@zyh2022:我认为这个系列文章是目前在博客或论文中能找到的、关于 LLM 异步 RL 分数中心化最直观、最直接的讲解……

X AI KOLs Timeline 论文

摘要

推荐 HuggingFace 博客文章系列《Score Function Centering》,从直觉出发系统讲解 LLM 异步强化学习中的 trainer-generator 失配问题以及分数函数中心化(SFC)如何修复策略梯度中零期望性质,只需了解 GRPO 即可阅读。

我认为这个系列文章是目前你在博客或论文中能找到的、关于 LLM 异步强化学习中分数中心化最直观、最直接的讲解。你只需要知道 GRPO 是什么就可以开始阅读。 https://huggingface.co/blog/NormalUhr/sfc… https://huggingface.co/blog/NormalUhr/sfc-kl…
查看原文
查看缓存全文

缓存时间: 2026/10/17 12:56

我相信这个系列文章是对 LLM 异步强化学习中分数函数中心化(score function centering)最直观、最直接的解释——无论是在博客还是论文中,你都很难找到更好的。你只需要知道 GRPO 是什么就可以开始阅读。

https://huggingface.co/blog/NormalUhr/sfc… https://huggingface.co/blog/NormalUhr/sfc-kl…


理解分数函数中心化最直观的方式:从分数函数的角度理解异步 RL 中的训练器-生成器不匹配

Source: https://huggingface.co/blog/NormalUhr/sfc

