DPO
1. 引入
DPO 是用来让模型和人类需要的偏好进行对齐的开发方法。在传统的 RLHF 中,我们需要用四个模型:Actor,Reference,Reward 与 Critic,这给显存带来和很大压力。而 DPO 跳过了“训练奖励模型”和“强化学习”这两个阶段,通过一个数学上的等价变换,直接利用 Chosen(优) 和 Rejected(劣) 数据对来更新模型。
2. 数学推导
首先先看最原始的 RLHF。RLHF 的逻辑为:先训练一个奖励模型 r(x,y)。然后做如下假定:用户觉得 yw 比 yl 好,是因为 yw 的奖励值比 yl 高:
P(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))
在传统的强化学习(PPO)中,我们的目标是找到一个模型 πθ,既能获得高奖励,又别离原始模型 πref 太远(不然模型会偷懒、直接反复输出奖励高的东西,会把之前SFT得到的东西都弄丢的)。即:
Objective=πθmax[Ey∼πθ[r(x,y)]−βKL(πθ∣∣πref)]
也即:
J(π)=Ey∼π[r(x,y)]−βEy∼π[logπref(y∣x)π(y∣x)]
这个东西在数学上的最优解为:
r(x,y)=βlogπref(y∣x)π∗(y∣x)+βlogZ(x)
这里 βlogZ(x) 只取决于 x,与具体的生成回答 y 无关。
我们发现在这个公式中,奖励函数 r 实际上可以用“模型概率的比值”来完全替代:
- 如果一个回答 y 的奖励很高,那么在最优模型 π∗ 中它出现的概率就会比在原始模型 πref 中大得多。
- 然后 β 就是与原模型的“偏移距离”。
于是我们将这个结论塞到前面那个假定的公式中,把 r(w) 换成 βlogπref(w)πθ(w)
,把 r(l) 换成 βlogπref(l)πθ(l),于是就得到了DPO的式子:
r(x,yw)−r(x,yl)=βlogπref(yw∣x)π∗(yw∣x)−βlogπref(yl∣x)π∗(yl∣x)
这里完全不涉及奖励模型。对这个式子最小化负对数似然得到的损失函数表达式为:
LDPO(πθ;πref)=−E(x,yw,yl)∼D[logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]
3. 实验
在 jondurbin/gutenberg-dpo-v0.1 中使用 Qwen-7B-Instruct 做了简单的 DPO 实验,可以看到结果相当好,模型确实能模仿对应的写作方式,但是由于 Beta 设置得有些小导致偏离原始模型有些多、在一些不太相关的任务中也会带入“作家”的回答方式。