RLHF-奖励模型RM 的“引擎”:Pairwise Loss 梯度计算详解

149 阅读2分钟

RLHF-奖励模型RM 的“引擎”:Pairwise Loss 梯度计算详解

在上一篇文章中,我们介绍了奖励模型 (RM) 是 RLHF 的“指南针”,它通过 Pairwise Ranking Loss 来学习人类的偏好。我们最终得到了一个损失值,例如 0.312。

但这个数字本身并不能更新模型。真正驱动模型学习的,是这个损失值 (Loss) 相对于模型每一个参数 (θ\theta) 的梯度 (Gradient) 。梯度是一个向量,它指明了参数调整的方向,以最快地降低损失。

这篇文章将深入技术细节,拆解 Pairwise Ranking Loss 的反向传播(Backpropagation)过程,揭示模型是如何通过数学“理解”并“执行”——“拉高赢家分数,压低输家分数”这一指令的。

一、 目标与链式法则:拆解依赖关系

我们的总目标是计算 θL\nabla_\theta L,即总损失 LL 相对于模型所有参数 θ\theta 的梯度。

首先,我们回顾一下(为简化起见,我们先忽略平均值 1/(K2)1/\binom{K}{2}):

L(θ)=(yw,yl)log(σ(rθ(x,yw)rθ(x,yl)))L(\theta) = - \sum_{(y_w, y_l)} \log\left(\sigma\left(r_\theta(x, y_w) - r_\theta(x, y_l)\right)\right)

我们来看其中一个偏好对 (yw,yl)(y_w, y_l) 产生的损失 LpairL_{\text{pair}}

Lpair=log(σ(s))其中 s=rwrlL_{\text{pair}} = - \log(\sigma(s)) \quad \text{其中 } s = r_w - r_l

(注:rw=rθ(x,yw)r_w = r_\theta(x, y_w)rl=rθ(x,yl)r_l = r_\theta(x, y_l))

要计算 LpairL_{\text{pair}}θ\theta 的梯度 Lpairθ\frac{\partial L_{\text{pair}}}{\partial \theta},我们必须使用链式法则 (Chain Rule) 。参数 θ\theta 的改变是通过影响 rwr_wrlr_l 的分数,进而影响 ss 的差值,最后影响 LpairL_{\text{pair}} 的。

这个过程有两条路径:

  1. 路径 1 (通过赢家 rwr_w): θrwsLpair\theta \to r_w \to s \to L_{\text{pair}}
  2. 路径 2 (通过输家 rlr_l): θrlsLpair\theta \to r_l \to s \to L_{\text{pair}}

因此,总梯度是这两条路径上的梯度之和:

θLpair=(Lpairssrw)θrw+(Lpairssrl)θrl\nabla_\theta L_{\text{pair}} = \left( \frac{\partial L_{\text{pair}}}{\partial s} \cdot \frac{\partial s}{\partial r_w} \right) \cdot \nabla_\theta r_w + \left( \frac{\partial L_{\text{pair}}}{\partial s} \cdot \frac{\partial s}{\partial r_l} \right) \cdot \nabla_\theta r_l

我们可以把这个过程分为两类关键的偏导数进行计算。

二、 第 1 类:损失 L 对分数 r 的偏导数(“上游梯度”)

这是最核心的数学推导,它定义了 Loss 函数本身的行为。

首先,我们使用一个在数值上更稳定的 LpairL_{\text{pair}} 表达式。

因为 Lpair=log(σ(s))=log(11+es)=log(1+es)L_{\text{pair}} = -\log(\sigma(s)) = -\log\left(\frac{1}{1 + e^{-s}}\right) = \log(1 + e^{-s})

  1. 计算 Lpairs\frac{\partial L_{\text{pair}}}{\partial s} (损失对分数 差值 的偏导数):
Lpairs=ddslog(1+es)=11+es(es1)\frac{\partial L_{\text{pair}}}{\partial s} = \frac{d}{ds} \log(1 + e^{-s}) = \frac{1}{1 + e^{-s}} \cdot (e^{-s} \cdot -1)
=es1+es=1es+1=σ(s)=σ(s)1= - \frac{e^{-s}}{1 + e^{-s}} = - \frac{1}{e^s + 1} = - \sigma(-s) = \sigma(s) - 1

这个结果 σ(s)1\sigma(s) - 1 非常关键。

  1. 计算 Lpairrw\frac{\partial L_{\text{pair}}}{\partial r_w} (损失对 赢家分数 的偏导数):
Lpairrw=Lpairssrw\frac{\partial L_{\text{pair}}}{\partial r_w} = \frac{\partial L_{\text{pair}}}{\partial s} \cdot \frac{\partial s}{\partial r_w}

