RLHF 的流程里有一段被公认为最麻烦的部分:先训一个奖励模型,再用强化学习去优化策略。
麻烦体现在三处:
- 要多训一个模型(奖励模型);
- 训练循环不稳定(强化学习的固有特性);
- 还要同时驻留四个模型(策略、参考、奖励、价值)。
于是很自然的问题出现了:
能不能跳过奖励模型,直接用偏好数据训练策略模型?
一开始看起来这不可能------奖励模型的分数是强化学习的信号来源,没有它,怎么做优化?
但 2023 年的一篇工作给出了一个漂亮的答案:
目标函数可以重新推导,让奖励模型从式子里消失。
这就是 DPO(Direct Preference Optimization,直接偏好优化)。
这篇文章讲清它为什么成立、省掉了什么、以及它没解决什么。
第一部分:先回忆------RLHF 的三个麻烦
先说清楚 DPO 要解决的具体痛点。
1.1 麻烦一:奖励模型只是"代理目标"
我们真正想要的是"让模型输出人类更喜欢的内容",但实际优化的却是"让奖励模型的分数更高"。
这两件事不完全等价 ------ 中间的偏差就是"奖励黑客"的土壤。
第 014 篇讲过 :奖励模型的输出本质上是排序函数,不是有物理意义的分数。用一个近似的代理目标去优化真实目标,偏差是不可避免的。
1.2 麻烦二:强化学习训练不稳定
强化学习优化的是期望回报,方差大、对超参敏感。
同样的数据,换个随机种子结果可能差很多。
"换个随机种子结果差很多"这一条在工程上尤其致命 ------ 它意味着你的实验结果不可复现,而这会让调优变成一种碰运气。
1.3 麻烦三:四个模型同时驻留
策略、参考、奖励、价值------显存压力很大,这直接限制了能训练的模型规模。
1.4 所以 DPO 的价值定位
如果一个方法能同时缓解这三点,价值就很大。DPO 恰好做到了。
注意"同时缓解三点"这个表述 :它不是只在某一点上改进,而是结构性地简化了整个流程。
第二部分:核心洞察------把奖励当作"策略的隐含变量"
这是理解 DPO 的关键一步。 用一个思想实验来理解。
2.1 一个反向的思考
假设存在一个"人类真实偏好函数"(我们看不到它)。
在 RLHF 里,我们的路径是:
text
试图用奖励模型去逼近它 → 然后优化策略
但理论上有个等价关系:
能产生最优策略的那个奖励函数,和策略本身之间存在一一对应关系。
2.2 用人话说
给定一个最优策略,你反推出来的奖励长什么样,是有确定形式的;反过来,给定奖励,最优策略也有确定形式。
这是一个很强的数学事实 ------ 它不是近似,而是精确的对应关系。
2.3 既然一一对应,就可以绕过去
不必先求奖励、再求策略------可以直接求解策略,把奖励消掉。
这就是 DPO 名字的由来:
直接偏好优化(Direct Preference Optimization)------ 跳过中间变量,直接优化我们真正关心的对象。
2.4 一个类比的帮助
可以这样理解这个推导的价值:
假设你要找一个函数 f 的最大值,而 f = g(x)。
- RLHF 的做法:先拟合出 g,再对 f 求最优;
- DPO 的做法 :发现 f 可以直接用 x 表达,于是跳过 g,直接优化 x。
当然前提是"确实存在这样的直接表达" ------ 而这一点正是那篇论文证明的。
理解这个类比,就理解了 DPO 的"省"不是工程技巧,而是数学结果。
第三部分:结果长什么样------像训练一个"偏好分类器"
3.1 推导的结果
推导的结果非常简洁。可以这样理解最终形态。
训练数据是成对的偏好样本:同一个问题下的"更好的回答"和"更差的回答"。
DPO 的损失函数做的是:
提高"更好的回答"在当前策略下的相对概率,同时压低"更差的回答"的相对概率------而"相对"是相对于参考模型而言的。
3.2 "相对于参考模型"这个设计很关键
它相当于一个隐式的 KL 约束:
我们不关心绝对概率,只关心"新模型相比旧模型,更偏向哪一个"。
也就是说,KL 约束并没有消失,它被"内化"进了损失函数的形式里。
这一点常被误解 ------ 很多人以为"DPO 省掉了 KL 约束",实际上它是把约束从"一个可以调的项"变成了"损失函数结构的一部分"。
这个区别带来一个实际后果 :DPO 里控制"偏离程度"的方式变成了调 beta 参数 (或等价地调学习率),而不是像 RLHF 那样调 KL 系数。
3.3 训练过程长什么样
text
喂入偏好对
→ 提高好答案的相对概率
→ 降低差答案的相对概率
→ 完成
它不需要采样生成、不需要估计基线、不需要奖励模型。
训练起来和普通的监督微调很像------这是它最大的工程优势。
"和 SFT 很像"这个性质的价值在于 :你不需要为它专门搭建一套强化学习基础设施,用现有的训练框架就能跑。
第四部分:DPO 省掉了什么,没省掉什么
4.1 省掉的部分很实在
① 省掉一个模型。
只需要策略模型和参考模型,两者还可以共享(参考模型不需要梯度,显存开销小很多)。
② 省掉强化学习循环。
训练变成一次前向加一次反向的标准流程,稳定性大幅提升,随机种子敏感度降低。
③ 省掉"奖励模型与真实偏好之间的偏差"这一层。
不再有"代理目标"的失真问题。
第三点是最本质的 :前两点是工程上的简化,而第三点是"更接近目标本身" ------ 这解释了为什么 DPO 在某些任务上不只是"更简单",而是"更好"。
4.2 但没省掉的部分也必须清楚
① 没省掉偏好数据。
数据质量依然是上限。 而且要注意:
DPO 对偏好数据的噪声更敏感 ------ 因为它直接把偏好当作训练信号,而不是先"平滑"成奖励模型。
这个差别很关键:
| RLHF | DPO | |
|---|---|---|
| 噪声的处理 | 训练奖励模型时被"平滑"了一部分 | 直接进入训练信号 |
所以同样一份有噪声的偏好数据,在 DPO 上的表现可能更差。
② 没省掉"分布外"的问题。
DPO 是离线方法:只用固定的偏好数据集训练。
如果模型演化了,数据集里的样本可能不再反映模型现在的输出分布,训练效果会打折扣。
而在线方法可以持续生成新样本,始终在"当前分布"上优化。
③ 没省掉参考模型。
它仍需加载以计算相对概率,只是不需要梯度与优化器状态。
4.3 一句话概括
DPO 把"复杂的优化问题"变成了"稳定的训练任务",但代价是失去了在线探索的能力。
"失去在线探索"这个代价的重要性,取决于你的任务是否需要探索 ------ 这一点在下一部分展开。
第五部分:真实差距------什么时候 DPO 够用,什么时候不够
这是最容易被夸张或贬低的点,需要说清楚边界。
5.1 DPO 表现良好的场景
① 偏好维度相对"局部"。
比如:语气、长度、格式、是否给建议。
这类偏好不需要模型去探索新的输出空间。
"局部"这个词的意思是 :你希望模型在它已经能生成的 那些回答里,更倾向于某一类。它不要求模型生成新的东西。
② 数据量中等、质量高。
几千到几万条干净的偏好对就能有明显效果。
③ 资源有限、追求落地速度。
训练简单、成本低、稳定性好。
5.2 在线方法更有优势的场景
① 需要提升推理能力。
这类能力提升依赖大量自我生成的探索,离线偏好数据无法覆盖。
为什么? 因为"更好的推理"往往是一个新的、训练数据里没出现过的推理路径。而离线数据只能告诉你"这两个已有答案哪个更好",无法引导模型发现新路径。
② 偏好难以标注但可以自动判定。
数学题、代码测试用例------能用规则给分就不需要人工偏好。
这类场景下,在线方法有一个很大的优势 :它可以生成大量样本并自动判定,不需要人工标注 ------ 这解决了"偏好数据贵"这个根本问题。
③ 任务空间很大、需要探索。
在线方法能持续在"当前模型输出"上优化。
5.3 更准确的结论
在通用对话偏好对齐上,DPO 类方法往往性价比更高;在能力提升(尤其推理)上,可验证奖励的在线强化学习更强。
两者不是替代,而是分工。
5.4 一个很实用的判断框架
问自己:
text
"我想要的是让模型在已有输出里更偏向某类" → DPO 类
"我想要的是让模型生成它现在生成不出来的东西" → 在线强化学习
这个问法的好处是 :它把"哪个方法更好"这个无法回答的问题,变成了一个可以回答的问题 ------ 因为"你要的是哪种改变"是你能确定的。
第六部分:DPO 的家族------几个值得知道的变体
围绕 DPO 出现了一批改进方法,各解决一个问题。
6.1 变体一:解决"过拟合偏好数据"的
DPO 有个已知倾向:
会同时压低好答案和差答案的绝对概率,只是后者降得更多。
这个现象不太好 ------ 因为"好答案的概率也降低"意味着:模型对正确答案的生成倾向变弱了,而它只是"更倾向于好答案"。
有一类改进通过加入正则项或换用不同的目标形式来缓解。
6.2 变体二:不需要成对数据的
有些方法只需要"这个回答好/不好"的单点标注(而不是成对比较)。
降低了数据构造的难度。
为什么这有价值? 因为成对数据的构造成本远高于单点标注 ------ 你要先有多个候选回答,再让标注者比较。如果只需要单点打分,数据收集会简单得多。
6.3 变体三:把微调和偏好合并的
这类方法尝试在一次训练里同时完成"学会格式"与"偏好对齐",省掉一个阶段。
适合数据有限、想快速跑通的场景。
它的取舍是 :省掉了一个阶段,但可能无法把两件事都做到最好 ------ 因为 SFT 和偏好优化关注的是不同的目标。
6.4 选择建议
不要追最新,先看你的数据形态。
| 你的数据 | 选择 |
|---|---|
| 有成对偏好 | DPO |
| 只有单点标注 | 对应变体 |
| 数据紧缺、又还没做 SFT | 考虑合并方案 |
"先看数据形态"这个原则很重要 ------ 因为数据是最难改变的那一项,而算法是最容易换的。
第七部分:实践建议------把 DPO 用对
给几条能直接落地的经验。
7.1 第一,先做好 SFT
DPO 是"在已有能力上调整偏好"。如果模型连基本格式都还不稳,先做 SFT。
这一条和 RLHF 的要求完全一样 ------ 因为顺序问题不因方法而改变。
7.2 第二,偏好数据必须"差值明显"
好答案和差答案如果差别很小,训练信号会很弱。
宁可样本少、但对比鲜明。
这条建议有一个直接的操作含义 :构造偏好对时,不要选两个"都不错"的回答 ------ 那样学不到东西。要选一个明显好、一个明显差。 这样能放大训练信号。
7.3 第三,用好参考模型
参考模型通常就选 SFT 之后的那一版。
它定义了"相对"的基准。换参考模型等于换了约束强度。
具体影响:
| 参考模型的选择 | 效果 |
|---|---|
| SFT 版本(标准做法) | 约束适中 |
| 更早的版本 | 约束更强(允许的偏离更小) |
| 更强的模型 | 会把模型拉向更强的那个分布 |
7.4 第四,关注一个容易被忽略的指标:输出长度的变化
偏好数据里如果存在长度偏置(标注者偏爱长回答),DPO 会显著放大它。
训练后一定要检查平均输出长度是否异常增长。
为什么 DPO 特别容易放大它? 因为标注者在比较两个回答时,往往潜意识地觉得"更长的更全面" ------ 于是偏好数据里有一个系统性的长度倾向。而 DPO 会把这个倾向当作真实偏好来学习。
这个问题的危害很实际 :模型输出变长 → token 成本上升 → 用户阅读负担增加 → 而内容质量可能并没有提升。
7.5 第五,保留回归测试
和微调一样,要验证通用能力与安全拒答能力有没有被破坏。
注意偏好优化对安全能力的特殊影响 :如果偏好数据里全是"有帮助的回答",模型可能学会"永远不要拒绝"。
常见误区
误区一:"DPO 完全等价于 RLHF,而且更简单。"
它在目标形式上等价,但在数据获取方式上不等价。
DPO 是离线的,RLHF 类在线方法可以持续采样。这就是两者效果差异的主要来源。
"目标形式等价"这个说法容易被误读 ------ 它指的是数学上的优化目标 ,但要达到那个目标,需要的假设和数据是不同的。
误区二:"DPO 不需要参考模型。"
需要,只是不需要它的梯度。
参考模型是"相对概率"的基准,去掉它损失函数就没有意义了。
误区三:"有了 DPO,PPO 就没用了。"
两者适配不同场景。
需要探索、需要可验证奖励的能力训练,仍然依赖在线强化学习。
误区四:"DPO 训练简单,所以随便调调就行。"
它训练稳定,但对数据质量与长度偏置极其敏感。
省下的调参时间,往往要花在数据上。
这句话概括了 DPO 的工程特征 :它把复杂度从"训练过程"转移到了"数据准备"。
误区五:"DPO 也会像 RLHF 一样有奖励黑客问题。"
不会以同样形式出现 ------ 因为没有显式的奖励模型可以被钻空子。
但它有自己形式的"钻空子" :过拟合偏好数据的表面特征 (比如长度、格式、某些措辞),而不是学习真正的偏好。
所以"没有奖励模型"不等于"没有代理目标失真" ------ 只是失真的形式变了。
误区六:"离线数据不好,可以重新标注一份。"
重新标注解决不了"分布漂移"的问题 ------ 因为只要训练开始,模型就在演化,而数据是固定的。
真正解决这个问题需要在线采样,也就是回到在线方法。
实战问答
Q1:面试问"DPO 为什么能不用奖励模型",怎么答?
A:给逻辑链 + 工程后果。
逻辑链:
RLHF 的最优策略与奖励函数之间存在一一对应关系,因此可以把奖励当作隐式变量消掉,直接写出只依赖偏好数据的策略优化目标。
工程后果:
训练从"强化学习循环"变成"类似分类的稳定训练",模型数量从四个降到两个。
这个答法的层次在于 :前半句是"数学上为什么成立",后半句是"工程上有什么用"。两者结合才完整。
Q2:DPO 训练完,模型回答变得特别长,怎么办?
A :这是典型的长度偏置。三个处理方式:
| 方式 | 做法 |
|---|---|
| ① 检查偏好数据 | 如果好答案系统性更长,标注本身就引入了偏置 |
| ② 补入"简洁但更好"的样本 | 直接改变数据的倾向 |
| ③ 把长度作为独立约束或评估维度 | 训练后监控平均长度 |
第一个方式是根治 ------ 因为问题出在数据里。
第二个方式的操作细节 :构造一些"明显更简洁、但质量相当"的偏好对,让模型看到"短也可以更好"。
Q3:为什么有人说 DPO 效果不如在线强化学习?
A :因为 DPO 用固定的离线数据,而模型在训练中会演化,逐渐偏离数据集覆盖的分布,于是信号会变弱甚至失效。
在线方法每轮都基于当前模型的输出重新采样,始终在"当下分布"上优化。
这个差距在需要探索的任务(尤其推理)上最明显。
理解这个机制很重要 :它意味着DPO 的效果会随着训练进行而"自己衰减" ------ 不是方法错了,而是数据过期了。
Q4:小团队做对齐,推荐哪条路?
A:优先 DPO 类方法。
理由:
- 训练简单、稳定、算力门槛低;
- 而且大多数业务需求的偏好是"局部的"(语气、格式、详略)。
只有当你要训练推理能力、并且任务能自动判定对错时,才值得投入在线强化学习。
这个建议的核心逻辑是"匹配投入和收益" :DPO 的成本低、覆盖大部分需求,所以应该是默认选择。
Q5:怎么判断我的场景适合离线还是在线?
A:问两个问题。
问题一:我想要的改变,模型现在能做出来吗?
| 答案 | 说明 |
|---|---|
| 能,只是不够稳定/不够倾向 | 离线够用(DPO) |
| 完全做不出来 | 需要探索 → 在线 |
问题二:我能自动判断对错吗?
| 答案 | 说明 |
|---|---|
| 能(数学、代码、格式) | 可以省掉人工标注,在线的成本就降下来了 |
| 不能(语气、风格) | 需要人工偏好数据,离线更划算 |
这两个问题的组合,基本能定掉大部分选型。
而且它们揭示了一个规律 :在线方法的优势来自"能探索 + 能自动判定"这两个条件的交集。
Q6:为什么偏好数据里"好答案稍微长一点"会造成这么大影响?
A :因为 DPO 会系统性放大它。
机制是这样的:
- 标注者在比较时,潜意识倾向于选更全的那个(它通常也更长);
- 于是偏好数据里有一个系统性的长度倾向;
- DPO 把这个倾向当作真实偏好来学习;
- 由于训练是持续迭代的,每一轮都在强化这个倾向;
- 结果:输出长度可能膨胀几倍,而质量没有提升。
一个微小的系统性偏差,在迭代训练中被放大成了显著的行为变化。
这也是为什么"训练后检查输出长度"这条建议值得单独提出来 ------ 它成本极低,但能发现一个影响很大的问题。
Q7:DPO 要不要配 SFT 一起用?
A :顺序使用,不是二选一。
text
① 先做 SFT:建立格式与基础能力
② 再做 DPO:在已有能力上调整偏好
能不能合并成一步? 有一类方法尝试这么做(第六部分的变体三),但通常只在数据非常有限、想快速跑通时才考虑 ------ 因为两者的优化目标不同,合并会互相牵制。
判断标准:
| 情况 | 建议 |
|---|---|
| 模型已经能稳定输出合格格式 | 直接上 DPO |
| 模型连格式都不稳 | 必须先 SFT |
| 数据极少、想快速验证 | 可以考虑合并方案 |
术语表
| 术语 | 含义 |
|---|---|
| DPO(直接偏好优化) | 直接用偏好数据优化策略、无需显式奖励模型的对齐方法 |
| 离线方法 | 只使用固定数据集训练,不与环境或模型自身交互采样 |
| 在线方法 | 训练过程中持续生成新样本,在最新分布上优化 |
| 隐式奖励 | 由策略与参考模型的概率比自然导出的奖励形式 |
| 长度偏置 | 偏好数据中隐含的"更长即更好"倾向,会被对齐方法放大 |
| 偏好对 | 同一输入下更好与更差的回答组成的训练样本 |
| beta 参数 | DPO 中控制"允许偏离参考模型程度"的关键超参数 |
结语
把这篇压缩成三句话:
第一,DPO 的聪明之处在于数学上把奖励模型消掉了。
既然最优策略与奖励一一对应,就可以直接优化策略。
第二,于是对齐从"不稳定的强化学习循环"变成"稳定的分类式训练",模型数量从四个减到两个。
第三,但代价是失去在线探索能力:
它在偏好类任务上强,在需要探索的能力训练上不如在线方法。
所以更准确的定位是分工,而不是替代。
而如果只允许带走一条实操建议,那就是:训练后第一时间检查平均输出长度。 因为长度偏置是这个方法最隐蔽、也最容易发生的陷阱------它不需要你做错什么,只需要你的标注者有一点人类共有的偏好。