时长 7 小时:§1 闭式最优解(1h)· §2 DPO(1.5h)· §3 性质与局限(1.5h)· §4 变体地图(1h)· §5 怎么选、对齐税(0.5h)· §A–§C(1.5h)
对应正课 Lecture 5 的后半部分:DPO。学习计划点名要会的:“奖励模型和最优策略之间有闭式对应关系”;DPO 的损失在做什么、β 是什么、相比 PPO 省了什么又丢了什么;IPO、KTO、SimPO、ORPO 各自解决的痛点;对齐税。
配套代码
w3day4_checks.py(纯 numpy):闭式最优解与最优值、隐式奖励与真实奖励只差一个常数、表格 DPO 收敛到 π* 与 β 的作用、梯度权重、likelihood displacement、确定性偏好下 DPO 与 IPO 的差别§B 参考实现(
code/目录):w3d4_dpo.py(DPO / IPO / SimPO 的损失;mini-GPT 上用规则标注的偏好对做 DPO,与 Day 3 的 PPO 对比;开放模型上的 LoRA-DPO,参考模型就是关掉 LoRA 的策略)。今天的目标:能闭卷推出 KL 约束目标的最优解,再由它推出 DPO 损失;能解释 DPO 的梯度为什么是”按排错程度加权”;能说清 DPO 的三个局限(likelihood displacement、确定性偏好下的过拟合、离线数据的分布偏移);能说出四个变体各自修了什么。
§0 今天的主线
Day 3 §3.5 的表里有一个值得停下来想的现象:带 KL 惩罚的 PPO 费了很大力气采样、估优势、裁剪更新,最后收敛到的分布,和一个写得出解析式的分布 几乎一模一样。
那为什么不直接用这个解析式?今天先推出它(§1),看清它为什么不能直接用;然后看 DPO 怎样用一个代数上的小技巧绕过障碍,把 RLHF 变成一个和 SFT 一样简单的监督学习问题(§2);再看这个简化的代价(§3)和针对这些代价的一系列变体(§4)。
今天要用到的旧结论:KL 散度的非负性(Week 0 Day 5 §1);Bradley-Terry 模型、损失和梯度(Day 2 §2.2);KL 约束的 RLHF 目标(Day 2 §3.3);PPO 在玩具上收敛到闭式解(Day 3 §3.5);LoRA 与 disable_adapter(Week 2 Day 6 §3、Day 3 §A.2);只在回答上算 log 概率(Week 2 Day 6 §1.3)。
§1 KL 约束目标的闭式最优解
1.1 动机
RLHF 的目标(Day 2 §3.3),对每个提示 :
这是一个在概率单纯形上的凸优化问题(目标对 是凹的)。它有解析解。
1.2 推导
把目标整理成一个 KL 的形式。定义
取对数:。代回目标:
不依赖 ;,当且仅当 时为 0。所以:
w3day4_checks.py 第 1 组:对 logits 直接做 2 万步梯度上升,数值解与闭式解的最大差不超过 ;数值最优值与 逐位吻合( 时都是 0.3334)。
直觉:最优策略就是在参考模型上按奖励做指数加权。 是”温度”: 时 ; 时全部概率压到奖励最高的回答上。这和 softmax 的温度是同一件事(Week 2 Day 3 §2.2)。
1.3 为什么不能直接用
是对所有可能的回答求和。回答是长度几百的 token 序列,可能性是天文数字, 根本算不出来。所以有了 的形式,也没法直接从中采样或计算它的概率。PPO 的做法是用采样去逼近它(Day 3 §3.5)。
DPO 的洞见是:我们其实不需要 。
§2 DPO
2.1 把关系反过来:用策略表示奖励
上面那个关系对任意奖励 和它对应的最优策略都成立。把它倒过来读:
奖励可以用最优策略和参考模型表示出来,只多了一个只依赖提示的项 。
现在把它代进 Bradley-Terry 模型(Day 2 §2.2)。BT 只看同一个提示下两个回答的奖励之差:
在相减时抵消了。 第 2 组:隐式奖励 与真实奖励在所有回答上都恰好差 (最大偏离 ),两者算出的所有 BT 概率的最大差是 。
2.2 DPO 损失
既然偏好概率可以只用策略表示,就直接对策略 做最大似然:
它和奖励模型的损失(Day 2 §2.2)形式完全一样,只是把 换成了 。Rafailov et al. 2023 的论文标题说的就是这件事:Your Language Model is Secretly a Reward Model。
要算的东西:四个序列 log 概率。,只对回答部分求和(和 SFT 的掩码一样,Week 2 Day 6 §1.3)。参考模型的两项不需要梯度,可以在训练前一次算好。
第 3 组(表格情形,20 个回答,偏好对按 BT 从真实奖励生成,):
| 偏好对数 | KL(π_θ‖π*) | 隐式奖励与真实奖励的相关 | 只赢过 / 只输过的回答数 | |
|---|---|---|---|---|
| 100 | 2.086 | 0.679 | 2.373 | 2 / 2 |
| 1000 | 7.364 | 0.693 | 0.990 | 1 / 0 |
| 10000 | 0.002 | 0.988 | 3.248 | 0 / 0 |
( 本身 , 是 −0.605。)
数据足够时,DPO 的解就是 :它和 PPO(Day 3 §3.5)在逼近同一个分布,只是不需要采样、不需要奖励模型。数据少时要小心:1000 对时有一个回答只赢过、从没输过,DPO 会把它的概率无限推高,结果离 反而比 100 对时还远。这个机制 §3.5 专门讲。
2.3 梯度:按排错程度加权
对 求导(记 、 为两个隐式奖励):
直觉:提高 的概率、降低 的概率,权重是”隐式奖励模型当前把这一对排错的程度”。第 4 组:
| −4 | −2 | 0 | +2 | +4 | |
|---|---|---|---|---|---|
| 权重 | 0.982 | 0.881 | 0.500 | 0.119 | 0.018 |
已经排对、而且排得很开的对,几乎不再贡献梯度。论文报告:去掉这个权重(直接最大化 )会让模型退化。
2.4 算法
准备:SFT 模型 π_SFT;偏好数据 (x, y_w, y_l),最好是从 π_SFT 采样再标注的
1. π_ref ← π_SFT(冻结);π_θ ← π_SFT
2. 预先算好每条数据的 log π_ref(y_w|x)、log π_ref(y_l|x)(可选,省显存)
3. 像 SFT 一样按 batch 训练:算 log π_θ(y_w|x)、log π_θ(y_l|x),代入 L_DPO,反传
和 PPO 比:没有奖励模型、没有价值模型、没有在线采样、没有 GAE 和裁剪;超参数基本只有 和学习率。显存是策略 + 参考模型,参考模型的 log 概率预先算好的话,只剩策略本身(Day 3 §4.3)。
§3 性质与局限
3.1 DPO 和 PPO 优化的是同一个东西吗
在理想条件下是。 如果偏好数据完全服从 BT 模型、奖励模型和策略都有无限容量、数据覆盖所有回答,那么”先训练奖励模型再做 KL 约束的 RL”和”直接做 DPO”得到同一个 。第 3 组(10000 对时 KL(π_θ‖π*)=0.002)和 Day 3 §3.5(KL(π‖π*)≈0.01)在玩具上验证了这一点。
现实里不是,差别就在下面几节。
3.2 β 的作用
同样的 10000 对数据,换不同的 (第 3 组):
| KL(π_θ‖π_ref) | KL(π_θ‖π*_β) | ||
|---|---|---|---|
| 0.1 | 2.513 | 3.323 | 0.000 |
| 0.25 | 2.490 | 3.318 | 0.001 |
| 0.5 | 2.349 | 3.258 | 0.002 |
| 1.0 | 1.603 | 2.686 | 0.003 |
| 2.0 | 0.496 | 1.184 | 0.001 |
越小,离参考模型越远、奖励越高,也越容易过度优化(Day 2 §3.2); 越大越保守。每个 下 DPO 都收敛到对应的 。常用 。学习计划的动手任务要求”观察 β 取不同值的效果”,参考代码 --mini --beta 就是做这个的。
3.3 被选中的回答,概率也会下降
现象:DPO 训练时,被选中回答的 log 概率常常也在下降,只是被拒绝的降得更多。这叫 likelihood displacement。
原因:DPO 只要求间隔 变大,不要求 本身变大。真实模型的参数是共享的,压低 的那个方向,也会压低和它很像的 。
第 5 组(50 个回答共享 8 维特征,只用一个偏好对训练 200 步):
| 两个回答的关系 | 下降的种子数 | 下降 | 间隔变大 |
|---|---|---|---|
| 很像(噪声) | 16 / 20 | 20 / 20 | 20 / 20 |
| 不相关 | 6 / 20 | 20 / 20 | 20 / 20 |
一个例子:训练前 、;200 步后分别是 −4.11 和 −10.01,其余 48 个回答的总概率从第 1 步的 0.946(第 50 步先降到 0.940)升到 0.984。概率流向了训练数据里没有的回答,而那些回答不一定好。
意义:偏好数据里的好坏回答往往很像(同一个模型对同一个提示的两次采样),所以这在实践中很常见。对策包括:在 DPO 损失上加一项被选中回答的 SFT 损失(RPO、DPOP 等变体),或者使用在线数据(§3.4)。
3.4 离线数据与分布偏移
DPO 是离线的:偏好对是事先收集好的,训练中策略不再采样。问题是:
- 如果偏好对不是从 采的(比如用别的更强的模型生成),DPO 的推导前提(数据来自 附近)就不成立。论文建议:没有合适的 SFT 模型时,先在被选中的回答上做一遍 SFT,再把它当 。
- 策略一旦偏离,它在自己的新分布上犯的错,离线数据里没有任何信号去纠正。
PPO 是在线的,每一轮都在自己的分布上采样、打分,这正是它的优势。折中的做法是迭代 / 在线 DPO:每一轮用当前策略采样新的回答对,用奖励模型或人来标注,再做一轮 DPO。
3.5 确定性偏好:DPO 的 KL 约束会失效
问题:偏好数据里一个对往往只出现一次,标签是确定的,没有反例。DPO 的损失 只有在 时才等于 0。第 6 组(一个偏好对、没有反例,):
| 步数 | DPO: | DPO:KL(π‖π_ref) | IPO: | IPO:KL(π‖π_ref) |
|---|---|---|---|---|
| 10 | 1.00 | 0.041 | 0.99 | 0.040 |
| 100 | 9.06 | 1.861 | 5.04 | 0.945 |
| 1000 | 38.70 | 2.198 | 5.00 | 0.933 |
| 20000 | 147.59 | 2.198 | 5.00 | 0.933 |
( 是未乘 的对数比之差。)DPO 的 无界增长, 被压向 0;KL 停在 2.2 只是因为 的概率已经几乎没了。 只改变”推多快”,不改变”推到哪”: 本该起的”别离参考模型太远”的作用,在有限、确定的偏好数据上失效了。 这也是第 3 组”1000 对时比 100 对还差”的原因。
实践中的表现:DPO 训练久了,隐式奖励在训练集上的准确率接近 100%,间隔持续增大,而生成质量开始下降。对策:早停、少训几个 epoch(通常 1–3 个)、标签平滑(conservative DPO,今天 §4 表中)、或者换 IPO。
§4 变体地图
学习计划点名的四个,每个都在修 DPO 的一个具体问题:
4.1 IPO:有界的目标间隔
问题:§3.5 的过拟合。做法(Azar et al. 2023):把 换成平方损失
它让 回归到一个有限的目标值,而不是无限增大。第 6 组: 时 稳定在 5.00,KL 停在 0.93。
4.2 KTO:不需要成对数据
问题:成对的偏好数据贵;很多场景只有”这个回答好 / 不好”的单点反馈(点赞、点踩)。做法(Ethayarajh et al. 2024):借用行为经济学的前景理论(prospect theory),对每个回答单独打分。设 , 是当前策略与参考模型之间 KL 的一个批内估计,则
好回答的隐式奖励要高于参照点 ,坏回答要低于它;、 可以不对称(“损失厌恶”)。
4.3 SimPO:去掉参考模型,按长度归一化
问题:DPO 的隐式奖励是整个序列 log 概率之比,和生成时实际用的”每个 token 的平均 log 概率”不一致;训练时要多存或多算一个参考模型;而且容易让回答越来越长。做法(Meng et al. 2024):
奖励是长度归一化的平均 log 概率,不需要参考模型; 是一个目标间隔。代价是失去了 KL 约束的理论保证, 和 要仔细调(论文里 常在 2 以上)。
4.4 ORPO:把 SFT 和偏好对齐合成一步
问题:SFT 和 DPO 要分两个阶段、还要一个参考模型。做法(Hong et al. 2024):在 SFT 损失上加一项胜率比(odds ratio)损失
其中 用长度归一化的似然。SFT 项让模型学会被选中的回答,odds ratio 项同时拉开和被拒绝回答的距离。一个阶段、没有参考模型。
4.5 对照表
| 方法 | 需要的数据 | 参考模型 | 修的是什么 |
|---|---|---|---|
| PPO | 提示 + 奖励模型(或规则) | 需要(算 KL) | 在线探索;最通用,但最重 |
| DPO | 偏好对 | 需要 | 去掉奖励模型和 RL |
| IPO | 偏好对 | 需要 | 确定性偏好下的过拟合(§3.5) |
| KTO | 单点的好 / 坏标签 | 需要 | 成对数据太贵 |
| SimPO | 偏好对 | 不需要 | 训练与生成的度量不一致、长度偏置、参考模型的开销 |
| ORPO | 偏好对 | 不需要 | 两阶段流程合并成一步 |
| 在线 / 迭代 DPO | 每轮新采样的偏好对 | 需要 | 离线数据的分布偏移(§3.4) |
还有一些常见的小修补:给 DPO 加标签平滑(假设一部分标签是错的),加一项被选中回答的 NLL(对付 §3.3),RPO、DPOP、cDPO 等名字大多属于这一类。
§5 怎么选,以及对齐税
5.1 DPO 相比 PPO:省了什么,丢了什么
学习计划的自测题:“DPO 相比 PPO,去掉了哪两个模型?代价是什么?”
- 去掉了奖励模型和价值模型。只剩策略和参考模型,而参考模型的 log 概率可以预先算好(Day 3 §4.3:PPO 36 字节/参数,DPO 18 或 16)。同时去掉了在线采样、GAE、裁剪和一大堆超参数。
- 丢掉的:(1) 在线探索:只能从固定的偏好数据里学,策略在自己新分布上的错误得不到纠正(§3.4);(2) 一个可复用的奖励模型:奖励模型可以给任意新回答打分,用来做 best-of-、做评估、做迭代的数据筛选;DPO 的隐式奖励绑定在策略上;(3) 有限数据上的正则:确定性偏好让 KL 约束失效(§3.5);(4) likelihood displacement(§3.3)。
5.2 什么时候选 PPO 而不是 DPO
学习计划的自测题:“什么情况下你会选 PPO 而不是 DPO?”
- 奖励可以自动算(数学题对错、代码能否通过测试、格式是否合规):在线 RL 可以无限地采样、打分,不需要人标偏好对。这正是 Day 5 的 RLVR 场景(它用的是 PPO 的变体 GRPO)。
- 需要在策略自己的分布上持续改进,离线偏好数据已经覆盖不了当前策略会犯的错。
- 有足够的工程资源(多卡、推理引擎、RL 框架)和调参经验。
- 反过来,只有一份固定的偏好数据集、资源有限、想快速得到一个”更像人喜欢”的模型,DPO 是首选。很多开源模型的对齐流程是:SFT → DPO(或它的变体);前沿的大模型则往往在最后阶段用在线 RL。
5.3 对齐税
现象:InstructGPT 发现,RLHF 之后模型在一些公开 NLP 基准(如 SQuAD、DROP、HellaSwag、WMT 法译英)上的表现下降了。这种”对齐换来的能力退化”叫对齐税(alignment tax)。
原因:偏好优化把策略从预训练 / SFT 的分布上拉开,一些与偏好数据无关的能力会被挤掉;过度优化(Day 2 §3.2)时尤其明显。
缓解:
- KL 约束 / :不让策略离参考模型太远。
- PPO-ptx:在 RL 的目标里混入预训练数据的语言模型损失(Day 2 §3.1),InstructGPT 用它大幅减轻了这些退化。
- 在 DPO 损失上加 SFT 项、少训几个 epoch、早停。
- 用 LoRA 做偏好优化:LoRA 学得少、忘得少(Week 2 Day 6 §3.5)。
- 评测要覆盖通用能力,不能只看偏好胜率(第 4 周 Lecture 8)。
§A DPO:API 用法与边界
A.1 参考模型
- 全量微调:参考模型是 SFT 模型的一份冻结拷贝。显存吃紧时,先把整个数据集的 算好存起来,训练时只加载策略。
- LoRA:参考模型就是关掉适配器的策略(
with model.disable_adapter():),不需要额外的显存。参考代码--hf就是这样做的。 - 参考模型必须是训练开始时的策略(通常就是 SFT 模型)。换一个参考模型, 的含义和最优解都变了。
A.2 trl 的 DPOTrainer
- 数据格式:
prompt、chosen、rejected三个字段(或对话形式)。trl 会自己套 chat template、只在回答上算 log 概率。 beta就是 ;loss_type可以选"sigmoid"(标准 DPO)、"ipo"等;新版本里还有"simpo"、"robust"之类(以你安装版本的文档为准)。- 用 peft 时不传
ref_model,它会自动用关掉适配器的模型当参考。 - 训练日志里
rewards/chosen、rewards/rejected、rewards/margins、rewards/accuracies分别是两个隐式奖励、它们的间隔、间隔为正的比例。rewards/chosen变成负数是常态(§3.3),不代表训练坏了;间隔和准确率一路涨到很高、生成质量却下降,才是过拟合(§3.5)。
A.3 超参数
- 学习率要小:全量微调常用 量级,LoRA 在 到 。比 SFT 小一个数量级以上。
- :0.1 左右起步;想离参考模型更远就调小。
- epoch:1–3 个。确定性偏好下训得越久越过拟合。
- 最大长度:被截断的回答对,比较的就不是完整的回答了;两个回答截断程度不同时,隐式奖励会偏向更短的那个。
§B 实操
- 跑通
w3day4_checks.py,6 组结论都看懂。 - 推导(1h,闭卷):(a) 从 KL 约束目标推出 和最优值 ;(b) 把 用 表示,代入 BT,得到 DPO 损失;(c) 求 DPO 损失的梯度,说明权重的含义。这是面试高频题,要做到不看资料十分钟写完。
- mini-GPT 上的 DPO(1.5h):
python code/w3d4_dpo.py --mini,再用--beta 0.02、--loss ipo各跑一次。与 Day 3 的 PPO 比较:gold 提高了多少、KL 多大、用时多少;观察 chosen / rejected 的 log 概率。 - 学习计划的动手任务(2h,GPU 更好):在 Week 2 的 SFT 模型上做 DPO:
--hf --model ../../Week2/code/w2d6_out/lora/merged(没有的话用默认的 Qwen2.5-0.5B-Instruct),对比 DPO 前后的回答风格,并试两个不同的 。 - 读论文:DPO 的第 4 节(推导)与第 5 节(理论);挑读 IPO(Azar et al. 2023)的第 5 节。
参考实现:code/w3d4_dpo.py。
§C 自测
动机与直觉层
- 既然 KL 约束的 RLHF 目标有闭式最优解,为什么不能直接用它?DPO 是怎么绕过这个障碍的?
- DPO 的”隐式奖励”是什么?为什么说语言模型本身就是一个奖励模型?
- DPO 的梯度权重 有什么作用?
- 为什么 DPO 训练时被选中回答的概率也会下降?这有什么风险?
- 为什么确定性偏好会让 DPO 的 KL 约束失效?IPO 怎么修?
推导与计算层
- 推出 KL 约束目标的最优解,写出最优值。
- 从最优解推出 DPO 损失,说明 为什么会抵消。
- 求 DPO 损失对 的梯度。
- 写出 IPO、SimPO、ORPO 的损失,各用一句话说明它修的问题。
工程层
- DPO 相比 PPO 去掉了哪两个模型?代价是什么?
- 什么情况下你会选 PPO 而不是 DPO?
- 用 LoRA 做 DPO 时,参考模型从哪来?训练日志里
rewards/chosen是负数正常吗? - 什么是对齐税?列出三种缓解方法。
出关标准
- 能闭卷推出 和 DPO 损失,说清 为什么抵消
- 能求出 DPO 的梯度,解释权重的含义
- 能说清 的作用,并在
--mini上观察到 - 能解释 likelihood displacement、确定性偏好下的过拟合、离线数据的分布偏移
- 能说出 IPO、KTO、SimPO、ORPO 各自的数据需求、是否需要参考模型、修的是什么
- 能回答”DPO 省了什么、丢了什么”和”什么时候选 PPO”
- 在 Week 2 的 SFT 模型上跑通一次 DPO