在 5.2 节中,我们完整拆解了 RLHF 的 pipeline:先训 SFT 模型,再训奖励模型(RM),最后用 PPO 在 RM 的引导下对策略模型做在线强化学习。这套流程效果确凿,是 ChatGPT、Claude 等顶级产品对齐的基石,但它也出了名的重、慢、脆——需要维护四个模型(Actor、Critic、RM、Reference)的同步,PPO 的超参数极其敏感,训练过程中Reward Hacking 和模式崩溃时有发生。
有没有办法跳过显式的奖励模型和 PPO,直接用偏好数据对齐策略模型?2023 年提出的 DPO(Direct Preference Optimization,直接偏好优化) 给出了肯定的答案。它正在成为学术界和工业界中小规模对齐任务的首选方案,也是理解后续 5.4 节拒绝采样、自我对齐等技术的逻辑前提。
一、核心洞察:奖励模型其实可以被“解析地”消去
DPO 的出发点是一个精妙的数学发现:在 Bradley-Terry 偏好假设和 KL 散度约束下,最优策略与奖励函数之间存在一一对应的闭式解。
用大白话说:如果你知道“最优的回答应该是什么样子”(即策略模型 π),你可以反推出一个隐式的奖励函数 R;反过来,传统的 RLHF 是先显式地学出 R,再用 PPO 去逼近 π。既然两者可以互相推导,为什么不直接优化策略,把中间商(RM 和 PPO)砍掉?
这就是 DPO 名字的由来——Direct,直接对策略做偏好优化。
二、技术逻辑:从 RLHF 到 DPO 的推导直觉
为了兼顾准确性和可读性,我们保留核心直觉,略去繁琐的变分推导。
1. 起点与 RLHF 相同:偏好数据
你手里仍是一组三元组 (x, y_w, y_l):
x:提示词(Prompt)y_w:人类标注者偏好的回答(Win)y_l:人类标注者不喜欢的回答(Lose)
2. 隐式奖励的构造
DPO 证明:给定一个固定的参考模型 π_ref(通常就是 SFT 后的模型,参数冻结),任何一个策略模型 π_θ 都隐含地对应着一个奖励函数:
R(x,y) = β · log( π_θ(y|x) / π_ref(y|x) ) + const
其中:
π_θ(y|x)是正在训练的策略模型;π_ref(y|x)是参考模型;β是一个控制 KL 散度的超参数,理解成“允许新策略偏离老模型多远”的松紧带。
关键理解:这个公式把“奖励”定义成了策略模型相对于参考模型的对数概率增益。如果策略模型给某个回答打出的概率远高于参考模型,就相当于给这个回答打了高分。
3. 直接优化的损失函数
把上述隐式奖励代入 Bradley-Terry 偏好模型,就得到了 DPO 的最终损失函数。对一条偏好数据,DPO 损失为:
L_DPO(θ) = -log σ( β · log[π_θ(y_w|x)/π_ref(y_w|x)] - β · log[π_θ(y_l|x)/π_ref(y_l|x)] )
其中 σ 是 Sigmoid 函数。
直观解释:
- 分子部分
π_θ(y_w|x)/π_ref(y_w|x)表示:好回答在新策略下的概率,相对于老模型提升了多少; - 分母部分
π_θ(y_l|x)/π_ref(y_l|x)表示:坏回答在新策略下的概率,相对于老模型提升了多少; - DPO 的目标就是让分子的比值尽可能大,分母的比值尽可能小,两者之差通过 Sigmoid 和负对数似然变成可优化的损失。
换句话说,DPO 并不关心策略模型给某个回答的绝对概率是多少,它只关心偏好对之间的相对差距是否被放大。
三、DPO 的完整训练流程(工程视角)
与 RLHF 相比,DPO 的 pipeline 极度瘦身:
| 步骤 | RLHF (PPO) | DPO |
|------|------------|-----|
| 阶段 1 | SFT 得到基座策略 | SFT 得到参考模型 π_ref(兼作初始化) |
| 阶段 2 | 训练奖励模型 RM | 跳过 |
| 阶段 3 | 用 PPO 在线采样、打分、更新 Actor/Critic | 直接用离线偏好数据计算上述损失,更新 π_θ |
| 在线采样 | 训练时需要实时生成回答 | 不需要,偏好数据是离线的 |
具体实施时:
- 初始化:用 5.1 节的 SFT 模型作为
π_ref,同时复制一份作为可训练的π_θ; - 参考模型冻结:
π_ref在整个 DPO 训练中参数不动,仅提供概率比值的基准; - 数据组织:构造
(x, y_w, y_l)对。注意y_w和y_l必须来自同一 Prompt 下的不同回答; - 前向计算:对
y_w和y_l分别计算π_θ和π_ref的序列对数概率; - 反向传播:最小化
L_DPO,更新π_θ。
四、DPO 的四大优势(为什么它这么受欢迎)
1. 训练稳定性大幅提升
PPO 的痛点在于在线采样带来的高方差:策略稍一更新,生成的回答分布就变了,Critic 的估值容易滞后,导致训练震荡。DPO 是离线方法,数据固定,损失函数是简单的分类逻辑(对比 y_w 和 y_l),梯度路径清晰,几乎不需要调 PPO 那一堆棘手的超参数(clip ratio、GAE λ、entropy coef 等)。
2. 显存与计算开销减半
RLHF 需要同时加载 Actor、Critic、RM、Reference 四个大模型,显存占用是单模型的 3–4 倍。DPO 只需要两个模型(一个训练、一个参考),参考模型甚至可以只做推理(可进一步用 FP16/量化缓存优化)。对于 70B 级别的模型,这意味着从 8 卡 A100 降到 4 卡甚至单卡即可完成对齐。
3. 数据效率更高
PPO 需要不断在线生成新回答来探索策略空间,生成本身就是计算瓶颈。DPO 直接复用已有的偏好数据,不需要在训练过程中让模型“写新作文再打分了”。对于偏好数据已经标注好的场景,训练速度快一个数量级。
4. 实现极简
开源框架(Hugging Face TRL、LLaMA-Factory、Axolotl)中,DPO 的实现通常只有几十行核心代码。团队不需要雇佣专门的 RL 工程师,算法工程师或甚至资深产品经理都能快速上手。
五、局限与适用边界:DPO 不是万能药
理解 DPO 的短板,才能避免在实际项目中盲目套用:
1. 高度依赖偏好数据质量
RLHF 的奖励模型相当于一个“滤波器”:即使单条偏好标注有噪声,RM 通过大规模学习可以平均掉部分偏差。DPO 没有这一层缓冲,数据中的错误偏好会直接注入策略。如果标注者本身对好坏的判断标准不一致,DPO 很容易过拟合到噪声上。
2. 缺乏在线探索能力
PPO 在训练时会实时生成回答,策略有机会探索训练数据分布之外的新表达,从而发现更优解。DPO 是纯离线对比学习,策略只能“模仿”偏好数据里已有的回答对,难以自发创造出超越数据上限的新风格或推理路径。在需要极强创造性或复杂推理跃迁的场景,RLHF 的上限往往更高。
3. 对长文本/复杂序列的数值敏感
当 y_w 或 y_l 非常长时,序列对数概率的绝对值会变得极大,概率比值的对数运算可能出现数值不稳定(overflow/underflow)。工程上需要小心处理 log-prob 的累加和裁剪。
4. 仍受限于参考模型的天花板
DPO 的 π_ref 通常就是 SFT 模型。如果 SFT 模型本身对某个领域几乎无知(例如某冷门编程语言),DPO 很难凭空“变出”该领域的高质量回答,因为它没有引入外部新知识,只是在重新分配已有概率。
六、工程实践建议
何时选 DPO?
- 团队资源有限,没有 RL 工程经验;
- 偏好数据规模在数万到数十万级别,且标注质量经过去噪和一致性校验;
- 任务以风格对齐、安全过滤、指令遵循为主,而非需要强推理跃迁的数学/代码任务;
- 需要快速迭代(例如每周更新一版对齐模型)。
关键超参 β 的调节:
β越小,策略越自由,可能学到更强的偏好区分,但也越容易过拟合、偏离原始 SFT 模型的语言能力(出现语法崩坏或重复);β越大,策略被“拉”回参考模型越紧,训练更安全但效果更弱;- 实践中通常从
β = 0.1(或按公式中的等效温度倒数形式β = 0.5)开始网格搜索。
数据配比技巧:
- 不要让 DPO 数据中的
y_w和y_l差距过大(例如一个是满分作文,一个是乱码)。过于极端的对比会让梯度饱和,模型学不到细腻的对齐; - 可引入长度惩罚,避免模型单纯学会“更长的回答更好”这一伪相关。
与 5.4 节技术的衔接:
DPO 常与拒绝采样(Rejection Sampling Fine-Tuning, RSF)配合使用:先用拒绝采样从 SFT 模型中筛选出高质量回答构造偏好对,再用 DPO 做精细对齐。这种“离线筛数据 + DPO 精调”的组合,正在成为很多开源模型(如 Zephyr、Llama-2-Chat 的部分变体)的标准动作。
七、小结
DPO 的核心贡献在于揭示了奖励函数与策略模型之间的解析等价性,从而把 RLHF 中“训 RM + PPO 优化”的两阶段流程,压缩为单阶段的直接偏好对比学习。
Takeaway:
- DPO 的本质:用参考模型做锚点,通过放大“好/坏回答的相对概率差距”来实现对齐;
- DPO 的优势:省显存、省算力、省调参、训练稳定;
- DPO 的代价:对数据质量要求更苛刻,缺乏在线探索,复杂推理场景的上限可能低于 RLHF。
在 5.4 节中,我们将继续扩展对齐工具箱,探讨拒绝采样如何利用高质量数据做提升,以及自我对齐(Self-Alignment) 如何进一步降低对人类标注的依赖,让模型自己教自己对齐。