深度解读 📅 2026-10-07 ✍️ MagicNetWorld 编辑部

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 的便利之处,也是它公认的软肋。

直接偏好优化RLHF模型对齐数学推导

让一个已经会说话的大模型「说人话、按指令办事」,靠的不是接着做预训练,而是一个单独的对齐(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):对同一个提示,采样若干个模型回答,让人工把它们排序;再用这些成对比较数据,训一个「打分模型」rϕ(x,y)r_\phi(x,y),让它对更受偏好的回答给更高分。

第三步是用强化学习微调语言模型:把奖励模型当作环境里的奖励信号,用 PPO 之类的算法更新语言模型,让它生成更高奖励的回答;同时在目标里加一个 KL 惩罚项,防止语言模型为了骗高分而偏离原来的分布太远。

头疼的地方集中在第二、三步。奖励模型是一个代理目标:它只是人类偏好的一次近似,模型很容易学会去钻它的空子(reward hacking)。而第三步的在线强化学习要反复「采样 → 打分 → 更新」,采样成本高、方差大、超参敏感。DPO 的动机就是:既然奖励模型本身也只是个人类偏好的近似,能不能不要它,也不要在线强化学习,直接拿偏好数据去优化语言模型?

二、符号与约定

后文一律用下面这套记号,先统一,免得推导时混淆。

符号含义
xx输入提示(prompt)
yy模型生成的整段回答(answer / completion)
yw, yly_w,\,y_l同一提示下,人类标注中更偏好(winner)与更不偏好(loser)的两个回答
πθ(y∣x)\pi_\theta(y\mid x)正在训练的策略模型,参数为 θ\theta
πref(y∣x)\pi_{\mathrm{ref}}(y\mid x)冻结的参考模型,通常是监督微调之后的模型
πr(y∣x)\pi_r(y\mid x)给定奖励 r(x,y)r(x,y) 时的最优策略(第五节给出其闭式解)
r(x,y)r(x,y)标量奖励函数;RLHF 里由一个参数化模型 rϕ(x,y)r_\phi(x,y) 拟合
β\betaKL 惩罚系数,越大表示越不允许策略偏离参考模型
σ(⋅)\sigma(\cdot)logistic / sigmoid 函数 σ(z)=1/(1+e−z)\sigma(z)=1/(1+e^{-z})
Z(x)Z(x)配分函数(partition function),只依赖提示 xx
DKLD_{\mathrm{KL}}Kullback–Leibler 散度
r^θ(x,y)\hat r_\theta(x,y)DPO 隐含的奖励,只由策略与参考模型的对数比给出

一句话概括这套记号里的主角:策略 πθ\pi_\theta 是要训练的,参考模型 πref\pi_{\mathrm{ref}} 是冻住的,奖励 rr 是我们要绕开的那一环。

三、形式化之一:把「人类偏好」写成一个概率模型

人类给出的是成对比较:对同一个提示,回答 A 比回答 B 好。要把它变成一个可优化的目标,需要一个把「标量分数差」映射到「A 胜过 B 的概率」的模型。RLHF 用的标准答案是 Bradley–Terry 模型:

p(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))=11+exp⁡(r(x,yl)−r(x,yw)).p(y_w \succ y_l \mid x) = \sigma\big(r(x,y_w) - r(x,y_l)\big) = \frac{1}{1+\exp\big(r(x,y_l)-r(x,y_w)\big)}.

它说的是:两个回答被偏好的概率,只取决于它们奖励分数的差。分数差越大,赢家胜出的概率越接近 1;分数相等时概率正好是 0.5。这一步在 RLHF 里被用来训奖励模型——把人类比较数据当成标签,用最大似然去拟合 rϕr_\phi。

注意一个关键前提:Bradley–Terry 只看同一提示内部的分数差。这意味着,如果两个奖励函数只在「同一个 xx 上加了一个常数」上不同,它们给出的偏好分布完全一样。这个「只依赖 xx 的常数项」在第五节会再次出现,并且正是它让 DPO 的推导得以成立。

这条用成对比较训奖励模型的路线,最早可以追溯到 Christiano 等把人类偏好用于深度强化学习的工作(arXiv:1706.03741),以及 Stiennon 等把它用于摘要任务的研究(arXiv:2009.01325)。

四、形式化之二:RLHF 的目标函数与 KL 约束

有了奖励模型,第三步要解决的是一个带约束的优化问题:让策略生成的回答拿高分,但又不许离参考模型太远。写成期望形式:

max⁡πθ Ex∼D, y∼πθ(y∣x)[r(x,y)]  −  β DKL(πθ(y∣x) ∥ πref(y∣x)).\max_{\pi_\theta}\ \mathbb{E}_{x\sim\mathcal{D},\,y\sim\pi_\theta(y\mid x)}\Big[r(x,y)\Big] \;-\; \beta\, D_{\mathrm{KL}}\Big(\pi_\theta(y\mid x)\,\Big\|\,\pi_{\mathrm{ref}}(y\mid x)\Big).

逐项读一下:第一项是「拿高分」,第二项是「别跑远」。DKL(πθ∥πref)D_{\mathrm{KL}}(\pi_\theta\|\pi_{\mathrm{ref}}) 度量策略相对参考模型的分布偏移;rr 在这里可以理解为一个已经训好的(或隐式的)奖励函数。

为什么要加这个 KL 项?Hugging Face 在介绍 DPO 的官方博客里给了一个直白的解释:它相当于一个「锚」,防止模型为了最大化奖励而学歪、输出乱码或钻奖励模型的空子(Hugging Face Blog,2023-08-08,dpo-trl)。InstructGPT 的 PPO 目标里同样带这一项(Ouyang 等,arXiv:2203.02155)。

