本章定位:2024–2026 年 LLM 对齐的主流方向。DPO 用一个漂亮的数学推导砍掉了 RM 和 Critic,把 RL 问题变成纯监督学习。Llama 3、Mistral、Qwen 2.5 都以 DPO 为主。
承上:Ch6 §A.1 的 Bradley-Terry 模型 + Ch6 §A.5 的 KL-约束 RL 目标。
启下:Ch8 推理时代会回到 RL(GRPO),但 DPO 仍是绝大多数对齐场景的首选。
§A 数学原理
1. 起点:KL-约束 RL 的优化目标
回忆 Ch6,RLHF 优化目标是:
PPO 用迭代采样的方式优化它,但这个问题其实有闭式解。
2. 闭式解推导(DPO 核心一)
把 KL 展开:
对 $\pi$ 求变分极值。设 $\pi(y \mid x)$ 的拉格朗日函数(含归一化约束 $\sum_y \pi = 1$),对 $\pi(y)$ 求导并令其为零:
整理得:
其中 $Z(x) = \sum_y \pi_{\text{ref}}(y \mid x) \exp(r(x,y)/\beta)$ 是归一化常数(仅依赖 $x$)。
几何直觉:最优 Policy = 在 reference 分布上”按 reward 重加权”的分布。Reward 越高的 response 概率被乘以一个指数放大因子。
3. 反解 reward(DPO 核心二)
对 $\pi^*$ 取对数:
反解 reward:
这是 DPO 最关键的等式:reward 可以用 policy 的 log-ratio 表达。
4. 代入 Bradley-Terry:log Z(x) 神奇消去
回忆 Ch6 §A.1.2,BT 模型给出偏好概率:
把第 3 步的 reward 表达代入:
$\log Z(x)$ 自动消去! 这是 DPO 推导最神奇的一步——$Z(x)$ 是个棘手的、不可计算的归一化常数(要对所有 $y$ 求和),但它只依赖 $x$,在两项相减时正好抵消。
5. 最终:DPO 损失函数
把上面代回 BT 模型,再做 MLE,得到:
核心洞察:
- 不需要训练 RM——Policy 自身的 log-ratio 就是 reward 的隐式表达
- 不需要 Critic——直接用偏好对训练
- 不需要 online 采样——纯 offline 监督学习
6. DPO 的几何解读
设 $\Delta_w = \log \frac{\pi_\theta(y_w)}{\pi_{\text{ref}}(y_w)}$,$\Delta_l = \log \frac{\pi_\theta(y_l)}{\pi_{\text{ref}}(y_l)}$。
DPO 损失变为:
梯度方向:
直觉:让 $\pi_\theta$ 在 $y_w$ 上的”相对 ref 提升”超过在 $y_l$ 上的提升。差距越大(已经学得很好),梯度越小。
§B 模型结构(PyTorch 实现)
B.1 DPO 损失函数(核心)
1 | import torch |
B.2 计算整条 response 的 sum log-prob
1 | def get_batch_logps(logits, labels, average=False): |
B.3 完整 DPO 训练循环
1 | def dpo_train_step(policy, reference, batch, optimizer, beta=0.1): |
B.4 IPO:DPO 的”防过拟合”变种
DPO 有个问题:当 chosen-rejected 差距已经很大时,loss 仍可能继续推高 $\Delta_w - \Delta_l$,导致 $\pi_\theta$ 过度偏离 $\pi_{\text{ref}}$。
IPO(Identity-PO, 2023)用平方损失替代 sigmoid:
1 | def ipo_loss(policy_chosen_logps, policy_rejected_logps, |
B.5 KTO:单点偏好(不要 pairwise)
KTO(Kahneman-Tversky Optimization)的洞察:很多场景没有成对偏好,只有”这个回答好/坏”的单点标注。
其中 $v$ 是 prospect theory 的 value function(不对称:损失比收益感受更强)。
1 | def kto_loss(policy_logps, reference_logps, labels, |
B.6 ORPO:不需要 reference 模型
ORPO(Odds Ratio Preference Optimization, 2024)把 SFT 损失和偏好损失合二为一,完全不需要 reference 模型:
其中 odds ratio loss:
$\text{odds}(y) = \frac{\pi(y)}{1 - \pi(y)}$。直觉:让”选 $y_w$ 的几率”显著高于”选 $y_l$ 的几率”。
显存节省:DPO 需要 2 个模型(policy + ref),ORPO 只需要 1 个。
B.7 SimPO:去掉 reference 的另一种思路
SimPO(Simple Preference Optimization, 2024)观察到 DPO 的 log-ratio 形式与”长度”耦合(response 越长,logp 越小)。
它直接用 平均 token log-prob 替代 sum:
- 平均化:消除长度偏差
- margin $\gamma$:避免 logits 无限增大
- 无 reference:直接用 policy 的 logp,不需要 $\pi_{\text{ref}}$
1 | def simpo_loss(policy_chosen_logps_avg, policy_rejected_logps_avg, |
§C 训练与推理
C.1 DPO vs PPO:完整对比
| 维度 | PPO(Ch6) | DPO(本章) |
|---|---|---|
| 显式 RM | 需要 | 不需要 |
| Critic | 需要 | 不需要 |
| 采样方式 | online(每次重新生成) | offline(直接用偏好数据) |
| 模型数 | 4 个 | 2 个(Policy + Reference) |
| 显存 | 极高 | 中等 |
| 训练稳定性 | 难 | 容易 |
| 超参敏感度 | 高 | 低 |
| 上限 | 高(online 探索) | 受限于偏好数据集 |
| 代表模型 | InstructGPT, GPT-4 | Llama 3, Mistral, Qwen 2.5 |
C.2 DPO 训练流程
1 | 1. 准备偏好数据集 D = {(x, y_w, y_l)}(与 RM 训练同源) |
关键超参:
- $\beta = 0.1$(最常用),范围 0.01–0.5
- $\beta$ 大 → 更强 KL 约束,更接近 ref
- $\beta$ 小 → 更激进对齐,但易过拟合 chosen
- 学习率:5e-7 到 5e-6(比 SFT 小 10 倍)
- Epoch:1–3(DPO 容易过拟合)
C.3 DPO 的局限与常见 pitfalls
Pitfall 1:Length Bias(最常见)
DPO 的 $\sum_t \log \pi(y_t)$ 与长度相关,导致模型倾向写长。
缓解:
- SimPO(用 average logp)
- 训练数据中加入长度多样的 chosen/rejected 对
Pitfall 2:Chosen reward 下降
监控指标:policy_chosen_logps - reference_chosen_logps
- 健康训练:这个数值应该上升或稳定
- 不健康:chosen 和 rejected 都在下降,但 chosen 下降得慢——这是 DPO 的”边际效应”,模型为了拉开差距,可能同时降低两者
缓解:
- 加 NLL 辅助损失(在 chosen 上做 SFT 损失,正则)
- 用 IPO 替代 DPO
Pitfall 3:Distribution shift
如果偏好数据 $(x, y_w, y_l)$ 不是来自当前 SFT 模型的输出(来自其他模型),DPO 效果会变差。
缓解:
- 用 SFT 模型自己生成 $y_w, y_l$(self-generated preference)
- Iterative DPO / Online DPO(详见 C.5)
C.4 推理视角:DPO 后的模型与 PPO 后有何不同?
| 维度 | PPO 后 | DPO 后 |
|---|---|---|
| 输出分布 | 向 RM 偏好聚集,可能 mode collapse | 向 chosen 分布对齐,相对温和 |
| 创造性 | 显著下降 | 略下降 |
| 风格一致性 | 强 | 中等 |
| 适合的 temperature | 0.0(greedy 最优) | 0.5–0.7(保留多样性) |
| 拒答倾向 | 强(向 harmless 偏好对齐) | 中等 |
经验法则:DPO 后的模型在采样时更”灵活”,PPO 后的模型更”刻板”。这是因为 DPO 是 offline 学习,没有 online 探索 RM 的”顶峰”。
C.5 Iterative DPO / Online DPO:闭环演进
DPO 的 offline 限制可以通过迭代缓解:
1 | Round 1: |
这就是 SPIN / Self-Rewarding LM / Online DPO 的核心思想——本质是 BYOL 中”周期性更新 Target”思想的离散化(呼应 Ch4 §D)。
1 | # 伪代码 |
§D 章末速查
D.1 DPO 家族对比
| 方法 | 核心思路 | 是否需要 ref | 长度归一化 | 适用 |
|---|---|---|---|---|
| DPO | KL-RL 闭式解 + BT | ✓ | ✗ | 主流场景 |
| IPO | DPO 用平方损失防过拟合 | ✓ | ✗ | 数据量小、想稳 |
| KTO | 单点偏好 | ✓ | ✗ | 没有 pairwise 标注 |
| ORPO | SFT + odds ratio | ✗ | ✗ | 显存极限 |
| SimPO | 平均 logp 去长度偏差 | ✗ | ✓ | 长度偏差严重 |
D.2 选型指南
- 首选 DPO:90% 场景的默认选择
- 数据量小 (< 1万对):选 IPO,更稳
- 没有 pairwise 数据:选 KTO
- 极限显存:选 ORPO 或 SimPO(不需要 ref model)
- 想要 online 探索:用 Iterative DPO
D.3 常见面试题
Q1:DPO 怎么从 KL 约束 RL 推导出来的?
- 第一步:写出 KL 约束 RL 的拉格朗日 → 闭式解 $\pi^* = \frac{1}{Z}\pi_{\text{ref}}\exp(r/\beta)$
- 第二步:反解 $r = \beta \log(\pi^*/\pi_{\text{ref}}) + \beta \log Z$
- 第三步:代入 BT 模型,$\log Z(x)$ 在差中消去
- 第四步:MLE → DPO 损失
Q2:DPO 的 $\beta$ 起什么作用?
- 数学上:原 RL 目标里的 KL 强度系数
- 直觉上:控制 policy 偏离 reference 的程度
- $\beta$ 大 → 接近 ref(保守)
- $\beta$ 小 → 激进对齐(容易过拟合)
Q3:为什么 DPO 不需要采样?
- 数据集 $(x, y_w, y_l)$ 已经预先准备好
- DPO loss 只需要在 $y_w$ 和 $y_l$ 上计算 logp,不需要 model.generate()
- 这是 DPO 比 PPO 工程门槛低的根本原因
Q4:DPO 的 reference 一定要是 SFT 模型吗?
- 不一定,但必须是和偏好数据”分布匹配”的模型
- 如果偏好数据来自 SFT 模型的输出,reference 就用 SFT
- 如果偏好数据来自其他源,需要谨慎处理 distribution shift
承上启下
DPO 把”经典 RLHF”工程化成了纯监督学习,是 2024–2026 年 LLM 对齐的主流路径。但它仍有局限:
- 离线限制:无法探索 RM 边界(PPO 能)
- 依赖偏好数据质量:好数据贵
- 不适合纯客观奖励的场景(如数学题对错)
下一章 Ch8 进入”推理时代”,看 GRPO / PRM / RLAIF 如何分别解决这三个问题:
- GRPO:去掉 Critic 的 PPO 简化版,DeepSeek-R1 同款
- PRM:对推理过程每一步打分(不只看最终答案)
- RLAIF / Constitutional AI:用 AI 反馈替代人类标注,规模化生成偏好数据