第 3 周 · Day 4:DPO 与偏好优化的变体

Transformers and Large Language Models · Week 3 · Day 4。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

时长 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 费了很大力气采样、估优势、裁剪更新,最后收敛到的分布,和一个写得出解析式的分布 π∗∝πrefexp⁡(r/β)\pi^*\propto\pi_{ref}\exp(r/\beta) 几乎一模一样。

那为什么不直接用这个解析式?今天先推出它(§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),对每个提示 xx:

max⁡π ∑yπ(y∣x) r(x,y)−β∑yπ(y∣x)log⁡π(y∣x)πref(y∣x).\max_\pi\ \sum_y\pi(y\mid x)\,r(x,y)-\beta\sum_y\pi(y\mid x)\log\frac{\pi(y\mid x)}{\pi_{ref}(y\mid x)}.

这是一个在概率单纯形上的凸优化问题(目标对 π\pi 是凹的)。它有解析解。

1.2 推导

把目标整理成一个 KL 的形式。定义

π∗(y∣x)=1Z(x) πref(y∣x)exp⁡ ⁣(r(x,y)β),Z(x)=∑yπref(y∣x)exp⁡ ⁣(r(x,y)β).\pi^*(y\mid x)=\frac1{Z(x)}\,\pi_{ref}(y\mid x)\exp\!\Big(\frac{r(x,y)}\beta\Big),\qquad Z(x)=\sum_y\pi_{ref}(y\mid x)\exp\!\Big(\frac{r(x,y)}\beta\Big).

取对数:r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x)r(x,y)=\beta\log\frac{\pi^*(y\mid x)}{\pi_{ref}(y\mid x)}+\beta\log Z(x)。代回目标:

∑yπ[βlog⁡π∗πref+βlog⁡Z−βlog⁡ππref]=−β∑yπlog⁡ππ∗+βlog⁡Z=−β KL(π ∥ π∗)+βlog⁡Z(x).\sum_y\pi\Big[\beta\log\frac{\pi^*}{\pi_{ref}}+\beta\log Z-\beta\log\frac{\pi}{\pi_{ref}}\Big]=-\beta\sum_y\pi\log\frac{\pi}{\pi^*}+\beta\log Z=-\beta\,\mathrm{KL}(\pi\,\|\,\pi^*)+\beta\log Z(x).

βlog⁡Z(x)\beta\log Z(x) 不依赖 π\pi;KL≥0\mathrm{KL}\ge0,当且仅当 π=π∗\pi=\pi^* 时为 0。所以:

 π∗(y∣x)=1Z(x) πref(y∣x)exp⁡ ⁣(r(x,y)β),最优值=βlog⁡Z(x). \boxed{\ \pi^*(y\mid x)=\frac1{Z(x)}\,\pi_{ref}(y\mid x)\exp\!\Big(\frac{r(x,y)}\beta\Big),\qquad\text{最优值}=\beta\log Z(x).\ }

w3day4_checks.py 第 1 组:对 logits 直接做 2 万步梯度上升,数值解与闭式解的最大差不超过 4.3×10−44.3\times10^{-4};数值最优值与 βlog⁡Z\beta\log Z 逐位吻合(β=0.5\beta=0.5 时都是 0.3334)。

直觉:最优策略就是在参考模型上按奖励做指数加权。β\beta 是”温度”:β→∞\beta\to\infty 时 π∗=πref\pi^*=\pi_{ref};β→0\beta\to0 时全部概率压到奖励最高的回答上。这和 softmax 的温度是同一件事(Week 2 Day 3 §2.2)。

1.3 为什么不能直接用

Z(x)Z(x) 是对所有可能的回答求和。回答是长度几百的 token 序列,可能性是天文数字,Z(x)Z(x) 根本算不出来。所以有了 π∗\pi^* 的形式,也没法直接从中采样或计算它的概率。PPO 的做法是用采样去逼近它(Day 3 §3.5)。

DPO 的洞见是:我们其实不需要 Z(x)Z(x)。


§2 DPO

2.1 把关系反过来:用策略表示奖励

上面那个关系对任意奖励 rr 和它对应的最优策略都成立。把它倒过来读:

r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x).r(x,y)=\beta\log\frac{\pi^*(y\mid x)}{\pi_{ref}(y\mid x)}+\beta\log Z(x).

奖励可以用最优策略和参考模型表示出来,只多了一个只依赖提示的项 βlog⁡Z(x)\beta\log Z(x)。

现在把它代进 Bradley-Terry 模型(Day 2 §2.2)。BT 只看同一个提示下两个回答的奖励之差:

