技术博客

DPO 推导:从 RLHF 目标到闭式解,奖励模型是怎么被消掉的

第 147 / 147 篇 · 2026-09-06 · ai · DPORLHF对齐

DPO(Direct Preference Optimization,Rafailov et al., 2023)最迷人的地方是它的推导:RLHF 需要奖励模型加 PPO 两个训练阶段,DPO 用一个恒等变形把奖励模型从整个流程里消掉了,最后剩下的损失函数可以直接在偏好数据上做监督式训练。这篇文章把这条推导链完整走一遍,每一步说明动机。

两条对齐流水线:DPO 把奖励模型和 PPO 从流程里恒等消去 RLHF SFT 模型 π_ref 偏好数据对 训练奖励模型 RM PPO 采样 + KL 约束 π_θ 显存常驻 4 个模型(policy / ref / RM / critic)+ rollout 采样流水线 DPO π_θ 与冻结的 π_ref 偏好数据对 闭式偏好损失(监督式) π_θ 显存 2 个模型,训练循环与普通 SFT 相同

起点:RLHF 真正在优化什么

RLHF 的强化学习阶段,目标不是裸的最大化奖励。设策略 $\pi_\theta(y|x)$(正在训练的模型),参考模型 $\pi_{\text{ref}}$(SFT 后冻结的副本),奖励函数 $r(x,y)$,目标是

$$ \max_{\pi}\; \mathbb{E}_{x,\,y\sim\pi}\big[r(x,y)\big] - \beta\,\mathrm{KL}\big(\pi(y|x)\,\|\,\pi_{\text{ref}}(y|x)\big). $$

KL 项不可或缺:奖励模型只是在偏好数据上拟合出来的代理,离 $\pi_{\text{ref}}$ 越远,它的分数越不可信(reward hacking 的温床);KL 惩罚把策略钉在参考模型附近的可信域里。$\beta$ 控制这个钉子的松紧。

关键一步:这个目标有闭式最优解

把 KL 展开,对固定的 $x$(下面省略 $x$ 的条件记号):

$$ \mathbb{E}_{y\sim\pi}[r(y)] - \beta\,\mathbb{E}_{y\sim\pi}\left[\log\frac{\pi(y)}{\pi_{\text{ref}}(y)}\right] = \mathbb{E}_{y\sim\pi}\left[r(y) - \beta\log\frac{\pi(y)}{\pi_{\text{ref}}(y)}\right]. $$

我们要在"$\pi$ 是合法分布"的约束下逐点最优。把括号里的奖励除进对数里,配出一个新分布的形状:定义

$$ Z = \sum_y \pi_{\text{ref}}(y)\,e^{r(y)/\beta}, $$

则目标可以改写成

$$ -\beta\,\mathrm{KL}\!\left(\pi \,\middle\|\, \frac{1}{Z}\pi_{\text{ref}}e^{r/\beta}\right) + \beta\log Z. $$

验证:展开右边 KL 项,$\log Z$ 项与 $\beta\log Z$ 抵消后回到原目标。既然 KL 散度非负、且在两个分布相等时取零,最优策略直接读出:

$$ \pi^*(y|x) = \frac{1}{Z(x)}\,\pi_{\text{ref}}(y|x)\,e^{r(x,y)/\beta}. $$

直觉很美:最优策略就是参考模型按奖励的指数再加权,$\beta$ 扮演温度——$\beta$ 小则激进地向高奖励集中,$\beta$ 大则贴近参考模型。RLHF 里 PPO 那套复杂的采样、优势估计、clip,本质上都是在逼近这个已知的闭式解。既然如此,为什么不绕过它?

反解奖励:恒等变形的核心

对闭式解两边取对数,解出 $r$:

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

这就是"奖励的隐式参数化":任何一个策略 $\pi$ 都隐式定义了一个奖励函数(差一个只依赖 $x$ 的归一化项)。PPO 用策略去逼近 $\pi^*$;DPO 反过来,把这个关系当成 $r$ 与 $\pi$ 之间的字典,把奖励模型整个替换掉。

代入 Bradley-Terry:$Z(x)$ 恰好消掉

偏好数据的形式是三元组 $(x, y_w, y_l)$:同一提示下,$y_w$ 是被偏好的回答,$y_l$ 是被拒绝的。Bradley-Terry 模型假设人类偏好的概率由奖励差决定:

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

$\sigma$ 是 sigmoid。把上一步反解出的 $r$ 代入,奖励差是

$$ r(x,y_w) - r(x,y_l) = \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)}, $$

两项里的 $\beta\log Z(x)$ 相消——这就是为什么逐点配分函数不需要计算,也是整个推导得以落地的技术枢纽($Z(x)$ 要对整个回答空间求和,根本算不起)。

现在把 $\pi^*$ 换成正在训练的 $\pi_\theta$,对偏好数据做最大似然,DPO 损失出炉:

$$ \mathcal{L}_{\text{DPO}} = -\mathbb{E}_{(x,y_w,y_l)}\left[\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)\right]. $$

这个损失在做什么

定义对数概率比 $\hat r_\theta(y) = \beta\log\frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}$,它是"策略相对参考模型的改进量"。DPO 损失就是

$$ -\log\sigma\big(\hat r_\theta(y_w) - \hat r_\theta(y_l)\big), $$