这个目标看起来需要「在策略分布上求期望」,直觉上必须靠在线采样加强化学习才能解。DPO 的第一个关键动作,是证明它其实有闭式解。

五、闭式最优策略:把最优解先解出来

先把目标里两项合并。利用 DKL(π∥q)=Ey∼π[log⁡π(y∣x)q(y∣x)]D_{\mathrm{KL}}(\pi\|q)=\mathbb{E}_{y\sim\pi}[\log \frac{\pi(y|x)}{q(y|x)}],把上面的目标改写成对 π\pi 的单一期望:

max⁡π −β Ey∼π[log⁡π(y∣x)πref(y∣x)−r(x,y)β].\max_{\pi}\ -\beta\,\mathbb{E}_{y\sim\pi}\Big[\log\frac{\pi(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} - \frac{r(x,y)}{\beta}\Big].

这等价于最小化方括号里的期望(乘正的常数 β\beta 不改变极值点)。现在引入一个只依赖 xx 的配分函数:

Z(x)=∑yπref(y∣x) exp⁡ ⁣(1β r(x,y)).Z(x) = \sum_{y}\pi_{\mathrm{ref}}(y\mid x)\,\exp\!\Big(\frac{1}{\beta}\,r(x,y)\Big).

并据此定义一个分布:

πr(y∣x)=1Z(x) πref(y∣x) exp⁡ ⁣(1β r(x,y)).\pi_r(y\mid x) = \frac{1}{Z(x)}\,\pi_{\mathrm{ref}}(y\mid x)\,\exp\!\Big(\frac{1}{\beta}\,r(x,y)\Big).

注意 Z(x)Z(x) 出现在分母上的作用,就是把这个式子归一化成一个合法概率分布(各项非负且求和为 1)。把它代回方括号里,做一个「乘 Z(x)Z(x) 再除 Z(x)Z(x)」的小变换:

log⁡π(y∣x)πref(y∣x)−log⁡exp⁡ ⁣(r(x,y)β)=log⁡π(y∣x)πref(y∣x) er(x,y)/β=log⁡π(y∣x)Z(x) πr(y∣x).\log\frac{\pi(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} - \log\exp\!\Big(\frac{r(x,y)}{\beta}\Big) = \log\frac{\pi(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)\,e^{r(x,y)/\beta}} = \log\frac{\pi(y\mid x)}{Z(x)\,\pi_r(y\mid x)}.

于是原目标等价于:

−β Ey∼π[log⁡π(y∣x)πr(y∣x)]+βlog⁡Z(x)=−β DKL(π ∥ πr)+βlog⁡Z(x).-\beta\,\mathbb{E}_{y\sim\pi}\Big[\log\frac{\pi(y\mid x)}{\pi_r(y\mid x)}\Big] + \beta\log Z(x) = -\beta\,D_{\mathrm{KL}}\big(\pi\,\|\,\pi_r\big) + \beta\log Z(x).

右边第二项 βlog⁡Z(x)\beta\log Z(x) 与 π\pi 无关,是个常数。KL 散度非负、且当且仅当 π=πr\pi=\pi_r 时取 0。所以最优策略就是:

 πr(y∣x)=1Z(x) πref(y∣x) exp⁡ ⁣(1β r(x,y)) \boxed{\ \pi_r(y\mid x) = \frac{1}{Z(x)}\,\pi_{\mathrm{ref}}(y\mid x)\,\exp\!\Big(\frac{1}{\beta}\,r(x,y)\Big)\ }

这个解的形状很值得记:最优策略 = 参考模型 × 奖励的指数加权,再做归一化。奖励越高、概率被抬得越多;β\beta 越大,指数里的 r/βr/\beta 越被压平,策略就越贴近参考模型——这正好和「β\beta 是 KL 约束强度」的直觉对上。

六、DPO 损失:把奖励反解出来,代回偏好似然

闭式解里 πr\pi_r 是「给定奖励 rr 时的最优策略」。DPO 要的是反方向:把 rr 用 πr\pi_r 表示出来。对上一式取对数、移项:

r(x,y)=β log⁡πr(y∣x)πref(y∣x)  +  β log⁡Z(x).r(x,y) = \beta\,\log\frac{\pi_r(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} \;+\; \beta\,\log Z(x).

这就是 DPO 的枢纽一步:奖励可以写成「策略与参考模型的对数比」加一个常数。而且那个常数 βlog⁡Z(x)\beta\log Z(x) 只依赖提示 xx,不依赖回答 yy。

现在把它代回第三节的 Bradley–Terry 概率里。因为比较的两个回答共享同一个提示 xx,两个 βlog⁡Z(x)\beta\log Z(x) 相减时整项约掉:

p(yw≻yl∣x)=σ ⁣(βlog⁡πr(yw∣x)πref(yw∣x)−βlog⁡πr(yl∣x)πref(yl∣x)).p(y_w\succ y_l\mid x) = \sigma\!\Big(\beta\log\frac{\pi_r(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)} - \beta\log\frac{\pi_r(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}\Big).

到这里,奖励模型 rϕr_\phi 已经彻底消失,只剩策略和参考模型。把「最优策略」πr\pi_r 换成我们要训练的参数化策略 πθ\pi_\theta,再对数据集里的所有偏好对取负对数似然,就得到 DPO 的损失:

 LDPO(πθ;πref)=− E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))] \boxed{\ \mathcal{L}_{\mathrm{DPO}}(\pi_\theta;\pi_{\mathrm{ref}}) = -\,\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\Big[\log\sigma\Big(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)} - \beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}\Big)\Big]\ }