P(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))=σ(βlog⁡π∗(yw∣x)πref(yw∣x)−βlog⁡π∗(yl∣x)πref(yl∣x)).P(y_w\succ y_l\mid x)=\sigma\big(r(x,y_w)-r(x,y_l)\big)=\sigma\Big(\beta\log\frac{\pi^*(y_w\mid x)}{\pi_{ref}(y_w\mid x)}-\beta\log\frac{\pi^*(y_l\mid x)}{\pi_{ref}(y_l\mid x)}\Big).

βlog⁡Z(x)\beta\log Z(x) 在相减时抵消了。 第 2 组:隐式奖励 r^=βlog⁡(π∗/πref)\hat r=\beta\log(\pi^*/\pi_{ref}) 与真实奖励在所有回答上都恰好差 −βlog⁡Z-\beta\log Z(最大偏离 10−1610^{-16}),两者算出的所有 BT 概率的最大差是 2×10−162\times10^{-16}。

2.2 DPO 损失

既然偏好概率可以只用策略表示,就直接对策略 πθ\pi_\theta 做最大似然:

LDPO(θ)=−E(x,yw,yl)[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))].\mathcal L_{DPO}(\theta)=-\mathbb E_{(x,y_w,y_l)}\Big[\log\sigma\Big(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{ref}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{ref}(y_l\mid x)}\Big)\Big].

它和奖励模型的损失(Day 2 §2.2)形式完全一样,只是把 rϕ(x,y)r_\phi(x,y) 换成了 r^θ(x,y)=βlog⁡πθ(y∣x)πref(y∣x)\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\mid x)}{\pi_{ref}(y\mid x)}。Rafailov et al. 2023 的论文标题说的就是这件事:Your Language Model is Secretly a Reward Model。

要算的东西:四个序列 log 概率。log⁡πθ(y∣x)=∑tlog⁡πθ(yt∣x,y<t)\log\pi_\theta(y\mid x)=\sum_t\log\pi_\theta(y_t\mid x,y_{<t}),只对回答部分求和(和 SFT 的掩码一样,Week 2 Day 6 §1.3)。参考模型的两项不需要梯度,可以在训练前一次算好。

第 3 组(表格情形,20 个回答,偏好对按 BT 从真实奖励生成,β=0.5\beta=0.5):

偏好对数KL(π_θ‖π*)隐式奖励与真实奖励的相关Eπ[r]\mathbb E_\pi[r]只赢过 / 只输过的回答数
1002.0860.6792.3732 / 2
10007.3640.6930.9901 / 0
100000.0020.9883.2480 / 0

(π∗\pi^* 本身 E[r]=3.265\mathbb E[r]=3.265,πref\pi_{ref} 是 −0.605。)

数据足够时,DPO 的解就是 π∗\pi^*:它和 PPO(Day 3 §3.5)在逼近同一个分布,只是不需要采样、不需要奖励模型。数据少时要小心:1000 对时有一个回答只赢过、从没输过,DPO 会把它的概率无限推高,结果离 π∗\pi^* 反而比 100 对时还远。这个机制 §3.5 专门讲。

2.3 梯度:按排错程度加权

对 θ\theta 求导(记 r^w\hat r_w、r^l\hat r_l 为两个隐式奖励):

∇θLDPO=−β E[σ(r^l−r^w)⏟权重(∇θlog⁡πθ(yw∣x)−∇θlog⁡πθ(yl∣x))].\nabla_\theta\mathcal L_{DPO}=-\beta\,\mathbb E\Big[\underbrace{\sigma(\hat r_l-\hat r_w)}_{\text{权重}}\big(\nabla_\theta\log\pi_\theta(y_w\mid x)-\nabla_\theta\log\pi_\theta(y_l\mid x)\big)\Big].

直觉:提高 ywy_w 的概率、降低 yly_l 的概率,权重是”隐式奖励模型当前把这一对排错的程度”。第 4 组:

r^w−r^l\hat r_w-\hat r_l−4−20+2+4
权重 σ(r^l−r^w)\sigma(\hat r_l-\hat r_w)0.9820.8810.5000.1190.018

已经排对、而且排得很开的对,几乎不再贡献梯度。论文报告:去掉这个权重(直接最大化 log⁡π(yw)−log⁡π(yl)\log\pi(y_w)-\log\pi(y_l))会让模型退化。

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 和裁剪;超参数基本只有 β\beta 和学习率。显存是策略 + 参考模型,参考模型的 log 概率预先算好的话,只剩策略本身(Day 3 §4.3)。


