1. 首页
  2. 精选文章
  3. 关于 Score Centering 的五种解释:drift、BPO、理想 baseline、STE、局部分布族

关于 Score Centering 的五种解释:drift、BPO、理想 baseline、STE、局部分布族

  • 发布于 2026-10-13
  • ·
  • 2 次阅读
  • ·
  • ·

作者:Palind

最近的 Score Centering 居然有整整五种解释方法🫠🫠🫠每一个角度都很有趣!

本文详细整理了五个解释 Score Centering(SC)的角度,而且每个都附上了出处链接。本文就是:「五等分的 Score Centering」。😉

TL;DR

视角 对 SC 的解释
原 SC 视角 SC 是一种解决训推不一致(TIM)导致的 drift 的方法。
BPO 视角 SC 是根据 PMD 的闭式解改写的 critic-free 目标的 token-level surrogate 的梯度。
Advantage 定义视角 SC 是人们希望得到 sampler 分布的精确 value baseline 而推出来的期望更新。
STE 视角 SC 是直通估计器(STE)。
局部分布族视角 SC 是构造出的局部分布族在起点处的真实 score。

最后两个其实很接近 🤔 它们在变化靠近更新零点 \delta=0 时是一样的。不过出发点不同,而且它们都特别精彩!所以我分为两点记录了。

另外,本文会记录一些关于社区的实现的笔记,如果你想快速浏览五种视角,可以直接跳过。

每一点,都能独立推出 SC,这真是异曲同工。接下来我来详细讲他们的核心。

前言:Score Centering 近况

截至 2026 年 10 月 10 日,SC 已经有 原论文、官方实现,也已经进入 verl 的 rollout correction 实现。

2026 年 9 月 17 日,Martin Marek 与 Max Ryabinin 提出 Score Centering (SC),引起广泛关注,社区迅速响应,9 月 23 日,slime 实现了 SC:PR #2405;
10 月 1 日,verl 实现了 SC:PR #8010。

slime

verl

BPO 在 9 月 14 日发表。其一层梯度近似之后,与完整 SC 梯度结构相同。BPO 的作者们分别在知乎和 huggingface 上和大家分享了这一发现。

huggingface

在工作被广泛关注后,人们开始从不同的问题入手重新解释 SC,揭示了其本质。具体来说:为什么训推不一致会制造额外更新??把减去的 baseline 设为理想的采样器 value,能否进一步推导??在模型更新的原点分布,能不能得到一个近似梯度??

于是科学家们提出了以下 5 种解释 🥳

0. 本文的符号约定与预备知识

0.1 概率、参数、score 函数、奖励

固定一个生成前缀,记为 h。其包含 prompt 和已经生成的 token。

接下来讨论单个位置时,省略条件 h 不写。

  • \mathcal V:词表。
  • \theta:trainer 训练器参数。
  • p_\theta(a\mid h):trainer 训练器计算的下一 token 概率。
  • q(a\mid h):sampler 实际采样器的下一 token 概率。
  • s_\theta(a\mid h):这就是 score 函数,它是 \nabla_\theta\log p_\theta(a\mid h)。
  • m_q(h):\mathbb E_{a\sim q}[s_\theta(a\mid h)],是平均 score,注意是从 q 采样。
  • R:rollout 的终局奖励。
  • B:实际会乘在 score 上的标量权重,可以是奖励,也可以是 advantage。
  • \operatorname{sg}:stop-gradient,也就是 detach。本文 actor 更新中,反向传播不会传到采样器 q、奖励等。

本文统一采用更新的上升方向 G,即定义 G=-\nabla_\theta L。

0.2 预备知识①,score 在自己的分布下均值为零,但是,训推不一致(TIM)改变了采样分布

\begin{aligned} \mathbb E_p[s_\theta] &=\sum_a p_\theta(a)\nabla_\theta\log p_\theta(a)\\ &=\sum_a\nabla_\theta p_\theta(a)\\ &=\nabla_\theta\sum_a p_\theta(a)\\ &=\nabla_\theta 1=0. \end{aligned}

第一步之所以成立,是因为 \nabla\log p=(\nabla p)/p。

不过,在真实的 RL 训练中,是 sampler 采样得到轨迹,trainer 进行训练。举个例子,verl 的训练框架默认用的是 FSDP,当然也可以用 megatron,这就是 trainer;而 verl 的采样框架可以用 vLLM,这就是 sampler。

既然 Sampler q 生成 rollout,trainer p 对 rollout 轨迹重算 log-prob。训推框架存在很大区别,比方说量化,比方说 kernel 的实现不一样,还比方说浮点误差。还有一点主要的:如果开启了异步训练(比如,verl 可以开启全异步),那么异步带来的 staleness 样本,也会导致 p \neq q。

这就是 TIM(training-inference mismatch)。

所以,对于我们恒为零的上式,把里面的分布 p 换成 sampler q 之后:

\mathbb E_q[s_\theta]=\sum_aq(a)s_\theta(a)=m_q

这通常不等于零。综上,\mathbb E_p[s]=0,但通常 \mathbb E_q[s] \neq 0。

0.3 预备知识②,回顾策略梯度(PG)

迅速回顾普通的策略梯度(Policy Gradient,PG)。考虑单步,选择动作 a,获得奖励 r(a),r(a) 与 \theta 无关。

在 LLM 的 RL 中,我们的目标就是,最大化分布的平均奖励:

J_p(\theta)=\sum_a p_\theta(a)r(a).

速推 PG,不多说。因为 \nabla_\theta p_\theta(a)=p_\theta(a)\nabla_\theta\log p_\theta(a),所以

\nabla_\theta J_p =\sum_a r(a)\nabla_\theta p_\theta(a) =\mathbb E_p[r(a)s_\theta(a)].

这就是 PG。注,上文的 p 是泛指一个策略,并非训练器。(实际上,我们真正想优化的,肯定是在推理引擎上的效果。)

在实际训练中,动作来自 sampler 的分布 q。因此,直接用这些采样动作得到的奖励乘以 trainer 的 score,得到的期望更新方向是

G_{\mathrm{plain}}=\mathbb E_q[r(a)s_\theta(a)].

实际更新按 q 加权,但优化的却是 p 的 θ? 如果你是 SC 的作者,你一定早已感到其中的不对劲。具体来说,你一定很想找找这个偏差破坏了哪些梯度本该持有的特性,比如减 baseline 后的期望不变。我们后面讲解。