这就是整篇文章的落点。回头看这条路做了三件事:① 用 KL 正则化目标求出了最优策略的闭式解;② 把奖励反解成策略与参考模型的对数比,只相差一个「只依赖 xx 的常数」;③ 把这个反解代回 Bradley–Terry 偏好似然,常数项因 xx 相同而约掉,从而得到一个完全不需要奖励模型、也不需要在线采样的损失。

工程含义是直接的:训练时你只需要对每个偏好对做前向传播——一次过 πθ\pi_\theta 算两个回答的对数概率,一次过冻结的 πref\pi_{\mathrm{ref}} 算同样的量,然后算上面的 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 不是「没有奖励」,而是把奖励藏进了策略与参考模型的对数比里(所以论文标题说语言模型「其实是个奖励模型」);推导的关键就是那个只依赖 xx 的常数项在成对比较里被约掉。

七、梯度解剖:那个隐式权重从哪来

光有损失还不够,得看它按什么方向推参数。对 LDPO\mathcal{L}_{\mathrm{DPO}} 求关于 θ\theta 的梯度,令隐式奖励

r^θ(x,y)=β log⁡πθ(y∣x)πref(y∣x),\hat r_\theta(x,y) = \beta\,\log\frac{\pi_\theta(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)},

可以写成(符号 σ\sigma 内为偏好差):

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

逐项读:括号里是「抬高赢家对数概率、压低输家对数概率」的方向;前面的权重

w=σ(r^θ(x,yl)−r^θ(x,yw))=σ(−(r^θ(x,yw)−r^θ(x,yl)))w = \sigma\big(\hat r_\theta(x,y_l)-\hat r_\theta(x,y_w)\big) = \sigma\big(-\big(\hat r_\theta(x,y_w)-\hat r_\theta(x,y_l)\big)\big)

正是这个梯度里最需要留意的地方。当模型已经强烈偏好赢家(r^w−r^l\hat r_w-\hat r_l 是个较大的正数)时,ww 会趋近 0——也就是说,模型已经做对的样本,会被自动降权。反过来,模型当前判断错、或 margin 还很小的样本,权重接近 0.5,贡献最大。

这个设计有它的合理性(把学习注意力集中在还没学会的样本上),但也埋了 DPO 的一个公认软肋:损失里没有一个显式的、可标定的奖励项,模型对「已经正确的样本」的偏好可能会被过度压低,而不是被温和地维持。这一点在第八节的数值例子和第十六节的外部研究中都会再出现。

八、数值例子(本文自行推导)

为了把上面的公式变成可感的数字,本文取 β=0.1\beta = 0.1(原论文多数实验的默认值),令

Δw=log⁡πθ(yw∣x)−log⁡πref(yw∣x),Δl=log⁡πθ(yl∣x)−log⁡πref(yl∣x),\Delta_w=\log\pi_\theta(y_w\mid x)-\log\pi_{\mathrm{ref}}(y_w\mid x),\qquad \Delta_l=\log\pi_\theta(y_l\mid x)-\log\pi_{\mathrm{ref}}(y_l\mid x),

于是 margin m=β(Δw−Δl)m=\beta(\Delta_w-\Delta_l),损失 =−log⁡σ(m)=-\log\sigma(m),梯度权重 w=σ(−m)w=\sigma(-m)。下表四行是本文用这两个公式直接算出来的结果(不是任何论文的实验数据):

Δw\Delta_wΔl\Delta_lmargin mmσ(m)\sigma(m)损失 −log⁡σ(m)-\log\sigma(m)梯度权重 w=σ(−m)w=\sigma(-m)
0.00.00.00.50000.69310.5000
2.0−2.00.40.59870.51300.4013
4.0−4.00.80.69000.37110.3100
−0.50.5−0.10.47500.74440.5250

怎么读这张表:

  • 第一行是从零起步:策略与参考模型对两个回答的判断完全一样(Δw=Δl=0\Delta_w=\Delta_l=0),margin 为 0,σ(0)=0.5\sigma(0)=0.5,损失就是 ln⁡2≈0.6931\ln 2\approx 0.6931,梯度权重 0.5——最「不知道」的状态,贡献最大。
  • 第二、三行是模型逐渐把赢家抬高、把输家压低:margin 从 0 涨到 0.4 再到 0.8,损失从 0.6931 降到 0.5130 再到 0.3711;同时梯度权重从 0.5 掉到 0.4013、再到 0.3100。损失在降、权重也在降,正是「学会了的样本被自动降权」的量化体现。
  • 第四行是模型学反了:它更偏好被标注为差的回答(Δw<0<Δl\Delta_w<0<\Delta_l),margin 变成负数,损失升到 0.7444(比第一行还高),梯度权重也升到 0.5250,方向会把它往回拉。

再看 β\beta 的作用。同样取 Δw=4, Δl=−4\Delta_w=4,\ \Delta_l=-4,把 β\beta 从 0.1 换成 0.5,margin 从 0.8 变成 4.0,σ(m)\sigma(m) 从 0.6900 涨到 0.9820,损失从 0.3711 跌到 0.0181,梯度权重从 0.3100 掉到 0.0180。也就是说:β\beta 越大,同样的对数比变化能换到越大的 margin——模型只需偏离参考模型更少,就能把偏好拉开。这和第五节「β\beta 是 KL 约束强度」的结论一致:β \beta 大 = 更严格地贴着参考模型。

