跳到主要内容

[LLM 4/10] DPO:当语言模型成为它自己的奖励模型

· 阅读需 7 分钟
Kobkrit Viriyayudhakorn
CEO, iApp Technology

上一章我们用 PPO 做了 RLHF,你应该已经看到它有多少零件—— 要单独训练一个奖励模型,要同时把 4 个模型塞进显存, 还要调十几个 PPO 超参数;而一旦奖励模型跑偏,模型就会找到刷分的捷径。 这一章我们要用一个普通的 supervised 训练循环做同样的事——没有奖励模型,也没有 RL。 更关键的是,这并不是一种近似:我们会用代数证明那两块东西是真的互相抵消掉了

Open in Colab04_dpo.ipynb

1. 问题(Problem statement)

假设你希望自己的 AI 助手"永远用泰语回答"——听起来很简单。 但你试着把它写成一个 loss function 看看,你会发现根本写不出来。

这就是 alignment 的核心难题:回答的质量没法写成公式。 "更礼貌""更自然""不要中途滑回英语"——这些都不存在唯一正确的标准答案, 有的只是比较:让人看两个回答,然后说更喜欢哪一个。 于是得到的数据长成三元组:prompt xx、被选中的回答 ywy_w(chosen)、被拒绝的回答 yly_l(rejected)。

PPO 版本的 RLHF 用两步绕路来解决这个问题:

  1. 训练一个奖励模型 rϕ(x,y)r_\phi(x,y) 去模仿人类的偏好
  2. RL 把策略推向该奖励模型给分高的方向

这条绕路是有代价的:

RLHF/PPO 的问题实际造成的后果
要多训练 1 个模型多一个环节、多一处可能出错、多花时间
要同时加载 4 个模型policy + ref + reward + value —— 显存爆炸
reward hacking模型找到刷分的漏洞,而人类其实一点也没更喜欢
PPO 对超参数敏感换个 seed 跑两遍,结果可能完全不同

所以这一章的问题只有一句话:我们能不能把第 1 步和第 2 步直接跳过?

2. 我们要做什么(Solution)

答案是能,而且理由非常漂亮。

出发点是这样一个观察:带 KL 约束的 RLHF objective 存在闭式解(closed form)。 我们其实早就知道最优策略长什么样,一个 RL step 都不用跑。 既然如此,我们就把公式反过来写——与其问"这个 reward 对应什么策略", 不如问"这个策略意味着多少 reward"。

本章的核心观点

把公式一反过来,语言模型本身就已经隐含地是一个奖励模型。 奖励模型和 RL 循环并不是被"近似掉"的,而是在代数上互相消掉了。 剩下的只是一个普通的 supervised loss function,用一个 Trainer 就能训完。

这就是 DPO(Direct Preference Optimization),由 Rafailov 等人在 2023 年提出。 名字里的 "Direct" 指的是我们直接在偏好数据上做优化,中间不经过任何代理。

3. 公式(Equation)

3.1 先摆出题目:RLHF objective

maxπ ExD,yπ(x)[r(x,y)]βDKL[π(yx)πref(yx)]\max_{\pi}\ \mathbb{E}_{x\sim\mathcal{D},\,y\sim\pi(\cdot|x)}\big[r(x,y)\big] - \beta\,\mathbb{D}_{\text{KL}}\big[\pi(y|x)\,\|\,\pi_{\text{ref}}(y|x)\big]

用人话读一遍:"把 reward 拿到最高,但不许离初始模型太远。"

  • π\pi = 策略,也就是我们正在训练的模型
  • πref\pi_{\text{ref}} = 参考策略,也就是初始模型(本章指第 2 章 SFT 之后的模型)
  • r(x,y)r(x,y) = 回答 yy 对 prompt xx 的 reward
  • β\beta = 这根牵引绳的紧度,越大就把模型往 πref\pi_{\text{ref}} 拉得越狠

KL 那一项不是装饰。没有它,模型会跑向 reward 很高但语言已经崩坏的地方。

3.2 第一步——闭式解

上面这道题可以手推出来(本质是在求一个相对目标分布 KL 最小的分布),结果是

