RLHF 到 DPO:偏好对齐的三年演化
偏好对齐这条线索在三年里走完了「奖励模型 + 强化学习」到「直接优化偏好」的迁移。这篇不打算复述论文,而是把中间那个关键的代数变换讲清楚——理解了它,就知道 DPO 为什么可行,以及它在什么情况下不够用。
一、经典 RLHF 的三个阶段
- 监督微调(SFT)。用人工写的高质量回答做标准的语言建模训练,得到 πSFT。这一步决定了模型的基本行为风格,重要性经常被低估。
- 训练奖励模型(RM)。收集偏好对 (x, yw, yl),其中 yw 是标注者更偏好的回答。用 Bradley-Terry 模型拟合:
- 用 PPO 优化策略,目标是最大化奖励同时不要跑离 SFT 模型太远:
KL 项不是可选的正则化,而是必需品。没有它,策略会迅速找到奖励模型的漏洞——生成一些人类看来毫无意义、但 RM 打分极高的文本。这就是奖励攻陷(reward hacking),几乎每个做过 RLHF 的团队都见过。
二、关键的代数变换
上面那个带 KL 约束的最大化问题,其实有闭式最优解。做法是把目标写成一个 KL 散度的形式:
其中 Z(x) 是配分函数。这一步是标准结果,可以通过对目标函数关于 π 求变分导数并令其为零得到。
接下来是 DPO 的那一步:把这个式子反解出 r。
也就是说,任何奖励函数都可以用「最优策略与参考策略的对数比值」来表示。现在把它代回 Bradley-Terry 的偏好概率里:
注意 log Z(x) 在相减时消掉了——这是整个方法能成立的关键。配分函数是唯一难算的部分,而它恰好不出现在偏好概率里。
于是可以直接对策略做最大似然,完全不需要显式的奖励模型,也不需要在线采样:
def dpo_loss(policy_lp_w, policy_lp_l, ref_lp_w, ref_lp_l, beta=0.1):
"""lp = 该回答的 token 对数概率之和"""
pi_logratio = policy_lp_w - policy_lp_l
ref_logratio = ref_lp_w - ref_lp_l
logits = beta * (pi_logratio - ref_logratio)
return -F.logsigmoid(logits).mean()
训练循环退化成了普通的监督学习:两次前向(策略和参考模型),一个 sigmoid 损失。参考模型是冻结的,可以预先算好对数概率缓存起来,显存开销几乎只有一份模型。
三、DPO 的实际表现与坑
β 的选择
β 控制偏离参考模型的程度,和 PPO 里的 KL 系数是同一个东西。我们的经验值:
| β | 行为 | 适用 |
|---|---|---|
| 0.01 | 偏离大,风格变化剧烈,容易退化 | 不推荐 |
| 0.1 | 平衡,主流默认值 | 通用偏好对齐 |
| 0.3–0.5 | 保守,主要微调语气 | 已有强 SFT 基座 |
一个反复出现的现象:两边概率都在降
训练一段时间后经常观察到 log π(yw) 和 log π(yl) 同时下降,只是后者降得更快。损失确实在降,但模型对"好回答"的概率也在降低,这显然不是我们想要的。
原因在于 DPO 的损失只约束差值,不约束绝对水平。缓解办法有几种,我们用的是加一个 SFT 正则项:
加上之后 chosen 的对数概率稳定住了,下游任务指标提升约 1.8 个点。这个改法在文献里有若干变体名称,思路都是一样的。
离线数据的分布问题
这是 DPO 相对 PPO 最本质的劣势。PPO 是在线的:策略每更新一次,就从新策略采样新数据,标注(由 RM 打分)跟着策略走。DPO 用的是固定的离线偏好数据集,随着策略偏离,训练数据越来越不代表当前策略的输出分布。
实际影响是 DPO 训练超过 2–3 个 epoch 后收益迅速衰减甚至倒退。我们的应对是迭代式 DPO:训练一轮 → 用新策略采样 → 用一个评判模型或人工重新标注偏好 → 再训一轮。三轮之后收益基本饱和,但已经能追上 PPO 的大部分差距,工程复杂度低得多。
四、后续的变体
- IPO:把 sigmoid 换成平方损失,避免偏好数据接近确定性时的过拟合。当标注者高度一致时值得一试。
- KTO:不需要成对数据,单条样本标注「好/不好」即可。数据收集成本大幅降低,适合从线上点赞点踩日志里学。
- ORPO:把 SFT 和偏好优化合成一个阶段,省掉参考模型。显存友好,但对基座质量要求更高。
这些变体之间的差距,在我们的评测里普遍小于「数据质量的差距」。花在清洗偏好数据上的时间,回报几乎总是高于换算法。
五、一点保留意见
偏好对齐优化的是"标注者更喜欢哪个回答",这和"哪个回答更正确"并不总是一致。已知的系统性偏差包括:偏好更长的回答、偏好更自信的语气、偏好格式更漂亮的排版。如果不在标注规范里明确对抗这些倾向,模型会稳定地学到它们。我们在标注指南里加了一条硬规则——长度差异超过 1.5 倍时必须说明选择理由——之后长度偏置明显收敛。