声明:本节表格与数字均为本文依据第六、七节的公式自行计算(计算工具为 Python 标准库),用的是假设出来的 Δw,Δl\Delta_w,\Delta_l,不属于任何论文的实验结果,只用于说明公式行为。β=0.1\beta=0.1 取自原论文常见设置,具体取值以各任务实验为准。

九、对照表:RLHF-PPO / DPO / IPO / KTO / GRPO 各自在优化什么

把几个常被拿来和 DPO 比较的方法放在一起,能看清 DPO 的定位(各行结论均来自对应一手来源的摘要或正文):

方法要不要奖励模型训练信号优化方式是否需要在线采样一手来源
RLHF-PPO要(先训 rϕr_\phi)成对偏好在线强化学习 + 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 直接用固定的偏好对。

十、工程含义:β、参考模型、数据与常见误用

把推导落到实现层面,有几点值得单独拎出来。

β\beta 怎么选。 原论文多数任务取 β=0.1\beta=0.1。由第八节可知,β\beta 越大越贴着参考模型、越小越允许偏离。常用的调参直觉:模型「不够听话」(对齐不足、需要更大偏离)就把 β\beta 往小调;模型「带上了怪腔、丢了原有能力」(偏离过头)就把 β\beta 往大调——方向别弄反,β\beta 越大越贴参考模型、能做的偏离越小。

参考模型必须冻结,且和策略用同一套预处理。 πref\pi_{\mathrm{ref}} 是整个方法的「标尺」,它一变,对数比的基准就变了。实操里最常见的坑是:策略和参考模型用了不同的对话模板(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)。换损失类型时,β\beta 的语义可能跟着变——文档对 hinge 就注明此时 beta 是 margin 的倒数,不能照搬 0.1。

数据必须是「同一提示下的成对」。 两个回答不同提示,Bradley–Terry 的推导前提就不成立。构造数据时要保证 chosen/rejected 共享同一个 prompt。

别把它当监督微调。 DPO 的目标是「拉开赢家与输家的对数比」,不是「让模型复述赢家」。TRL 文档里有一句观察值得记住:实践中它更多是通过压低不偏好回答的概率来实现的,而不是单纯抬高偏好回答的概率(Hugging Face TRL 文档,DPO Trainer)。

十一、回看闭式解:换一条路(拉格朗日)再推一遍做自验

第五节是用「配方 + KL 散度改写」推的闭式解。为了确认它没推错,这里换一条更机械的路:把它当成一个带归一化约束的优化问题,用拉格朗日乘子法再解一遍。

目标(对固定提示 xx,为省记号把 xx 隐含在 π(y)\pi(y)、r(y)r(y) 里)是

max⁡π ∑yπ(y) r(y)  −  β∑yπ(y)log⁡π(y)πref(y),\max_{\pi}\ \sum_y \pi(y)\,r(y) \;-\; \beta\sum_y \pi(y)\log\frac{\pi(y)}{\pi_{\mathrm{ref}}(y)},

约束是 ∑yπ(y)=1\sum_y \pi(y)=1。引进只依赖 xx 的乘子 λ(x)\lambda(x),构造拉格朗日函数:

J(π)=∑yπ(y) r(y)−β∑yπ(y)log⁡π(y)πref(y)+λ(x)(1−∑yπ(y)).\mathcal{J}(\pi)=\sum_y \pi(y)\,r(y) - \beta\sum_y \pi(y)\log\frac{\pi(y)}{\pi_{\mathrm{ref}}(y)} + \lambda(x)\Big(1-\sum_y\pi(y)\Big).

对每个 π(y)\pi(y) 求偏导。这里要用到一条基本导数:∂∂π[πlog⁡ππref]=log⁡ππref+1\frac{\partial}{\partial\pi}\big[\pi\log\frac{\pi}{\pi_{\mathrm{ref}}}\big]=\log\frac{\pi}{\pi_{\mathrm{ref}}}+1。令偏导为零:

r(y)−βlog⁡π(y)πref(y)−β−λ(x)=0.r(y) - \beta\log\frac{\pi(y)}{\pi_{\mathrm{ref}}(y)} - \beta - \lambda(x) = 0.

移项解出 π\pi:

log⁡π(y)πref(y)=r(y)−β−λ(x)β⟹π(y)=πref(y)exp⁡ ⁣(r(y)β)⋅exp⁡ ⁣(−1−λ(x)β)⏟只依赖 x 的因子.\log\frac{\pi(y)}{\pi_{\mathrm{ref}}(y)} = \frac{r(y)-\beta-\lambda(x)}{\beta}\quad\Longrightarrow\quad \pi(y)=\pi_{\mathrm{ref}}(y)\exp\!\Big(\frac{r(y)}{\beta}\Big)\cdot\underbrace{\exp\!\Big(-1-\frac{\lambda(x)}{\beta}\Big)}_{\text{只依赖 }x\text{ 的因子}}.

右边那个因子对同一个 xx 是常数,由归一化条件 ∑yπ(y)=1\sum_y\pi(y)=1 唯一确定;把它记作 1/Z(x)1/Z(x),就回到第五节的结果 πr∝πrefexp⁡(r/β)\pi_r\propto\pi_{\mathrm{ref}}\exp(r/\beta)。两条路结果一致,说明推导可信;顺带还看清了 Z(x)Z(x) 的来历——它不是凭空定义的,而是归一化约束逼出来的。

一个附带的结论值得记住:目标函数对 π\pi 是严格凹的(线性项 ∑πr\sum\pi r 对 π\pi 线性,−βDKL-\beta D_{\mathrm{KL}} 对 π\pi 严格凹,两者之和严格凹),所以这个最优解是唯一的。这正是 DPO 敢把「最优策略」直接写成一个闭式表达式的前提——若最优解不唯一,「反解奖励」那一步就无从谈起。