π(yx)=1Z(x)πref(yx)exp(1βr(x,y))\pi^*(y|x) = \frac{1}{Z(x)}\pi_{\text{ref}}(y|x)\exp\left(\frac{1}{\beta}r(x,y)\right)
  • Z(x)=yπref(yx)exp ⁣(r(x,y)/β)Z(x) = \sum_{y}\pi_{\text{ref}}(y|x)\exp\!\big(r(x,y)/\beta\big) 就是 partition function,负责把总和归一到 1 的分母
  • 注意 Z(x)Z(x) 只依赖 xx,不依赖 yy——把这句话记牢,它待会儿是主角

直觉上的含义是:最优策略就是原模型,按 exp(r/β)\exp(r/\beta) 重新加权。 reward 高的回答概率被放大,reward 低的被压低,但一切始终是从 πref\pi_{\text{ref}} 原本的形状出发的。

实际上我们算不出 Z(x)Z(x),因为那要把全宇宙所有可能的回答都加起来。 这正是大家不得不用 RL 的原因——也正是 DPO 不需要用 RL 的原因。

3.3 第二步——把公式反解出 reward

两边取 log 再移项,得到

r(x,y)=βlogπ(yx)πref(yx)+βlogZ(x)r(x,y) = \beta\log\frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta\log Z(x)

这一行就是关键:任何 reward 函数都可以改写成"最优策略与初始策略"的形式。 也就是说,只要手上有两个模型,我们立刻就能算出它隐含的 reward,完全不必训练任何奖励模型。

3.4 第三步——代入 Bradley-Terry,Z(x)Z(x) 抵消

偏好的标准建模方式是 Bradley-Terry:人类选择 ywy_w 而非 yly_l 的概率为

p(ywylx)=σ(r(x,yw)r(x,yl))p(y_w \succ y_l \mid x) = \sigma\big(r(x,y_w) - r(x,y_l)\big)

其中 σ\sigma 是 sigmoid。注意在这个式子里,reward 只以差值的形式出现。 把 3.3 代进去——βlogZ(x)\beta\log Z(x) 在两边完全相等,因为 xx 是同一个——于是它直接抵消掉了

LDPO(θ)=E(x,yw,yl)[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{\text{DPO}}(\theta) = -\mathbb{E}_{(x,y_w,y_l)}\left[\log\sigma\left(\beta\log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta\log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right)\right]
整篇文章就是为了说出这句话

那个算不出来的东西(Z(x)Z(x))消失了,因为 Bradley-Terry 只关心 reward 的差值。 剩下的只是两个模型在我们本来就有的文本上的 log-probability,一次普通的 forward pass 就能算出来。 不采样回答、不做 rollout、没有 value function——DPO 是彻头彻尾的 supervised learning。

3.5 梯度——直觉所在之处

θLDPO=βE[σ(r^lr^w)(θlogπθ(ywx)θlogπθ(ylx))]\nabla_\theta\mathcal{L}_{\text{DPO}} = -\beta\,\mathbb{E}\left[\sigma(\hat r_l - \hat r_w)\left(\nabla_\theta\log\pi_\theta(y_w|x) - \nabla_\theta\log\pi_\theta(y_l|x)\right)\right]

其中 r^=βlog(πθ/πref)\hat r = \beta\log\big(\pi_\theta/\pi_{\text{ref}}\big) 被称为隐式奖励(implicit reward)

一块一块地读:

  • 右边的括号 = 方向:同时把 ywy_w 的 log-prob 推上去、把 yly_l 的 log-prob 压下来
  • σ(r^lr^w)\sigma(\hat r_l - \hat r_w) = 权重,也就是"模型把这一对排错得有多离谱"

这个权重是全章最重要的教学点。如果模型本来就把这一对排对了(r^w\hat r_w 明显大于 r^l\hat r_l), 那么 σ(r^lr^w)\sigma(\hat r_l - \hat r_w) 会趋近于零,这一对几乎不贡献任何梯度。 于是 DPO 会自动把注意力集中在自己犯的错上,不需要任何人替它筛数据。

完整内容在课程中

这篇文章大约是本章的前 30%。其余部分——环境准备、数据准备、核心代码、实测结果与总结——都在免费的 LLM Finetuning 课程中,使用 Google 登录即可阅读。

在课程中阅读完整章节 →