再说一下 Q 的定义。在 LLM RL 中,采样一个 token 后不会立即奖励,完整回答后才获得终局奖励 R。我们固定前缀 h、当前 token 选为 a、后续按策略 q 生成时,平均能获得多少奖励?这个条件期望就是 Q^q(h,a):

Q^q(h,a)=\mathbb E[R\mid h,\text{当前 token}=a,\text{后续使用 }q].

给定 h 和 a 后,当前 token 的 score 确定。因此,先对后续生成求平均,再对当前动作求平均,有

G_{\mathrm{plain}}=\mathbb E_q[R s_\theta(a\mid h)\mid h] =\sum_a q(a\mid h)Q^q(h,a)s_\theta(a\mid h).

因此,固定前缀处分析期望更新时,可以用动作价值 Q^q(h,a) 表示当前动作对应的平均终局奖励。

0.4 预备知识③,softmax 的 score

定义训练器的 logits 向量是 z_\theta\in\mathbb R^{|\mathcal V|},有

p_\theta(a)=\frac{e^{z_\theta(a)}}{\sum_b e^{z_\theta(b)}}.

定义 e_a 是 token a 的 one-hot 向量。

令 J_\theta=\partial z_\theta/\partial\theta 为 Jacobian。

先看对数概率对第 v 个 logit 求导:

\begin{aligned} \log p_\theta(a)&=z_\theta(a)-\log\sum_b e^{z_\theta(b)},\\ \frac{\partial\log p_\theta(a)}{\partial z_\theta(v)} &=\mathbf 1\{v=a\}-p_\theta(v). \end{aligned}

其中\mathbf1\{\cdot\} 是条件成立时为 1、否则为 0 的指示函数。再把上式扩展到所有维度,即可得到:

\nabla_z\log p(a)=e_a-p,

这就是对 logit 求导。再进一步,即可得到对参数 \theta 的求导:

s_\theta(a)=J_\theta^\top(e_a-p).

对它按 q 求平均,得:

m_q=\mathbb E_{a\sim q}[s_\theta(a)]=J_\theta^\top(q-p).

1. 第一解释:原 SC 论文。消除 drift 留下 covariance

现在考虑普通 PG,也就是梯度等于奖励乘 score。

假如你是 SC 的作者,你一定常常思考:如果环境没有提供任何奖励差异(比方说,现在每个奖励恒定为 +1,那么环境就没有真的给你提供方向),观察到的更新为什么还不为零?你肯定知道是 TIM 造成的,但具体原因呢?能否精确到某一项?

1.1 环境无奖励差异时的漂移更新

令奖励恒定为常数 c。

对单步目标 J_p=c,真实梯度是应当是零。用理想情况验证一下,理想 on-policy 时,p=q,又根据 E_p[s_\theta]=0 有:

\nabla_\theta J_p=\mathbb E_p[c s]=c\mathbb E_p[s_θ]=0.

但现实情况使用 q 采样、p 求 score,因此

\mathbb E_q[c s]=c m_q.

它可能非零。尽管环境没有区分哪个动作更好,这个漂移更新仍然存在。

1.2 梯度进行协方差分解

定义标量 B 为 s 在梯度中乘的系数,例如刚刚的奖励恒定纯 PG 中,B 就是 c。它与 s 的协方差是

\operatorname{Cov}_q(B,s) =\mathbb E_q[B s]-\mathbb E_q[B]\mathbb E_q[s].

其中,等号右边的第一项就是梯度 G_{\mathrm{plain}}。所以把等号右边第二项移项到左边,并称之为 \text{drift}。

G_{\mathrm{plain}} =\underbrace{\mathbb E_q[B]m_q}_{\text{drift}} +\underbrace{\operatorname{Cov}_q(B,s)}_{\text{signal}}.

当 B 为我们 1.1 中说的常数 c 时,协方差项为 0。此时剩下 \text{drift}。既然 p=q 时 \text{drift}=0,考虑消去 \text{drift}=\mathbb E_q[B]m_q。

定义 SC 操作:

\widetilde s(a)=s(a)-m_q.

因为 m_q 在固定前缀处是固定向量,所以得到:

\mathbb E_q[\widetilde s]=m_q-m_q=0.

把梯度 G 中的 s 换为 \widetilde s,得:

\begin{aligned} G_{\mathrm{SC}} &=\mathbb E_q[B\widetilde s]\\ &=\mathbb E_q[Bs]-\mathbb E_q[B]m_q\\ &=G_{\text{plain}}-\mathbb E_q[B]m_q\\ &=\operatorname{Cov}_q(B,s). \end{aligned}

现在,把它与理想 on policy 对比:

\begin{aligned} G_{\mathrm{on-policy}} &=\mathbb E_p[Bs]\\ &=\mathbb E_p[B]\mathbb E_p[s]+\operatorname{Cov}_p(B,s)\\ &=\operatorname{Cov}_p(B,s). \end{aligned}

注意 SC 消除了 drift,与理想 on-policy 唯一的区别是,SC 的协方差仍在采样分布 q 下计算。一般不等于训练器分布 p 下的理想更新。

1.3 小证明,drift 是蒸馏方向

固定 q,那么以 sampler 为教师的交叉熵可以写为:

L_{\mathrm{CE}}(\theta)=-\sum_aq(a)\log p_\theta(a).

求导:

\nabla_\theta L_{\mathrm{CE}}=-m_q.

因此很直观,当 \mathbb E_q[B]>0 时,drift 的方向与降低这个交叉熵一致;均值为负时方向反过来。训练器朝 sampler 的分布蒸馏。

当开启异步时,sampler 是随 trainer 刷新的量化或陈旧副本,这种蒸馏偏差会在更新和权重同步中反馈累积。关于异步、副本陈旧,verl 的文档里有一张便于理解的图:

verl

上图的右下角即为全异步引起的陈旧。

1.4 SC 恢复的理想特性:「减 baseline 后的期望不变性」

SC 恢复了理想 on-policy 情况下的一个性质:减去与当前动作无关的 baseline,期望更新不变。

我们固定前缀 h,令 b(h) 为只依赖前缀、不依赖当前动作的任意一个标量 baseline,比方说它可以是当前前缀的 value V^q(h),具体实现上可以用组内中心化来采样实现。在本次 actor 更新中,将 b 视为固定量。

