Dark Dwarf Blog background

DPO

DPO

1. 引入

DPO 是用来让模型和人类需要的偏好进行对齐的开发方法。在传统的 RLHF 中,我们需要用四个模型:Actor,Reference,Reward 与 Critic,这给显存带来和很大压力。而 DPO 跳过了“训练奖励模型”和“强化学习”这两个阶段,通过一个数学上的等价变换,直接利用 Chosen(优) 和 Rejected(劣) 数据对来更新模型。

2. 数学推导

首先先看最原始的 RLHF。RLHF 的逻辑为:先训练一个奖励模型 r(x,y)r(x, y)。然后做如下假定:用户觉得 ywy_wyly_l 好,是因为 ywy_w 的奖励值比 yly_l

P(ywylx)=σ(r(x,yw)r(x,yl))P(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l))

在传统的强化学习(PPO)中,我们的目标是找到一个模型 πθ\pi_\theta,既能获得高奖励,又别离原始模型 πref\pi_{ref} 太远(不然模型会偷懒、直接反复输出奖励高的东西,会把之前SFT得到的东西都弄丢的)。即:

Objective=maxπθ[Eyπθ[r(x,y)]βKL(πθπref)]\text{Objective} = \max_{\pi_\theta} \left[ \mathbb{E}_{y \sim \pi_\theta} [r(x, y)] - \beta \text{KL}(\pi_\theta || \pi_{ref}) \right]

也即:

J(π)=Eyπ[r(x,y)]βEyπ[logπ(yx)πref(yx)]J(\pi) = \mathbb{E}_{y \sim \pi} [r(x, y)] - \beta \mathbb{E}_{y \sim \pi} \left[ \log \frac{\pi(y|x)}{\pi_{ref}(y|x)} \right]

这个东西在数学上的最优解为:

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)

这里 βlogZ(x)\beta \log Z(x) 只取决于 xx,与具体的生成回答 yy 无关。

我们发现在这个公式中,奖励函数 rr 实际上可以用“模型概率的比值”来完全替代

  • 如果一个回答 yy 的奖励很高,那么在最优模型 π\pi^* 中它出现的概率就会比在原始模型 πref\pi_{ref} 中大得多。
  • 然后 β\beta 就是与原模型的“偏移距离”。

于是我们将这个结论塞到前面那个假定的公式中,把 r(w)r(w) 换成 βlogπθ(w)πref(w)\beta \log \frac{\pi_\theta(w)}{\pi_{ref}(w)} ,把 r(l)r(l) 换成 βlogπθ(l)πref(l)\beta \log \frac{\pi_\theta(l)}{\pi_{ref}(l)},于是就得到了DPO的式子:

r(x,yw)r(x,yl)=βlogπ(ywx)πref(ywx)βlogπ(ylx)πref(ylx)r(x, y_w) - r(x, y_l) = \beta \log \frac{\pi^*(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi^*(y_l|x)}{\pi_{\text{ref}}(y_l|x)}

这里完全不涉及奖励模型。对这个式子最小化负对数似然得到的损失函数表达式为:

LDPO(πθ;πref)=E(x,yw,yl)D[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = -\mathbb{E}_{(x, y_w, y_l) \sim D} \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]

3. 实验

jondurbin/gutenberg-dpo-v0.1 中使用 Qwen-7B-Instruct 做了简单的 DPO 实验,可以看到结果相当好,模型确实能模仿对应的写作方式,但是由于 Beta 设置得有些小导致偏离原始模型有些多、在一些不太相关的任务中也会带入“作家”的回答方式。