要求被偏好回答的隐式奖励高于被拒绝的。注意它不是简单地"提高 $y_w$ 的概率":$\log\pi_\theta(y_w)$ 上升和 $\log\pi_\theta(y_l)$ 上升同样多,比值不变、损失不降——DPO 拉开的是相对参考模型的差距之差。看梯度更清楚,令 $u = \hat r_\theta(y_w)-\hat r_\theta(y_l)$:

$$ \nabla_\theta \mathcal{L} = -\beta\,\sigma(-u)\left[\nabla_\theta\log\pi_\theta(y_w|x) - \nabla_\theta\log\pi_\theta(y_l|x)\right]. $$

权重 $\sigma(-u)$ 是"当前犯错程度":分错得越厉害,更新越狠;已经分对($u$ 很大)的样本梯度趋零。DPO 自带按错误程度加权的课程。

用一组数字感受这个机制。设 $\beta=0.1$,某样本上策略对 $y_w$ 的相对对数概率比为 $\log\pi_\theta(y_w) - \log\pi_{\text{ref}}(y_w) = 2$,对 $y_l$ 为 $5$,则 $u = 0.1\times(2-5) = -0.3$,$\sigma(-0.3)\approx 0.43$——梯度权重接近一半,说明模型把被拒绝的回答排在了前面,狠狠更新。若训练推进到 $u=2$,$\sigma(-2)\approx 0.12$,更新自然放缓。这个自调节性质是 DPO 训练曲线通常平稳的原因,也是它比 PPO 少一坨超参的深层理由:PPO 的 clip 阈值、优势归一化、价值损失系数,干的也是"控制更新幅度"这件事,只是用机制而不是用数学自动完成。

推导里藏着的三个前提

干净的推导容易让人忘了它踩在什么地基上,这里把隐含前提挖出来晾一晾。

$y$ 是序列,$Z(x)$ 是天文数字。 配分函数要对整个回答空间求和,这个空间随长度指数膨胀,$Z(x)$ 连近似都算不起。推导能落地,全靠 Bradley-Terry 模型只含奖励差 $r_w - r_l$——任何把偏好概率写成奖励差的函数的建模方式都能让 $Z(x)$ 相消;换成依赖奖励绝对水平的偏好模型,这条恒等变形立刻失效。DPO 和 BT 模型是捆绑销售的。

$\pi_{\text{ref}}$ 必须冻结。 反解 $r$ 那一步把参考模型当作固定参照物,隐式奖励的定义域就锚在它上面。工程上有人想让参考模型同步更新(边训边蒸馏),在 DPO 框架下这会直接破坏推导;要动参考模型就得换框架,比如 ORPO 干脆把 ref 整个扔掉。

隐式奖励住在策略的函数类里。 $r$ 被参数化为 $\beta\log(\pi_\theta/\pi_{\text{ref}})$,表达能力受限于"能用对数概率比表示的奖励",而显式奖励模型是独立网络,可以学任意形状的打分函数。更要紧的是,对数概率比是逐 token 求和的,序列长度直接进入隐式奖励——标注者若系统性偏好长回答,这个偏好会被原样编码进策略,长度偏差不是实现 bug,是结构自带的。看清这三个前提再回头读 IPO、KTO、SimPO 那一谱系变体,就能认出它们各自在松哪根钉子。

代价与边界

绕过奖励模型不是没有代价。DPO 的隐式奖励被参数化为 $\beta\log(\pi_\theta/\pi_{\text{ref}})$ 的形式,表达能力受限于"能用对数概率比表示的奖励";显式奖励模型可以学任意函数。另外 $Z(x)$ 的消去依赖 Bradley-Terry 这个偏好模型本身,偏好数据里的混杂因子(比如标注者偏好长回答)会原样进入策略——长度偏差就是这么来的,这也是为什么后续有 IPO、KTO、SimPO 一整个修正谱系。但推导链本身干净得罕见:从 RL 目标到监督损失,只用了配平方和一次取对数。

工程上的对比也值得算一笔。PPO 阶段的 RLHF 需要同时在显存里放四个模型:训练中的策略、冻结的参考模型、奖励模型、以及 PPO 的 critic;还要维护 rollout 采样流水线。DPO 只需要策略加参考模型两个,训练循环就是普通的监督式前向反向,一份偏好数据一条损失。对 7B 规模,这是"需要一整套 RL 基础设施"和"改改 SFT 脚本就能跑"的差别,DPO 能迅速普及,一半功劳在这条推导,另一半在工程成本的断崖。

$\beta$ 的取值是实践中最敏感的旋钮:论文默认 0.1,值越小 KL 约束越松、策略离参考模型越远、对偏好数据拟合越狠,但也越容易过拟合到数据噪声上;值大则保守,学不动。配合上面的梯度分析看,$\beta$ 同时缩放了梯度幅度,所以它名义上是 KL 系数,实际还扮演学习率的一部分——调 $\beta$ 时学习率要联动考虑。

小结

DPO 的推导三步:带 KL 的 RL 目标有闭式最优解 $\pi^* \propto \pi_{\text{ref}}e^{r/\beta}$;取对数把 $r$ 反解成策略的对数概率比;代入 Bradley-Terry,配分函数相消,得到纯监督的偏好损失。奖励模型不是被近似掉了,而是被恒等变形消掉了。下次看到"DPO 训练很简单"时,值得记起这份简单是建立在这条推导之上的。