DPO 为什么能绕开强化学习:从 Bradley-Terry 偏好模型把直接偏好优化的损失一步步推出来
RLHF 的经典三段式(SFT → 训练奖励模型 → PPO 在线强化学习)效果扎实但工程繁琐,DPO 声称只用一个二分类损失就能直接对齐模型。本文不复述结论,而是把中间那步关键代换补全出来:在 KL 正则化的奖励最大化目标下,最优策略有闭式解 π_r(y|x) ∝ π_ref(y|x)·exp(r(x,y)/β),把这个奖励反解出来代回 Bradley-Terry 偏好似然,只依赖提示 x 的配分函数 β·log Z(x) 会整项约掉,最后剩下的恰好是一个只含策略与参考模型对数比的 sigmoid 损失。文中用 β=0.1 的数值例子说明:模型已经把 margin 拉开的样本会被隐式权重自动降权——这既是 DPO 的便利之处,也是它公认的软肋。
让一个已经会说话的大模型「说人话、按指令办事」,靠的不是接着做预训练,而是一个单独的对齐(alignment)步骤。这一步的行业标准做法叫 RLHF(reinforcement learning from human feedback,基于人类反馈的强化学习),它的经典配方是「先做监督微调 → 再训一个奖励模型 → 最后用强化学习把语言模型往高奖励方向推」。OpenAI 的 InstructGPT 论文把这条路的收益摆得很清楚:他们那篇论文的摘要里写,1.3B 参数的 InstructGPT,其输出被人类评测者偏好的比例高于 175B 的 GPT-3,尽管前者参数少了约两个数量级(Ouyang 等,arXiv:2203.02155)。
但这条路的工程成本也不低:你要有采样、要有奖励模型、要调 PPO 的一堆超参,还要随时提防强化学习把语言模型训崩。2023 年的一篇论文提出了一条捷径——直接偏好优化(Direct Preference Optimization,DPO)。它那句出圈的口号是「你的语言模型其实是个隐藏的奖励模型」(arXiv:2305.18290)。这篇论文的核心贡献,是把 RLHF 目标里「奖励函数」到「最优策略」的解析映射写了出来,于是整个强化学习问题被改写成一个简单的二分类问题。
本文不复述 DPO 有多好用,而是把那条「映射」一步步补全:奖励怎么被反解成两个模型的对数比、那个看起来碍事的配分函数为什么整项约掉、最后落下来的损失为什么正好是一个 sigmoid 的二分类损失、它的梯度里那个隐式权重又意味着什么。凡是引用他人结论处,一律标注一手出处(论文名 + 编号);凡是本文自己算出来的数字,在文末「本文自行推导」一节单列,与来源里的官方数字分列,不作官方口径引用。
一、直觉:RLHF 的三段式为什么让人头疼
先把 RLHF 的经典流程拆开看。以 InstructGPT 为例,它分三步(Ouyang 等,arXiv:2203.02155):
第一步是监督微调(SFT):拿人工写的「示范回答」去监督微调,让模型学会按指令作答的基本格式。
第二步是训练奖励模型(RM):对同一个提示,采样若干个模型回答,让人工把它们排序;再用这些成对比较数据,训一个「打分模型」,让它对更受偏好的回答给更高分。
第三步是用强化学习微调语言模型:把奖励模型当作环境里的奖励信号,用 PPO 之类的算法更新语言模型,让它生成更高奖励的回答;同时在目标里加一个 KL 惩罚项,防止语言模型为了骗高分而偏离原来的分布太远。
头疼的地方集中在第二、三步。奖励模型是一个代理目标:它只是人类偏好的一次近似,模型很容易学会去钻它的空子(reward hacking)。而第三步的在线强化学习要反复「采样 → 打分 → 更新」,采样成本高、方差大、超参敏感。DPO 的动机就是:既然奖励模型本身也只是个人类偏好的近似,能不能不要它,也不要在线强化学习,直接拿偏好数据去优化语言模型?
二、符号与约定
后文一律用下面这套记号,先统一,免得推导时混淆。
| 符号 | 含义 |
|---|---|
| 输入提示(prompt) | |
| 模型生成的整段回答(answer / completion) | |
| 同一提示下,人类标注中更偏好(winner)与更不偏好(loser)的两个回答 | |
| 正在训练的策略模型,参数为 | |
| 冻结的参考模型,通常是监督微调之后的模型 | |
| 给定奖励 时的最优策略(第五节给出其闭式解) | |
| 标量奖励函数;RLHF 里由一个参数化模型 拟合 | |
| KL 惩罚系数,越大表示越不允许策略偏离参考模型 | |
| logistic / sigmoid 函数 | |
| 配分函数(partition function),只依赖提示 | |
| Kullback–Leibler 散度 | |
| DPO 隐含的奖励,只由策略与参考模型的对数比给出 |
一句话概括这套记号里的主角:策略 是要训练的,参考模型 是冻住的,奖励 是我们要绕开的那一环。
三、形式化之一:把「人类偏好」写成一个概率模型
人类给出的是成对比较:对同一个提示,回答 A 比回答 B 好。要把它变成一个可优化的目标,需要一个把「标量分数差」映射到「A 胜过 B 的概率」的模型。RLHF 用的标准答案是 Bradley–Terry 模型:
它说的是:两个回答被偏好的概率,只取决于它们奖励分数的差。分数差越大,赢家胜出的概率越接近 1;分数相等时概率正好是 0.5。这一步在 RLHF 里被用来训奖励模型——把人类比较数据当成标签,用最大似然去拟合 。
注意一个关键前提:Bradley–Terry 只看同一提示内部的分数差。这意味着,如果两个奖励函数只在「同一个 上加了一个常数」上不同,它们给出的偏好分布完全一样。这个「只依赖 的常数项」在第五节会再次出现,并且正是它让 DPO 的推导得以成立。
这条用成对比较训奖励模型的路线,最早可以追溯到 Christiano 等把人类偏好用于深度强化学习的工作(arXiv:1706.03741),以及 Stiennon 等把它用于摘要任务的研究(arXiv:2009.01325)。
四、形式化之二:RLHF 的目标函数与 KL 约束
有了奖励模型,第三步要解决的是一个带约束的优化问题:让策略生成的回答拿高分,但又不许离参考模型太远。写成期望形式:
逐项读一下:第一项是「拿高分」,第二项是「别跑远」。 度量策略相对参考模型的分布偏移; 在这里可以理解为一个已经训好的(或隐式的)奖励函数。
为什么要加这个 KL 项?Hugging Face 在介绍 DPO 的官方博客里给了一个直白的解释:它相当于一个「锚」,防止模型为了最大化奖励而学歪、输出乱码或钻奖励模型的空子(Hugging Face Blog,2023-08-08,dpo-trl)。InstructGPT 的 PPO 目标里同样带这一项(Ouyang 等,arXiv:2203.02155)。
这个目标看起来需要「在策略分布上求期望」,直觉上必须靠在线采样加强化学习才能解。DPO 的第一个关键动作,是证明它其实有闭式解。
五、闭式最优策略:把最优解先解出来
先把目标里两项合并。利用 ,把上面的目标改写成对 的单一期望:
这等价于最小化方括号里的期望(乘正的常数 不改变极值点)。现在引入一个只依赖 的配分函数:
并据此定义一个分布:
注意 出现在分母上的作用,就是把这个式子归一化成一个合法概率分布(各项非负且求和为 1)。把它代回方括号里,做一个「乘 再除 」的小变换:
于是原目标等价于:
右边第二项 与 无关,是个常数。KL 散度非负、且当且仅当 时取 0。所以最优策略就是:
这个解的形状很值得记:最优策略 = 参考模型 × 奖励的指数加权,再做归一化。奖励越高、概率被抬得越多; 越大,指数里的 越被压平,策略就越贴近参考模型——这正好和「 是 KL 约束强度」的直觉对上。
六、DPO 损失:把奖励反解出来,代回偏好似然
闭式解里 是「给定奖励 时的最优策略」。DPO 要的是反方向:把 用 表示出来。对上一式取对数、移项:
这就是 DPO 的枢纽一步:奖励可以写成「策略与参考模型的对数比」加一个常数。而且那个常数 只依赖提示 ,不依赖回答 。
现在把它代回第三节的 Bradley–Terry 概率里。因为比较的两个回答共享同一个提示 ,两个 相减时整项约掉:
到这里,奖励模型 已经彻底消失,只剩策略和参考模型。把「最优策略」 换成我们要训练的参数化策略 ,再对数据集里的所有偏好对取负对数似然,就得到 DPO 的损失:
这就是整篇文章的落点。回头看这条路做了三件事:① 用 KL 正则化目标求出了最优策略的闭式解;② 把奖励反解成策略与参考模型的对数比,只相差一个「只依赖 的常数」;③ 把这个反解代回 Bradley–Terry 偏好似然,常数项因 相同而约掉,从而得到一个完全不需要奖励模型、也不需要在线采样的损失。
工程含义是直接的:训练时你只需要对每个偏好对做前向传播——一次过 算两个回答的对数概率,一次过冻结的 算同样的量,然后算上面的 sigmoid 二分类损失、反向传播即可。论文摘要里把它总结为:稳定、有效、计算轻量,微调期间不需要从语言模型采样,也不需要大量超参调优(Rafailov 等,arXiv:2305.18290)。
下面这张图把 RLHF 的三段式和 DPO 的单段式并排放在一起,说明 DPO 省掉的到底是哪几环。
flowchart TD
subgraph P["RLHF / PPO 三段式"]
A1["提示集 x"] --> A2["用 SFT 模型在线采样多个回答"]
A2 --> A3["人工标注成对偏好"]
A3 --> A4["训练奖励模型 r_phi"]
A4 --> A5["PPO 在线采样再更新策略 KL 惩罚"]
end
subgraph D["DPO 单段式"]
B1["提示集 x"] --> B2["离线偏好对 y_w 优于 y_l"]
B2 --> B3["前向算策略与参考模型的对数概率"]
B3 --> B4["二分类损失直接更新策略"]
end这张图说明了什么:RLHF 里「训练奖励模型」和「PPO 在线采样」两个方框,在 DPO 里被彻底去掉了——DPO 用固定的离线偏好数据,直接对策略做监督式的二分类优化。
第二张图单独展开 DPO 的损失是怎么由一批数据算出来的,澄清「二分类损失」这个词到底作用在哪一层。
flowchart LR
X["偏好样本 x y_w y_l"] --> P["策略 pi_theta 可训练"]
X --> R["参考模型 pi_ref 冻结"]
P --> LP["log pi_theta 算两个回答"]
R --> LR["log pi_ref 算两个回答"]
LP --> RW["对数比 beta 乘 pi_theta 比 pi_ref"]
LR --> RW
RW --> M["margin 等于赢家对数比减输家对数比"]
M --> S["sigmoid"]
S --> LOS["损失 负 log sigmoid"]
LOS --> U["反向传播更新 theta"]这张图说明了什么:从一条偏好样本出发,策略与参考模型各算一次对数概率,两两相减得到 margin,再经 sigmoid 得到二分类损失——整条链路里既没有奖励模型也没有采样,这正是「二分类损失」作用的位置。
第三张图把这条推导的骨架单独画出来:奖励与最优策略一一对应,而那个只依赖提示的常数项在成对比较中相消。
flowchart TD
R1["奖励 r 与最优策略 pi_r 一一对应"] --> R2["pi_r 正比于 pi_ref 乘 exp r 比 beta"]
R2 --> R3["反解 reward 等于 beta 乘对数比 加 常数"]
R3 --> R4["常数项只依赖提示 x"]
R4 --> R5["成对比较时同一 x 下相消"]
R5 --> R6["只剩含对数比的可优化目标"]这张图说明了什么:奖励和最优策略是同一个关系的两面——DPO 不是「没有奖励」,而是把奖励藏进了策略与参考模型的对数比里(所以论文标题说语言模型「其实是个奖励模型」);推导的关键就是那个只依赖 的常数项在成对比较里被约掉。
七、梯度解剖:那个隐式权重从哪来
光有损失还不够,得看它按什么方向推参数。对 求关于 的梯度,令隐式奖励
可以写成(符号 内为偏好差):
逐项读:括号里是「抬高赢家对数概率、压低输家对数概率」的方向;前面的权重
正是这个梯度里最需要留意的地方。当模型已经强烈偏好赢家( 是个较大的正数)时, 会趋近 0——也就是说,模型已经做对的样本,会被自动降权。反过来,模型当前判断错、或 margin 还很小的样本,权重接近 0.5,贡献最大。
这个设计有它的合理性(把学习注意力集中在还没学会的样本上),但也埋了 DPO 的一个公认软肋:损失里没有一个显式的、可标定的奖励项,模型对「已经正确的样本」的偏好可能会被过度压低,而不是被温和地维持。这一点在第八节的数值例子和第十六节的外部研究中都会再出现。
八、数值例子(本文自行推导)
为了把上面的公式变成可感的数字,本文取 (原论文多数实验的默认值),令
于是 margin ,损失 ,梯度权重 。下表四行是本文用这两个公式直接算出来的结果(不是任何论文的实验数据):
| margin | 损失 | 梯度权重 | |||
|---|---|---|---|---|---|
| 0.0 | 0.0 | 0.0 | 0.5000 | 0.6931 | 0.5000 |
| 2.0 | −2.0 | 0.4 | 0.5987 | 0.5130 | 0.4013 |
| 4.0 | −4.0 | 0.8 | 0.6900 | 0.3711 | 0.3100 |
| −0.5 | 0.5 | −0.1 | 0.4750 | 0.7444 | 0.5250 |
怎么读这张表:
- 第一行是从零起步:策略与参考模型对两个回答的判断完全一样(),margin 为 0,,损失就是 ,梯度权重 0.5——最「不知道」的状态,贡献最大。
- 第二、三行是模型逐渐把赢家抬高、把输家压低:margin 从 0 涨到 0.4 再到 0.8,损失从 0.6931 降到 0.5130 再到 0.3711;同时梯度权重从 0.5 掉到 0.4013、再到 0.3100。损失在降、权重也在降,正是「学会了的样本被自动降权」的量化体现。
- 第四行是模型学反了:它更偏好被标注为差的回答(),margin 变成负数,损失升到 0.7444(比第一行还高),梯度权重也升到 0.5250,方向会把它往回拉。
再看 的作用。同样取 ,把 从 0.1 换成 0.5,margin 从 0.8 变成 4.0, 从 0.6900 涨到 0.9820,损失从 0.3711 跌到 0.0181,梯度权重从 0.3100 掉到 0.0180。也就是说: 越大,同样的对数比变化能换到越大的 margin——模型只需偏离参考模型更少,就能把偏好拉开。这和第五节「 是 KL 约束强度」的结论一致: 大 = 更严格地贴着参考模型。
声明:本节表格与数字均为本文依据第六、七节的公式自行计算(计算工具为 Python 标准库),用的是假设出来的 ,不属于任何论文的实验结果,只用于说明公式行为。 取自原论文常见设置,具体取值以各任务实验为准。
九、对照表:RLHF-PPO / DPO / IPO / KTO / GRPO 各自在优化什么
把几个常被拿来和 DPO 比较的方法放在一起,能看清 DPO 的定位(各行结论均来自对应一手来源的摘要或正文):
| 方法 | 要不要奖励模型 | 训练信号 | 优化方式 | 是否需要在线采样 | 一手来源 |
|---|---|---|---|---|---|
| RLHF-PPO | 要(先训 ) | 成对偏好 | 在线强化学习 + KL 惩罚 | 需要 | arXiv:2203.02155 |
| DPO | 不要(奖励隐含在策略对数比里) | 成对偏好 | 二分类(sigmoid)损失 | 不需要 | arXiv:2305.18290 |
| IPO | 不要 | 成对偏好 | 用恒等变换替代对数变换 | 不需要 | arXiv:2310.12036 |
| KTO | 不要 | 二元「好/坏」标签(可不成对) | 前景理论效用 | 不需要 | arXiv:2402.01306 |
| GRPO | 不要(可用规则或模型奖励) | 组内相对优势 | PPO 的变体(省去价值网络) | 需要(组采样) | arXiv:2402.03300 |
这张表说明了什么:DPO 属于「reward-free / 离线」这一族——它和 RLHF-PPO 最大的分野不在损失函数形式,而在训练信号从哪来:PPO 要在线采样再由奖励模型打分,DPO 直接用固定的偏好对。
十、工程含义:β、参考模型、数据与常见误用
把推导落到实现层面,有几点值得单独拎出来。
怎么选。 原论文多数任务取 。由第八节可知, 越大越贴着参考模型、越小越允许偏离。常用的调参直觉:模型「不够听话」(对齐不足、需要更大偏离)就把 往小调;模型「带上了怪腔、丢了原有能力」(偏离过头)就把 往大调——方向别弄反, 越大越贴参考模型、能做的偏离越小。
参考模型必须冻结,且和策略用同一套预处理。 是整个方法的「标尺」,它一变,对数比的基准就变了。实操里最常见的坑是:策略和参考模型用了不同的对话模板(chat template)或不同的截断方式,导致对数比在算之前就已经错位。Hugging Face 的 TRL 文档明确要求每条样本含一个 prompt 加一个 chosen、一个 rejected,并对三者用同一分词器处理(Hugging Face TRL 文档,DPO Trainer,2026-10-07 访问)。
损失类型可换。 TRL 的 DPOTrainer 把 loss_type 暴露成一个选项:默认 sigmoid(即 DPO 原版,对归一化对数比做 logistic 回归);ipo 对应对数变换可能过拟合的修正;hinge 来自 SLiC/RSO 一族;exo_pair 是反向 KL 的偏好变体(Hugging Face TRL 文档,DPO Trainer)。换损失类型时, 的语义可能跟着变——文档对 hinge 就注明此时 beta 是 margin 的倒数,不能照搬 0.1。
数据必须是「同一提示下的成对」。 两个回答不同提示,Bradley–Terry 的推导前提就不成立。构造数据时要保证 chosen/rejected 共享同一个 prompt。
别把它当监督微调。 DPO 的目标是「拉开赢家与输家的对数比」,不是「让模型复述赢家」。TRL 文档里有一句观察值得记住:实践中它更多是通过压低不偏好回答的概率来实现的,而不是单纯抬高偏好回答的概率(Hugging Face TRL 文档,DPO Trainer)。
十一、回看闭式解:换一条路(拉格朗日)再推一遍做自验
第五节是用「配方 + KL 散度改写」推的闭式解。为了确认它没推错,这里换一条更机械的路:把它当成一个带归一化约束的优化问题,用拉格朗日乘子法再解一遍。
目标(对固定提示 ,为省记号把 隐含在 、 里)是
约束是 。引进只依赖 的乘子 ,构造拉格朗日函数:
对每个 求偏导。这里要用到一条基本导数:。令偏导为零:
移项解出 :
右边那个因子对同一个 是常数,由归一化条件 唯一确定;把它记作 ,就回到第五节的结果 。两条路结果一致,说明推导可信;顺带还看清了 的来历——它不是凭空定义的,而是归一化约束逼出来的。
一个附带的结论值得记住:目标函数对 是严格凹的(线性项 对 线性, 对 严格凹,两者之和严格凹),所以这个最优解是唯一的。这正是 DPO 敢把「最优策略」直接写成一个闭式表达式的前提——若最优解不唯一,「反解奖励」那一步就无从谈起。
十二、四种偏好损失的形式对比
把 DPO 的偏好差记成一个「logit」:
那么 DPO 的损失就是 。同一条流水线上的其他损失,差别几乎都只落在「拿 做哪种变换」。下表对照 Hugging Face TRL 文档对 loss_type 的说明,给出各变换的标准损失形式(TRL 文档只给定性描述,公式为本文按各自方法的常见写法转写):
loss_type | 对偏好差做的变换 | 损失形式 | 备注 |
|---|---|---|---|
sigmoid(DPO 原版,默认) | logistic | 对归一化对数比做二分类 | |
hinge(SLiC / RSO) | 铰链 | 文档注明此时 是 margin 的倒数,语义与 DPO 不同 | |
ipo(IPO) | 恒等 | 去掉对数变换,改为对偏好差做平方回归 | |
exo_pair(EXO) | 反向 KL | 偏好对的简化式(TRL 文档指向其 Eq.16) | 需 label_smoothing > 0,推荐 |
其中 IPO 的
就是不带 的对数比之差, 是它希望拟合的理想偏好差( 是正则强度)。这张表说明一件事:DPO 只是「用偏好差做二分类」这一族里的一个特例,换一个变换就得到另一套方法;而变换的选择会改变 的语义,所以「」不能无脑套到别的损失上。IPO 那篇论文的立论正是:DPO 里那个 logit(对数)变换可能过拟合,于是干脆换成恒等变换,让目标直接回归偏好差本身(arXiv:2310.12036)。
十三、常见误解速查
推导看完了,把几个最容易想歪的点集中纠正一下。
误解一:DPO 不需要奖励模型,所以就没有奖励。 错。由第六节,奖励以隐式形式
存在于目标里,只是不再单独训练一个模型去拟合它——论文标题那句「你的语言模型其实是个奖励模型」说的就是这个。
误解二:DPO 是监督微调,等于让模型复述赢家回答。 错。DPO 优化的是赢家与输家的对数比之差,并以参考模型为基线;TRL 文档还指出,实践中它常常是靠压低输家回答的概率来达成,而不是单纯抬高赢家。
误解三:DPO 不需要采样,所以训练时不需要任何前向计算。 错。「不需要在线采样」说的是不需要让模型现场生成再打分;每个偏好对仍要对策略和参考模型各做一次前向,算出两个回答的对数概率。
误解四: 是学习率。 错。 是 KL 约束强度(在偏好差里充当温度),与优化器的学习率是两回事:它决定策略偏离参考模型的程度,不决定参数更新的步长。
误解五:参考模型可以随便换。 错。训练中 必须冻结,且要与策略使用同一分词器与对话模板;否则对数比的基准错位,损失算出来就是错的。
误解六:既然 DPO 更简单,它一定比 PPO 好。 有争议。见第十六节:有综合研究发现 DPO 可能有根本局限,PPO 在某些任务上能反超。
误解七: 是万能默认。 不是。它来自 DPO 原论文的常见设置;换成 hinge 等损失时 的语义会变(见第十二节),照搬会调错。
误解八:隐式奖励可以直接当奖励模型复用。 不能。隐式奖励缺了「只依赖 的常数」,无法用于跨提示比较,也不能直接接到别的系统里当绝对打分。
十四、训练变体:迭代 DPO 与参考模型滚动更新
标准 DPO 是离线的:偏好数据集固定,训练过程中不再更新。这带来一个已知的分布问题——当策略更新到数据集覆盖不到的分布上时,损失里的隐式权重就不再是推导时假设的样子。社区因此发展出两类变体。
迭代 / 在线 DPO。 用当前策略重新生成候选回答、重新标注(或用一个奖励模型打分),构造贴近当前策略分布的新偏好对,再训一轮。它把「离线」补成「半在线」,代价是重新引入了生成与标注成本——绕了一圈又把 RLHF 的一部分开销拿了回来。
参考模型滚动更新(TR-DPO)。 TRL 文档里有一个 ref_model_mixup_alpha 参数(,默认 0.6),当 sync_ref_model=True 时按
更新参考模型,在「贴得住基线」与「跟得上策略」之间折中。这说明第五节那个「冻结参考模型」的假设,在实践中是可以让步的:把参考模型当作一个缓慢移动的锚,而不是一块死石头。
这两种变体都在试图回答同一个问题:离线 DPO 的参考模型与数据分布一旦和当前策略脱节,损失里那个隐式权重就不再是它推导时假设的形状。 记住这条,就能理解为什么「DPO 不需要采样」这个优点,在数据分布漂移时反而会变成限制。
十五、一次 DPO 训练步的完整清单
把前十四节压成一条可执行的流水线:一次前向 + 反向里,机器到底算了什么。下表是单个 mini-batch 的步骤清单(logp 表示对回答取的对数概率之和):
| 步骤 | 计算内容 | 是否带梯度 |
|---|---|---|
| 1 | 策略前向,得 、 | 是 |
| 2 | 参考前向,得 、 | 否(冻结) |
| 3 | 组隐式奖励 | 是(经 ) |
| 4 | margin | 是 |
| 5 | 损失 ,对 batch 取平均 | 是 |
| 6 | 反向传播,只更新 | — |
第 5 步的 batch 平均写成式子就是
其中 是这一批里偏好对的条数。
这张清单能解释三件工程上的事实。
其一,DPO 显存开销的大头是「要同时装下两个模型」:策略 与参考 都要常驻(参考那份不带梯度,但权重仍在)。这常被忽略,也是为什么中小显存上要配上 LoRA、或者对参考模型做量化。
其二,参考模型的对数概率可以预计算并缓存。因为 被冻结,对一份固定的偏好数据集, 与 在整个训练过程中都是常量——完全可以离线算一遍存起来,训练循环里就不再重复跑参考前向。这是把「两步前向」压掉一步的标准优化。
其三,只有 被更新, 一丝不动。这也是为什么前面反复强调参考模型要冻结、要和策略同模板:它一旦漂移,整条推导的基线就断了。
十六、边界与未解:DPO 的已知局限与争议
推导漂亮,不等于方法没有代价。以下几条都有独立来源支撑。
「DPO 一定优于 PPO」是有争议的。 有一篇专门做综合对比的论文(arXiv:2404.10719)在摘要里直接反问「Is DPO truly superior to PPO?」,结论是 DPO 可能存在根本性局限,并且在从对话到代码生成的多个测试台上,PPO 能够反超、在代码类任务上达到最好结果。这说明 DPO 的「简单」并不是无条件的优势。
推导里依赖了对数(logit)变换,这一步可能过拟合。 IPO 那篇论文(arXiv:2310.12036)指出,DPO 仍然依赖一个近似(把奖励映射成对数比的那套变换),并提出了更一般的 PO 目标来同时绕开两个近似;把 取成恒等就得到 IPO,作者报告在某些例子上优于 DPO。换句话说,DPO 不是这条路上的终点。
隐式奖励不可当独立奖励用。 由第六节, 只由对数比给出,而真正的奖励还要加上那个「只依赖 的常数」。这个常数在成对比较里约掉了,但在需要用奖励做跨提示比较、或把奖励接到别的系统里时,它是缺的——DPO 没有给你一个可标定的绝对奖励。
偏好不一定要成对。 KTO(arXiv:2402.01306)的出发点是:人类反馈未必是成对的,也可以是「这个回答好 / 那个回答差」的二元标签。它用一个基于前景理论(prospect theory)的效用,只用二元信号就能训练,据其摘要,在 1B 到 30B 尺度上匹配或超过偏好类方法。该论文还给出一个更宏观的结论:没有哪一族损失是普遍最优的,最好的损失取决于场景的归纳偏好。
分布偏移与过拟合。 因为 DPO 是在固定偏好数据上离线优化,数据一旦不能代表部署时的输入分布,它的效果就会打折;这和各 reward-free 方法的通病一样。本文第八节那个「已学会的样本被降权」的机制,在极端情形下也可能让模型把赢家的概率压得过低。
本文自己的边界。 第八节的数值例子里, 是人为指定的,只用来展示公式形状,不能读成「DPO 在某个模型上能降多少损失」。真正的效果必须以具体论文的实验为准。
十七、小结
DPO 的全部魔法,其实是三步代数:先在 KL 正则化的奖励最大化目标下求出最优策略的闭式解 ;再把奖励反解成策略与参考模型的对数比(只差一个只依赖提示 的常数 );最后代回 Bradley–Terry 偏好似然——由于成对比较共享同一个 ,这个常数整项约掉,奖励模型就此消失,剩下的正好是一个 sigmoid 的二分类损失。工程收益是「不训奖励模型、不跑在线强化学习、训练时不需要采样」;代价则是它把奖励隐藏成了不可标定的对数比,并且在数据分布之外的表现、以及相对 PPO 的优劣,都仍有公开争议。
理解了这三步,你既能看懂 DPOTrainer 里那几个参数为什么存在(、loss_type、参考模型),也能判断它什么时候不该用。
附一、把 DPO 损失读成「奖励模型目标」的一次换形
A. 奖励模型是怎么训出来的
回到第三节的 Bradley–Terry 模型。RLHF 的第二步之所以能训出一个奖励模型,靠的正是它的最大似然:把人类成对比较当成标签,让奖励模型给赢家打的分尽量高于输家。写成目标就是
这里 是一个自由函数:形状不受约束,参数 由数据学出来;训完之后它就是一个可复用、能给任意回答打分的奖励模型。
现在把 DPO 的损失照抄一遍,把里面那个「分数差」单独框出来:
B. 形状完全相同,只差「分数从哪来」
对比上面两个目标,会发现它们的形状一模一样:都是「对两个分数的差做 sigmoid,再在数据集上取负对数似然」。唯一的分野在于那两个分数从哪来——
- 奖励模型那一版:分数由一个自由函数 给出,需要单独训练;
- DPO 那一版:分数被钉死成 ,由策略与参考模型解析地给出,不需要单独训练。
所以 DPO 不是「没有奖励模型」,而是用一个由策略和参考模型解析决定的函数,替代了原本要单独训练的那个奖励模型。论文标题「你的语言模型其实是个奖励模型」,说的就是这层字面含义。
| 维度 | 奖励模型目标(RLHF 第二步) | DPO 损失 |
|---|---|---|
| 分数来源 | 自由函数 ,需训练 | 固定形式 |
| 是否需在线采样新回答 | 需要 | 不需要 |
| 梯度权重 | (同形) | |
| 训练产物 | 一个可复用的打分器 | 一个对齐后的策略 |
| 能否拿去给别的输出打分 | 可以 | 不可以(缺 ) |
C. 隐式权重不是 DPO 的专利
第七节说 DPO 的梯度里有一个「已做对就降权」的权重。换奖励模型目标的视角看,这个权重其实来自 Bradley–Terry 最大似然本身。对奖励模型目标求关于 的梯度,令 ,用 :
把 展开成 ,它的形状跟第七节 DPO 梯度的权重 完全一致。结论很重要:「模型已经做对的样本被自动降权」不是 DPO 发明的毛病,而是「成对比较 + sigmoid」这套似然自带的性质。只要走 Bradley–Terry,就继承它;DPO 只是把这套权重从「训练奖励模型」搬到了「训练策略」上。
还可以拿第八节的数字对一下:训练最开始策略就等于参考模型,,分数差 ,,损失 ——这正是第八节表格第一行那个数。也就是说,无论训奖励模型还是跑 DPO,起点都落在「损失 = ln 2、权重 = 0.5」这个最「不知道」的位置上。
D. 这个视角解释了三个「为什么」
- 为什么 DPO 的分数要用对数比、而不是直接用 ? 因为「分数」这个角色在 RM 版里由 充当,需要一个尺度合理、可比的对象;用 的对数比,等于把参考模型当作零点,策略被钉在「相对参考模型抬升或压低了多少」上,不会在任意尺度上漂移。
- 为什么 会出现在分数里? 因为在 RLHF 目标里它本来就是 KL 惩罚的系数,第五节反解时它自然落进 。
- 为什么 DPO 不需要在线采样? RM 版要反复采样新回答来喂最大似然;DPO 版的「分数」由两个现成模型在固定数据上直接算出来,不依赖任何新样本。
E. 同一个换形,既给了便利,也划了边界
把 DPO 读成「换了个分数来源的奖励模型目标」,便利与代价其实在同一个动作里就写好了:因为分数被钉成了「策略与参考模型的对数比」,DPO 省掉了奖励模型和在线采样(便利);但也正因为分数被钉死,它不再产出一个独立、可复用的打分器——你没法拿 DPO 训出来的策略去给别的系统打分(缺 那一项,见第十三节误解八)。想同时要「简单」和「可复用的奖励」,就得回到带显式奖励模型的那条路上去。
附二、工程落地速查:默认值、数据格式与失败模式
A. TRL DPOTrainer 的几个默认值
TRL 文档专门提示了它的几个参数默认值与通用 TrainingArguments 不同,照抄通用配置容易踩坑:
| 参数 | TRL 的默认值 | 与通用默认的差异 |
|---|---|---|
learning_rate | 通用为 ,DPO 用小得多 | |
logging_steps | 10 | 通用为 500 |
gradient_checkpointing | True | 通用为 False |
bf16 | 未设 fp16 时为 True | 通用为 False |
(来源:Hugging Face TRL 文档,DPO Trainer。)注意 不在这张默认值表里:TRL 的 DPOConfig 里 同样默认 0.1,与 DPO 原论文多数任务的取值一致;但它不是跨任务的万能值——不同任务、不同 loss_type(如 hinge)下语义可能变,仍需按实测调整。
B. 数据格式
TRL 的 DPOTrainer 需要一份偏好数据集:每条样本含一个 prompt,以及 chosen(偏好回答)与 rejected(不偏好回答)两个补全;它同时支持标准格式与会话格式,遇到会话格式会自动套用对话模板(Hugging Face TRL 文档,DPO Trainer)。文档的快速上手示例甚至只用几行代码就能跑起来:
from trl import DPOTrainer
from datasets import load_dataset
trainer = DPOTrainer(
model="Qwen/Qwen3-0.6B",
train_dataset=load_dataset("trl-lib/ultrafeedback_binarized", split="train"),
)
trainer.train()
(代码摘自 Hugging Face TRL 文档,DPO Trainer,仅示意数据接入方式。)
C. 三条常见失败模式与排查
以下三条由本文前文的推导加实现约束推出,属排查建议而非某篇论文的结论:
其一:策略与参考模型预处理不一致。 两者用了不同的对话模板或截断方式,对数比的基准就错位了,损失从第一步起就是错的。排查:对同一条样本分别用两个模型算一次对数概率,看是否用了同一模板与同一 max_length。
其二:把 prompt 的 token 也算进对数概率。 DPO 的「分数」只应对回答部分取对数概率;若把 prompt 也算进去,差异会被 prompt 的长度和内容淹没。排查:确认 log-prob 只在 chosen/rejected 的 token 上求和(prompt token 的标签被 mask 掉)。
其三: 调到两个极端。 由第八节的推演, 过大时策略被死死按在参考模型上、偏好挤不开(损失降不动); 过小时策略容易跑飞、丢掉原有能力。排查:从 0.1 起步,同时盯住训练损失与一个独立的评测指标——前者降、后者不降,就是跑飞了。
D. 和 LoRA 一起用
由第十五节,DPO 的显存大头是「策略 + 参考」两个模型常驻。一个常见的省显存做法是只训练低秩适配器(LoRA)、冻住基座:这样策略侧只有适配器带梯度,显存大幅下降。更进一步,参考模型可以直接复用「关掉适配器的同一份基座」——不少实现(PEFT / TRL 生态里很常见)就是这么省掉一份权重拷贝的。代价是适配器容量有限,强对齐任务上可能不如全参微调;本段属工程实践,不是某篇论文的结论。
E. 上线前自检清单
把前文所有硬约束压成一份可勾选的清单,训练前逐条过一遍:
- 参考模型已冻结,且与策略使用同一分词器、同一对话模板;
- 每条样本都含同一 prompt 下的
chosen与rejected; - 对数概率只在回答 token 上求和(prompt 部分已 mask);
- 从 0.1 起步,并按任务与实测调整,不照搬;
loss_type与 的语义匹配(例如hinge下 是 margin 的倒数,不能沿用 0.1);- 训练损失与一个独立的评测指标同时盯:损失降而评测不升,就是跑飞了;
- 若用 LoRA,确认参考模型那份确实不带梯度。
附三、DPO 论文自己的实验结果(只引摘要)
DPO 论文在摘要里报告:在控制生成情感(sentiment)的任务上,DPO 超过基于 PPO 的 RLHF;在摘要任务与单轮对话上,它的回答质量与既有方法持平或更好,同时实现和训练明显更简单(Rafailov 等,arXiv:2305.18290)。
这里要分清两件事:这些数字是论文在它自己的实验设置下得到的,属于作者自报结果,不是跨设置通用的结论;而且次年(2024 年)的独立研究(arXiv:2404.10719)在更多测试台上得出了「PPO 可在部分任务反超」的相反观察。把两者并置来看,合理的结论是:DPO 用远低的工程复杂度换到了有竞争力的对齐效果,但「最简单的方法一定最强」并不成立——选哪条路,取决于你的数据、算力和对稳定性的要求。
📋 来源与核验记录
以下来源均在本文写作时(来源核验日期:2026-10-07)实际打开。正文引用的一手论文 / 官方文档均在本清单;文中提到的 SLiC、RSO、EXO 等具体损失名称,系经本清单第 6 项(Hugging Face TRL 文档)转引,未单独列为一手来源。
- Rafailov, Sharma, Mitchell, Ermon, Manning, Finn. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290(v1 2023-05-29;v3 2024-07-29)。https://arxiv.org/abs/2305.18290 —— 本文第三至七节的主要来源。
- Ouyang 等. Training language models to follow instructions with human feedback(InstructGPT). arXiv:2203.02155。https://arxiv.org/abs/2203.02155 —— RLHF 三段式与 1.3B/175B 对比。
- Christiano 等. Deep reinforcement learning from human preferences. arXiv:1706.03741。https://arxiv.org/abs/1706.03741 —— 人类偏好用于强化学习的早期工作。
- Stiennon 等. Learning to summarize from human feedback. arXiv:2009.01325。https://arxiv.org/abs/2009.01325 —— 用成对比较训奖励模型后再强化学习的代表。
- Hugging Face Blog. Fine-tune Llama 2 with DPO(dpo-trl),2023-08-08。https://huggingface.co/blog/dpo-trl —— DPO 与 PPO 的对照、KL 项作用的直觉解释。
- Hugging Face TRL 文档. DPO Trainer. https://huggingface.co/docs/trl/dpo_trainer (2026-10-07 访问)—— 损失类型、数据集格式、实现层面的约束。
- Azar 等. A General Theoretical Paradigm to Understand Learning from Human Preferences(IPO / PO). arXiv:2310.12036。https://arxiv.org/abs/2310.12036
- Ethayarajh, Xu, Muennighoff, Jurafsky, Kiela. KTO: Model Alignment as Prospect Theoretic Optimization. arXiv:2402.01306。https://arxiv.org/abs/2402.01306
- Xu, Fu, Gao, Ye, Liu, Mei, Wang, Yu, Wu. Is DPO Superior to PPO for LLM Alignment? A Comprehensive Study. arXiv:2404.10719。https://arxiv.org/abs/2404.10719
- Shao 等. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models(提出 GRPO). arXiv:2402.03300。https://arxiv.org/abs/2402.03300
本文自行推导(与上述一手来源的官方数字分列):
- 第五节的最优策略闭式解、第六节的 DPO 损失、第七节的梯度式,均为本文依据 独立复算的推导过程(公式结论出自来源 1 的 DPO 论文),可独立复算。
- 第八节表格中的 margin、、损失、梯度权重四个数值,是本文按 ( 的单点对比另算)与假设的 用 Python 标准库计算所得,非任何论文的实验数据。