DPO
Direct Preference Optimization(直接偏好优化)
DPO 是一种直接用偏好数据训练语言模型的方法。它不再显式训练奖励模型,也不再用 PPO 这类强化学习算法去优化策略,而是把“偏好优化”直接改写成一个简单的二分类损失。
经典 RLHF 可以理解成“带 KL 约束的奖励最大化”;而在这个问题里,最优策略和奖励之间存在一个闭式关系。利用这个关系,就可以把原本的“奖励建模 + 强化学习”两阶段过程,直接改写成一个策略上的偏好损失。
所以,DPO 经常被概括为:
不显式训练奖励模型的偏好优化。
但这句话还不够精确。更准确地说是:
DPO 把奖励隐含进策略和参考策略的对数比值里。
这也是论文标题里那句“你的语言模型其实是奖励模型”的含义。
DPO 处理的数据长什么样
DPO 的训练数据通常是成对偏好数据:
这里:
是提示词; 是更被偏好的回答,也就是偏好回答; 是不被偏好的回答,也就是非偏好回答。
也就是说,标注者不一定要给一个绝对分数,而只需要回答一个问题:
在同一个提示词下,这两个回答谁更好?
这和很多 RLHF 工作里的偏好数据形式是一样的。经典 RLHF 里也常先收集成对偏好数据,再训练奖励模型。
为什么会有 DPO
在经典 RLHF 里,常见流程通常是:
- 先做 SFT,得到一个初始参考模型;
- 收集偏好数据,训练奖励模型;
- 再用 PPO 等强化学习算法,让策略去最大化奖励,同时别偏离参考模型太远。
这套流程的优点很明显,但它也有几个常见问题:
- 流程比较长;
- 要单独训练奖励模型;
- 再做 PPO 时还要处理采样、KL 惩罚、价值函数、优势函数等问题;
- 工程实现和超参都更复杂。
DPO 的出发点不是否定 RLHF 的目标,而是说:
能不能保留“偏好对齐”这件事本身,但把优化过程写得更简单?
RLHF 在优化什么
为了看懂 DPO,先看经典 RLHF 的一个标准目标。
对一个提示词
它的含义很直观:
- 一方面,希望回答的奖励更高;
- 另一方面,希望新策略不要离参考策略太远。
这里的
DPO 原论文明确把强化学习微调阶段写成这个带 KL 约束的奖励最大化形式。
TIP
回答要更符合人类偏好,但不要为了讨好奖励模型把原模型能力搞坏。
这里
关键一步:固定奖励时,最优策略长什么样
这是 DPO 最核心的一步。
先固定某个提示词
对这个提示词,我们想优化:
并满足概率分布约束:
这时可以写拉格朗日函数:
对
移项可得:
其中
两边取指数:
再把归一化常数写成
其中
在带 KL 约束的奖励最大化里,最优策略等于参考策略乘上一个奖励的指数权重,再做归一化。
TIP
这个式子表明:最优策略 = 参考策略 × 奖励的指数加权。
如果某个回答奖励高,那么:
就大,于是这个回答在新策略里的概率会被抬高。
如果奖励低,它的概率就不会被抬高,甚至相对变低。
从最优策略反推出奖励
上式还可以反过来写。
从
出发,移项并取对数:
这说明:
只要给定一个参考策略
,奖励和策略的对数比值之间是可以互相对应的。
如果一个回答在新策略下比参考策略更容易出现,那么它隐含的奖励就更高。
论文进一步指出,在 Bradley–Terry / Plackett–Luce 这类偏好模型下,奖励本身存在一个“只差一个与
TIP
所以 DPO 不再单独训练奖励模型,而是用这个东西当隐式奖励:
对于:
表示“当前模型相对于参考模型,到底有多偏向这个回答”。
如果这个值大,说明当前模型比参考模型更喜欢这个回答。
如果这个值小,说明当前模型比参考模型更不喜欢这个回答。
偏好模型怎么写
有了奖励函数以后,一个最常见的偏好假设是 Bradley–Terry 模型。
对于同一个提示词
它也可以写成 sigmoid 形式:
其中
这是很多奖励建模工作的标准写法。
偏好回答比非偏好回答好多少,取决于二者奖励的差距。
TIP
如果:
很大,那么 sigmoid 接近 1,表示模型认为偏好回答确实更好。
如果这个差值很小,sigmoid 接近 0.5,表示模型分不清谁更好。
如果差值是负的,说明模型反而认为非偏好回答更好,那就错了。
把奖励换成策略以后会发生什么
现在把前面那条奖励重参数化代进去:
那么偏好回答和非偏好回答的奖励差值就是:
这里
于是偏好概率变成:
这一步就是 DPO 最关键的“魔法”:
本来要先学奖励,再拿奖励去优化策略;现在直接把偏好概率写成了策略本身的函数。
这个差值可以理解成:
当前模型相对参考模型对偏好回答的提升,减去当前模型相对参考模型对非偏好回答的提升。
DPO 的损失函数
既然上面已经得到了“偏好概率”的表达式,那就可以直接做最大似然训练。
于是 DPO 的目标写成:
这就是论文里的核心公式。
如果把中间那部分单独记成一个间隔:
那么 DPO 损失就只是:
所以从优化形式上看,DPO 很像一个成对逻辑分类损失。
它并不是单纯要求:
提高偏好回答的概率,降低非偏好回答的概率。
它真正要求的是:
让偏好回答相对于参考模型的提升,要大于非偏好回答相对于参考模型的提升。
这和普通 SFT 很不一样。
如果只对偏好回答做 SFT,模型只会学:
- 偏好回答要更像训练数据;
- 但非偏好回答到底该如何处理,并没有被直接写进目标。
而 DPO 会同时看偏好回答和非偏好回答,并明确要求二者之间拉开差距。
所以 DPO 的核心不是“模仿偏好回答”,而是:
学会偏好回答胜过非偏好回答。
为什么 DPO 里一定要有参考模型
DPO 损失里有一个非常关键的对象:
它通常就是 SFT 模型,或者一个固定的初始策略。
它的作用至少有三层。
第一,它给出了“偏好优化之前,模型原本会怎么回答”的基准。
DPO 优化的不是绝对概率,而是相对于这个基准的变化。
第二,它把 DPO 和“带 KL 约束的奖励最大化”联系了起来。
没有参考模型,就没有上面那条最优策略的闭式解,也就没有 DPO 的理论来源。
第三,它还能起到一种“别跑太远”的作用。
因为 DPO 学的不是无限制地把偏好回答概率抬高,而是围绕参考模型来做相对调整。
论文也明确建议,当有 SFT 模型时就把
到底控制什么
在 DPO 里,
从理论推导上看,它来自前面的 KL 正则化强化学习目标,因此它和“偏离参考模型的强弱”有关。
从损失的形式上看,它直接缩放了偏好回答 / 非偏好回答的对数比值差异:
所以可以这么理解:
控制 DPO 更新有多激进。
它太小,偏好信号会变弱;
它太大,训练会更激进,也更容易不稳定。
实际训练里,
更稳妥的表述是:
决定“遵守偏好数据”和“贴近参考策略”之间的权衡强度。
DPO 的梯度直觉
论文还给出了一个很有启发性的梯度形式。
记隐式奖励为
那么梯度可以写成一种很直观的形式:
可以这么解读:
- 如果模型已经明显更偏好
,那么这一对样本的权重会变小; - 如果模型还把
排得太高,那么这一对样本的权重会变大; - 梯度方向会提高
的概率,同时压低 的概率。
所以 DPO 并不是“所有 pair 一视同仁”,而是:
模型当前排错得越厉害,那一对 pair 的更新权重越大。
这也是它比“只对偏好回答做 SFT”更像真正偏好学习的地方。
序列级概率在实现里怎么计算
在语言模型里,回答
所以 DPO 实现时,通常会:
- 把提示词
和回答 拼起来; - 只对回答部分的 token 计算对数概率;
- 把这些 token 的对数概率求和,得到
; - 对偏好回答和非偏好回答分别算一次;
- 再代入 DPO 损失。
因此,虽然 DPO 的公式写在“序列级”上,但底层仍然是语言模型的 token 级对数概率在起作用。
DPO 和 SFT 的区别
SFT 的目标通常是:
它的核心是:
给定一个标准答案,尽量把它拟合好。
DPO 则不是只看一个答案,而是看一对答案
所以:
- SFT 更像模仿学习;
- DPO 更像成对偏好学习。
如果一句话概括:
SFT 教模型“参考答案长什么样”,DPO 教模型“在两个回答里哪个更好”。
DPO 和经典 RLHF 的区别
DPO 和经典 RLHF 的目标并不是完全不同。
更准确地说,DPO 试图在同一个偏好学习问题上,绕开显式奖励模型和 PPO。
经典 RLHF 通常是:
- 先训练奖励模型;
- 再用 PPO 最大化奖励 - KL。
DPO 则是:
- 直接把奖励通过策略概率比隐式参数化;
- 用一个成对逻辑损失直接训练策略。
所以 DPO 的最大特点不是“完全不关心奖励”,而是:
奖励不再作为一个独立网络显式存在,而是被吸收到策略相对于参考模型的对数比值里。
这也是为什么 DPO 经常被叫作“无强化学习的偏好优化”。
但要注意,它不是“没有 RLHF 理论背景”,而恰恰是从 KL-constrained RLHF 目标推出来的。
一个简化的训练流程
DPO 的训练流程通常可以概括成下面几步:
- 先有一个参考模型,通常是 SFT 模型;
- 准备偏好数据
; - 对偏好回答和非偏好回答分别计算策略对数概率;
- 用参考模型算对应的参考对数概率;
- 计算 DPO 间隔;
- 最小化 DPO 损失。
这也能看出 DPO 的一个工程优势:
训练时不需要在线采样,不需要采样轨迹,不需要价值模型,也不需要 PPO 的整套强化学习机制。
你的语言模型其实是奖励模型
DPO 里定义的隐式奖励是:
它说明:
如果某个回答在当前策略下相对参考模型被大幅抬高,那么它的隐式奖励就高;
如果某个回答相对参考模型被压低,那么它的隐式奖励就低。
也就是说,策略本身就已经在“编码”一个奖励排序。
这正是论文标题的意思:
语言模型本身就可以被看成一个隐式奖励模型。
DPO 的优点
DPO 之所以流行,很大程度上是因为它有几条非常实际的优点。
第一,训练流程更短。
它绕开了显式奖励模型 + PPO 的两阶段后训练。
第二,实现更简单。
本质上就是一个监督式的成对损失。
第三,训练通常更稳定。
至少在工程上,它不需要处理 PPO 里那些更麻烦的采样轨迹、价值函数、优势函数、KL 调节细节。
第四,它能直接复用离线偏好数据。
DPO 原论文也明确强调,可以直接重用已有偏好数据集,而不一定要重新采样再标注。
DPO 也不是没有边界
虽然 DPO 很好用,但它也不是“免费午餐”。
第一,它依然高度依赖偏好数据质量。
如果偏好回答 / 非偏好回答本身噪声很大,DPO 也会学歪。
第二,它仍然依赖参考模型。
参考模型太弱、分布偏太多,都会影响训练效果。
第三,它不是说“完全没有奖励过优化风险”。
只是它把问题换了一种形式来做。
第四,它优化的是成对偏好,不是绝对真实价值。
所以本质上它仍然是在拟合“谁比谁更好”,而不是学到一个完美的通用目标函数。
总结
带 KL 约束的 RLHF 目标:
固定奖励时的最优策略:
隐式奖励:
DPO 损失:
DPO 的核心思想是:在经典 RLHF 的 KL 正则化奖励最大化里,最优策略和奖励之间存在一个闭式关系。
利用这条关系,可以把原本需要“奖励建模 + PPO”的偏好学习问题,直接改写成一个成对逻辑损失。
于是,模型不再显式学习奖励函数,而是通过相对于参考策略的对数概率比值,隐式表示奖励。
最终的训练目标不再是“单独把偏好回答拟合好”,而是“让偏好回答相对非偏好回答更符合人类偏好”。
DPO = 把 RLHF 里的偏好优化,直接改写成策略上的成对分类损失。