由于 s=rwrls = r_w - r_l,我们知道 srw=1\frac{\partial s}{\partial r_w} = 1

Lpairrw=(σ(s)1)1=σ(rwrl)1\frac{\partial L_{\text{pair}}}{\partial r_w} = (\sigma(s) - 1) \cdot 1 = \sigma(r_w - r_l) - 1
  1. 计算 Lpairrl\frac{\partial L_{\text{pair}}}{\partial r_l} (损失对 输家分数 的偏导数):
Lpairrl=Lpairssrl\frac{\partial L_{\text{pair}}}{\partial r_l} = \frac{\partial L_{\text{pair}}}{\partial s} \cdot \frac{\partial s}{\partial r_l}

由于 s=rwrls = r_w - r_l,我们知道 srl=1\frac{\partial s}{\partial r_l} = -1

Lpairrl=(σ(s)1)(1)=1σ(rwrl)\frac{\partial L_{\text{pair}}}{\partial r_l} = (\sigma(s) - 1) \cdot (-1) = 1 - \sigma(r_w - r_l)

结果分析:

  • 对赢家 rwr_w 的梯度 Lpairrw=σ(s)1\frac{\partial L_{\text{pair}}}{\partial r_w} = \sigma(s) - 1

    由于 σ(s)\sigma(s) 的值域在 (0,1)(0, 1) 之间,这个梯度永远是负数。

  • 对输家 rlr_l 的梯度 Lpairrl=1σ(s)\frac{\partial L_{\text{pair}}}{\partial r_l} = 1 - \sigma(s)

    这个梯度永远是正数。

这组正负号,就是“拉高赢家,压低输家”的数学本质。

三、 第 2 类:分数 r 对参数 θ\theta 的偏导数(“本地梯度”)

这一类偏导数是:

  • θrw=rθ(x,yw)θ\nabla_\theta r_w = \frac{\partial r_\theta(x, y_w)}{\partial \theta}
  • θrl=rθ(x,yl)θ\nabla_\theta r_l = \frac{\partial r_\theta(x, y_l)}{\partial \theta}

这是什么?

θ\theta 代表了 RM 神经网络中的所有参数(例如 Transformer 的 WQ,WK,WVW_Q, W_K, W_V 矩阵、FFN 层的权重和偏置等)。

θrw\nabla_\theta r_w 是一个巨大的梯度向量,它由深度学习框架(如 PyTorch)的自动微分(Autograd)引擎计算。它代表了:“为了让 rwr_w 的分数增加 1,模型中的每一个参数 θi\theta_i 应该如何变化?”

这个计算过程就是标准的反向传播:梯度从 RM 的“回归头”输出 rwr_w 开始,流经 Transformer 的每一层,计算出 rwr_w 对每个参数的偏导数。

θrl\nabla_\theta r_l 同理,但由于输入 yly_lywy_w 不同,其计算出的激活值和最终的梯度向量也会完全不同。

四、 组合:完整的梯度更新

现在我们把这两类偏导数组合起来,得到一个偏好对 (yw,yl)(y_w, y_l) 对模型总梯度的贡献 θLpair\nabla_\theta L_{\text{pair}}

θLpair=(Lpairrw)θrw+(Lpairrl)θrl\nabla_\theta L_{\text{pair}} = \left(\frac{\partial L_{\text{pair}}}{\partial r_w}\right) \nabla_\theta r_w + \left(\frac{\partial L_{\text{pair}}}{\partial r_l}\right) \nabla_\theta r_l

代入我们在第二节中推导出的结果:

θLpair=(σ(rwrl)1)标量 (负数)θrw向量+(1σ(rwrl))标量 (正数)θrl向量\nabla_\theta L_{\text{pair}} = \underbrace{(\sigma(r_w - r_l) - 1)}_{\text{标量 (负数)}} \cdot \underbrace{\nabla_\theta r_w}_{\text{向量}} + \underbrace{(1 - \sigma(r_w - r_l))}_{\text{标量 (正数)}} \cdot \underbrace{\nabla_\theta r_l}_{\text{向量}}

梯度下降如何工作:

模型在更新时,遵循的是梯度下降 (Gradient Descent) 规则:

θnew=θoldηθL\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla_\theta L

(其中 η\eta 是学习率)

我们把上面那个偏好对的梯度代入:

θnew=θoldη[(σ(s)1)θrw+(1σ(s))θrl]\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \left[ (\sigma(s)-1) \cdot \nabla_\theta r_w + (1-\sigma(s)) \cdot \nabla_\theta r_l \right]