§3 性质与局限

3.1 DPO 和 PPO 优化的是同一个东西吗

在理想条件下是。 如果偏好数据完全服从 BT 模型、奖励模型和策略都有无限容量、数据覆盖所有回答,那么”先训练奖励模型再做 KL 约束的 RL”和”直接做 DPO”得到同一个 π∗\pi^*。第 3 组(10000 对时 KL(π_θ‖π*)=0.002)和 Day 3 §3.5(KL(π‖π*)≈0.01)在玩具上验证了这一点。

现实里不是,差别就在下面几节。

3.2 β 的作用

同样的 10000 对数据,换不同的 β\beta(第 3 组):

β\betaKL(π_θ‖π_ref)Eπ[r]\mathbb E_\pi[r]KL(π_θ‖π*_β)
0.12.5133.3230.000
0.252.4903.3180.001
0.52.3493.2580.002
1.01.6032.6860.003
2.00.4961.1840.001

β\beta 越小,离参考模型越远、奖励越高,也越容易过度优化(Day 2 §3.2);β\beta 越大越保守。每个 β\beta 下 DPO 都收敛到对应的 πβ∗\pi^*_\beta。常用 β≈0.1\beta\approx0.1。学习计划的动手任务要求”观察 β 取不同值的效果”,参考代码 --mini --beta 就是做这个的。

3.3 被选中的回答,概率也会下降

现象:DPO 训练时,被选中回答的 log 概率常常也在下降,只是被拒绝的降得更多。这叫 likelihood displacement。

原因:DPO 只要求间隔 log⁡πθ(yw)πref(yw)−log⁡πθ(yl)πref(yl)\log\frac{\pi_\theta(y_w)}{\pi_{ref}(y_w)}-\log\frac{\pi_\theta(y_l)}{\pi_{ref}(y_l)} 变大,不要求 πθ(yw)\pi_\theta(y_w) 本身变大。真实模型的参数是共享的,压低 yly_l 的那个方向,也会压低和它很像的 ywy_w。

第 5 组(50 个回答共享 8 维特征,只用一个偏好对训练 200 步):

两个回答的关系log⁡π(yw)\log\pi(y_w) 下降的种子数log⁡π(yl)\log\pi(y_l) 下降间隔变大
很像(yl=yw+0.3⋅y_l=y_w+0.3\cdot噪声)16 / 2020 / 2020 / 20
不相关6 / 2020 / 2020 / 20

一个例子:训练前 log⁡π(yw)=−3.35\log\pi(y_w)=-3.35、log⁡π(yl)=−4.02\log\pi(y_l)=-4.02;200 步后分别是 −4.11 和 −10.01,其余 48 个回答的总概率从第 1 步的 0.946(第 50 步先降到 0.940)升到 0.984。概率流向了训练数据里没有的回答,而那些回答不一定好。

意义:偏好数据里的好坏回答往往很像(同一个模型对同一个提示的两次采样),所以这在实践中很常见。对策包括:在 DPO 损失上加一项被选中回答的 SFT 损失(RPO、DPOP 等变体),或者使用在线数据(§3.4)。

3.4 离线数据与分布偏移

DPO 是离线的:偏好对是事先收集好的,训练中策略不再采样。问题是:

  • 如果偏好对不是从 πref\pi_{ref} 采的(比如用别的更强的模型生成),DPO 的推导前提(数据来自 πref\pi_{ref} 附近)就不成立。论文建议:没有合适的 SFT 模型时,先在被选中的回答上做一遍 SFT,再把它当 πref\pi_{ref}。
  • 策略一旦偏离,它在自己的新分布上犯的错,离线数据里没有任何信号去纠正。

PPO 是在线的,每一轮都在自己的分布上采样、打分,这正是它的优势。折中的做法是迭代 / 在线 DPO:每一轮用当前策略采样新的回答对,用奖励模型或人来标注,再做一轮 DPO。

3.5 确定性偏好:DPO 的 KL 约束会失效

问题:偏好数据里一个对往往只出现一次,标签是确定的,没有反例。DPO 的损失 −log⁡σ(βh)-\log\sigma(\beta h) 只有在 h→∞h\to\infty 时才等于 0。第 6 组(一个偏好对、没有反例,β=0.1\beta=0.1):

步数DPO:hhDPO:KL(π‖π_ref)IPO:hhIPO:KL(π‖π_ref)
101.000.0410.990.040
1009.061.8615.040.945
100038.702.1985.000.933
20000147.592.1985.000.933

