RLHF 与 DPO
问题
RLHF 和 DPO 是什么?它们如何让模型对齐人类偏好?
答案
RLHF 和 DPO 是 SFT 之后的对齐训练方法,让模型输出更符合人类偏好(有用、无害、诚实)。详细的对齐技术原理参见 人类对齐。
一、RLHF 流程
三个阶段:
- SFT:用高质量数据监督微调
- Reward Model:训练奖励模型,用人类偏好打分
- PPO:用强化学习优化策略,最大化奖励
二、DPO 简化对齐
DPO(Direct Preference Optimization) 跳过 Reward Model 和 PPO,直接用偏好数据优化模型:
| 对比 | RLHF | DPO |
|---|---|---|
| 训练阶段 | 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()
五、其他对齐方法
| 方法 | 核心思想 | 优势 |
|---|---|---|
| ORPO | SFT + 对齐一步完成 | 最简单 |
| KTO | 只需好/坏标签,无需成对 | 数据需求低 |
| SPIN | 自对弈生成数据 | 不需要人工标注 |
| GRPO | 用组相对奖励替代 RM | DeepSeek R1 采用 |
常见面试问题
Q1: 什么时候用 RLHF,什么时候用 DPO?
答案:
- DPO:首选方案——实现简单、训练稳定、效果接近 RLHF,适合大多数场景
- RLHF:当追求极致对齐效果、有充足计算资源和 RL 工程经验时使用
- 实际趋势:DPO 及其变体(如 ORPO、SimPO)正在替代 RLHF 成为主流
Q2: DPO 的 beta 参数有什么作用?
答案:
- beta 控制偏离参考模型的惩罚强度
- beta 越大,模型越接近 SFT 模型(保守)
- beta 越小,模型变化越大(激进,可能不稳定)
- 通常取 0.1-0.5,需要实验调优