AI++
安全对齐·进阶·9 分钟阅读·AI++ 编辑部

DPO:绕过奖励模型,直接从偏好数据优化策略

DPO(Direct Preference Optimization)把 RLHF 的「训奖励模型 + 跑 RL」两步,压缩成「直接在偏好数据上做监督学习」一步。 它的数学核心是:最优策略可以用奖励函数闭式表达,于是奖励被策略隐式定义,RL 循环整个消失。 上手简单、训练稳定,是当前最流行的对齐方法之一;但它不是 RLHF 的等价替代,有自己的边界。

一句话结论

DPO 用一个数学恒等式证明了「最优 RLHF 策略」可以由奖励函数闭式写出,于是奖励函数反过来也能被策略表达——这意味着你不再需要单独训一个奖励模型、也不需要跑 PPO,直接在「A 比 B 好」的偏好对上做类监督学习就能完成对齐。

背景问题

经典 RLHF(以 InstructGPT 为代表)分三步:

  1. SFT:用指令数据微调一个初始策略。
  2. 训练奖励模型(RM):让人标注「回答 A 比回答 B 好」的偏好对,训一个回归模型预测奖励分数。
  3. 跑 PPO:把 RM 当环境,用强化学习最大化奖励,同时加 KL 约束防止跑飞。

这套流程有效,但工程上极其痛苦:

  • 三套模型同台:policy、reward model、reference model,外加 PPO 还要个 critic,显存压力巨大。
  • RM 容易被 hack:policy 会找到 RM 评分高但实际差的回答(reward hacking)。
  • PPO 不稳定:学习率、KL 系数、clip 范围一堆超参,调不好就崩。
  • 数据效率低:RM 训完才有信号,中间隔了一层。

Stanford 团队问了一个反直觉的问题:第二、三步能不能合并、甚至一起干掉? 答案是能,关键在于重新看 RLHF 的目标函数。

核心思路

RLHF 的最终目标是最大化 KL 正则化的奖励:

$$ \max_{\pi}\ \mathbb{E}{x\sim\mathcal{D},,y\sim\pi(\cdot|x)}\big[r(x,y)\big] - \beta,D{KL}\big(\pi(\cdot|x),|,\pi_{\text{ref}}(\cdot|x)\big) $$

这个目标有闭式最优解

$$ \pi^*(y|x) = \frac{1}{Z(x)}\pi_{\text{ref}}(y|x)\exp!\left(\frac{1}{\beta}r(x,y)\right) $$

其中 $Z(x)$ 是配分函数(与 $y$ 无关)。把上式反过来解 $r$:

$$ r(x,y) = \beta\log\frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta\log Z(x) $$

这就是 DPO 的全部魔法:奖励函数被最优策略和参考策略的对数比显式表达出来了。$Z(x)$ 这一项在偏好对比里会消掉(见下),所以根本不用算它。

接下来把奖励模型那步也省掉。奖励模型本来是用 Bradley-Terry 模型从偏好对 $(y_w, y_l)$ 学的:

$$ p(y_w \succ y_l \mid x) = \sigma\big(r(x,y_w) - r(x,y_l)\big) $$

把上面 $r$ 的表达式代进去,$Z(x)$ 相减消掉,得到:

$$ p(y_w \succ y_l \mid x) = \sigma!\left(\beta\log\frac{\pi(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta\log\frac{\pi(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right) $$

直接对这个概率做极大似然,就得到 DPO 损失

$$ \mathcal{L}{\text{DPO}} = -\mathbb{E}{(x,y_w,y_l)}\log\sigma!\left(\beta\log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta\log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right) $$

没有奖励模型、没有 PPO、没有 critic、没有 rollout——就是一个二分类交叉熵,输入是两段回答的「对数概率比」之差。

关键技术点

1. 「策略即奖励模型」的重新参数化

DPO 最反直觉的地方是:训练时你以为在学策略,实际上是在隐式学一个奖励函数;而这个奖励函数又恰好等于策略自身的对数比。这种「自指」结构让它免去了显式 RM。

2. 参考模型锚定一切

$\pi_{\text{ref}}$ 在 DPO 里既是 KL 的锚点,也是奖励的零点。换参考模型,整个奖励 landscape 就变了。实践中 $\pi_{\text{ref}}$ 通常是 SFT 后的模型——它定义了「不偏」的状态。

3. $\beta$ 是唯一的「超参主轴」

$\beta$ 控制 KL 的强度,也是 DPO 里最关键(几乎唯一需要认真调)的超参:

  • $\beta$ 太大 → 模型不敢动,学不到偏好;
  • $\beta$ 太小 → 模型漂离参考模型太远,可能过拟合偏好数据、generalize 变差。

典型取值在 0.1~0.5 之间,不同任务差异大,需要按验证集调。

4. 损失梯度有「自适应」特性

DPO 的梯度天然带一个有趣的性质:当模型已经把 $y_w$ 放得比 $y_l$ 高很多时,sigmoid 接近饱和,梯度自动变小;反之差距小的地方梯度大。这种自适应让训练比 PPO 平稳得多,这也是它「好用」的主因之一。

5. 推理时无额外开销

训完之后,模型就是普通的 next-token predictor,推理时不需要任何额外组件——没有 RM 打分、没有拒绝采样。部署成本和 SFT 模型完全一样。

效果与局限

效果:

  • 原论文在 TL;DR 摘要、IMDb 情感控制等任务上,DPO 达到甚至超过 PPO,且训练时间和超参敏感度都大幅改善。
  • 自 2023 下半年起,DPO 几乎成为开源社区对齐的默认选择——Llama-2/3 的社区微调、Zephyr、许多小模型的对齐版都用了 DPO 或其变体。
  • 训练 pipeline 极简:偏好数据 → 直接 SGD,几行代码就能跑。

局限:

  • 完全 off-policy。DPO 用的是「已经采好的」偏好数据,不会因为策略变化而重新采样。PPO 是 on-policy 的,能持续探索新回答。这意味着 DPO 的样本上限就是数据集质量上限,不能发现数据里没有的好回答
  • 容易过优化 / 退化。$\beta$ 调不好或数据有偏时,模型会变得「过于自信」地把 $y_w$ 概率推高、$y_l$ 推到接近 0,导致通用能力下降(所谓 DPO 退化)。后续的 IPO、SimPO、KTO 等都是针对这个问题的改进。
  • 假设 Bradley-Terry。即偏好可被一个标量奖励完全建模,且偏好关系传递。人对复杂回答的判断不总满足这个假设。
  • 不适合「过程奖励」场景。DPO 是 outcome-level 的(整段对比),对需要细粒度过程监督的数学/代码推理,不如 PRM + GRPO/PPO 直接。

谁该关心

  • 做对齐微调的工程师:如果你的奖励可验证性弱、数据量中等、没有跑 PPO 的算力,DPO 是性价比最高的起点。
  • 小模型 / 端侧模型团队:DPO 训完即用、推理无负担,是端侧对齐的优选。
  • 研究对齐算法的人:DPO 之后衍生出 IPO、KTO、SimPO、ORPO 等一大族方法,理解 DPO 是理解整条线的前提。
  • 被 PPO 折磨过的人:哪怕最终仍要用 RL,先用 DPO 跑一版基线,能让你快速判断「问题出在数据还是出在 RL」。

一个常被忽略的提醒:DPO 不是 RLHF 的「等价压缩」,而是一种不同的目标函数。它在简单偏好上好用、稳定,但在需要探索、需要过程奖励、需要 reward model 可解释性的场景里,PPO 仍有不可替代的位置。把它们看成互补工具,而不是替代关系。

对齐偏好学习RLHF监督学习