(hh 是未乘 β\beta 的对数比之差。)DPO 的 hh 无界增长,π(yl)\pi(y_l) 被压向 0;KL 停在 2.2 只是因为 yly_l 的概率已经几乎没了。β\beta 只改变”推多快”,不改变”推到哪”:β\beta 本该起的”别离参考模型太远”的作用,在有限、确定的偏好数据上失效了。 这也是第 3 组”1000 对时比 100 对还差”的原因。

实践中的表现:DPO 训练久了,隐式奖励在训练集上的准确率接近 100%,间隔持续增大,而生成质量开始下降。对策:早停、少训几个 epoch(通常 1–3 个)、标签平滑(conservative DPO,今天 §4 表中)、或者换 IPO。


§4 变体地图

学习计划点名的四个,每个都在修 DPO 的一个具体问题:

4.1 IPO:有界的目标间隔

问题:§3.5 的过拟合。做法(Azar et al. 2023):把 −log⁡σ(βh)-\log\sigma(\beta h) 换成平方损失

LIPO=(h−12τ)2,h=log⁡πθ(yw)πref(yw)−log⁡πθ(yl)πref(yl).\mathcal L_{IPO}=\Big(h-\frac1{2\tau}\Big)^2,\qquad h=\log\frac{\pi_\theta(y_w)}{\pi_{ref}(y_w)}-\log\frac{\pi_\theta(y_l)}{\pi_{ref}(y_l)}.

它让 hh 回归到一个有限的目标值,而不是无限增大。第 6 组:τ=0.1\tau=0.1 时 hh 稳定在 5.00,KL 停在 0.93。

4.2 KTO:不需要成对数据

问题:成对的偏好数据贵;很多场景只有”这个回答好 / 不好”的单点反馈(点赞、点踩)。做法(Ethayarajh et al. 2024):借用行为经济学的前景理论(prospect theory),对每个回答单独打分。设 rθ=log⁡πθ(y)πref(y)r_\theta=\log\frac{\pi_\theta(y)}{\pi_{ref}(y)},z0z_0 是当前策略与参考模型之间 KL 的一个批内估计,则