你可以在我的个人博客网站(https://normaluhr.github.io/en/)找到我最新的文章(如果你是中文母语者,还有中文版本),那里有更好的渲染效果和交互体验,你也可以在那里留言!让我惊讶的是,在 HuggingFace 上发布社区文章居然需要购买 Pro 订阅。我大概总有一天会退订,你知道在哪里能找到我 ⬆️

我发现网上关于分数函数中心化的解释大多比较绕弯子,不够直接。我希望这篇文章能从直觉出发,给你最直接的分数函数中心化解释。这篇文章完全由我手写,不是 AI 生成的。当然,如果你读的是英文版,抱歉,那个是 AI 翻译的。

本文假设你已经知道如何使用 PPO 或 GRPO(知道损失函数长什么样),以及一些简单的概率论知识(真的就够了)。如果你还没有读过,请花十分钟读这篇文章(https://normaluhr.github.io/en/p/grpo/)。

如果以下任何一条描述符合你,这篇文章应该很适合你:

  • 你只知道怎么用 GRPO,但不知道其背后的原理
  • 你想加深对训练器-生成器不匹配(trainer-generator mismatch)的理解
  • 你从事长序列 rollout 训练的异步 RL 工作,仍然不确定如何提高算法的稳定性
  • 你完全不知道什么是分数函数中心化(你甚至可能不知道这里的“分数“是什么),但你想弄清楚

Score Function Centering 并不是一个既有的术语。我知道每个前沿实验室都有自己的叫法——alternative token、covariance optimization 等等。你随便怎么叫都行。本文也会解释这些名字的由来。

TL;DR:

  • 读完第 1 节,你将知道分数函数是计算策略梯度的重要桥梁,也是自动微分能给出的最直接的东西。
  • 读完第 2 节,你将知道分数函数的一个重要性质:它已经是中心化的,所以它的期望是 0。我们需要这个期望保持为 0,才能在策略梯度中用所谓的优势(advantage)来替代奖励。你还将看到训练器-生成器不匹配如何破坏这个性质,以及破坏它的实际代价:均值优势会产生额外的梯度,将当前训练器拉向旧的生成器——这就是为什么我们需要修复它。
  • 读完第 3 节,你将知道分数函数中心化真正在做什么、为什么它能修复零期望性质、我们在实践中应该如何使用它,以及在这个领域批量产出论文的一个方向。

1. 从分数函数开始:什么是分数?我们为什么要用它?

1.1 在 GRPO/PPO 中,我们实际在计算什么梯度?

以下是策略梯度的快速推导。如果你对这部分已经很熟悉,可以跳过本小节。

假设在某个状态、即某个 LLM 前缀 x 下,策略为:

p_θ(a|x)

为了简化,我们先去掉 x,写成:

p_θ(a)

我们的目标非常自然:“让高奖励的动作更容易被模型采样到。”

因此我们可以写出最简单的目标函数:

J(θ) = E_{a∼p_θ}[R(a)]

这表示:“从当前模型 p_θ 中采样一个动作,计算奖励,并期望其期望值持续上升。”

问题在于:我们如何计算 ∇θ E{a∼p_θ}[R(a)]?

这里有一个困难:θ 并不直接出现在 R(a) 中。它隐藏在采样分布 a∼p_θ 中。换句话说,我们不是在计算 ∇_θ R(a)。实际上,强化学习中的奖励完全可以是不可微的。比如:数学题答对得 1 分,否则得 0 分;或者由人类专家直接打分。这些都无所谓。真正依赖 θ 的是 p_θ(a)。

把期望展开写:

J(θ) = ∑_a p_θ(a) R(a)

求导:

∇_θ J(θ) = ∑_a R(a) ∇_θ p_θ(a)

然后我们使用一个非常简单但极其重要的恒等式:

∇_θ p_θ(a) = p_θ(a) ∇_θ log p_θ(a)

因为:

∇ log p = (1/p) ∇p

所以:

∇_θ J(θ) = ∑_a p_θ(a) R(a) ∇_θ log p_θ(a)

写回期望形式:

∇θ J(θ) = E{a∼p_θ}[R(a) ∇_θ log p_θ(a)]

终于,出现了策略梯度中最关键的对象:

s_θ(a) = ∇_θ log p_θ(a)

这个东西叫做分数函数(score function)。

注意这里的 score 不是奖励分数,不是“这个答案得了多少分“。它是概率统计中的一个专业术语:

score = ∇_θ log p_θ(a)

即某个采样动作的对数概率对模型参数的梯度。

1.2 我们为什么要研究分数函数?

因为策略梯度的核心结构真的就是:

奖励 × 分数(我知道你想说我们实际用的是 Advantage × score,但先把这个放在一边。)

用我们训练 LLM 时更习惯的写法:

g = R(a) ∇_θ log p_θ(a)

所以你可以这样理解这两部分:

R(a) 告诉我们**“这个动作应该被强化还是削弱,幅度多大?”**

而 ∇_θ log p_θ(a) 告诉我们**“如果我想提高或降低这个动作的概率,参数应该往哪个方向移动?”**

这也是为什么我认为理解策略梯度最重要的一句话是:

分数函数是一座桥梁,它把“对分布上期望的梯度“——你根本没法计算的东西——变成了“一个可以通过采样来计算的梯度估计“。

更精确地说:

分布层面的求导 → 样本层面的梯度估计

我们最初想计算的是:

∇θ E{a∼p_θ}[R(a)]

看起来需要对整个动作分布求导。但分数函数技巧把它变成了这样:先采样一个动作 a∼p_θ,然后计算:

R(a) ∇_θ log p_θ(a)

再多采样几次并取平均:

∇θ J ≈ (1/N) ∑{i=1}^N R(a_i) ∇_θ log p_θ(a_i)

这就是 REINFORCE 和策略梯度的核心计算机制。虽然 GRPO 增加了组相对优势、重要性比率、裁剪等等,但其中实际产生策略梯度的基本对象仍然是:

∇_θ log p_θ(a)

同时你会注意到,当你真正使用 GRPO 时,这是一次反向传播能直接给你的最直接的东西。

2. 分数函数与训练器-生成器不匹配

2.1 分数函数有什么优美的性质?为什么它很重要?

现在我们来谈谈优势(advantage)。

我们都知道在 GRPO/PPO 中我们不直接使用奖励,而是使用优势(为什么?见 https://normaluhr.github.io/en/p/grpo/)。

优势就是奖励减去一个常数:

A(a) = R(a) − b

这里的 b 可以是一个价值函数、可以是组均值、可以是任何只依赖当前状态而不依赖具体动作的基线。

在 GRPO 中,我们最熟悉的做法是:对同一个 prompt 采样多个回复,然后用某种组相对奖励作为优势。不管具体的归一化方式如何,本质上都在做同一件事:从原始奖励中减去一个大家都共享的部分,只留下这个动作比平均水平好还是差。

但这里有一个非常基本、也非常容易被忽视的问题:

我们凭什么有权减去这个基线?

原始策略梯度是:

g = E_{a∼p_θ}[R(a) s_θ(a)]

如果我们把奖励换成优势 A(a) = R(a) − b,那么新的梯度是:

g’ = E_{a∼p_θ}[(R(a) − b) s_θ(a)]

展开:

E_{a∼p_θ}[R(a) s_θ(a)] − b E_{a∼p_θ}[s_θ(a)]

第一项就是我们原始的策略梯度。换句话说,如果我们希望减去基线后策略梯度的期望完全不变,第二项必须消失:

b E_{a∼p_θ}[s_θ(a)] = 0

而 b 显然不一定为 0,所以我们真正需要的是:

E_{a∼p_θ}[s_θ(a)] = 0

这就是分数函数在策略梯度中的一个重要性质。

你可以暂时忽略为什么这个性质成立,只需记住它在实践中的含义:

只要分数函数的期望为 0,我们就可以从奖励中减去任何不依赖动作的基线,而不改变期望的策略梯度。

这就是为什么我们能把奖励写成优势,也是为什么奖励中心化、价值基线和组相对基线在 PPO 和 GRPO 中都有效。

有些论文(https://arxiv.org/abs/2609.20807)从协方差的角度来解释,写成:

E_{a∼p_θ}[R(a) s_θ(a)] = Cov(R(a), s(a)) + E[R(a)] E[s(a)]

然后因为 E[s] = 0,只剩下协方差。

这样写当然也没错,但我个人觉得这把一个非常简单的事情说得很绕。我们真正在乎的其实就一句话:

我想从奖励中减去一个基线,并且不希望这个基线自己产生梯度。

这自然要求 E[s] = 0。就这么简单。

而且这个性质非常符合直觉。

假设两个动作的奖励分别是:

R(A) = 101, R(B) = 99

以及:

R’(A) = 2, R’(B) = 0

从策略优化的角度来看,这两组奖励携带完全相同的信息:在这两组中 A 都比 B 好 2 分。

我们显然不希望仅仅因为给每个奖励加了 99,模型的期望更新方向就发生改变。给所有奖励加减同一个常数永远不会改变期望的策略梯度。

这也是为什么基线在本质上是一个非常自然的操作,而不仅仅是一个数学技巧。

现在的问题是:为什么分数函数的期望恰好等于 0?

要回答这个问题,我们终于需要看看分数函数到底是什么。

2.2 分数函数到底是什么?

接下来我们对分数函数做一些微积分推导——任何上过微积分课的人都能做的那种。

我们之前定义了:

s_θ(a) = ∇_θ log p_θ(a)

假设当前模型在某个前缀下输出词表中所有 token 的 logits:

z_θ(1), z_θ(2), …, z_θ(V)

我们通常假设输出分布由 Softmax 给出:

p_θ(a) = e^{z_θ(a)} / ∑_v e^{z_θ(v)}

所以:

s_θ(a) = ∇_θ z_θ(a) − ∇_θ log ∑_v e^{z_θ(v)}

让我们给上面第一项起一个好听的名字,叫做 logit 雅可比(logit Jacobian):

J_θ(v) = ∇_θ z_θ(v)

你可以这样理解 J_θ(v):如果我稍微改变当前训练器的模型参数,token v 的原始 logit 会往哪个方向移动。

这里有一个具体例子。假设模型参数从 θ 变为 θ + Δθ,那么一阶近似下:

z_{θ+Δθ}(v) ≈ z_θ(v) + J_θ(v)^T Δθ

所以 J_θ(v) 本质上就是 token v 在参数空间中的“logit 敏感度方向“。它告诉我们参数需要往哪个方向移动,才能推高或拉低这个 token 的 logit。

接下来我们处理第二项:

∇_θ log ∑_v e^{z_θ(v)}

这需要用两次链式法则。先对外层的 log 求导,把 log 里的求和放到分母上:

∇_θ log ∑_v e^{z_θ(v)} = (1 / ∑_u e^{z_θ(u)}) ∇_θ ∑_v e^{z_θ(v)}

然后把梯度移到求和符号内部,对每个 e^{z_θ(v)} 再用一次链式法则:

∇_θ ∑_v e^{z_θ(v)} = ∑_v ∇_θ e^{z_θ(v)} = ∑_v e^{z_θ(v)} ∇_θ z_θ(v)

把两步合起来得到:

(∑_v e^{z_θ(v)} ∇_θ z_θ(v)) / (∑_u e^{z_θ(u)})

而恰好:

p_θ(v) = e^{z_θ(v)} / ∑_u e^{z_θ(u)}, J_θ(v) = ∇_θ z_θ(v)

所以第二项可以写成:

∑_v p_θ(v) J_θ(v)

即:

E_{v∼p_θ}[J_θ(v)]

因此:

s_θ(a) = J_θ(a) − E_{v∼p_θ}[J_θ(v)]

这个表达式特别重要,因为它告诉我们:在分数函数中,Softmax 已经在做中心化了……

相似文章

@vintcessun: 最难的题,反而最教不会模型?GRPO 的死区就在这里:一组 rollout 全错,组内优势归零,梯度也随之消失。 https://arxiv.org/abs/2607.27787 LSPO 给这些“悬崖题”临时装上 LoRA:用标准推导短…

X AI KOLs Timeline

该论文提出 LSPO(LoRA Scaffolded Policy Optimization),用于解决 GRPO 在零奖励“悬崖题”上梯度消失的问题:通过临时 LoRA 适配器进行短暂 SFT 并采样成功轨迹,经重要性采样校正后回灌 RL batch,最终只更新基础模型。实验表明在 DeepMath-103K 上优于 DAPO 基线,平均提升 3.8 点。

LISA: 面向视觉条件可控生成的似然分数对齐

Hugging Face Daily Papers

本文介绍了LISA,一种正则化方法,它将侧网络的中间特征与近似的似然分数对齐,以提高基于分数的生成模型中视觉条件可控生成的训练效率和质量。