s_i
序列级比率 · 几何平均
整条 response 共用一个比率,数值范围与序列长度解耦。
s_i = (π_θ(y_i|x)/π_θold(y_i|x))^{1/|y_i|}。它不是某个 token 的比率,而是整条序列的「平均倾斜程度」:几千个逐 token 涨落被平均成一个贴 1 小幅波动的数。裁剪、min、梯度全部以它为单位。
Hover 看完整定义
RL POST-TRAINING · GSPO · SEQUENCE-LEVEL IMPORTANCE SAMPLING
被裁掉的 token 多两个数量级,训练反而更高效
token 级重要性比率从 PPO 时代就是标配,用了八年。Qwen 团队在 GSPO 论文(arXiv:2507.18071)里认定:这是对重要性采样的根本误用——恒等式靠 N≫1 的平均成立,而每个 token 级比率都是一次单样本「校正」。它在小模型、短回答、近 on-policy 的年代被掩盖,在 MoE 长回答训练里变成不可逆崩溃的病灶。GSPO 的回答是把比率、裁剪、优化全部提到序列级。本报告拆解这条论证链,以及论文没点破的前提与代价。
本报告为博客正文的配套交互版 · 正文:/posts/gspo-sequence-level-importance-sampling/(线上 njx-njx.github.io) · 论文 arXiv:2507.18071
证据分级:论文一手 > 书/教材一手 > 二手/本地教材(已回对)> 推算/作者判断 [已标注] · 图内数字可点击下钻 · 点击画布切换 GRPO / GSPO 两种视角
§0 · 关键结论
RLVR 的奖励是给整条序列的(答对 1 分答错 0 分),而 GRPO 的校正和裁剪都发生在 token 级。GSPO 论文把症结提炼成一句话:优化目标的单位应当匹配奖励的单位。单位错配,校正越「认真」,伤害越精确。
GSPO 的改动看上去只是换了一个比率的定义:把逐 token 的重要性比率换成整条序列似然比的几何平均 s_i,裁剪与优化随之整体搬到序列级。但由此引出的数字全都反直觉:裁剪带收窄三个数量级(从 0.2/0.27 到 3e-4/4e-4);被裁掉的 token 比例反而高约两个数量级,训练效率和 benchmark 却更好;MoE 模型再也不用 Routing Replay 补丁。
这条报告按论证链展开:§1 先看病灶现场(一个补丁如何暴露问题、重要性采样为什么「失效」),§2 拆 GSPO 的序列级机制(几何平均与长度归一化),§3 从梯度视角看清两种方案的本质差别,§4 过三个实验事实,§5 追问裁剪范围 3e-4/4e-4 是怎么定的,§6 给出作者的三个保留意见,§7 把它和上一篇 DAPO 的 Clip-Higher 对上。
优化目标的单位应当匹配奖励的单位。
— GSPO 论文 · 症结提炼
语境RLVR 的奖励给整条序列,GRPO 的校正和裁剪却都在 token 级。 为何重要这句话是整个改动的合法性来源:序列级裁剪把整条 response 从梯度估计中剔除——样本要么整个用,要么整个不用,粒度与奖励对齐了。
§1 · 病灶现场
2025 年中之前,用 GRPO 训 MoE 模型需要一个专门的补丁。补丁能跑,但代价实打实;更麻烦的是,即便有补丁,崩溃照样发生。
Qwen 团队在论文里交代了他们此前的办法——Routing Replay:采样时把旧策略激活的专家路由缓存下来,计算重要性比率时在新策略上「重放」这套路由,让比率的分子分母跑同一张激活网络。之所以需要它,是因为他们观察到一个数字:48 层的 Qwen3-30B-A3B,每做一次梯度更新,同一条 rollout 样本在新策略下激活的专家约有 10% 与旧策略不同。路由一变,逐 token 概率跟着变,token 级比率剧烈波动,GRPO 直接不收敛。
补丁的代价:额外的显存和通信开销,而且强制新策略走旧路由等于限制模型的实际容量。更麻烦的是另一件事——即便有补丁,大模型长回答任务上的 GRPO 仍会发生不可逆的模型崩溃。论文的措辞很重:崩溃一旦发生,回退 checkpoint、细调裁剪范围、延长生成长度、换 RL query,全都救不回来。
先把重要性采样(IS)本身写出来。要用行为分布 πbeh 的样本,估计目标分布 πtar 下函数 f 的期望:
Ez~πtar[f(z)] = Ez~πbeh [ w(z)·f(z) ], w(z) = πtar(z) / πbeh(z)
这个恒等式成立不靠比率本身,靠的是大量样本的平均:N≫1 时,随机比率 w 的涨落被平均掉,估计才收敛到真值。单个样本乘上 w,起不到任何校正作用,只是给 f(z) 乘了一个高方差的随机数。下面这个蒙特卡洛实验把这句话变成可见的:抽 1 个样本时估计值乱跳,平均足够多才收敛。
现在看 GRPO 在做什么。它对每个 token 算比率 wi,t(θ) = πθ(yi,t|x,yi,<t) / πθold(yi,t|x,yi,<t)。其中第 t 步的 next-token 分布里只采了一个样本 yi,t。也就是说,每个比率都是拿单个样本对单步分布做「校正」——按上面的判据,这根本不构成 IS 校正,它只是往梯度里注入了一个逐 token 的随机权重。序列越长,累积的随机权重越多;模型越大越稀疏(MoE),单个权重的方差越大。clipping 再把超出范围的 token 梯度清零,噪声就被放大成「随机抹掉一部分 token 的学习信号」。
诚实补一句:这是批评角度,不是公理。GRPO 这么写并非没有理论来源——把每个 token 看作一步 action、整条轨迹的 IS 比率分解为逐步比率,是标准 RL 的推导路径。问题出在实现层面把逐 token 比率当作独立的校正权重逐个使用、逐个裁剪:这一步近似在大词表、长轨迹、单样本的条件下不再无害。这是 GSPO 论文的批评角度,读者可以保留自己的判断。
§2 · 序列级机制
和 GRPO 的差别一眼可见:min-clip 外面没有了逐 token 求和,一条 response 整体只占目标函数里的一项。
JGSPO(θ) = E [ (1/G)·Σi min( s_i(θ)·Â_i , clip( s_i(θ), 1−ε, 1+ε )·Â_i ) ]
advantage 还是组内归一化的 Â_i(用组内奖励的均值和标准差标准化),整条 response 共享。核心是序列级比率 s_i 的定义——下面这个公式每个部件都可以点击拆解:
FORMULA DISSECTION · 点击上方部件
整条序列似然比的几何平均
等价于逐 token 对数比率的算术平均再取 exp。点任意部件看它在论证链里的角色。
序列级比率 · 几何平均
整条 response 共用一个比率,数值范围与序列长度解耦。
s_i = (π_θ(y_i|x)/π_θold(y_i|x))^{1/|y_i|}。它不是某个 token 的比率,而是整条序列的「平均倾斜程度」:几千个逐 token 涨落被平均成一个贴 1 小幅波动的数。裁剪、min、梯度全部以它为单位。
Hover 看完整定义
长度归一化 · 不能省
几千个比率连乘会被少数 token 引爆;归一化后一个 ε 通吃。
不归一化,几千个比率连乘,少数几个 token 的似然变化就能让总比率剧烈波动,且不同长度的 response 需要不同裁剪范围,ε 根本没法设。归一化之后 s_i 与序列长度解耦。本地教材 hands-on-modern-rl 第 16.4 节的 GSPO 公式漏了这一项——漏掉它,整条论证链就断了。
Hover 看完整定义
裁剪带 · 3e-4 / 4e-4
比 token 级窄三个数量级,且左右不对称。
GRPO 用 0.2/0.27(精心调过的 token 级边界),GSPO 用 3e-4/4e-4。几何平均把涨落压小,s_i 天然贴 1,裁剪带必须窄才有意义。换算:3e-4 对应平均每 token 约 0.03% 的对数漂移。右界比左界宽 33%——这个不对称是 §7 的主角;ε 本身的选取逻辑是 §5 的主角(K19)。
Hover 看完整定义
裁剪的含义也随之改变。GRPO 的裁剪是把单个 token 的梯度清零——信号被切碎,但样本还在;GSPO 的裁剪是把整条 response 从梯度估计中剔除——样本要么整个用,要么整个不用。这和「奖励给整条序列」在粒度上对齐了。下面这张图演示几何平均的方差压缩:逐 token 对数比率大幅波动,平均成一个 s_i 后,分布收成一根针。拖动序列长度看针怎么变窄。
§3 · 梯度视角
把两个目标的梯度展开(论文公式 8–12),根本差别落在一个地方:逐 token 的 ∇log π 前面乘的是什么。
GRPO 的梯度里,token t 的 ∇log π 乘的是它自己的比率 wi,t。经过 min-clip 后,这些逐 token 权重分布在 (0, 1+ε](Â_i>0 时)或 [1−ε, +∞)(Â_i<0 时)——同一条 response 内部,不同 token 拿到的梯度权重可以差出量级,且随训练步数累积,后果难以预测。
GSPO 的梯度里,同一条 response 的所有 token 共享同一个标量权重 s_i:
∇JGSPO = E [ (1/G)·Σi s_i(θ)·Â_i · (1/|y_i|)·Σt ∇log π_θ(y_{i,t}|·) ]
每个 token 对更新的贡献只相差它们自身 ∇log π 的大小,不再有逐 token 的随机权重调制。论文把这称为消除 GRPO 的不稳定因素。下面这条 40-token 的 response 把两种权重画在一起:左边 GRPO 逐 token 不等权(还随机抹掉几个),右边 GSPO 全序列等权。
§4 · 三个实验事实
实验设置本身就值得注意:冷启动模型,每个 rollout batch 切成 4 个 mini-batch 做梯度更新——标准的 off-policy 场景,正是「clip 真正开始工作」的场景。
设置细节:Qwen3-30B-A3B-Base 经 SFT 冷启动;每个 rollout batch 切 4 个 mini-batch,策略在批内多次更新,比率才会偏离 1。GRPO 基线的裁剪范围 0.2/0.27 是精心调过的,GSPO 用 3e-4/4e-4。
少而干净,胜过多而脏。
— 博客正文 · §证据(对论文解读的概括)
语境GRPO 的 token 级梯度估计噪声大,被随机保留下来的那部分并不比被裁掉的部分更有用。 为何重要这把「clip fraction 高」从警报重新解释成筛选在起作用的证据——序列级裁剪剔除的是整个「坏样本」,不是随机 token。
工程上训练引擎(Megatron)和推理引擎(SGLang、vLLM)存在精度差异,GRPO 必须用训练引擎把旧策略的似然重算一遍才敢用;序列级似然对精度差异的容忍度高得多,GSPO 可以直接用推理引擎返回的似然做优化,省掉重算。对 partial rollout、多轮 RL、训推分离架构,这是实打实的吞吐红利。
§5 · 附:裁剪范围 3e-4/4e-4 是怎么定的
论文层面:没说。GSPO 论文只给了结果(左界 3e-4、右界 4e-4),没有选取过程,没有针对裁剪范围的消融。为什么是这个数而不是 1e-4 或 1e-3,外界无从得知;合理的猜测是作者在自家配置(Qwen3-30B-A3B 冷启动、每 batch 分 4 个 mini-batch)上试出来的,但这只是猜测。
原则层面(以下为推断,不是论文内容):裁剪范围的工作是放过正常波动、拦住异常波动,所以它应当定在 s_i 日常波动幅度的一个小倍数上:
ε ≈ k · σ / √L
其中 σ 是一次更新后逐 token 对数比率的漂移幅度,L 是回答长度,k 是想放过的波动倍数。把 §4 的演示数(σ=5%、L=2000)代入,σ/√L ≈ 0.0011,论文的 3e-4 相当于 k ≈ 0.27——只放过约四分之一的日常波动,是很严的筛选,与实测「裁掉百分之几十 token」互相印证。
这个框架同时说明 3e-4 不能照搬,它和三件事耦合:off-policy 程度(数据越陈旧 σ 越大,ε 要相应放宽,否则样本全被裁光);回答长度(L 越长平均后波动越小,同样的 ε 越严,32k 与 2k 的合适取值差约 4 倍);想要的裁剪力度(最优裁剪比例没有公开数据,复现只能自己扫参)。换一套配置,这个数就要重新定。
§6 · 三个保留意见
GSPO 的改进不宜理解为「恢复了重要性采样的理论正确性」——它没有。它真正做的是三件工程论证的合流,扎实,但不是定理。
下面这个计算器把保留意见二做成可算的:拖动「关键 token 漂移」和「序列长度」,看它对 s_i 的贡献落在裁剪带的里面还是外面。
§7 · 与 Clip-Higher 的关系
病灶同为 off-policy 下 token 级 clip 的结构性缺陷:DAPO 的解法是调边界,GSPO 的解法是换单位。两者不互斥。
上一篇写 DAPO 的 Clip-Higher(交互研报 / 博客正文):上界 0.2 抬到 0.28,放探索 token 一马。GSPO 则是整个 response 共用一个比率。两者不互斥——Qwen 的实践就是 GSPO 叠加 Dr.GRPO 式的去归一化偏差修正。
还有个细节值得点破:GSPO 论文的裁剪范围 3e-4 / 4e-4 本身就是不对称的——右界比左界宽,给强化方向(Â>0 时比率向上突破)多留了 33% 的空间。这不就是序列级版本的 Clip-Higher 吗。论文没有讨论这个不对称的来历,但方向与 DAPO 的逻辑一致:好的样本,让它走得更远一点。两个团队在同一病灶上独立开出了同方向的药,这比任何单篇论文的消融都更能说明问题。
§8 · 未决问题