LKTO={λD(1−σ(β(rθ−z0)))y 是好的λU(1−σ(β(z0−rθ)))y 是坏的\mathcal L_{KTO}=\begin{cases}\lambda_D\big(1-\sigma(\beta(r_\theta-z_0))\big)&y\ \text{是好的}\\\lambda_U\big(1-\sigma(\beta(z_0-r_\theta))\big)&y\ \text{是坏的}\end{cases}

好回答的隐式奖励要高于参照点 z0z_0,坏回答要低于它;λD\lambda_D、λU\lambda_U 可以不对称(“损失厌恶”)。

4.3 SimPO:去掉参考模型,按长度归一化

问题:DPO 的隐式奖励是整个序列 log 概率之比,和生成时实际用的”每个 token 的平均 log 概率”不一致;训练时要多存或多算一个参考模型;而且容易让回答越来越长。做法(Meng et al. 2024):

LSimPO=−log⁡σ(β∣yw∣log⁡πθ(yw∣x)−β∣yl∣log⁡πθ(yl∣x)−γ).\mathcal L_{SimPO}=-\log\sigma\Big(\frac\beta{|y_w|}\log\pi_\theta(y_w\mid x)-\frac\beta{|y_l|}\log\pi_\theta(y_l\mid x)-\gamma\Big).

奖励是长度归一化的平均 log 概率,不需要参考模型;γ\gamma 是一个目标间隔。代价是失去了 KL 约束的理论保证,β\beta 和 γ\gamma 要仔细调(论文里 β\beta 常在 2 以上)。

4.4 ORPO:把 SFT 和偏好对齐合成一步

问题:SFT 和 DPO 要分两个阶段、还要一个参考模型。做法(Hong et al. 2024):在 SFT 损失上加一项胜率比(odds ratio)损失

LORPO=LSFT(yw)−λlog⁡σ(log⁡oddsθ(yw)oddsθ(yl)),odds(y)=Pθ(y)1−Pθ(y),\mathcal L_{ORPO}=\mathcal L_{SFT}(y_w)-\lambda\log\sigma\Big(\log\frac{\text{odds}_\theta(y_w)}{\text{odds}_\theta(y_l)}\Big),\qquad\text{odds}(y)=\frac{P_\theta(y)}{1-P_\theta(y)},

其中 Pθ(y)P_\theta(y) 用长度归一化的似然。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-nn、做评估、做迭代的数据筛选;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 约束 / β\beta:不让策略离参考模型太远。
  • 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 模型的一份冻结拷贝。显存吃紧时,先把整个数据集的 log⁡πref\log\pi_{ref} 算好存起来,训练时只加载策略。
  • LoRA:参考模型就是关掉适配器的策略(with model.disable_adapter():),不需要额外的显存。参考代码 --hf 就是这样做的。
  • 参考模型必须是训练开始时的策略(通常就是 SFT 模型)。换一个参考模型,β\beta 的含义和最优解都变了。

A.2 trl 的 DPOTrainer

  • 数据格式:prompt、chosen、rejected 三个字段(或对话形式)。trl 会自己套 chat template、只在回答上算 log 概率。
  • beta 就是 β\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 超参数

  • 学习率要小:全量微调常用 5×10−75\times10^{-7} 量级,LoRA 在 5×10−65\times10^{-6} 到 5×10−55\times10^{-5}。比 SFT 小一个数量级以上。
  • β\beta:0.1 左右起步;想离参考模型更远就调小。
  • epoch:1–3 个。确定性偏好下训得越久越过拟合。
  • 最大长度:被截断的回答对,比较的就不是完整的回答了;两个回答截断程度不同时,隐式奖励会偏向更短的那个。

§B 实操

  1. 跑通 w3day4_checks.py,6 组结论都看懂。
  2. 推导(1h,闭卷):(a) 从 KL 约束目标推出 π∗\pi^* 和最优值 βlog⁡Z\beta\log Z;(b) 把 rr 用 π∗\pi^* 表示,代入 BT,得到 DPO 损失;(c) 求 DPO 损失的梯度,说明权重的含义。这是面试高频题,要做到不看资料十分钟写完。
  3. mini-GPT 上的 DPO(1.5h):python code/w3d4_dpo.py --mini,再用 --beta 0.02、--loss ipo 各跑一次。与 Day 3 的 PPO 比较:gold 提高了多少、KL 多大、用时多少;观察 chosen / rejected 的 log 概率。
  4. 学习计划的动手任务(2h,GPU 更好):在 Week 2 的 SFT 模型上做 DPO:--hf --model ../../Week2/code/w2d6_out/lora/merged(没有的话用默认的 Qwen2.5-0.5B-Instruct),对比 DPO 前后的回答风格,并试两个不同的 β\beta。
  5. 读论文:DPO 的第 4 节(推导)与第 5 节(理论);挑读 IPO(Azar et al. 2023)的第 5 节。

参考实现:code/w3d4_dpo.py。


§C 自测

动机与直觉层

  1. 既然 KL 约束的 RLHF 目标有闭式最优解,为什么不能直接用它?DPO 是怎么绕过这个障碍的?
  2. DPO 的”隐式奖励”是什么?为什么说语言模型本身就是一个奖励模型?
  3. DPO 的梯度权重 σ(r^l−r^w)\sigma(\hat r_l-\hat r_w) 有什么作用?
  4. 为什么 DPO 训练时被选中回答的概率也会下降?这有什么风险?
  5. 为什么确定性偏好会让 DPO 的 KL 约束失效?IPO 怎么修?

推导与计算层

  1. 推出 KL 约束目标的最优解,写出最优值。
  2. 从最优解推出 DPO 损失,说明 Z(x)Z(x) 为什么会抵消。
  3. 求 DPO 损失对 θ\theta 的梯度。
  4. 写出 IPO、SimPO、ORPO 的损失,各用一句话说明它修的问题。

工程层

  1. DPO 相比 PPO 去掉了哪两个模型?代价是什么?
  2. 什么情况下你会选 PPO 而不是 DPO?
  3. 用 LoRA 做 DPO 时,参考模型从哪来?训练日志里 rewards/chosen 是负数正常吗?
  4. 什么是对齐税?列出三种缓解方法。

出关标准

  • 能闭卷推出 π∗\pi^* 和 DPO 损失,说清 Z(x)Z(x) 为什么抵消
  • 能求出 DPO 的梯度,解释权重的含义
  • 能说清 β\beta 的作用,并在 --mini 上观察到
  • 能解释 likelihood displacement、确定性偏好下的过拟合、离线数据的分布偏移
  • 能说出 IPO、KTO、SimPO、ORPO 各自的数据需求、是否需要参考模型、修的是什么
  • 能回答”DPO 省了什么、丢了什么”和”什么时候选 PPO”
  • 在 Week 2 的 SFT 模型上跑通一次 DPO

疑问清单

← 返回课程目录