十二、四种偏好损失的形式对比

把 DPO 的偏好差记成一个「logit」:

u=βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x),u=\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)},

那么 DPO 的损失就是 −log⁡σ(u)-\log\sigma(u)。同一条流水线上的其他损失,差别几乎都只落在「拿 uu 做哪种变换」。下表对照 Hugging Face TRL 文档对 loss_type 的说明,给出各变换的标准损失形式(TRL 文档只给定性描述,公式为本文按各自方法的常见写法转写):

loss_type对偏好差做的变换损失形式备注
sigmoid(DPO 原版,默认)logistic−log⁡σ(u)-\log\sigma(u)对归一化对数比做二分类
hinge(SLiC / RSO)铰链max⁡(0, 1−u)\max(0,\,1-u)文档注明此时 β\beta 是 margin 的倒数,语义与 DPO 不同
ipo(IPO)恒等(hπ−12τ)2\big(h_\pi-\tfrac{1}{2\tau}\big)^2去掉对数变换,改为对偏好差做平方回归
exo_pair(EXO)反向 KL偏好对的简化式(TRL 文档指向其 Eq.16)需 label_smoothing > 0,推荐 10−310^{-3}

其中 IPO 的

hπ=log⁡πθ(yw∣x) πref(yl∣x)πθ(yl∣x) πref(yw∣x),h_\pi=\log\frac{\pi_\theta(y_w\mid x)\,\pi_{\mathrm{ref}}(y_l\mid x)}{\pi_\theta(y_l\mid x)\,\pi_{\mathrm{ref}}(y_w\mid x)},

就是不带 β\beta 的对数比之差,1/(2τ)1/(2\tau) 是它希望拟合的理想偏好差(τ\tau 是正则强度)。这张表说明一件事:DPO 只是「用偏好差做二分类」这一族里的一个特例,换一个变换就得到另一套方法;而变换的选择会改变 β\beta 的语义,所以「β=0.1\beta=0.1」不能无脑套到别的损失上。IPO 那篇论文的立论正是:DPO 里那个 logit(对数)变换可能过拟合,于是干脆换成恒等变换,让目标直接回归偏好差本身(arXiv:2310.12036)。

十三、常见误解速查

推导看完了,把几个最容易想歪的点集中纠正一下。

误解一:DPO 不需要奖励模型,所以就没有奖励。 错。由第六节,奖励以隐式形式

r^θ(x,y)=βlog⁡πθ(y∣x)πref(y∣x)\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}

存在于目标里,只是不再单独训练一个模型去拟合它——论文标题那句「你的语言模型其实是个奖励模型」说的就是这个。

误解二:DPO 是监督微调,等于让模型复述赢家回答。 错。DPO 优化的是赢家与输家的对数比之差,并以参考模型为基线;TRL 文档还指出,实践中它常常是靠压低输家回答的概率来达成,而不是单纯抬高赢家。

误解三:DPO 不需要采样,所以训练时不需要任何前向计算。 错。「不需要在线采样」说的是不需要让模型现场生成再打分;每个偏好对仍要对策略和参考模型各做一次前向,算出两个回答的对数概率。

误解四:β\beta 是学习率。 错。β\beta 是 KL 约束强度(在偏好差里充当温度),与优化器的学习率是两回事:它决定策略偏离参考模型的程度,不决定参数更新的步长。

误解五:参考模型可以随便换。 错。训练中 πref\pi_{\mathrm{ref}} 必须冻结,且要与策略使用同一分词器与对话模板;否则对数比的基准错位,损失算出来就是错的。

误解六:既然 DPO 更简单,它一定比 PPO 好。 有争议。见第十六节:有综合研究发现 DPO 可能有根本局限,PPO 在某些任务上能反超。

误解七:β=0.1\beta=0.1 是万能默认。 不是。它来自 DPO 原论文的常见设置;换成 hinge 等损失时 β\beta 的语义会变(见第十二节),照搬会调错。

误解八:隐式奖励可以直接当奖励模型复用。 不能。隐式奖励缺了「只依赖 xx 的常数」βlog⁡Z(x)\beta\log Z(x),无法用于跨提示比较,也不能直接接到别的系统里当绝对打分。

十四、训练变体:迭代 DPO 与参考模型滚动更新

标准 DPO 是离线的:偏好数据集固定,训练过程中不再更新。这带来一个已知的分布问题——当策略更新到数据集覆盖不到的分布上时,损失里的隐式权重就不再是推导时假设的样子。社区因此发展出两类变体。

迭代 / 在线 DPO。 用当前策略重新生成候选回答、重新标注(或用一个奖励模型打分),构造贴近当前策略分布的新偏好对,再训一轮。它把「离线」补成「半在线」,代价是重新引入了生成与标注成本——绕了一圈又把 RLHF 的一部分开销拿了回来。

参考模型滚动更新(TR-DPO)。 TRL 文档里有一个 ref_model_mixup_alpha 参数(α\alpha,默认 0.6),当 sync_ref_model=True 时按

πref=α πθ+(1−α) πrefprev\pi_{\mathrm{ref}} = \alpha\,\pi_\theta + (1-\alpha)\,\pi_{\mathrm{ref}}^{\mathrm{prev}}

更新参考模型,在「贴得住基线」与「跟得上策略」之间折中。这说明第五节那个「冻结参考模型」的假设,在实践中是可以让步的:把参考模型当作一个缓慢移动的锚,而不是一块死石头。