理想 on-policy 时,因为 \mathbb E_p[s_\theta\mid h]=0,所以 PG 的梯度是:

\begin{aligned} \mathbb E_p[(B-b(h))s_\theta\mid h] &=\mathbb E_p[B s_\theta\mid h] -b(h)\mathbb E_p[s_\theta\mid h]\\ &=\mathbb E_p[B s_\theta\mid h]. \end{aligned}

但是实际情况动作来自 q,PG 的 score 的均值可能非零,因此减 baseline 会改变更新的期望,也就是,

\mathbb E_q[(B-b(h))s_\theta\mid h] =\mathbb E_q[B s_\theta\mid h]-b(h)m_q(h).

如果用 SC 将 score 中心化后,就有 \mathbb E_q[\widetilde s_\theta\mid h]=0,于是有

\begin{aligned} \mathbb E_q[(B-b(h))\widetilde s_\theta\mid h] &=\mathbb E_q[B\widetilde s_\theta\mid h] -b(h)\mathbb E_q[\widetilde s_\theta\mid h]\\ &=\mathbb E_q[B\widetilde s_\theta\mid h]. \end{aligned}

这就是 SC 恢复的 baseline invariance 特性。

实际上,你可能隐约感到了另一种解释。人们通常会很想选取 sampler 的精确 value 作为 baseline,因为减掉此 baseline,就能比较某个动作相对于当前策略的平均表现是更好还是更差。

不过,人们只能通过采样来估计 value。如果在公式内进一步用精确 value 推导呢?这里就引出了后文的第三条解释 😉 它也能独立推导出 SC。我们稍后再说。

顺便,在原始 PG 上,人们常常用 group centering 来估计 value。固定同一 prompt。定义:

  • n:同一 prompt 采样的回答条数。
  • R_i:第 i 条回答的终局奖励。
  • \overline R:这组回答的平均奖励。
  • B_i:第 i 条回答的 advantage,乘在 score 上。
\overline R=\frac1n\sum_{j=1}^nR_j, \qquad B_i=R_i-\overline R.

因此

\sum_{i=1}^n B_i=0.

如果再除以组内奖励标准差,就得到常见的组内标准化 advantage。

1.5 社区实现简述

我这里是顺手记一下 ☺️ 如果你想速览其他解释 SC 的角度,可以跳过这一节。

下文以 verl 为例。PR #8010 于 2026 年 10 月 1 日合并,把 SC 加入 bypass-mode REINFORCE,使用 sampler top-k 概率重建平均 score。文档在:rollout correction 文档 。

1.5.1 不要全词表

对于完整词表,SC 的 per-token loss 是

L_{\mathrm{SC}} =-\operatorname{sg}(B)\left[ \log p_a-\sum_v\operatorname{sg}(q_v)\log p_v \right].

之所以说是「完整词表」,就是因为上式中的 \sum_v 会遍历整个 vocab。

对此 surrogate 自动微分就得到我们需要的 -\nabla L=B(s_a-m_q)。

但是,保存和传输 sampler 完整概率分布太贵。

每个生成位置都要保存 |\mathcal V| 个概率,若词表约 15 万,使用 fp32,每个位置就需要约 600 KB。

因此 verl 和官方 SC 实现保存 top-k 概率,并用 trainer 的分布去近似尾部。

1.5.2 top-k

令 H 是 sampler 概率最大的 k 个 token 的集合,T=\mathcal V\setminus H 是尾部。记

q_H=\sum_{v\in H}q_v,\quad p_H=\sum_{v\in H}p_v, \qquad \rho=\frac{1-q_H}{1-p_H}.

重建 sampler 分布为

\widehat q_v=\begin{cases} q_v,&v\in H,\\ \rho p_v,&v\in T. \end{cases}

注意其保留 sampler 的真实 k 个头部 token 概率,并按 trainer 的尾部分布形状填入 sampler 的尾部总质量。这样构造后,可以有 \sum_v\widehat q_v=1。

下式第一步,利用 \sum_vp_vs_v=0:

\begin{aligned} \widehat m_q &=\sum_{v\in H}q_vs_v+\rho\sum_{v\in T}p_vs_v\\ &=\sum_{v\in H}q_vs_v-\rho\sum_{v\in H}p_vs_v\\ &=\sum_{v\in H}(q_v-\rho p_v)s_v. \end{aligned}

因此,loss 只需要 head 的 trainer log-probs:

L=-B\left[\log p_a-\sum_{v\in H}\operatorname{sg}(q_v-\rho p_v)\log p_v\right].

这样,top-k 节约了传输和存储成本。

1.5.3 SC + TIS/MIS

其实,重要性采样(Importance Sampling,IS)本来就可以精确校正采样分布与目标分布的不一致。人们为什么不用精确 IS 呢?为什么要用 TIS/MIS 等方式截断呢?

固定一个前缀,定义概率比值

r_a=\frac{p_a}{q_a}.

假设 p_a>0 的动作都有 q_a>0,对于同一个固定动作权重函数 B(a),有

\begin{aligned} \mathbb E_q[r_aB(a)s_a] &=\sum_aq_a\frac{p_a}{q_a}B(a)s_a\\ &=\sum_ap_aB(a)s_a\\ &=\mathbb E_p[B(a)s_a]. \end{aligned}

它将 q 下的加权期望精确变回了 p 下的期望。同样,精确 IS 加权后的 score 均值是

\mathbb E_q[r_as_a]=\sum_ap_as_a=0.

因此,精确 IS 已经消除了这里的 mean-score drift,不需要再用 SC 扣除一个非零均值。

那为什么还需要 SC?精确 IS 的权重可能很大,导致梯度估计的方差很高。

注意,这里是 token ratio,修正的是固定前缀下的动作分布。若要精确恢复完整序列目标,还需要完整轨迹的概率比值,在 verl 里就是开启 rollout_is: sequence,那么方差就可能更大了。

因此,人们用 TIS 或 MIS 来限制极端权重。令 c>0 为上截断阈值,0<\ell\le u 为保留区间:

  • TIS:w_a=\min(r_a,c),将过大的 ratio 截断。
  • MIS/IcePop 区间权重:w_a=r_a\mathbf1\{\ell\le r_a\le u\},区间外的权重置零。

现在的 IS 方差被控制住了,但是有偏了。这时 q_aw_a 一般不再等于 p_a,所以加权 score 的均值可能重新变成非零:

