跳到主要内容

RLHF 与 DPO

问题

RLHF 和 DPO 是什么?它们如何让模型对齐人类偏好?

答案

RLHFDPO 是 SFT 之后的对齐训练方法,让模型输出更符合人类偏好(有用、无害、诚实)。详细的对齐技术原理参见 人类对齐

一、RLHF 流程

三个阶段

  1. SFT:用高质量数据监督微调
  2. Reward Model:训练奖励模型,用人类偏好打分
  3. PPO:用强化学习优化策略,最大化奖励

二、DPO 简化对齐

DPO(Direct Preference Optimization) 跳过 Reward Model 和 PPO,直接用偏好数据优化模型:

LDPO=E[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{\text{DPO}} = -\mathbb{E}\left[\log \sigma\left(\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right)\right]
对比RLHFDPO
训练阶段3 阶段(SFT→RM→PPO)1 阶段(直接优化)
复杂度高(需要多个模型同时训练)低(只需一个模型)
稳定性PPO 训练不稳定相对稳定
效果天花板高接近 RLHF
适用大规模对齐中小规模对齐

三、偏好数据格式

{
"prompt": "解释一下什么是人工智能",
"chosen": "人工智能(AI)是计算机科学的一个分支,致力于创建能够模拟人类智能行为的系统...",
"rejected": "AI 就是机器人,它们会取代人类的工作,可能会毁灭世界..."
}

四、DPO 训练代码

from trl import DPOTrainer, DPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

# 加载 SFT 微调后的模型
model = AutoModelForCausalLM.from_pretrained("sft_model")
ref_model = AutoModelForCausalLM.from_pretrained("sft_model") # 参考模型(冻结)
tokenizer = AutoTokenizer.from_pretrained("sft_model")

# DPO 训练配置
training_args = DPOConfig(
output_dir="./dpo-output",
beta=0.1, # KL 散度惩罚系数
learning_rate=5e-7, # DPO 需要极低学习率
num_train_epochs=1,
per_device_train_batch_size=4,
bf16=True,
)

# DPO Trainer
trainer = DPOTrainer(
model=model,
ref_model=ref_model,
args=training_args,
train_dataset=preference_dataset,
tokenizer=tokenizer,
)

trainer.train()

五、其他对齐方法

方法核心思想优势
ORPOSFT + 对齐一步完成最简单
KTO只需好/坏标签,无需成对数据需求低
SPIN自对弈生成数据不需要人工标注
GRPO用组相对奖励替代 RMDeepSeek R1 采用

常见面试问题

Q1: 什么时候用 RLHF,什么时候用 DPO?

答案

  • DPO:首选方案——实现简单、训练稳定、效果接近 RLHF,适合大多数场景
  • RLHF:当追求极致对齐效果、有充足计算资源和 RL 工程经验时使用
  • 实际趋势:DPO 及其变体(如 ORPO、SimPO)正在替代 RLHF 成为主流

Q2: DPO 的 beta 参数有什么作用?

答案

  • beta 控制偏离参考模型的惩罚强度
  • beta 越大,模型越接近 SFT 模型(保守)
  • beta 越小,模型变化越大(激进,可能不稳定)
  • 通常取 0.1-0.5,需要实验调优

相关链接