Tensor NotesNotes on machine learning
Alignment

RLHF 到 DPO:偏好对齐的三年演化

RLHF 到 DPO:偏好对齐的三年演化题图

偏好对齐这条线索在三年里走完了「奖励模型 + 强化学习」到「直接优化偏好」的迁移。这篇不打算复述论文,而是把中间那个关键的代数变换讲清楚——理解了它,就知道 DPO 为什么可行,以及它在什么情况下不够用。

一、经典 RLHF 的三个阶段

  1. 监督微调(SFT)。用人工写的高质量回答做标准的语言建模训练,得到 πSFT。这一步决定了模型的基本行为风格,重要性经常被低估。
  2. 训练奖励模型(RM)。收集偏好对 (x, yw, yl),其中 yw 是标注者更偏好的回答。用 Bradley-Terry 模型拟合:
P(yw ≻ yl | x) = σ( r(x, yw) − r(x, yl) )
  1. 用 PPO 优化策略,目标是最大化奖励同时不要跑离 SFT 模型太远:
maxπ E[ r(x, y) ] − β · KL( π(y|x) ‖ πref(y|x) )

KL 项不是可选的正则化,而是必需品。没有它,策略会迅速找到奖励模型的漏洞——生成一些人类看来毫无意义、但 RM 打分极高的文本。这就是奖励攻陷(reward hacking),几乎每个做过 RLHF 的团队都见过。

RLHF 三阶段流程与 DPO 单阶段流程的对比
图 1 · 上:经典 RLHF 需要独立的奖励模型和在线采样。下:DPO 把两步合并

二、关键的代数变换

上面那个带 KL 约束的最大化问题,其实有闭式最优解。做法是把目标写成一个 KL 散度的形式:

π*(y|x) = (1/Z(x)) · πref(y|x) · exp( r(x, y) / β )

其中 Z(x) 是配分函数。这一步是标准结果,可以通过对目标函数关于 π 求变分导数并令其为零得到。

接下来是 DPO 的那一步:把这个式子反解出 r

r(x, y) = β · log( π*(y|x) / πref(y|x) ) + β · log Z(x)

也就是说,任何奖励函数都可以用「最优策略与参考策略的对数比值」来表示。现在把它代回 Bradley-Terry 的偏好概率里:

P(yw ≻ yl) = σ( β·log(π*(yw)/πref(yw)) − β·log(π*(yl)/πref(yl)) )

注意 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 正则项:

L = LDPO + λ · ( −log π(yw|x) ), λ ≈ 0.1–1.0

加上之后 chosen 的对数概率稳定住了,下游任务指标提升约 1.8 个点。这个改法在文献里有若干变体名称,思路都是一样的。

离线数据的分布问题

这是 DPO 相对 PPO 最本质的劣势。PPO 是在线的:策略每更新一次,就从新策略采样新数据,标注(由 RM 打分)跟着策略走。DPO 用的是固定的离线偏好数据集,随着策略偏离,训练数据越来越不代表当前策略的输出分布。

实际影响是 DPO 训练超过 2–3 个 epoch 后收益迅速衰减甚至倒退。我们的应对是迭代式 DPO:训练一轮 → 用新策略采样 → 用一个评判模型或人工重新标注偏好 → 再训一轮。三轮之后收益基本饱和,但已经能追上 PPO 的大部分差距,工程复杂度低得多。

什么时候还是该用 PPO当奖励可以被程序化精确验证时(数学答案对错、代码是否通过测试、格式是否合规),在线 RL 的优势非常明显——奖励信号无噪声,也不存在被攻陷的空间。这类场景不要用 DPO。

四、后续的变体

  • IPO:把 sigmoid 换成平方损失,避免偏好数据接近确定性时的过拟合。当标注者高度一致时值得一试。
  • KTO:不需要成对数据,单条样本标注「好/不好」即可。数据收集成本大幅降低,适合从线上点赞点踩日志里学。
  • ORPO:把 SFT 和偏好优化合成一个阶段,省掉参考模型。显存友好,但对基座质量要求更高。

这些变体之间的差距,在我们的评测里普遍小于「数据质量的差距」。花在清洗偏好数据上的时间,回报几乎总是高于换算法。

五、一点保留意见

偏好对齐优化的是"标注者更喜欢哪个回答",这和"哪个回答更正确"并不总是一致。已知的系统性偏差包括:偏好更长的回答、偏好更自信的语气、偏好格式更漂亮的排版。如果不在标注规范里明确对抗这些倾向,模型会稳定地学到它们。我们在标注指南里加了一条硬规则——长度差异超过 1.5 倍时必须说明选择理由——之后长度偏置明显收敛。

上一篇:Agent 的工具调用:状态、重试与失败边界…下一篇:扩散模型的噪声调度:DDPM、DDIM 与 …

继续阅读

Related