m_f=\mathbb E_q[w_as_a]=\sum_aq_aw_as_a

上式中,下标 f 表示所采用的权重规则,即 w_a=f(r_a)。原更新分解成:

\mathbb E_q[Bws] =\underbrace{\mathbb E_q[B]m_f}_{\text{残余 drift}} +\operatorname{Cov}_q(B,ws).

这就是为什么 SC 可以与 TIS/MIS 结合:先用 TIS/MIS 给 score 加权,再用 SC 减掉加权 score 的均值。 SC + TIS/MIS 后,单样本更新梯度为

B(w_as_a-m_f),

期望为

\begin{aligned} \mathbb E_q[B(ws-m_f)] &=\mathbb E_q[Bws]-\mathbb E_q[B]m_f\\ &=\operatorname{Cov}_q(B,ws). \end{aligned}

注意其中减去的是 m_f=\mathbb E_q[ws]。

精确 IS 时,w=r,m_f=0,SC 的附加修正自然是消失的;TIS/MIS 留下非零均值时,SC 才继续消除这一项。

最后,SC + TIS/MIS 也需要 top-k。在重建尾部上,\widehat q_v=\rho p_v,所以 p_v/\widehat q_v=1/\rho。令

\alpha=\rho f(1/\rho).

则 expected weighted score 的 head-only 形式为

\widehat m_f=\sum_{v\in H}(q_vw_v-\alpha p_v)s_v.

各规则对应如下 \alpha:

\alpha_{\mathrm{SC}}=\rho,\quad \alpha_{\mathrm{IS}}=1,\quad \alpha_{\mathrm{TIS}}=\min(1,c\rho),\quad \alpha_{\mathrm{MIS}}=\mathbf1\{\ell\le1/\rho\le u\}.

最后 loss 是

L=-B\left[ \operatorname{sg}(w_a)\log p_a -\sum_{v\in H}\operatorname{sg}(q_vw_v-\alpha p_v)\log p_v \right].