整理一下符号:

θnew=θold+η(1σ(s))正数θrwη(1σ(s))正数θrl\theta_{\text{new}} = \theta_{\text{old}} + \underbrace{\eta \cdot (1-\sigma(s))}_{\text{正数}} \cdot \nabla_\theta r_w - \underbrace{\eta \cdot (1-\sigma(s))}_{\text{正数}} \cdot \nabla_\theta r_l

这就是最终的更新指令:

    • [正数项] * (r_w 的梯度):

    这里的 (r_w 的梯度)(即 θrw\nabla_\theta r_w)本身是一个向量,它指向的是能使 rwr_w 分数增加的方向。

    • 参数 θ\theta 正在沿着“能使 rwr_w 增加的方向”移动。
    • 最终效果:拉高赢家 rwr_w 的分数。
    • [正数项] * (r_l 的梯度):

    这里的 (r_l 的梯度)(即 θrl\nabla_\theta r_l)本身是一个向量,它指向的是能使 rlr_l 分数增加的方向。

    • 参数 θ\theta 正在沿着“能使 rlr_l 增加的方向”的相反方向移动。
    • 最终效果:压低输家 rlr_l 的分数。

截屏2025-10-28 17.49.23.png


六、 核心洞察:梯度大小由“错误程度”决定

1、场景回顾

  • Prompt (x): "请推荐一部适合全家观看的电影。"

  • 人类排序 (K=4): y1>y2>y3>y4y_1 > y_2 > y_3 > y_4

  • RM 模型打分: (这是模型 当前 的输出)

    • rθ(x,y1)=2.5r_\theta(x, y_1) = 2.5
    • rθ(x,y2)=1.9r_\theta(x, y_2) = 1.9
    • rθ(x,y3)=2.1r_\theta(x, y_3) = 2.1 <-- 模型错误点 (人类认为 y2>y3y_2 > y_3)
    • rθ(x,y4)=1.0r_\theta(x, y_4) = -1.0

2. 奖励模型 (RM) 的 Pairwise Ranking Loss 计算

公式:

L(θ)=1(K2)(yw,yl)log(σ(rθ(x,yw)rθ(x,yl)))L(\theta) = - \frac{1}{\binom{K}{2}} \sum_{(y_w, y_l)} \log\left(\sigma\left(r_\theta(x, y_w) - r_\theta(x, y_l)\right)\right)

其中 (K2)=(42)=6\binom{K}{2} = \binom{4}{2} = 6

计算步骤:

我们需要计算 6 个偏好对 (yw,yl)(y_w, y_l)log(σ(rwrl))\log(\sigma(r_w - r_l)) 值。

偏好对 (w, l) (人类偏好)RM 分数 rw​,rl​差值 s=(rw​−rl​)σ(s)=1+e−s1​ (模型认为 w 赢的概率)log(σ(s)) (单对损失)
(y1,y2y_1, y_2)(2.5, 1.9)0.60.6σ(0.6)0.646\sigma(0.6) \approx 0.646log(0.646)0.437\log(0.646) \approx -0.437
(y1,y3y_1, y_3)(2.5, 2.1)0.40.4σ(0.4)0.599\sigma(0.4) \approx 0.599log(0.599)0.512\log(0.599) \approx -0.512
(y1,y4y_1, y_4)(2.5, -1.0)3.53.5σ(3.5)0.971\sigma(3.5) \approx 0.971log(0.971)0.029\log(0.971) \approx -0.029
(y2,y3y_2, y_3)(1.9, 2.1)0.2-0.2σ(0.2)0.450\sigma(-0.2) \approx 0.450log(0.450)0.798\log(0.450) \approx -0.798
(y2,y4y_2, y_4)(1.9, -1.0)2.92.9σ(2.9)0.948\sigma(2.9) \approx 0.948log(0.948)0.053\log(0.948) \approx -0.053
(y3,y4y_3, y_4)(2.1, -1.0)3.13.1σ(3.1)0.957\sigma(3.1) \approx 0.957log(0.957)0.044\log(0.957) \approx -0.044

最终 Loss 计算:

  1. 求和 (Sum):

    (0.437)+(0.512)+(0.029)+(0.798)+(0.053)+(0.044)=1.873(-0.437) + (-0.512) + (-0.029) + (-0.798) + (-0.053) + (-0.044) = -1.873

  2. 取平均 (Divide by 6):

    1.873/60.312-1.873 / 6 \approx -0.312

  3. 取负 (Negate):

    L(θ)=(0.312)=0.312L(\theta) = -(-0.312) = 0.312

