第一步:理解我们的目标与数据
- 问题设定: 我们有一个语言模型 πθ\pi_\thetaπθ(比如刚做完 SFT 的 Llama)。它的输出可能不够安全或不够符合人类口味。我们希望微调它,让它的输出对齐人类价值观 。
- πθ\pi_\thetaπθ:当前正在训练的策略(Policy),也就是我们的模型。θ\thetaθ 是模型的参数。
- 数据长什么样: 人类给出的偏好数据。给定一个提示词 xxx,模型生成两个回答,人类标注出哪个更好。
- xxx:输入的 Prompt。
- ywy_wyw:Win 的回答(人类更偏好的)。
- yly_lyl:Loss 的回答(人类不喜欢的)。
- 数据集就是很多这样的三元组 {x,yw,yl}\{x, y_w, y_l\}{x,yw,yl}。
第二步:传统的 RLHF 怎么做?训练奖励模型
在传统的 RLHF 中,第一步是训练一个奖励模型(Reward Model, 简称 RM) rϕ(x,y)r_\phi(x, y)rϕ(x,y)。
- rϕr_\phirϕ:奖励模型,ϕ\phiϕ 是它的参数。它的作用是像评委一样,输入 xxx 和 yyy,输出一个具体的分数(标量)。分数越高,代表回答越好。
0.什么是 Bradley-Terry 模型?
Bradley-Terry模型是一种用于估计竞争者在成对比较中相对实力的统计模型。这个模型最初由 R. A. Bradley 和 M. E. Terry 在1952年提出。它通常用于处理比如比赛、比较或选择偏好等情境中的成对比较数据。
在Bradley-Terry模型中,每个竞争者被赋予一个实力参数。这些参数用于预测在任意两个竞争者之间的比较结果。模型的基本假设是,一个竞争者击败另一个竞争者的概率与这两个竞争者的实力参数的比值有关。
具体来说,如果我们有两个竞争者A和B,他们的实力参数分别为 PAP_APA 和 PBP_BPB,那么A击败B的概率可以表示为:
PA_beats_B=PAPA+PBP_{A\_beats\_B} = \frac {P_A} {P_A + P_B}PA_beats_B=PA+PBPA
同样,B击败A的概率为:
PA_beats_B=PBPA+PBP_{A\_beats\_B} = \frac {P_B} {P_A + P_B}PA_beats_B=PA+PBPB
Bradley-Terry模型广泛应用于许多领域,包括心理学、社会科学、体育比赛、游戏排名、产品偏好等。在大模型领域常用于 DPO 训练中作者用来推导偏好对数据在强化学习中替代奖励模型。通过此模型,可以从成对比较的数据中估计出竞争者的相对实力,并用于预测未来的比赛结果或偏好趋势。
1. 怎么把分数变成概率?(Bradley-Terry 模型)
假设 ywy_wyw 得了 8 分,yly_lyl 得了 5 分。我们认为人类偏好 ywy_wyw 的概率,取决于它们的分数差。由 Bradley-Terry 模型,我们可以得到:
p∗(yw≻yl∣x)=er(x,yw)er(x,yw)+er(x,yl)p^*(y_w \succ y_l | x) = \frac {e^{r(x,y_w)}} {e^{r(x,y_w)} + e^{r(x,y_l)}}p∗(yw≻yl∣x)=er(x,yw)+er(x,yl)er(x,yw)
注意 :之所以将 rϕr_ \phirϕ 取对数,是因为奖励函数计算出来的得分区间是 (−∞,+∞)(-\infty, +\infty)(−∞,+∞), Bradley-Terry 模型要求正负样例之间的实力参数都是正的(否则分母正负相加会抵消),因此使用指数变换映射到 (0,+∞)(0, +\infty)(0,+∞) 区间内。此时分子分母同时除以 er(x,yw)e^{r(x,y_w)}er(x,yw) 可以得到:
p∗(yw≻yl∣x)=11+e−[r(x,yw)−r(x,yl)]p^*(y_w \succ y_l | x) = \frac {1} {1 + e^{-[r(x,y_w) - r(x,y_l)]}}p∗(yw≻yl∣x)=1+e−[r(x,yw)−r(x,yl)]1
这正是 σ\sigmaσ函数的形式,因此上述表达式可以写为:
p∗(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))p^*(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l))p∗(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))
- ≻\succ≻:表示"优于"。
- σ\sigmaσ:Sigmoid 函数(σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+e−z1),它的作用是把任何实数(比如 8-5=3)压缩到 0 到 1 之间,也就是变成概率。分数差越大,算出来的概率越接近 100%。
2. 使用"极大似然法"来最大化 ywy_wyw 的概率?
"似然"就是"可能性"。我们现在手里已经有了一堆客观事实(人类确实选择了 ywy_wyw 淘汰了 yly_lyl)。极大似然法的思想就是:"我要怎么调整奖励模型的参数,才能让这套模型预测出'人类选择 ywy_wyw'的概率最大?"
3. 使用 "负的对数似然" 来定义RM(奖励模型)的loss
由于训练过程目标一般都是最小化loss,因此我们使用负的对数来表征 p∗(yw≻yl∣x)p^*(y_w \succ y_l | x)p∗(yw≻yl∣x) 作为loss,使得该概率值最大化:
对数 (log): 因为概率都是小于 1 的小数,多个样本的概率相乘(奖励模型训练过程中,整个数据集的似然函数就是每一条训练样本被预测正确的概率之积)会变得极其微小,导致计算机下溢出。取对数(log)后,乘法就变成了加法,方便计算,且不改变单调性(概率越大,log 概率也越大)。
负号 (-): 深度学习的优化器(如 Adam)天生都是为了最小化 某个值(Loss 越小越好)设计的。我们想要最大化 似然(概率),等价于最小化它的相反数(负对数似然)。
因此,RM 的 Loss 公式可以被定义为:
LRM=E{x,yw,yl}∼D[−logσ(rϕ(x,yw)−rϕ(x,yl))]\mathcal{L}{RM} = \mathbb{E}{\{x,y_w,y_l\} \sim D} \left[ - \log \sigma(r_\phi(x, y_w) - r_\phi(x, y_l)) \right]LRM=E{x,yw,yl}∼D[−logσ(rϕ(x,yw)−rϕ(x,yl))]
* E\mathbb{E}E:数学期望,在这里可以理解为对数据集 D 中所有的样本求平均。
第三步:强化学习的训练目标
有了奖励模型 rϕr_\phirϕ 后,强化学习的理论目标函数可以定义为:
maxπθEx∼D,y∼πθ(y∣x)[rϕ(x,y)]−βDKL[πθ(y∣x)∣∣πref(y∣x)](1)\max_{\pi_\theta} \mathbb{E}{x \sim \mathcal{D}, y \sim \pi\theta(y|x)} \left[ r_\phi(x, y) \right] - \beta \mathbb{D}{KL} \left[ \pi\theta(y|x) || \pi_{ref}(y|x) \right] \tag{1}πθmaxEx∼D,y∼πθ(y∣x)[rϕ(x,y)]−βDKL[πθ(y∣x)∣∣πref(y∣x)](1)
这个公式分为两部分,我们拆开看:
-
左边 E[rϕ(x,y)]\mathbb{E}[r_\phi(x, y)]E[rϕ(x,y)]: 期望回报最大化。意思是让当前模型 πθ\pi_\thetaπθ 生成的答案 yyy,能在评委 rϕr_\phirϕ 那里拿到尽可能高的分数。
-
右边 βDKL\beta \mathbb{D}_{KL}βDKL(KL 散度惩罚项):
为什么要有KL 散度? 如果只追求高分,模型会找到"作弊"的方法(模式坍塌),比如不停地重复一句高分废话。引入这一项,就是告诉模型:"你要拿高分,但你的说话风格和概率分布,不能偏离原来的参考模型 πref\pi_{ref}πref 太远"。其中:
- πref\pi_{ref}πref:参考模型(通常是刚做完 SFT 的那个初始模型,固定参数不更新)。
- DKL\mathbb{D}_{KL}DKL:KL 散度,用来衡量两个概率分布有多大差异。
- β\betaβ:控制惩罚力度的超参数。β\betaβ 越大,模型就越保守,越不敢偏离 πref\pi_{ref}πref。
我们已知 KL 散度公式为:
DKL(P∣∣Q)=∑iP(i)logP(i)Q(i)(2)D_{KL}(P||Q) = \sum_{i} P(i) \log \frac{P(i)}{Q(i)} \tag{2}DKL(P∣∣Q)=i∑P(i)logQ(i)P(i)(2)
回忆一下数据期望的计算公式(概率乘函数值之和即为期望值),我们知道 P(i)∗f(i)=Ei∼Pf(i)P(i) * f(i) = \mathbb{E}{i \sim P} f(i)P(i)∗f(i)=Ei∼Pf(i) 。因此有:
DKL(P∣∣Q)=Ei∼PlogP(i)Q(i)(3)D{KL}(P||Q) = \mathbb{E}_{i \sim P} \log \frac{P(i)}{Q(i)} \tag{3}DKL(P∣∣Q)=Ei∼PlogQ(i)P(i)(3)
其中 iii 代表所有可能发生的情况。我们将该散度公式中的P与Q替换为πθ(y∣x)\pi_{\theta}(y | x)πθ(y∣x) 与 πref(y∣x)\pi_{ref}(y | x)πref(y∣x),可以得到:
DKL(πθ(y∣x)∣∣πref(y∣x))=Ey∼πθ(y∣x)logπθ(y∣x)πref(y∣x)=Ey∼πθ(y∣x)(logπθ(y∣x)−logπref(y∣x))(4)D_{KL}(\pi_{\theta}(y | x) || \pi_{ref}(y | x)) = \mathbb{E}{y \sim \pi{\theta}(y | x)} \log \frac{\pi_{\theta}(y | x)}{\pi_{ref}(y | x)} = \mathbb{E}{y \sim \pi{\theta}(y | x)} (\log {\pi_{\theta}(y | x)} - \log {\pi_{ref}(y | x)}) \tag{4}DKL(πθ(y∣x)∣∣πref(y∣x))=Ey∼πθ(y∣x)logπref(y∣x)πθ(y∣x)=Ey∼πθ(y∣x)(logπθ(y∣x)−logπref(y∣x))(4)
将 (4) 代入上述理论目标函数 (1) 中,可以进一步化简上述理论目标函数:
maxπθEx∼D,y∼πθ(y∣x)[rϕ(x,y)]−β(logπθ(y∣x)−logπref(y∣x))](5)\max_{\pi_\theta} \mathbb{E}{x \sim \mathcal{D}, y \sim \pi\theta(y|x)} \left[ r_\phi(x, y) \right] - \beta (\log {\pi_{\theta}(y | x)} - \log {\pi_{ref}(y | x)})] \tag{5}πθmaxEx∼D,y∼πθ(y∣x)[rϕ(x,y)]−β(logπθ(y∣x)−logπref(y∣x))](5)
第四步:DPO 作者找到了RLHF 的解析解!
这是 DPO 论文最天才的一步。
什么是"解析解"? 假设你要解方程 x2−4=0x^2 - 4 = 0x2−4=0。一种笨办法是从 x=1,2,3x=1, 2, 3x=1,2,3 慢慢试(这叫数值解/梯度下降,也就是 PPO 在干的事)。另一种聪明办法是直接推导出公式 x=−b±b2−4ac2ax=\frac{-b\pm\sqrt{b^2-4ac}}{2a}x=2a−b±b2−4ac (这叫解析解,也就是直接用数学公式给出最优答案)。
研究人员发现,针对公式 (5),其实不用费劲去用强化学习(PPO)一点点试,数学上可以直接求出最优的那个语言模型 长什么样!最优解 π∗\pi^*π∗ 为:
π∗(y∣x)=1Z(x)πref(y∣x)exp(1βrϕ(x,y))(6)\pi^*(y|x) = \frac{1}{Z(x)} \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r_\phi(x, y)\right) \tag{6}π∗(y∣x)=Z(x)1πref(y∣x)exp(β1rϕ(x,y))(6)
- π∗\pi^*π∗:理论上能拿到最高奖励且符合约束的最优语言模型策略。
- exp\expexp:自然指数函数 exe^xex。
- Z(x)Z(x)Z(x):配分函数 (Partition Function) 。这是个常被忽略但极其重要的变量!因为概率的总和必须是 1(比如 100%)。分子算出来可能是一个很大的数,我们需要除以 Z(x)Z(x)Z(x) 把结果归一化到 0~1 之间。它代表了对于提示词 xxx,所有可能生成的回答的奖励总和。
- 这个公式的物理意义: 最优策略 π∗\pi^*π∗ 等于在原有的参考模型 πref\pi_{ref}πref 的基础上,给那些高奖励 rϕr_\phirϕ 的回答增加概率权重。
第五步:推导最终的 DPO Loss 公式
既然我们知道了最优策略 π∗\pi^*π∗ 和奖励 rϕr_\phirϕ 的数学关系,DPO 作者说:"那我们干脆别训练奖励模型 rϕr_\phirϕ 了,直接用语言模型本身来替代它!"
1. 恒等变换(求 rϕr_\phirϕ):
我们对上面那个解析解公式两边取对数(log\loglog),把 rϕr_\phirϕ 挪到等式左边,可以得到:
rϕ(x,y)=βlogπ∗(y∣x)πref(y∣x)+βlogZ(x)(7)r_\phi(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \beta \log Z(x) \tag{7}rϕ(x,y)=βlogπref(y∣x)π∗(y∣x)+βlogZ(x)(7)
2. 代入偏好概率(Bradley-Terry 模型):
回到我们在第一步提到的公式,人类偏好 ywy_wyw 胜过 yly_lyl 的概率是:
p∗(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))p^*(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l))p∗(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))
现在,我们把刚刚推导出的 rϕ(x,y)r_\phi(x, y)rϕ(x,y) 公式代入到 r(x,yw)r(x, y_w)r(x,yw) 和 r(x,yl)r(x, y_l)r(x,yl) 中:
- r(x,yw)=βlogπ∗(yw∣x)πref(yw∣x)+βlogZ(x)r(x, y_w) = \beta \log \frac{\pi^*(y_w|x)}{\pi_{ref}(y_w|x)} + \beta \log Z(x)r(x,yw)=βlogπref(yw∣x)π∗(yw∣x)+βlogZ(x)
- r(x,yl)=βlogπ∗(yl∣x)πref(yl∣x)+βlogZ(x)r(x, y_l) = \beta \log \frac{\pi^*(y_l|x)}{\pi_{ref}(y_l|x)} + \beta \log Z(x)r(x,yl)=βlogπref(yl∣x)π∗(yl∣x)+βlogZ(x)
计算它们的差值 r(x,yw)−r(x,yl)r(x, y_w) - r(x, y_l)r(x,yw)−r(x,yl) 时,奇迹发生了: 极其难算的配分函数 βlogZ(x)\beta \log Z(x)βlogZ(x) 直接被减没了(抵消了)! 因此我们在做强化学习训练时,完全可以预先生成偏好对数据,然后省略掉奖励模型构建,直接开训!
剩下的差值是:
βlogπ∗(yw∣x)πref(yw∣x)−βlogπ∗(yl∣x)πref(yl∣x)\beta \log \frac{\pi^*(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi^*(y_l|x)}{\pi_{ref}(y_l|x)}βlogπref(yw∣x)π∗(yw∣x)−βlogπref(yl∣x)π∗(yl∣x)
为了方便书写,论文里经常把 βlogπ(y∣x)πref(y∣x)\beta \log \frac{\pi(y|x)}{\pi_{ref}(y|x)}βlogπref(y∣x)π(y∣x) 简写为隐式奖励 r^θ(x,y)\hat{r}_\theta(x,y)r^θ(x,y)。
3. 得出最终 Loss:
现在,把 π∗\pi^*π∗ 替换成我们正在训练的模型 πθ\pi_\thetaπθ,再套上我们在第二步提到的"负的对数似然"的外壳,就得到了最终的 DPO Loss:
LDPO=−E{x,yw,yl}∼D[logσ(βlogπθ(yw∣x)πref(yw∣x)−βlogπθ(yl∣x)πref(yl∣x))]\mathcal{L}{DPO} = -\mathbb{E}{\{x, y_w, y_l\} \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)} \right) \right]LDPO=−E{x,yw,yl}∼D[logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))]