这两种变体都在试图回答同一个问题:离线 DPO 的参考模型与数据分布一旦和当前策略脱节,损失里那个隐式权重就不再是它推导时假设的形状。 记住这条,就能理解为什么「DPO 不需要采样」这个优点,在数据分布漂移时反而会变成限制。

十五、一次 DPO 训练步的完整清单

把前十四节压成一条可执行的流水线:一次前向 + 反向里,机器到底算了什么。下表是单个 mini-batch 的步骤清单(logp 表示对回答取的对数概率之和):

步骤计算内容是否带梯度
1策略前向,得 log⁡πθ(yw∣x)\log\pi_\theta(y_w\mid x)、log⁡πθ(yl∣x)\log\pi_\theta(y_l\mid x)是
2参考前向,得 log⁡πref(yw∣x)\log\pi_{\mathrm{ref}}(y_w\mid x)、log⁡πref(yl∣x)\log\pi_{\mathrm{ref}}(y_l\mid x)否(冻结)
3组隐式奖励 r^w,r^l\hat r_w,\hat r_l是(经 πθ\pi_\theta)
4margin u=r^w−r^lu=\hat r_w-\hat r_l是
5损失 −log⁡σ(u)-\log\sigma(u),对 batch 取平均是
6反向传播,只更新 θ\theta—

第 5 步的 batch 平均写成式子就是

L=1N∑i=1N−log⁡σ(u(i)),\mathcal{L}=\frac{1}{N}\sum_{i=1}^{N} -\log\sigma\Big(u^{(i)}\Big),

其中 NN 是这一批里偏好对的条数。

这张清单能解释三件工程上的事实。

其一,DPO 显存开销的大头是「要同时装下两个模型」:策略 πθ\pi_\theta 与参考 πref\pi_{\mathrm{ref}} 都要常驻(参考那份不带梯度,但权重仍在)。这常被忽略,也是为什么中小显存上要配上 LoRA、或者对参考模型做量化。

其二,参考模型的对数概率可以预计算并缓存。因为 πref\pi_{\mathrm{ref}} 被冻结,对一份固定的偏好数据集,log⁡πref(yw∣x)\log\pi_{\mathrm{ref}}(y_w\mid x) 与 log⁡πref(yl∣x)\log\pi_{\mathrm{ref}}(y_l\mid x) 在整个训练过程中都是常量——完全可以离线算一遍存起来,训练循环里就不再重复跑参考前向。这是把「两步前向」压掉一步的标准优化。

其三,只有 θ\theta 被更新,πref\pi_{\mathrm{ref}} 一丝不动。这也是为什么前面反复强调参考模型要冻结、要和策略同模板:它一旦漂移,整条推导的基线就断了。

十六、边界与未解:DPO 的已知局限与争议

推导漂亮,不等于方法没有代价。以下几条都有独立来源支撑。

「DPO 一定优于 PPO」是有争议的。 有一篇专门做综合对比的论文(arXiv:2404.10719)在摘要里直接反问「Is DPO truly superior to PPO?」,结论是 DPO 可能存在根本性局限,并且在从对话到代码生成的多个测试台上,PPO 能够反超、在代码类任务上达到最好结果。这说明 DPO 的「简单」并不是无条件的优势。

推导里依赖了对数(logit)变换,这一步可能过拟合。 IPO 那篇论文(arXiv:2310.12036)指出,DPO 仍然依赖一个近似(把奖励映射成对数比的那套变换),并提出了更一般的 Ψ\PsiPO 目标来同时绕开两个近似;把 Ψ\Psi 取成恒等就得到 IPO,作者报告在某些例子上优于 DPO。换句话说,DPO 不是这条路上的终点。

隐式奖励不可当独立奖励用。 由第六节,r^θ(x,y)=βlog⁡πθ(y∣x)πref(y∣x)\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y|x)}{\pi_{\mathrm{ref}}(y|x)} 只由对数比给出,而真正的奖励还要加上那个「只依赖 xx 的常数」βlog⁡Z(x)\beta\log Z(x)。这个常数在成对比较里约掉了,但在需要用奖励做跨提示比较、或把奖励接到别的系统里时,它是缺的——DPO 没有给你一个可标定的绝对奖励。

偏好不一定要成对。 KTO(arXiv:2402.01306)的出发点是:人类反馈未必是成对的,也可以是「这个回答好 / 那个回答差」的二元标签。它用一个基于前景理论(prospect theory)的效用,只用二元信号就能训练,据其摘要,在 1B 到 30B 尺度上匹配或超过偏好类方法。该论文还给出一个更宏观的结论:没有哪一族损失是普遍最优的,最好的损失取决于场景的归纳偏好。

分布偏移与过拟合。 因为 DPO 是在固定偏好数据上离线优化,数据一旦不能代表部署时的输入分布,它的效果就会打折;这和各 reward-free 方法的通病一样。本文第八节那个「已学会的样本被降权」的机制,在极端情形下也可能让模型把赢家的概率压得过低。

本文自己的边界。 第八节的数值例子里,Δw,Δl\Delta_w,\Delta_l 是人为指定的,只用来展示公式形状,不能读成「DPO 在某个模型上能降多少损失」。真正的效果必须以具体论文的实验为准。

十七、小结

DPO 的全部魔法,其实是三步代数:先在 KL 正则化的奖励最大化目标下求出最优策略的闭式解 πr∝πrefexp⁡(r/β)\pi_r\propto\pi_{\mathrm{ref}}\exp(r/\beta);再把奖励反解成策略与参考模型的对数比(只差一个只依赖提示 xx 的常数 βlog⁡Z(x)\beta\log Z(x));最后代回 Bradley–Terry 偏好似然——由于成对比较共享同一个 xx,这个常数整项约掉,奖励模型就此消失,剩下的正好是一个 sigmoid 的二分类损失。工程收益是「不训奖励模型、不跑在线强化学习、训练时不需要采样」;代价则是它把奖励隐藏成了不可标定的对数比,并且在数据分布之外的表现、以及相对 PPO 的优劣,都仍有公开争议。