此 batch 的最终损失值为 0.312。


3. 梯度计算(关键标量部分)

我们无法计算完整的 θL\nabla_\theta L(这需要访问神经网络内部参数),但我们可以计算出驱动梯度更新的“标量”部分,即损失 LL 对 RM 分数 rr 的偏导数。

公式(来自我们之前的推导):

  • 赢家 rwr_w 的梯度标量:Lpairrw=σ(s)1\frac{\partial L_{\text{pair}}}{\partial r_w} = \sigma(s) - 1
  • 输家 rlr_l 的梯度标量:Lpairrl=1σ(s)\frac{\partial L_{\text{pair}}}{\partial r_l} = 1 - \sigma(s)

我们以两个极端案例为例:模型搞错的 (y2,y3y_2, y_3)模型做对的 (y1,y4y_1, y_4)

案例 1:模型搞错的偏好对 (y2,y3y_2, y_3)

  • 人类偏好:y2y_2 (赢家) > y3y_3 (输家)
  • 差值 s=r2r3=1.92.1=0.2s = r_2 - r_3 = 1.9 - 2.1 = -0.2
  • 模型概率 σ(s)=σ(0.2)0.450\sigma(s) = \sigma(-0.2) \approx 0.450

计算梯度标量:

  • 赢家 (y2y_2) 的梯度标量:

    σ(s)1=0.4501.0=0.55\sigma(s) - 1 = 0.450 - 1.0 = \mathbf{-0.55}

  • 输家 (y3y_3) 的梯度标量:

    1σ(s)=1.00.450=+0.551 - \sigma(s) = 1.0 - 0.450 = \mathbf{+0.55}

解释:

这两个值(-0.55 和 +0.55)的绝对值很大(最大为 1.0)。

在梯度下降 θθηL\theta \leftarrow \theta - \eta \cdot \nabla L 中:

  • 这个 -0.55(负数)会使 θ\theta增加 r2r_2(赢家)的方向更新。
  • 这个 +0.55(正数)会使 θ\theta减小 r3r_3(输家)的方向更新。
  • 结论: 产生了强烈的更新信号,迫使模型“拉高 r2r_2,压低 r3r_3”。

案例 2:模型做对的偏好对 (y1,y4y_1, y_4)

  • 人类偏好:y1y_1 (赢家) > y4y_4 (输家)
  • 差值 s=r1r4=2.5(1.0)=3.5s = r_1 - r_4 = 2.5 - (-1.0) = 3.5
  • 模型概率 σ(s)=σ(3.5)0.971\sigma(s) = \sigma(3.5) \approx 0.971

计算梯度标量:

  • 赢家 (y1y_1) 的梯度标量:

    σ(s)1=0.9711.0=0.029\sigma(s) - 1 = 0.971 - 1.0 = \mathbf{-0.029}

  • 输家 (y4y_4) 的梯度标量:

    1σ(s)=1.00.971=+0.0291 - \sigma(s) = 1.0 - 0.971 = \mathbf{+0.029}

解释:

这两个值(-0.029 和 +0.029)的绝对值非常小(接近 0)。

  • 结论: 模型已经正确且自信地将 r1r_1r4r_4 分开了,因此这个偏好对几乎不产生梯度。模型可以“忽略”这个简单的样本,转而专注于学习像 (y2,y3y_2, y_3) 这样的错误案例。

结论

梯度计算不是一个黑盒。通过链式法则,Pairwise Ranking Loss 被精确地分解为一组直观的数学指令:

  1. 方向: θL\nabla_\theta L 的计算结果天然地包含了“拉高 rwr_w”和“压低 rlr_l”的信号。
  2. 幅度: 梯度的大小与 1σ(rwrl)1 - \sigma(r_w - r_l) 成正比,即模型对正确答案的“不确定性”或“错误程度”。

这种自适应的调节机制使得 RM 能够高效、稳定地将数万个人类偏好排序,蒸馏到模型的数十亿参数中,最终打造出一个强大的“人类偏好指南针”。

在 RM 训练中,我们通过最小化 Pairwise Ranking Loss 来更新模型参数 θ\theta。这个损失值本身并不能更新模型,真正驱动模型学习的,是这个损失值 (Loss) 相对于模型每一个参数 (θ\theta) 的梯度 (Gradient)

梯度是一个向量,它指明了参数调整的方向,以最快地降低损失。这篇文章将深入技术细节,拆解 Pairwise Ranking Loss 的反向传播(Backpropagation)过程,揭示模型是如何通过数学“理解”并“执行”——“拉高赢家分数,压低输家分数”这一指令的。