深色模式
模型对齐:RLHF / DPO
摘要:SFT 教模型「怎么做」,对齐阶段教它「什么更好/更安全」。本文区分 RLHF(PPO,需奖励模型+价值模型)与 DPO(直接偏好优化,免奖励模型),给出 DPO 的损失函数、β 与参考模型的作用、TRL/OpenRLHF 落地路径,以及训练不稳定与奖励黑客的排查。适用:
trl≥ 0.9、openrlhf≥ 0.10([版本相关])。
适用版本与前提
- 框架:
trl0.9+(SFTTrainer/DPOTrainer/PPOTrainer)、openrlhf0.10+(Ray + vLLM + DeepSpeed) - 上游:需先有 SFT 模型作为策略/参考起点
- 数据:DPO 需
(prompt, chosen, rejected)偏好对;RLHF 需偏好对先训奖励模型 - 模型示例:Llama-3.1-8B 作为 SFT 起点
核心概念:PPO vs DPO
| 维度 | RLHF / PPO | DPO |
|---|---|---|
| 是否需要奖励模型 | 是(额外训练 RM) | 否(隐式奖励) |
| 是否需要价值/ critic | 是(PPO) | 否 |
| 是否在线采样 rollout | 是(训练中不稳定性来源) | 否(全离线) |
| 稳定性 | 较难调 | 稳定轻量 |
| KL 控制 | 奖励中加 KL 项 / 参考模型 | β 直接进损失 |
| 适用 | 需要复杂奖励/可验证奖励(RLVR) | 标准偏好对齐首选 |
理论关系
DPO(Rafailov et al., 2023, arXiv:2305.18290)证明了:在 Bradley-Terry 偏好模型下,KL 约束的奖励最大化目标有闭式最优策略,从而把「奖励模型 + RL」两步合并为一个简单的分类损失,无需在线采样、无需训练奖励模型。DPO 优化的目标与 PPO-based RLHF 在数学上等价(同一 KL 约束奖励目标),但实现更简洁。
架构与原理
DPO 损失(核心公式):
$$L_{DPO} = -\mathbb{E}{(x,y_w,y_l)}\left[\log \sigma\Big(\beta \log\frac{\pi\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log\frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\Big)\right]$$
其中 $y_w$ 为被偏好回答、$y_l$ 为被拒绝回答,$\beta$ 控制与参考模型偏离的程度(类比 PPO 的 KL 系数)。
β 敏感性与数据质量
研究表明 DPO 对 β 与偏好数据质量高度敏感:差异小的样本对适合较小 β,差异大的适合较大 β(β-DPO 思路)。低质量/噪声偏好对会显著拖累对齐效果。先用干净、差异清晰的偏好数据,再调 β(常用 0.1–0.5 起步)。[β 取值依模型/数据而异,需实测]
生产实践
选型与落地
- 首选 DPO:绝大多数「让回答更符合偏好」场景,DPO 更简单、稳定、便宜,先用 TRL
DPOTrainer。 - 上 PPO/RLHF 当:需要复杂奖励信号、可验证奖励(RLVR,如数学/代码判分)、或多轮 agent 场景,用 OpenRLHF(vLLM 加速生成 + DeepSpeed ZeRO-3 训练)。
- PPO 关键点(社区实证):advantage 归一化、大 batch、参考模型 EMA 更新,能显著提升 PPO 表现。
- 别跳过 SFT:DPO/PPO 都以 SFT 模型为起点,参考模型通常是 SFT checkpoint。
操作步骤:TRL 跑 DPO
python
# dpo_train.py —— 标准偏好对齐
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from trl import DPOTrainer
model_id = "meta-llama/Llama-3.1-8B"
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="auto")
ref_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="auto") # 或 ref_model=None 让 TRL 自动复制
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token
# 偏好数据集格式:{"prompt":..., "chosen":..., "rejected":...}
train_ds = load_dataset("json", data_files="prefs.jsonl", split="train") # 见下方字段约定
trainer = DPOTrainer(
model=model,
ref_model=ref_model, # None => TRL 以策略模型为参考并冻结
args=TrainingArguments(
output_dir="./dpo-out",
per_device_train_batch_size=2,
learning_rate=5e-6, # DPO lr 通常远小于 SFT
num_train_epochs=1,
bf16=True,
gradient_checkpointing=True,
logging_steps=10,
),
train_dataset=train_ds,
tokenizer=tokenizer,
beta=0.1, # KL 强度,关键超参
max_prompt_length=512,
max_length=1536,
)
trainer.train()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
json
// prefs.jsonl —— DPO 偏好对
{"prompt": "解释一下 K8s 的 RBAC。", "chosen": "RBAC 通过 Role/ClusterRole 与绑定对象...", "rejected": "RBAC 就是权限吧。"}1
2
2
验证
bash
# 1) 训练 reward/margin 应上升(DPO 日志含 implicit reward 差)
# 2) 偏好准确率:在保留偏好集上,策略对 chosen 的 logp 应高于 rejected
# 3) 用 MT-Bench / 自建 judge 评估回答质量是否提升(见 post-eval.md)
# 4) 警惕「风格漂移」:DPO 可能让模型变短/变啰嗦,需人工抽样1
2
3
4
2
3
4
回滚与清理
对齐回滚
- DPO/PPO 产出完整权重或 LoRA 适配器;回滚即切回 SFT 基线或旧 checkpoint。
- 对齐可能引入「奖励黑客」式退化(模型钻偏好数据空子),上线前必须人工抽检 + 安全评测。
- 大 RLHF checkpoint 同样需版本化与访问控制(见
infra.md安全部分)。
故障排查
- DPO 效果差:检查偏好数据质量(差异是否清晰)、β 是否过大/过小、学习率是否过高导致偏离参考。
- PPO 不稳定 / 熵崩塌:降低 KL 系数或加大参考约束;检查 advantage 归一化;确保 rollout 与训练分布不过度偏移。
- 奖励黑客(reward hacking):偏好数据需覆盖边界,RM 易过拟合表面特征;加 KL 约束 + 周期性人工评估。
- 多模型显存爆炸(PPO):用 OpenRLHF 的 Hybrid Engine(Actor/Critic/RM/Ref/vLLM 共享 GPU,sleep 模式分时复用),或 ZeRO-3 分片。
安全与合规
对齐本身的安全风险
- 偏好数据偏见:人工/AI 标注的偏好若含偏见或越权内容,会被模型学去。标注指南需含安全红线。
- 越狱/有害输出:对齐后仍需安全评测(如 TruthfulQA、专用红队集);DPO 可能削弱已学得的安全边界,务必复测。
- 奖励模型泄露:RLHF 的 RM 本身是模型,权重与训练数据需同等保护。
- 合规:对齐数据若含用户内容,需符合隐私与许可;RLVR 的判分脚本若引用外部规则,注意版权/合规。
成本与性能(估算,[未实测])
| 方法 | 额外模型 | 硬件 | 相对成本 |
|---|---|---|---|
| DPO 7B | 1(参考,可复用 SFT) | 1–8× A100 | 与一次 SFT 接近 |
| PPO 7B | Actor+Critic+RM+Ref | 多卡 + vLLM | 数倍于 DPO |
| PPO 70B | 全套 + Hybrid | 数十× A100/H100 | 高,按天计 |
性能备注
RLHF 中生成(rollout)常占 80%+ 总时间,因此 OpenRLHF 用 vLLM 加速生成、用 Hybrid Engine 让训练与推理共卡分时是关键降本手段。DPO 因为没有在线 rollout,成本接近一次 SFT。GPU 利用率与生成吞吐是主要瓶颈指标。[时长/单价为估算,非实测报价]
参考资料
- Direct Preference Optimization(Rafailov et al., 2023, arXiv:2305.18290)
- Hugging Face TRL — DPOTrainer 文档
- Hugging Face TRL — 训练器总览
- OpenRLHF 官方文档
- arXiv: OpenRLHF: An Easy-to-use, Scalable and High-performance RLHF Framework (2501.03262)
- Is DPO Superior to PPO for LLM Alignment?(Xu et al., 2024, arXiv:2404.10719)