理解了这三步,你既能看懂 DPOTrainer 里那几个参数为什么存在(β\beta、loss_type、参考模型),也能判断它什么时候不该用。

附一、把 DPO 损失读成「奖励模型目标」的一次换形

A. 奖励模型是怎么训出来的

回到第三节的 Bradley–Terry 模型。RLHF 的第二步之所以能训出一个奖励模型,靠的正是它的最大似然:把人类成对比较当成标签,让奖励模型给赢家打的分尽量高于输家。写成目标就是

max⁡rϕ E(x,yw,yl)∼D[log⁡σ(rϕ(x,yw)−rϕ(x,yl))].\max_{r_\phi}\ \mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}}\Big[\log\sigma\big(r_\phi(x,y_w)-r_\phi(x,y_l)\big)\Big].

这里 rϕr_\phi 是一个自由函数:形状不受约束,参数 ϕ\phi 由数据学出来;训完之后它就是一个可复用、能给任意回答打分的奖励模型。

现在把 DPO 的损失照抄一遍,把里面那个「分数差」单独框出来:

LDPO=− E[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x)⏟与 rϕ 同形的「分数差」)].\mathcal{L}_{\mathrm{DPO}} = -\,\mathbb{E}\Big[\log\sigma\Big(\underbrace{\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}}_{\text{与 }r_\phi\text{ 同形的「分数差」}}\Big)\Big].

B. 形状完全相同,只差「分数从哪来」

对比上面两个目标,会发现它们的形状一模一样:都是「对两个分数的差做 sigmoid,再在数据集上取负对数似然」。唯一的分野在于那两个分数从哪来——

  • 奖励模型那一版:分数由一个自由函数 rϕr_\phi 给出,需要单独训练;
  • DPO 那一版:分数被钉死成 βlog⁡πθ(y∣x)πref(y∣x)\beta\log\frac{\pi_\theta(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)},由策略与参考模型解析地给出,不需要单独训练。

所以 DPO 不是「没有奖励模型」,而是用一个由策略和参考模型解析决定的函数,替代了原本要单独训练的那个奖励模型。论文标题「你的语言模型其实是个奖励模型」,说的就是这层字面含义。

维度奖励模型目标(RLHF 第二步)DPO 损失
分数来源自由函数 rϕr_\phi,需训练固定形式 βlog⁡(πθ/πref)\beta\log(\pi_\theta/\pi_{\mathrm{ref}})
是否需在线采样新回答需要不需要
梯度权重σ(rl−rw)\sigma(r_l-r_w)σ(r^l−r^w)\sigma(\hat r_l-\hat r_w)(同形)
训练产物一个可复用的打分器一个对齐后的策略
能否拿去给别的输出打分可以不可以(缺 βlog⁡Z(x)\beta\log Z(x))

C. 隐式权重不是 DPO 的专利

第七节说 DPO 的梯度里有一个「已做对就降权」的权重。换奖励模型目标的视角看,这个权重其实来自 Bradley–Terry 最大似然本身。对奖励模型目标求关于 ϕ\phi 的梯度,令 z=rϕ(x,yw)−rϕ(x,yl)z=r_\phi(x,y_w)-r_\phi(x,y_l),用 ddzlog⁡σ(z)=σ(−z)\frac{d}{dz}\log\sigma(z)=\sigma(-z):

∇ϕ[−log⁡σ(z)]=− σ(−z) (∇ϕrϕ(x,yw)−∇ϕrϕ(x,yl)).\nabla_\phi\big[-\log\sigma(z)\big] = -\,\sigma(-z)\,\big(\nabla_\phi r_\phi(x,y_w)-\nabla_\phi r_\phi(x,y_l)\big).

把 σ(−z)\sigma(-z) 展开成 σ(rl−rw)\sigma(r_l-r_w),它的形状跟第七节 DPO 梯度的权重 w=σ(r^l−r^w)w=\sigma(\hat r_l-\hat r_w) 完全一致。结论很重要:「模型已经做对的样本被自动降权」不是 DPO 发明的毛病,而是「成对比较 + sigmoid」这套似然自带的性质。只要走 Bradley–Terry,就继承它;DPO 只是把这套权重从「训练奖励模型」搬到了「训练策略」上。

还可以拿第八节的数字对一下:训练最开始策略就等于参考模型,Δw=Δl=0\Delta_w=\Delta_l=0,分数差 z=0z=0,σ(0)=0.5\sigma(0)=0.5,损失 =ln⁡2≈0.6931=\ln 2\approx 0.6931——这正是第八节表格第一行那个数。也就是说,无论训奖励模型还是跑 DPO,起点都落在「损失 = ln 2、权重 = 0.5」这个最「不知道」的位置上。

D. 这个视角解释了三个「为什么」

  • 为什么 DPO 的分数要用对数比、而不是直接用 log⁡πθ\log\pi_\theta? 因为「分数」这个角色在 RM 版里由 rϕr_\phi 充当,需要一个尺度合理、可比的对象;用 πθ/πref\pi_\theta/\pi_{\mathrm{ref}} 的对数比,等于把参考模型当作零点,策略被钉在「相对参考模型抬升或压低了多少」上,不会在任意尺度上漂移。
  • 为什么 β\beta 会出现在分数里? 因为在 RLHF 目标里它本来就是 KL 惩罚的系数,第五节反解时它自然落进 βlog⁡(π/πref)\beta\log(\pi/\pi_{\mathrm{ref}})。
  • 为什么 DPO 不需要在线采样? RM 版要反复采样新回答来喂最大似然;DPO 版的「分数」由两个现成模型在固定数据上直接算出来,不依赖任何新样本。