(采样 token 如果落在尾部、不在 head 中呢?那仍要保存其 sampler log-prob,以计算 IS 权重。你可能想说,我采样如果不是整个词表呢?这样就不用考虑落到尾部的情况了,比如我开启 top-k 或 top-p 采样再 SC,verl 社区目前也在完善这样的支持:PR #8196)

1.5.4 verl 实现简述

核心文件为 score_centering.py。

其中,实现了 score_centering_correction() 返回标量 surrogate correction \sum_{v\in H}\operatorname{sg}(q_vw_v-\alpha p_v)\log p_v。它的梯度就是 \widehat m_f。大意是:

with torch.no_grad():
    p = head_logp.float().exp()
    q = sampler_head_logp.float().exp()
    rho = (1 - q.sum(-1)).clamp_min(1e-6) / (1 - p.sum(-1)).clamp_min(1e-6)
    alpha = rho * weight_fn(1 / rho)
    head_weights = weight_fn((head_logp - sampler_head_logp).exp())
    residual = q * head_weights - alpha.unsqueeze(-1) * p

correction = (residual * head_logp).sum(-1)

在 core_algos.py 的 REINFORCE loss compute_policy_loss_reinforce() 中,如果开启了 SC,有

pg_losses = -advantages * log_prob * rollout_is_weights
# 没有 IS 时,省去 rollout_is_weights
pg_losses = pg_losses + advantages * sc_correction

上述代码,第一行就是

L_{\mathrm{PG}}=-B\,w_a\log p_\theta(a).

第二行就是

L=-B\,w_a\log p_\theta(a)+B\,C_\theta.

因为 B、w_a 是 detach 了,求导得到

\begin{aligned} \nabla_\theta L &=-B\,w_a\,\underbrace{\nabla_\theta\log p_\theta(a)}_{s_\theta(a)} +B\,\underbrace{\nabla_\theta C_\theta}_{\widehat m_f}\\ &=-B\,w_a s_\theta(a)+B\,\widehat m_f. \end{aligned}

因此

-\nabla_\theta L=B(w_as_a-\widehat m_f).

2. 第二解释:BPO 从 PMD 与 Bellman 方程得到 SC 梯度

BPO 的一层梯度近似之后,与完整 SC 梯度结构相同。BPO 的作者们分别在知乎和 huggingface 上和大家分享了这一发现。

2.1 本节的符号约定

本节恢复前缀条件。定义:

  • x:prompt,来自分布 \mathcal D。
  • y=(y_1,\ldots,y_T):回答,长度至多 T_{\max}。
  • h_t=(x,y_{<t}):生成第 t 个 token 前的状态。
  • \mu:固定的 rollout policy,对应前文的 q。
  • \pi_\theta:待优化策略,对应前文的 p_\theta。
  • \mathbb P_\mu(y\mid x)=\prod_t\mu(y_t\mid h_t):完整回答分布。
  • V^\mu(h):从状态 h 开始、继续按 \mu 生成时的期望终局奖励。
  • Q^\mu(h,a):先选动作 a、随后按 \mu 生成时的期望终局奖励。
  • A^\mu(h,a)=Q^\mu(h,a)-V^\mu(h):rollout policy 的真实 advantage。

只给终局奖励、追加 token 的状态转移确定、无折扣的情况下,Bellman 方程给出:

V^\mu(h)=\sum_a\mu(a\mid h)Q^\mu(h,a), \qquad Q^\mu(h_t,y_t)=V^\mu(h_{t+1}).

代入 advantage 定义,它在自身策略 \mu 下的均值为零:

\begin{aligned} \sum_a\mu(a\mid h)A^\mu(h,a) &=\sum_a\mu(a\mid h)\left[Q^\mu(h,a)-V^\mu(h)\right]\\ &=\sum_a\mu(a\mid h)Q^\mu(h,a) -V^\mu(h)\sum_a\mu(a\mid h)\\ &=V^\mu(h)-V^\mu(h)\cdot1\\ &=0. \end{aligned}

又

A^\mu(h_t,y_t)=V^\mu(h_{t+1})-V^\mu(h_t)

得逐轨迹的望远镜恒等式:

\begin{aligned} \sum_{t=1}^T A^\mu(h_t,y_t) &=\sum_{t=1}^T[V^\mu(h_{t+1})-V^\mu(h_t)]\\ &=R(x,y)-V^\mu(x). \end{aligned}

注意终点状态的 value 就是终局奖励。

2.2 PMD 的目标与闭式解

定义 \eta>0 为更新强度。PMD 是什么?就是要求解:

\max_{\pi(\cdot\mid h)} \left\{ \sum_a\pi(a\mid h)A^\mu(h,a) -\frac1\eta D_{\mathrm{KL}}(\pi(\cdot\mid h)\Vert\mu(\cdot\mid h)) \right\}.

其中

D_{\mathrm{KL}}(u\Vert v)=\sum_a u(a)\log\frac{u(a)}{v(a)}.

约束是

\sum_a\pi(a\mid h)=1,\qquad \pi(a\mid h)\ge0.

由拉格朗日乘子法求解上述约束优化问题,得闭式解:

\pi^+(a\mid h) =\frac{\mu(a\mid h)e^{\eta A^\mu(h,a)}}{Z_\mu(h)},

其中

Z_\mu(h)=\sum_b\mu(b\mid h)e^{\eta A^\mu(h,b)}.

直接应用闭式解?注意这需要每个前缀、每个动作的 advantage,大量的 rollout 才能采样估计出来;或者需要额外的 critic 成本。

2.3 消去配分函数 Z,再消去中间 value

对上述闭式解取对数:

\log\frac{\pi^+(a\mid h)}{\mu(a\mid h)} =\eta A^\mu(h,a)-\log Z_\mu(h).

按 \mu 求平均,利用 \mathbb E_\mu[A^\mu]=0,根据 KL 的定义,等式两边变为:

-D_{\mathrm{KL}}(\mu\Vert\pi^+)=-\log Z_\mu(h).

对于本小节的第一个式子,把 -\log Z_\mu(h) 替换为 -D_{\mathrm{KL}}(\mu\Vert\pi^+),得

\eta A^\mu(h,a) =\log\frac{\pi^+(a\mid h)}{\mu(a\mid h)} +D_{\mathrm{KL}}(\mu(\cdot\mid h)\Vert\pi^+(\cdot\mid h)).

沿着回答求和,

\sum_t\left[ \log\frac{\pi^+(y_t\mid h_t)}{\mu(y_t\mid h_t)} +D_{\mathrm{KL}}(\mu(\cdot\mid h_t)\Vert\pi^+(\cdot\mid h_t)) \right] =\eta[R(x,y)-V^\mu(x)].

注意已经不再需要中间状态的 value。

2.4 平方残差目标

把上式等号左右两边的闭式解结果 \pi^+ 换为 \pi,然后让它们相减,定义为轨迹残差。本小节用 d(x,y;\pi,\mu) 表示轨迹残差:

\begin{aligned} d(x,y;\pi,\mu) ={}&\eta[R(x,y)-V^\mu(x)]\\ &-\sum_t\left[ \log\frac{\pi(y_t\mid h_t)}{\mu(y_t\mid h_t)} +D_{\mathrm{KL}}(\mu(\cdot\mid h_t)\Vert\pi(\cdot\mid h_t)) \right]. \end{aligned}

为每个 prompt x 指定正的 loss 权重常数 c(x)。定义

L_{\mathrm{exact}}(\pi) =\mathbb E_{x\sim\mathcal D,y\sim\mathbb P_\mu} \left[c(x)\frac{d(x,y;\pi,\mu)^2}{2\eta}\right].

PMD 的解会使残差逐轨迹为零,因此我们希望让上式最小。

最小化 L_{\mathrm{exact}},为什么不会出现「不同 token 残差互相抵消」的另一个解?为什么一定是 PMD 解?BPO 原论文 证明了 PMD 解与 L_{\mathrm{exact}} 解的充要性。这里我就不展开了。

2.5 与 SC 梯度相同

对于单条回答,固定 \mu、reward、value 和 c(x),对 \pi=\pi_\theta 的平方残差:

L_i=c(x)d_i^2/(2\eta)

求导:

\nabla_\theta L_i =-c(x)\frac{d_i}{\eta} \sum_t\nabla_\theta\left[ \log\pi_\theta(y_t\mid h_t) +D_{\mathrm{KL}}(\mu\Vert\pi_\theta\mid h_t) \right].

又因为

\begin{aligned} \nabla_\theta D_{\mathrm{KL}}(\mu\Vert\pi_\theta\mid h) &=-\sum_a\mu(a\mid h)\nabla_\theta\log\pi_\theta(a\mid h)\\ &=-m_\mu(h). \end{aligned}

所以上式的中括号内:

\nabla_\theta\left[ \log\pi_\theta(y_t\mid h_t) +D_{\mathrm{KL}}(\mu\Vert\pi_\theta\mid h_t) \right] =s_\theta(y_t\mid h_t)-m_\mu(h_t).

这里就是 SC 的中心化 score:

\widetilde s_\theta(y_t\mid h_t) =s_\theta(y_t\mid h_t)-m_\mu(h_t).

BPO 接着在残差变量 d_i 上对平方目标做线性化,围绕 \pi=\mu 时的残差,将梯度中的 d_i/\eta 换成 R_i-V^\mu(x)。

具体来说,把平方 loss 当作残差 d_i 的函数,在一个固定参考残差处做一阶泰勒展开。当 \pi=\mu 时,每个 token:

\log\frac{\pi}{\mu}=0, \qquad D_{\mathrm{KL}}(\mu\Vert\pi)=0.

所以残差中只剩奖励差:

d_i^{(0)}=\eta[R_i-V^\mu(x)].

对平方函数做一阶展开,原 loss 是

L_i(\theta)=\frac{c(x)}{2\eta}d_i(\theta)^2.

利用

d^2=(d_0)^2+2d_0(d-d_0)+(d-d_0)^2,

舍去最后的二次项,就得到线性化 loss:

\widetilde L_i(\theta)= \frac{c(x)}{2\eta} \left[ (d_i^{(0)})^2 +2d_i^{(0)}(d_i(\theta)-d_i^{(0)}) \right].

参考残差 d_i^{(0)} 固定,因此求导:

\nabla_\theta\widetilde L_i =\frac{c(x)d_i^{(0)}}{\eta}\nabla_\theta d_i(\theta).

代入 d_i^{(0)}/\eta=R_i-V^\mu(x),再代入我们刚推导的残差梯度:

\nabla_\theta\widetilde L_i= -c(x)[R_i-V^\mu(x)] \sum_t\left[ s_\theta(y_t^i\mid h_t^i)-m_\mu(h_t^i) \right].

定义:

A_i:=c(x)[R_i-V^\mu(x)],

BPO 选择 c(x)=1/\sigma_\mu(x),其中 \sigma_\mu(x) 是该 prompt 下 rollout 奖励的标准差。再用 grouped rollouts 估计 prompt value 和奖励标准差,得到响应级权重:

\widehat A_i= \frac{R_i-\operatorname{mean}_jR_j}{\operatorname{std}_jR_j}.

(注意零标准差需工程处理)

到这个阶段,近似 token loss 梯度为

\nabla_\theta\ell_{i,t} \approx-\widehat A_i[s_\theta(y_t\mid h_t)-m_\mu(h_t)].

因此,使用同一个 \mu、同一个固定 \widehat A_i,并精确计算完整词表 KL 时,它与完整 SC 的 token 梯度相同。

2.6 BPO 实际使用的 loss

BPO 也不用全词表。BPO 使用二元 KL。对已采样 token a,记 p_a=\pi_\theta(a\mid h)、q_a=\mu(a\mid h)。把词表分成「a」和「非 a」,定义二元 KL:

K_{\mathrm{bin}}(q_a\Vert p_a) =q_a\log\frac{q_a}{p_a} +(1-q_a)\log\frac{1-q_a}{1-p_a}.

用它替换梯度中的 KL:

\begin{aligned} \nabla_\theta\ell_{i,t} &\approx-\widehat A_i\nabla_\theta \left[\log p_a+D_{\mathrm{KL}}(q\Vert p_\theta)\right]\\ &\approx-\widehat A_i\nabla_\theta \left[\log p_a+K_{\mathrm{bin}}(q_a\Vert p_a)\right]. \end{aligned}

关注中括号内,固定 q_a,先对标量 p_a 求导:

\begin{aligned} \frac{d}{dp_a}[\log p_a+K_{\mathrm{bin}}] &=\frac1{p_a}-\frac{q_a}{p_a}+\frac{1-q_a}{1-p_a}\\ &=\frac{1-q_a}{p_a(1-p_a)}. \end{aligned}

再用链式法则:

\begin{aligned} \nabla_\theta[\log p_a+K_{\mathrm{bin}}] &=\frac{1-q_a}{p_a(1-p_a)}\,\nabla_\theta p_a\\ &=\frac{1-q_a}{p_a(1-p_a)}\,p_a\nabla_\theta\log p_a\\ &=\frac{1-q_a}{1-p_a}\,\nabla_\theta\log p_a. \end{aligned}

令 \epsilon>0 为加性平滑量、C>0 为权重上限,定义

\omega_a=\frac{1+\epsilon-q_a}{1+\epsilon-p_a}.

再令 \epsilon_{\mathrm{low}},\epsilon_{\mathrm{high}} 为 clipping 边界,mask 为

M_a=\begin{cases} 0,&\widehat A>0\ \text{且}\ \omega_a>1+\epsilon_{\mathrm{high}},\\ 0,&\widehat A<0\ \text{且}\ \omega_a<1-\epsilon_{\mathrm{low}},\\ 1,&\text{其他情况}. \end{cases}

BPO 实用 loss 是

\ell_{\mathrm{BPO}} =-\operatorname{sg}(\widehat A M_a\min(\omega_a,C))\log p_a.

3. 第三解释:从理想 baseline 得到 SC

我们还可以从 sampler 的精确 value V^q(h) 得到 SC。在 SC 原论文的第四节就提出了这种解释。这也是一个非常直观的入手点。

baseline

3.1 从精确 sampler value 出发

固定前缀 h,定义:

V^q(h)=\sum_aq(a\mid h)Q^q(h,a), \qquad A^q(h,a)=Q^q(h,a)-V^q(h).

注意上标是 q 是 sampler。在 actor 求导中 Q^q,V^q 固定。

从使用 advantage 的更新开始,省略 h:

\begin{aligned} \mathbb E_q[A^q s] &=\mathbb E_q[(Q^q-V^q)s]\\ &=\mathbb E_q[Q^q s]-V^q\mathbb E_q[s]\\ &=\mathbb E_q[Q^q s]-\mathbb E_q[Q^q]\mathbb E_q[s]\\ &=\mathbb E_q[Q^q(s-m_q)]. \end{aligned}

其中 m_q=\mathbb E_q[s]。因此:

\mathbb E_q[A^q s] =\mathbb E_q[Q^q\widetilde s] =\operatorname{Cov}_q(Q^q,s).

由此可见,对价值减掉精确 sampler baseline 在期望更新上等价对 score 减掉 sampler 均值。

前者需要一个精确的 value V^q(h),要想估计,或者需要大量采样,或者需要 critic。后者直接求词表期望。

4. 第四解释:SC 是 STE

dung defender 的知乎文章 最早提出了 score centering 的 STE 解释,原文非常精彩!推荐你去阅读一下 😄

4.1 STE 用 q 前向

构造

\widetilde z_\theta =z_\theta+\operatorname{sg}(z_q-z_\theta).

固定 q 时,前向永远得到 z_q,所以 \operatorname{softmax}(\widetilde z_\theta)=q。

但是,

\frac{\partial\widetilde z_\theta}{\partial\theta}=J_\theta.

其中 J_\theta=\partial z_\theta/\partial\theta 是训练器 logits 对参数的 Jacobian。

因为

\nabla_{\widetilde z}\log\operatorname{softmax}(\widetilde z)_a =e_a-\operatorname{softmax}(\widetilde z).

所以

\nabla_\theta \log\operatorname{softmax}(\widetilde z_\theta)_a =J_\theta^\top(e_a-q).

而

\begin{aligned} \widetilde s_\theta(a) &=J_\theta^\top(e_a-p)-J_\theta^\top(q-p)\\ &=J_\theta^\top(e_a-q). \end{aligned}

所以,这个 STE 构造按自动微分规则得到的梯度,恰好等于 SC 的中心化 score:

\nabla_\theta \log\operatorname{softmax}(\widetilde z_\theta)_a =\widetilde s_\theta(a).

4.2 不过这两个梯度相同的 surrogate 数值不同

固定权重 B,定义

L_{\mathrm{SC}}=-B\left[\log p_\theta(a)-\sum_v\operatorname{sg}(q_v)\log p_\theta(v)\right],
L_{\mathrm{STE}}=-B\log\operatorname{softmax}(\widetilde z_\theta)_a.

前者普通求导、后者按 STE 自动微分,梯度更新都为

B J_\theta^\top(e_a-q).

但前者 loss 数值不等于 -B\log q(a),后者前向值就是它。

4.3 知乎原文:固定旧差值的 surrogate

前面用的是当前差值构造。知乎原文用的是固定旧差值,令 \theta_0 为固定旧参数,定义

\Delta z=z_q-z_{\theta_0}, \qquad \widehat z_\theta=z_\theta+\operatorname{sg}(\Delta z), \qquad \widehat p_\theta=\operatorname{softmax}(\widehat z_\theta).

这里 \Delta z 固定。

因此

\widehat z_\theta=z_q+(z_\theta-z_{\theta_0}).

起点处 \widehat p_{\theta_0}=q;离开起点后,\widehat p_\theta 变化。

固定偏移以后,普通求导即可得到

\nabla_\theta\log\widehat p_\theta(a) =J_\theta^\top(e_a-\widehat p_\theta).

在起点处,它是 J_{\theta_0}^\top(e_a-q),也就是 SC。

(这里取更新起点处的局部进行观察,实际上与下面第五种解释完全一样!因为固定了局部,差值为常数,所以上面本来就不用显式地写 \text{sg}。)

4.4 固定偏移目标离开起点后不同于 SC

在单步固定奖励 r(a) 下,代理期望奖励可以写成

\widehat J(\theta)=\mathbb E_{a\sim q} \left[\frac{\widehat p_\theta(a)}{q(a)}r(a)\right] =\sum_a\widehat p_\theta(a)r(a).

因此

\nabla_\theta\widehat J =\mathbb E_q\left[ \frac{\widehat p_\theta(a)}{q(a)}r(a) J_\theta^\top(e_a-\widehat p_\theta) \right].

在起点,ratio 为 1,\widehat p=q,得到 SC;离开起点,ratio 和 score 中的分布都改变。而纯 SC 用固定 q 时是:

\mathbb E_q[r(a)J_\theta^\top(e_a-q)].

所以,上文所说相同,范围是离更新起点相近的局部。

5. 第五解释:局部分布族

局部分布族解释源于 𝕏 上几位科学家的交流讨论:

X

5.1 先看线性 softmax

令 \phi(a) 是与参数 \theta 同维度、不随 \theta 变化的动作特征向量。定义

p_\theta(a)=\frac{e^{\theta^\top\phi(a)}}{\sum_b e^{\theta^\top\phi(b)}}.

这就是线性的 softmax。

对它求对数概率梯度,得到普通的 score 是:

\begin{aligned} s_\theta(a) &=\nabla_\theta\left[\theta^\top\phi(a)-\log\sum_b e^{\theta^\top\phi(b)}\right]\\ &=\phi(a)-\sum_b p_\theta(b)\phi(b)\\ &=\phi(a)-\mathbb E_p[\phi]. \end{aligned}

如果把 score 再按 q 求平均:

m_q=\mathbb E_q[\phi]-\mathbb E_p[\phi].

因此,SC:

\begin{aligned} \widetilde s(a) &=s(a)-m_q\\ &=\left(\phi(a)-\mathbb E_p[\phi]\right) -\left(\mathbb E_q[\phi]-\mathbb E_p[\phi]\right)\\ &=\phi(a)-\mathbb E_p[\phi] -\mathbb E_q[\phi]+\mathbb E_p[\phi]\\ &=\phi(a)-\mathbb E_q[\phi]. \end{aligned}

这说明:SC 将 softmax 梯度中的平均特征权重从 p 换成了 q。

对于一个线性 softmax,进行 SC 的变化后,所选动作的特征 \phi(a) 保留,被减去的平均特征从 p 下的平均值换成 q 下的平均值。那么,能不能构造一个从 q 出发的分布族,使它的真实 score 就是这个中心化结果?

5.2 定义:分布族、基点、trainer-tangent

令 \theta_0 为当前固定参数、\delta 为参数增量,也就是说新参数是 θ = \theta_0 + \delta。每个 \delta 对应一个概率分布,整组分布记作 \{\nu_\delta\},这就是分布族。「基点」是 \delta=0 对应的起始分布。

先定义:未归一化权重是「把训练器的相对概率变化施加到 q(a) 后得到的数值」:

w_\delta(a)=q(a)\frac{p_{\theta_0+\delta}(a)}{p_{\theta_0}(a)}.

再定义归一化后是 \nu:

Z(\delta)=\sum_bw_\delta(b), \qquad \nu_\delta(a)=\frac{w_\delta(a)}{Z(\delta)}.

既然归一化了,那么就可以说,\nu 是我们新构造的一个概率分布。具体来说,\nu_\delta(a) 表示:参数改变量为 \delta 时,新分布赋给动作 a 的概率。

\nu 从 sampler 分布出发,施加 trainer 的相对概率变化。\delta=0 时,w_0=q、Z(0)=1、\nu_0=q。

你可能疑惑 \nu 是什么,目前来看,是在人为定义一个分布。但构造有明确目的的,我们求导看看。

5.3 求导时注意

在刚刚这个构造中,起点参数 \theta_0 和采样分布 q 固定,
参数增量 \delta 是变量,更新后的参数为 \theta_0+\delta。

因此,在对 \delta 求导时:

  • 旧概率 p_{\theta_0}(a) 固定。
  • 更新后的概率 p_{\theta_0+\delta}(a) 随 \delta 变化。
  • 归一化因子 Z(\delta) 也随 \delta 变化,需要求导。

这里对 \delta 求导,本质上就是对更新后的参数求导:
令 \theta=\theta_0+\delta,即

\left.\nabla_\delta\log p_{\theta_0+\delta}(a)\right|_{\delta=0} = \left.\nabla_\theta\log p_\theta(a)\right|_{\theta=\theta_0} =s_{\theta_0}(a).

接下来,对整个 \log\nu_\delta(a) 求导时,注意以上。

5.4 求导,然后发现平均 score 来自于归一化

对 \nu 取对数:

\log\nu_\delta(a) =\log q(a)+\log p_{\theta_0+\delta}(a) -\log p_{\theta_0}(a)-\log Z(\delta).

前三项,仅中间的更新后概率依赖 \delta。因此

\left.\nabla_\delta\log\nu_\delta(a)\right|_0 =s_{\theta_0}(a)-\left.\nabla_\delta\log Z(\delta)\right|_0.

展开最后那个归一化项:

\begin{aligned} \left.\nabla_\delta\log Z(\delta)\right|_0 &=\frac1{Z(0)}\left.\nabla_\delta Z(\delta)\right|_0\\ &=\sum_bq(b)\frac{\nabla_\theta p_\theta(b)|_{\theta_0}}{p_{\theta_0}(b)}\\ &=\sum_bq(b)s_{\theta_0}(b)\\ &=m_q(\theta_0). \end{aligned}

因此

\left.\nabla_\delta\log\nu_\delta(a)\right|_0 =s_{\theta_0}(a)-m_q(\theta_0)=\widetilde s_{\theta_0}(a).

归一化的普通导数自然产生了 SC。

5.5 分布族的局部奖励目标

在单步固定动作奖励 r(a) 下,定义

J_\nu(\delta)=\sum_a\nu_\delta(a)r(a).

对它求导,并使用 \nabla\nu=\nu\nabla\log\nu:

\begin{aligned} \left.\nabla_\delta J_\nu\right|_0 &=\sum_a r(a)\left.\nabla_\delta\nu_\delta(a)\right|_0\\ &=\sum_aq(a)r(a)\widetilde s_{\theta_0}(a)\\ &=G_{\mathrm{SC}}(\theta_0). \end{aligned}

可见:SC 的期望更新,恰好是这个分布族的期望奖励目标在起点 \delta=0 处的梯度。

因此,SC 可以理解为:以采样分布 q 为起点,沿着训练器提供的概率变化路径,局部提高期望奖励,优化采样器策略。

5.6 分布族改写成 logits 形式后,与 STE 一致

定义三个 softmax 分母:

C_q=\sum_b e^{z_q(b)},\quad C_0=\sum_b e^{z_{\theta_0}(b)},\quad C_\delta=\sum_b e^{z_{\theta_0+\delta}(b)}.

把它们代入我们刚刚构造分布时未归一化的分子:

\begin{aligned} w_\delta(a) &=q(a)\frac{p_{\theta_0+\delta}(a)}{p_{\theta_0}(a)}\\ &=\frac{e^{z_q(a)}}{C_q} \frac{e^{z_{\theta_0+\delta}(a)}/C_\delta}{e^{z_{\theta_0}(a)}/C_0}\\ &=\frac{C_0}{C_qC_\delta} e^{z_{\theta_0+\delta}(a)+z_q(a)-z_{\theta_0}(a)}. \end{aligned}

由于公共因子 C_0/(C_qC_\delta) 可以随 \delta 变化,但不随 token a 变化,所以除以 \sum_b w_\delta(b) 时会消掉。我这句话具体是说,如果把这个公共因子记为

K(\delta)=\frac{C_0}{C_qC_\delta},

再记

u_\delta(a)=z_{\theta_0+\delta}(a)+z_q(a)-z_{\theta_0}(a).

于是前面得到的未归一化权重是

w_\delta(a)=K(\delta)e^{u_\delta(a)}.

对所有 token 求和时,K(\delta) 都相同,所以

\sum_b w_\delta(b) =K(\delta)\sum_b e^{u_\delta(b)}.

因此

\begin{aligned} \nu_\delta(a) &=\frac{w_\delta(a)}{\sum_b w_\delta(b)}\\ &=\frac{K(\delta)e^{u_\delta(a)}} {K(\delta)\sum_b e^{u_\delta(b)}}\\ &=\frac{e^{u_\delta(a)}}{\sum_b e^{u_\delta(b)}}. \end{aligned}

即

\nu_\delta(a)= \frac{e^{z_{\theta_0+\delta}(a)+z_q(a)-z_{\theta_0}(a)}} {\sum_b e^{z_{\theta_0+\delta}(b)+z_q(b)-z_{\theta_0}(b)}}.

也就是

\nu_\delta=\operatorname{softmax}(z_{\theta_0+\delta}+z_q-z_{\theta_0}).

令 \theta=\theta_0+\delta,它与知乎 STE 文章的固定旧 logits 差值构造是同一个函数!

因此,第四种解释和第五种解释,本质是同一个,不过「STE」与「构造分布」的思考出发点不同(比如分布族更关注对应什么局部优化目标),而且都特别精彩,因此我分开记录了。

两个构造本身就是同一个分布族的两种写法。

(这里也有个有趣的点,更一般地,可以将基点换为合适的固定分布 \mu,定义 \nu_\delta\propto\mu p_{\theta_0+\delta}/p_{\theta_0},起点 score 就是 s-\mathbb E_\mu[s]。)

5.7 对比:假设 sampler 可微

我们直接假设 sampler 对参数可微。工程上肯定不能在 sampler 里反向传播,只是假设。

若实际 sampler 的 logits 为 z^{\mathrm{samp}}_\theta,真实参数 Jacobian 应为 J^{\mathrm{samp}}_\theta=\partial z^{\mathrm{samp}}_\theta/\partial\theta。在可微条件下,它的 score 是

(J^{\mathrm{samp}}_\theta)^\top(e_a-q_\theta).

SC 则使用训练器的 J_\theta^\top(e_a-q)。

因此真实导数属于构造出的分布族。

5.8 上文是单 token 级。简单推一下整条序列级

对每个可能前缀 h 都构造同一个参数增量下的条件分布 \nu_\delta(a\mid h)。定义其完整回答分布

\mathbb P_{\nu_\delta}(y\mid x)=\prod_t\nu_\delta(y_t\mid h_t).

在有界长度、可微和共同支持集条件下,起点处完整分布等于 \mathbb P_q,并且

\left.\nabla_\delta\log\mathbb P_{\nu_\delta}(y\mid x)\right|_0 =\sum_t\widetilde s_{\theta_0}(y_t\mid h_t).

因此对于固定终局奖励函数 R(x,y),

\left.\nabla_\delta \mathbb E_{x\sim\mathcal D,y\sim\mathbb P_{\nu_\delta}}[R(x,y)]\right|_0 =\mathbb E_{x\sim\mathcal D,y\sim\mathbb P_q} \left[R(x,y)\sum_t\widetilde s_{\theta_0}(y_t\mid h_t)\right].

综上所述

以上就是「五等分的 Score Centering」,汇总了目前五种解释 SC 的视角 😉

Reference

论文与实现

各解释出处

目录
正在直播 B 站