【AI工程师精讲】15:DPO:不训奖励模型、不做强化学习,也能完成对齐

RLHF 的流程里有一段被公认为最麻烦的部分:先训一个奖励模型,再用强化学习去优化策略。

麻烦体现在三处:

  1. 要多训一个模型(奖励模型);
  2. 训练循环不稳定(强化学习的固有特性);
  3. 还要同时驻留四个模型(策略、参考、奖励、价值)。

于是很自然的问题出现了:

能不能跳过奖励模型,直接用偏好数据训练策略模型?

一开始看起来这不可能------奖励模型的分数是强化学习的信号来源,没有它,怎么做优化?

但 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 会系统性放大它。

机制是这样的:

  1. 标注者在比较时,潜意识倾向于选更全的那个(它通常也更长);
  2. 于是偏好数据里有一个系统性的长度倾向;
  3. DPO 把这个倾向当作真实偏好来学习;
  4. 由于训练是持续迭代的,每一轮都在强化这个倾向;
  5. 结果:输出长度可能膨胀几倍,而质量没有提升。

一个微小的系统性偏差,在迭代训练中被放大成了显著的行为变化。

这也是为什么"训练后检查输出长度"这条建议值得单独提出来 ------ 它成本极低,但能发现一个影响很大的问题。


Q7:DPO 要不要配 SFT 一起用?

A :顺序使用,不是二选一。

text 复制代码
① 先做 SFT:建立格式与基础能力
② 再做 DPO:在已有能力上调整偏好

能不能合并成一步? 有一类方法尝试这么做(第六部分的变体三),但通常只在数据非常有限、想快速跑通时才考虑 ------ 因为两者的优化目标不同,合并会互相牵制。

判断标准:

情况 建议
模型已经能稳定输出合格格式 直接上 DPO
模型连格式都不稳 必须先 SFT
数据极少、想快速验证 可以考虑合并方案

术语表

术语 含义
DPO(直接偏好优化) 直接用偏好数据优化策略、无需显式奖励模型的对齐方法
离线方法 只使用固定数据集训练,不与环境或模型自身交互采样
在线方法 训练过程中持续生成新样本,在最新分布上优化
隐式奖励 由策略与参考模型的概率比自然导出的奖励形式
长度偏置 偏好数据中隐含的"更长即更好"倾向,会被对齐方法放大
偏好对 同一输入下更好与更差的回答组成的训练样本
beta 参数 DPO 中控制"允许偏离参考模型程度"的关键超参数

结语

把这篇压缩成三句话:

第一,DPO 的聪明之处在于数学上把奖励模型消掉了。

既然最优策略与奖励一一对应,就可以直接优化策略。

第二,于是对齐从"不稳定的强化学习循环"变成"稳定的分类式训练",模型数量从四个减到两个。

第三,但代价是失去在线探索能力:

它在偏好类任务上强,在需要探索的能力训练上不如在线方法。

所以更准确的定位是分工,而不是替代。

而如果只允许带走一条实操建议,那就是:训练后第一时间检查平均输出长度。 因为长度偏置是这个方法最隐蔽、也最容易发生的陷阱------它不需要你做错什么,只需要你的标注者有一点人类共有的偏好。

相关推荐
亚远景aspice1 小时前
亚远景-低空经济与具身智能:具身智能飞行器量产落地,过程合规与安全体系怎么搭
人工智能·安全·过程改进·低空经济·研发管理·亚远景科技·过程能力评估
qinglongcn1 小时前
Agent 任务的一生——从用户按下发送到任务完成
agent·ai编程
天远数科1 小时前
Java数据工程:利用天远车辆估值优化商业银行汽车抵押贷款押品估值合规体验
人工智能
第404号工位1 小时前
手机到底有没有偷听我们?我抓包了 72 小时,抓到了真凶
linux·人工智能·架构
小四的小六1 小时前
OpenAI 的 Agent 改完配置又改回去,两个月后才被回扫发现:给自家 Agent 补一套发现链路
aigc·openai·ai编程
Momo__1 小时前
155个App把豆包关在门外,豆包反手掏出第二把钥匙
app·agent·ai编程
alonglong1 小时前
我用 TRAE 把"发布前自检"从零散记忆做成了一道门禁:Agent 拆解、IDE 落地、自动化跑起来
人工智能
skywsp1 小时前
Agent智能体架构设计-知识整理
大数据·人工智能
IT_陈寒1 小时前
Vue动态组件缓存的坑你踩过了吗?
前端·人工智能·后端