E. 同一个换形,既给了便利,也划了边界

把 DPO 读成「换了个分数来源的奖励模型目标」,便利与代价其实在同一个动作里就写好了:因为分数被钉成了「策略与参考模型的对数比」,DPO 省掉了奖励模型和在线采样(便利);但也正因为分数被钉死,它不再产出一个独立、可复用的打分器——你没法拿 DPO 训出来的策略去给别的系统打分(缺 βlog⁡Z(x)\beta\log Z(x) 那一项,见第十三节误解八)。想同时要「简单」和「可复用的奖励」,就得回到带显式奖励模型的那条路上去。

附二、工程落地速查:默认值、数据格式与失败模式

A. TRL DPOTrainer 的几个默认值

TRL 文档专门提示了它的几个参数默认值与通用 TrainingArguments 不同,照抄通用配置容易踩坑:

参数TRL 的默认值与通用默认的差异
learning_rate10−610^{-6}通用为 5×10−55\times10^{-5},DPO 用小得多
logging_steps10通用为 500
gradient_checkpointingTrue通用为 False
bf16未设 fp16 时为 True通用为 False

(来源:Hugging Face TRL 文档,DPO Trainer。)注意 β\beta 不在这张默认值表里:TRL 的 DPOConfig 里 β\beta 同样默认 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 掉)。

其三:β\beta 调到两个极端。 由第八节的推演,β\beta 过大时策略被死死按在参考模型上、偏好挤不开(损失降不动);β\beta 过小时策略容易跑飞、丢掉原有能力。排查:从 0.1 起步,同时盯住训练损失与一个独立的评测指标——前者降、后者不降,就是跑飞了。

D. 和 LoRA 一起用

由第十五节,DPO 的显存大头是「策略 + 参考」两个模型常驻。一个常见的省显存做法是只训练低秩适配器(LoRA)、冻住基座:这样策略侧只有适配器带梯度,显存大幅下降。更进一步,参考模型可以直接复用「关掉适配器的同一份基座」——不少实现(PEFT / TRL 生态里很常见)就是这么省掉一份权重拷贝的。代价是适配器容量有限,强对齐任务上可能不如全参微调;本段属工程实践,不是某篇论文的结论。

E. 上线前自检清单

把前文所有硬约束压成一份可勾选的清单,训练前逐条过一遍:

  • 参考模型已冻结,且与策略使用同一分词器、同一对话模板;
  • 每条样本都含同一 prompt 下的 chosen 与 rejected;
  • 对数概率只在回答 token 上求和(prompt 部分已 mask);
  • β\beta 从 0.1 起步,并按任务与实测调整,不照搬;
  • loss_type 与 β\beta 的语义匹配(例如 hinge 下 β\beta 是 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 文档)转引,未单独列为一手来源。

  1. 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 —— 本文第三至七节的主要来源。
  2. Ouyang 等. Training language models to follow instructions with human feedback(InstructGPT). arXiv:2203.02155。https://arxiv.org/abs/2203.02155 —— RLHF 三段式与 1.3B/175B 对比。
  3. Christiano 等. Deep reinforcement learning from human preferences. arXiv:1706.03741。https://arxiv.org/abs/1706.03741 —— 人类偏好用于强化学习的早期工作。
  4. Stiennon 等. Learning to summarize from human feedback. arXiv:2009.01325。https://arxiv.org/abs/2009.01325 —— 用成对比较训奖励模型后再强化学习的代表。
  5. Hugging Face Blog. Fine-tune Llama 2 with DPO(dpo-trl),2023-08-08。https://huggingface.co/blog/dpo-trl —— DPO 与 PPO 的对照、KL 项作用的直觉解释。
  6. Hugging Face TRL 文档. DPO Trainer. https://huggingface.co/docs/trl/dpo_trainer (2026-10-07 访问)—— 损失类型、数据集格式、实现层面的约束。
  7. Azar 等. A General Theoretical Paradigm to Understand Learning from Human Preferences(IPO / Ψ\PsiPO). arXiv:2310.12036。https://arxiv.org/abs/2310.12036
  8. Ethayarajh, Xu, Muennighoff, Jurafsky, Kiela. KTO: Model Alignment as Prospect Theoretic Optimization. arXiv:2402.01306。https://arxiv.org/abs/2402.01306
  9. 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
  10. Shao 等. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models(提出 GRPO). arXiv:2402.03300。https://arxiv.org/abs/2402.03300

本文自行推导(与上述一手来源的官方数字分列):

  • 第五节的最优策略闭式解、第六节的 DPO 损失、第七节的梯度式,均为本文依据 max⁡πEy∼π[r]−βDKL(π∥πref)\max_\pi \mathbb{E}_{y\sim\pi}[r]-\beta D_{\mathrm{KL}}(\pi\|\pi_{\mathrm{ref}}) 独立复算的推导过程(公式结论出自来源 1 的 DPO 论文),可独立复算。
  • 第八节表格中的 margin、σ(m)\sigma(m)、损失、梯度权重四个数值,是本文按 β=0.1\beta=0.1(β=0.5\beta=0.5 的单点对比另算)与假设的 Δw,Δl\Delta_w,\Delta_l 用 Python 标准库计算所得,非任何论文的实验数据。