📑 本页目录(点开跳转)
13 · DPO 与免 RL 对齐
⏱ 26 分钟 | ⭐ "能不能不用 RL"
🎯 一句话
RLHF 又贵又难调(四个模型、超参敏感、奖励攻击)。 DPO 证明了一件让人意外的事:那个"训奖励模型 + 跑 PPO"的两步流程, 在数学上等价于一个可以直接做的监督学习损失。
💡 一、核心洞察
RLHF 的目标(第 11、12 章):
max E[r(x,y)] − β·KL(π ‖ π_ref)
↑ 奖励高 ↑ 别离参考模型太远
这个带 KL 约束的优化问题,有一个闭式最优解:
$$\pi^*(y|x) = \frac{1}{Z(x)}\,\pi_{ref}(y|x)\,\exp\Big(\frac{1}{\beta}r(x,y)\Big)$$
🔗 这个闭式解不是变出来的,它是 KL 的定义直接推出来的: 数学原理 01b · KL 散度。 ⭐ 值得专门去一趟,因为整章 DPO 的推导都站在「$\text{KL}$ 里那个 $\log\frac{\pi}{\pi_{ref}}$」上—— 你看到的 $\beta\log\frac{\pi^*}{\pi_{ref}}$ 就是 KL 被积分号里那一项原样搬出来的, 知道这一点之后「奖励 = 对数比」就从「一个巧合」变成「本来就该这样」。 那一章还会告诉你这里的 $\text{KL}(\pi\|\pi_{ref})$ 是反向 KL($\pi$ 在分子,罚的是「跑出 $\pi_{ref}$ 的支撑集」), 所以它约束的是「别乱说」,不约束「别变单调」——这是 DPO 和 RLHF 共享的一个盲区。
把它反过来解出 r:
$$r(x,y) = \beta\log\frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \beta\log Z(x)$$
⭐⭐ 这一步是全部的关键:
「奖励函数」可以用「最优策略和参考策略的对数比」表示出来
→ 也就是说,【策略本身就隐含了一个奖励模型】
→ 那还训练什么奖励模型?直接优化策略就行了 ⭐
代入 Bradley–Terry 损失(第 12 章),那个讨厌的 $Z(x)$ 正好抵消:
$$L_{DPO} = -\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)$$
💡 人话翻译:
提高"好回答相对参考模型的概率", 同时压低"差回答相对参考模型的概率"。 就这一个损失,不需要奖励模型,不需要采样,不需要 PPO。
🔨 二、实现有多简单
# DPO 的全部核心
import torch.nn.functional as F
def dpo_loss(policy_logps, ref_logps, beta=0.1):
# 每个都是 (chosen, rejected) 两项
pi_logratio = policy_logps.chosen - policy_logps.rejected
ref_logratio = ref_logps.chosen - ref_logps.rejected
return -F.logsigmoid(beta * (pi_logratio - ref_logratio)).mean()
对比一下工程复杂度:
| RLHF (PPO) | DPO | |
|---|---|---|
| 需要的模型 | 4 个(策略/参考/RM/Critic) | 2 个(策略/参考)⭐ |
| 需要在线采样 | ✅ 要 | ❌ 不用 ⭐ |
| 训练稳定性 | 差,超参敏感 | 好,就是监督学习 |
| 显存 | 高 | 约一半 |
| 实现难度 | 高 | 几十行 |
🔑 DPO 之所以影响巨大,是因为它把"需要 RL 专家才能调通"的东西 变成了"会写监督学习就能跑"的东西。
⚠️ 三、但 DPO 不是免费的
| 局限 | 说明 |
|---|---|
| 离线 ⭐ | 只能用固定的偏好数据集;PPO 能在训练中探索新回答并获得反馈 |
| 分布依赖 | 数据必须来自和当前模型接近的分布,否则效果差 |
| 容易过优化 | β 太小会让模型剧烈偏离参考模型 ⭐ |
| 概率下降现象 ⭐ | 训练中 chosen 的绝对概率常常也在下降——它只保证"相对差距"拉大 |
| 对噪声敏感 | 标注错误会被直接学进去(没有 RM 做平滑) |
💡 "概率下降"是 DPO 一个反直觉的真实现象: 损失只约束 chosen 和 rejected 的相对对数比, 完全允许两个都下降,只要 rejected 降得更多。 后果是模型可能变得整体不自信、输出退化。 这催生了一批加正则项的变体。
🌿 四、DPO 的变体家族
| 方法 | 改了什么 |
|---|---|
| IPO | 换损失形式,缓解 DPO 的过拟合到确定性策略 |
| KTO ⭐ | 不需要成对偏好,只要"这个回答好/不好"的二元标注 → 数据便宜得多 |
| ORPO | 把 SFT 和对齐合成一步,不需要参考模型 ⭐ |
| SimPO | 用长度归一化的对数概率,去掉参考模型且缓解长度偏好 ⭐ |
| cDPO / rDPO | 显式建模标注噪声 |
💡 注意这些变体的共同方向: 越来越少的依赖 —— 去掉 RM、去掉 Critic、去掉在线采样、去掉参考模型、去掉成对数据。
⚖️ 五、DPO vs PPO:到底该用哪个
✅ 选 DPO:
├─ 已经有高质量的成对偏好数据
├─ 算力/显存有限
├─ 团队没有 RL 调参经验
└─ 想快速迭代
✅ 选 PPO(或 GRPO):
├─ 需要【在线探索】(模型要发现训练数据里没有的好回答)⭐
├─ 奖励是【可验证的】(代码跑通、数学正确)⭐⭐
├─ 追求最高上限
└─ 有算力和 RL 经验
🔑 一个当前的实践共识: 偏好对齐(有帮助、无害、风格)→ DPO 类方法已经够好且便宜得多。 推理能力提升(数学、代码)→ 必须用在线 RL, 因为模型需要自己探索出正确的推理路径,这是离线数据里没有的 ⭐
🔗 这就是第 12 章提到的 RLVR / GRPO 路线 —— 近年推理模型的训练主力。
🧭 六、还有哪些"免 RL"的路线
| 路线 | 做法 |
|---|---|
| 拒绝采样 / Best-of-N 蒸馏 ⭐ | 采样 N 个回答,用 RM 挑最好的,再拿去做 SFT → 极简单且有效 |
| Constitutional AI | 用一套书面原则让 AI 自我批评并修改 |
| 上下文蒸馏 | 把长系统提示的效果蒸馏进权重 |
| 条件化训练 | 训练时给数据打质量标签,推理时要求"高质量" |
💡 拒绝采样值得特别提:它简单到几乎不需要新知识 (采样 → 打分 → 挑最好的 → SFT),却经常能拿到 RLHF 大部分的收益。 很多团队的实际做法是:先做拒绝采样,不够再上 DPO,最后才考虑 PPO。
🔗 和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 11 章 KL 惩罚 | DPO 推导的出发点 ⭐ |
| 数学原理 01b · KL 散度 | 出发点的出发点。整章推导都建在 $\log\frac{\pi}{\pi_{ref}}$ 上,而那一项就是 KL 积分号里的东西——KL 在本教程被引用了六次却从没定义过,那一章补的就是这个 ⭐ |
| 第 12 章 Bradley–Terry 损失 | DPO 直接用了它 |
| 第 12 章 奖励攻击 | DPO 没有 RM,但仍可能过优化 |
| 第 12 章 RLVR | DPO 替代不了的那部分 ⭐ |
| 全景导论第 12 章 | 对齐的全景 |
| 全景导论 04 训练三阶段 | 那一章把「RLHF → DPO → GRPO 三代方法」压成了一段缩写版,本章和第 12 章就是它承诺的展开版。想先看清 DPO 在整条训练链上的位置,回那里 |
✅ 检查点
- DPO 的核心洞察是什么?用一句话说。
- 那个闭式最优解反过来说明了什么?
- DPO 损失里那个讨厌的 Z(x) 去哪了?
- DPO 相比 PPO 省掉了哪些东西?
- "概率下降现象"是什么?为什么会发生?
- KTO、ORPO、SimPO 各去掉了什么依赖?
- 什么情况下必须用 PPO/GRPO 而不能用 DPO?为什么?
- 拒绝采样为什么值得先试?
👀 答案
- 策略本身就隐含了一个奖励模型——所以不需要单独训 RM,直接优化策略即可。
- 带 KL 约束的 RLHF 目标有闭式解 π ∝ π_ref·exp(r/β),反解出 r = β·log(π/π_ref) + β·logZ(x),即奖励函数可以用"最优策略和参考策略的对数比"表示**。
- 代入 Bradley–Terry 损失(只关心两个回答的分数差)时,Z(x) 只依赖 x,在相减时正好抵消。
- 省掉了奖励模型、Critic、在线采样、PPO 的全部超参。模型从 4 个降到 2 个,显存约一半,实现只要几十行。
- 训练中 chosen 的绝对概率常常也在下降。因为损失只约束 chosen 和 rejected 的相对对数比,完全允许两个都降,只要 rejected 降得更多。后果是模型整体不自信、输出退化。
- KTO 去掉成对偏好(只要二元的好/不好标注);ORPO 去掉参考模型(并把 SFT 和对齐合成一步);SimPO 去掉参考模型并用长度归一化缓解长度偏好。
- 当需要在线探索、或奖励是可验证的(代码跑通、数学正确)时。因为模型需要自己探索出正确的推理路径,而这在离线偏好数据里根本不存在。
- 因为它简单到几乎不需要新知识(采样 N 个 → RM 打分 → 挑最好的 → SFT),却经常能拿到 RLHF 大部分的收益。实践顺序通常是:拒绝采样 → 不够再上 DPO → 最后才考虑 PPO。
🛑 可以停在这里
⚡ 走神救援
⭐⭐DPO 的核心洞察:策略本身就隐含了一个奖励模型——带 KL 约束的 RLHF 目标有闭式解 π* ∝ π_ref·exp(r/β),反解出 r = β·log(π*/π_ref) + β·logZ(x);代入 Bradley-Terry 损失时 Z(x) 正好抵消,得到 L = −logσ(β[log(π/π_ref)_chosen − log(π/π_ref)_rejected])。💡人话:提高好回答相对参考模型的概率,压低差回答的——不要 RM、不要采样、不要 PPO。⭐工程对比:PPO 要 4 个模型,DPO 只要 2 个,显存约一半,实现几十行——它把"需要 RL 专家才能调通"变成了"会写监督学习就能跑"。⚠️但不是免费的:离线(不能探索新回答)、分布依赖、容易过优化、⭐概率下降现象(chosen 的绝对概率常常也在降,因为损失只管相对差距,允许两个都降只要 rejected 降更多 → 模型整体不自信、输出退化)、对标注噪声敏感。变体的共同方向是越来越少的依赖:⭐KTO 去掉成对偏好(只要二元好/不好)、⭐ORPO 去掉参考模型(SFT 和对齐合一步)、⭐SimPO 去掉参考模型 + 长度归一化、IPO、cDPO。⭐选型共识:偏好对齐(有帮助/无害/风格)→ DPO 类够好且便宜;⭐⭐推理能力提升(数学、代码)→ 必须在线 RL,因为模型要自己探索出正确的推理路径,这在离线数据里根本不存在 → 这就是 RLVR / GRPO 路线。其他免 RL 路线:⭐拒绝采样/Best-of-N 蒸馏(采样→RM打分→挑最好→SFT,简单到几乎不需要新知识却常拿到 RLHF 大部分收益;实践顺序常是拒绝采样 → DPO → 最后才 PPO)、Constitutional AI、上下文蒸馏。
下一节 👉 14-RL在推荐与智能体里.md