Group Sequence Policy Optimization

Paper: arXiv:2507.18071 Code: alibaba/ROLL Code reference: main @ c09bc8bc (2026-05-11)

1. Motivation (研究动机)

当前大模型 RL 扩展越来越依赖长链 reasoning,但主流做法 GRPO 把 PPO 的 importance ratio 直接搬到 token level:每个 token 单独计算 ,再把 response-level 的相对奖励广播回所有 token。论文认为这在算法层面有两个根本问题。第一,token 级 importance weight 并不真正对应 response 被采样出来的概率偏移,和 sequence-level reward 粒度不一致;

第二,这些 token 权重在长序列中会累积高方差噪声,clipping 还会进一步放大不稳定性,最终导致 catastrophic collapse。论文要解决的具体问题不是“怎样再造一个 PPO 变体”,而是“怎样定义一个与语言生成 sequence reward 一致、又能稳定支撑超大规模 RL 训练的 importance ratio”。作者尤其关注 Qwen3 这类大模型与 MoE 模型场景:如果算法本身不稳,继续堆训练算力、拉长 generation length、增加 query 更新频率,都会先触发训练崩塌而不是能力提升。这个问题值得研究,因为它直接限制了 reasoning model 的 scaling law。

论文给出的证据是:GSPO 不仅比 GRPO 更稳定、更高效,而且在 MoE RL 训练里天然规避了 Routing Replay 这类额外工程补丁。换句话说,如果 sequence-level importance sampling 成立,就能同时释放更长推理、更大模型和更简单 RL infrastructure 的空间。论文的动机还可以理解为对“credit assignment 粒度”的一次纠偏。当前很多 post-training RL 流程里,reward model 或 rule-based verifier 只会在 response 完成后给出整体反馈,但优化器却把这个反馈拆散到 token 上逐个加权。

作者认为这种“sequence-level supervision + token-level off-policy correction”的错位,是 GRPO 类方法在长链 reasoning 中越来越脆弱的根源:模型真正被奖励的是“整条回答被采样出来且最终正确”,而不是其中某个局部 token 本身有多优。

作者也刻意把诊断聚焦在 objective mismatch,而不是把问题简单归因于 reward 噪声或超参数没调好。GSPO 的论证路径是:在 reward 定义、rollout 范式、甚至 group-relative normalization 都基本不变的前提下,只要把 importance correction 从 token 粒度改为 sequence 粒度,训练曲线就会显著变稳。这意味着瓶颈不只是“奖励难学”,而是优化目标本身没有和 language generation 的实际采样单位对齐。对 MoE 模型而言,这个动机又多了一层工程现实。

token-level ratio 默认假设 old/new policy 在每个 token 上的条件概率都能被稳定比较,但 expert routing 会让同一条 sequence 在不同前向中走过不同专家路径,局部概率比值因此更容易剧烈波动。GRPO 往往需要额外引入 Routing Replay 之类机制近似固定旧路由;GSPO 则因为只关心长度归一化后的 sequence likelihood shift,论文认为它天然更不容易被局部 routing 抖动击穿。

因此,论文真正瞄准的不是某个 benchmark 上的局部提分技巧,而是 RL-for-LLM 当前最核心的一条扩展瓶颈:当回答越来越长、模型越来越大、系统越来越复杂时,现有 token-level objective 是否还能作为可靠的基础设施继续放大。GSPO 给出的回答是,若不先修正这个基础单位,后续所有工程优化都只是在不稳定地基上继续加层。作者想解决的瓶颈可以进一步拆成三条:

  • 统计失配:reward 作用在 response 上, 但 ratio 作用在 token 上。
  • 方差失控:长序列里局部概率偏移会累计, 最终把整体更新方向扭曲。
  • 系统复杂化:MoE 为了救 token-level objective, 需要额外引入 Routing Replay 一类补丁。

2. Idea (核心思想)

GSPO 的核心 insight 是:在 autoregressive language generation 里,真正与“这条 response 从 old policy 漂移到 new policy 多远”对应的量,不是 token-level ratio,而是整条 response 的 sequence likelihood ratio 。于是 clipping、rewarding、optimization 都应该统一回到 sequence level。具体创新有两点。

第一,importance ratio 改为 sequence likelihood 的长度归一化版本 ,避免长回复的 joint probability 比值数值爆炸。第二,advantage 直接使用同一 query 下多条 response 的 group-normalized reward,使“按 response 打分”和“按 response 更新”两件事在粒度上重新对齐。与 GRPO 的根本差异不在于“group relative reward”这件事本身,而在于梯度权重的定义方式。GRPO 给同一 response 里的不同 token 施加不同 importance weight;

GSPO 让一条 response 内所有 token 共享同一个 sequence-level weight,因此移除了论文认为最关键的 instability factor。如果把 GSPO 压缩成一句最核心的话,它实际上是在说:对 autoregressive LM 而言,token 是生成展开的计算单位,但 response 才是 RL 决策与评估的自然单位。因此真正应该进入 importance sampling 与 clipping 的对象,不该是某个位置上的局部 conditional probability,而该是“整条回答在新旧策略下整体有多可能出现”。

这也解释了 GSPO 为什么不是简单回到朴素 sequence-level policy gradient。作者并没有放弃 PPO/GRPO 家族里最关键的 clipped off-policy update,而是保留 group-based relative reward 和 trust-region 风格,只把 trust-region 比较的对象从 token conditional probability 改成长度归一化后的 sequence likelihood。

也就是说,GSPO 不是“改成 sequence 训练后就不看 token”,而是“仍通过 token log-prob 回传梯度,但用 sequence-consistent weight 统一调节整条回答的更新强度”。

与 DAPO、GRPO 这类同代方法相比,GSPO 的 fundamental difference 还在于它对长序列不稳定性的处理哲学不同。很多方法是在 token-level objective 之上继续叠局部裁剪、额外正则、mask 规则或 replay trick;GSPO 则直接消除论文认为最主要的噪声源,即不要再让同一条 response 内部的 token 彼此携带不同的 off-policy magnification。作者因此把自己的贡献定位成 objective-level simplification,而不是 training-stack 上的又一个 patch。 如果进一步抽象,GSPO 的 idea 其实是在 RLHF/Reasoning RL 中重新强调一个很朴素的原则:优化器的概率修正单位,应当与奖励定义单位尽量一致。奖励若定义在 answer、trajectory 或 turn 上,importance correction 也应定义在相同层级;否则优化器会持续把本来属于“整条轨迹质量”的监督,误投到许多高方差的局部事件上。GSPO 只是把这个原则首次明确落实成一个可训练、可扩展的 sequence-level clipped objective。

3. Method (方法)

3.1 Overall framework

GSPO 仍然保留了 GRPO 一类 group-based RL 的外层训练范式:对每个 query 采样一组 response,计算 verifier reward,再执行 clipped policy optimization。真正被替换的是“importance ratio 的定义、clipping 的粒度、以及 advantage 与优化目标的对齐关系”。

Figure 1 解读:图中虽然主要展示实验曲线,但也反向说明了 GSPO 的整体训练范式。作者固定 cold-start 基座为 Qwen3-30B-A3B-Base,在相同训练 compute 和 query 消耗下比较 GSPO 与 GRPO;三条 benchmark 曲线与 reward 曲线一起表明,sequence-level objective 不是只换了个公式,而是直接改变了训练轨迹的稳定性和 compute efficiency。

整体流程可以概括为四步:给定 query ,old policy 采样 条 response ;verifier 对每条 response 产出 reward ;组内 reward 做标准化得到 ;new policy 基于 sequence-level importance ratio 做 PPO-style clipping 更新。与 GRPO 最大的不同,是 GSPO 不再让每个 token 各自带一个 ratio,而是一整条 response 只有一个共享的 ratio。

从直觉上看,这样做的原因很直接:reward 是对整条回答是否正确、是否高质量的判断,而不是对单个 token 的局部判断。既然监督信号本来就是 sequence-level,那么 importance sampling 也应该描述“整条输出从 old policy 到 new policy 的偏移”,而不是把偏移拆成大量局部、不稳定、彼此放大的 token factor。

3.2 From GRPO to GSPO

论文先回顾 PPO 与 GRPO。PPO 的目标是 GRPO 去掉 value model,改成组内相对奖励: 其中 论文的批判点是: 并不真正刻画 response 被抽样出来的分布偏移,而且同一 response 内 token importance weights 不相等,训练时相当于用不同力度放大/缩小不同 token 的 log-likelihood gradient。这种不一致在长序列和 MoE 路由抖动场景里都会迅速恶化。更具体地说,GRPO 的 surrogate objective 实际上把一个 response 拆成了很多“伪独立”的局部校正项。

表面上这些项都共享同一个最终 reward 或组内 advantage,但在梯度层面,它们被不同的 单独加权,于是 optimization 更像是在问“哪些 token 在新策略下比旧策略更可能出现”,而不是“这条回答整体是否更值得被提升”。作者认为,这会让 token-level 概率波动意外地主导 update,而真正和答案正确性相关的全局结构反而被稀释。这一点在 reasoning trace 尤其明显。很多 token 只是语法连接词、格式符号或中间展开步骤,它们对最终 reward 的因果贡献远小于整条回答的全局正确性;但在 GRPO 里,只要某个位置的 old/new 概率比值异常,就会被单独放大或截断。

于是一个高 reward 的 response 也可能因为少数 token ratio 偏移过大而产生畸形更新,或者一个低 reward 的 response 因为部分 token ratio 看起来“温和”而残留过多梯度信号。GSPO 的 sequence-level 共享权重,本质上是在恢复“整条回答作为一个训练样本”的完整性。

从 trust-region 的角度看,GRPO 其实默认了“只要每个 token 都没有偏太多,整条回答就没有偏太多”,但 autoregressive LM 并不满足这种简单可加直觉。多个 token 的小偏移在 joint distribution 上可以累计成非常大的 sequence shift,而相反,某个局部 token 的大偏移也未必意味着整条回答整体已经不可接受。GSPO 通过直接对 sequence likelihood 做约束,等于把 trust-region 的判断对象从局部条件分布改回真正的 joint behavior。

3.3 Sequence-level importance ratio

GSPO 的核心目标写成: 组内 advantage 为: sequence-level importance ratio 定义为: $ s_i(\theta)= \left( \frac{\pi_\theta(y_i\mid x)}{\pi_{\theta_{\text{old}}}(y_i\mid x)} \right)^{\frac{1}{|y_i|}}

\exp\left( \frac{1}{|y_i|}\sum_{t=1}^{|y_i|} \log\frac{\pi_\theta(y_{i,t}\mid x,y_{i,<t})}{\pi_{\theta_{\text{old}}}(y_{i,t}\mid x,y_{i,<t})} \right). \frac{1}{|y_i|}$ 的长度归一化。论文解释,如果不做长度归一化,少数 token likelihood 的变化就可能把整条 sequence ratio 放大到极端数值区间,不同长度 response 还会需要完全不同的 clipping range。长度归一化后,GSPO 的 ratio 更像平均 log-ratio 的指数化结果,方差更可控。还可以把这个定义理解成一种“几何平均 importance ratio”。普通 sequence ratio 会把所有 token 的局部偏移直接乘起来,长度越长越容易因为几个异常位置而失真;

GSPO 取 ,等价于先在 log 空间求平均,再回到概率空间。这样既保留了整条 response 在新旧策略下相对偏好的信息,又避免让 response length 本身主导权重大小。对于动辄几千 token 的 reasoning 输出,这个归一化不是公式修饰,而是 sequence-level 方法是否能落地的前提。从优化语义上说, 衡量的是“new policy 平均每个 token 相比 old policy 更倾向或更回避这条 response 到什么程度”。

这比单个 更接近 RL 真正关心的反事实问题:如果重新用新策略生成,整条回答整体上会不会更可能出现。作者正是利用这一点来论证,GSPO 的 ratio 与 response-level reward 处在同一个统计对象上,因此 clipping 后 surrogate objective 的语义也更加一致。

长度归一化还有一个很实际的副作用:它让 clipping range 终于可以在不同回答长度之间共享可比意义。若直接使用未归一化的 joint sequence ratio,那么 100-token response 和 4000-token response 即便平均每个位置的 policy shift 相同,前者和后者的 ratio 量级也会天差地别,单一 几乎不可能同时适配。GSPO 把 ratio 改写成按 token 平均后的指数形式之后,clip 的其实更接近“平均每个位置允许多大 policy drift”,这使得长短回答能被放在同一 trust-region 标尺上比较,也解释了为什么论文只需设置一组较小但稳定的 clipping 区间就能覆盖长 reasoning 输出。

3.4 Gradient view and why GSPO is stabler

省略 clipping 时,GSPO 梯度可写成: 对照 GRPO: 论文的结论是:GSPO 让同一 response 里的所有 token 使用同一个 ,因此一条回答内部不会再出现“不同 token 被不同 importance ratio 放缩”的问题。也就是说,GSPO 仍然优化 token log-likelihood,但把不稳定的局部 reweighting 换成了稳定的 response-wide reweighting。这个梯度视角还有一个容易忽略的含义:GSPO 并没有否认 token-level teacher signal 的必要性。

模型参数更新仍然通过 传播到每个位置,区别只在于这些 token 共享一个由整条 response 质量决定的全局尺度因子。因此 GSPO 保持了 autoregressive LM 训练最熟悉的“逐 token 回传”计算图,却避免了在同一 response 内把不同 token 当作不同 off-policy 样本处理。论文把它的稳定性拆成两层也很关键。第一层是统计层面:统一的 sequence weight 降低了 importance ratio 在时间维上的方差累积。

第二层是优化层面:clipping 现在只会裁剪 response 级别的偏移,而不是在回答内部局部截断某些 token、放过另一些 token。后者在 GRPO 中会形成很难解释的 optimization bias,因为同一回答的一部分 token 可能已经被 clip,另一部分还在继续放大;GSPO 则让“是否进入 trust-region 限制”变成 response 级别的整体决定。这也解释了为什么作者把 catastrophic collapse 归因为 objective mismatch,而不只是超参数没调好。

只要 token-level ratio 还在,长链回答里总会存在少数位置出现极端 old/new probability shift,它们会对整条回答的梯度贡献产生不成比例的放大;而这些 token 往往并不是 verifier 真正想强调的关键 reasoning step。GSPO 通过共享权重,至少把这种“偶然 token 主导全局 update”的路径堵住了。

3.5 GSPO-token 变体

为了兼容 multi-turn RL 或更细粒度 advantage 注入,论文还提出 GSPO-token: 其中 这里 sg[·] 表示 stop-gradient。论文证明如果所有 token 的 advantage 相同,即 ,那么 GSPO-token 与 GSPO 在数值目标、clipping 条件和理论梯度上都等价;它只是提供了 token-wise advantage customization 的接口。论文把它描述为在保持 sequence-level stability 的同时,引入 token-level flexibility。

更具体地说,GSPO-token 不是回到 GRPO 的 token ratio,而是让“prefix 一致的 sequence correction”服务于 token-level advantages,因此单个位置的更新依然由 sequence-consistent probability correction 支撑。这个区别很重要,因为它表明作者想保留的是更细粒度 credit assignment 的能力,而不是重新接受 token-wise off-policy noise。换句话说,GSPO-token 处理的是“advantage 能否更细”,而不是“importance sampling 是否必须更细”。

作者把这两件事明确拆开:credit signal 可以按 token、按 step、按 turn 细化,但 off-policy correction 仍要锚定在一个语义完整的 prefix 或 sequence 上。这个区分很有价值,因为它给后续 process supervision、tool-use RL、multi-turn agent RL 留出了扩展空间,同时又不必回到 GRPO 那种最容易失稳的 token-ratio 设计。

3.6 MoE stability and Routing Replay

Figure 3 解读:图 3 不是单纯的 ablation 曲线,而是论文对 GRPO failure mode 的关键证据。GRPO 在 MoE 上如果不做 Routing Replay,training reward 无法正常收敛;做了 Routing Replay 才能恢复训练。这证明问题不是单个超参数设置错误,而是 token-level ratio 对 expert routing volatility 本身就敏感。

论文指出,MoE 的问题在于同一条 rollout sample 经过一次或多次梯度更新后,新旧 policy 对应的 activated experts 会显著变化。以 48-layer Qwen3-30B-A3B-Base 为例,每次 RL update 后同一样本约有 10% activated experts 改变。这样一来,GRPO 的 token-level ratio 实际上拿的是两个“不同激活网络”上的 token likelihood 去做比值,数值会剧烈波动。Routing Replay 的补丁做法是缓存 old policy 激活的 experts,并在 new policy 上重放同一路由来重新计算 ratio。

GSPO 则从目标函数层面绕开了这个问题。它只关注 sequence likelihood ,而不对单个 token likelihood 的局部波动敏感。论文的论点是:MoE 模型整体语言建模能力仍然稳定,所以 sequence likelihood 不会像 token routing 那样剧烈抖动。因此 GSPO 从根本上消除了对 Routing Replay 的依赖。这里“绕开”并不意味着 GSPO 完全不受路由变化影响,而是说路由变化不再以最糟糕的方式进入目标函数。对 GRPO 来说,每个 token 的 ratio 都可能直接承受一次路由切换带来的局部概率突变;

对 GSPO 来说,这些局部扰动先在整条 response 上被平均到 log-ratio 里,再通过长度归一化变成单个共享权重。结果是同样的 routing volatility,在 GSPO 中更像可被平滑吸收的 sequence-level 扰动,而不是沿时间维逐点爆炸的乘性噪声。这也让 GSPO 和 Routing Replay 的关系更清楚。Routing Replay 的本质是试图让 new policy 在评估 ratio 时复现 old policy 当初的 expert path,以减少 apples-to-oranges 的 token likelihood 对比;

GSPO 则是改变 ratio 的统计对象,让训练不再对每个 token 的路径一致性如此敏感。前者是针对 MoE failure mode 的工程补丁,后者是从 objective 定义上降低 failure mode 触发概率。论文把这一点当作 GSPO 能在大规模 MoE RL 中更易部署的关键理由。

3.7 Clipping fraction 的反直觉现象

Figure 2 解读:图 2 展示一个反直觉结果。GSPO 的 clipped token fraction 比 GRPO 高两个数量级,意味着它实际上丢弃了更多 token 不参与梯度估计;但训练效率反而更高。论文据此反推:GRPO 的 token-level gradient estimate 噪声太大,即便“用了更多 token”,这些 token 提供的也是低质量学习信号,而 GSPO 的 sequence-level clipping 虽然更狠,却保留了更可靠的样本级优化方向。

这个观察很重要,因为它说明 GSPO 的收益不只是“更稳”,还在于 sample exploitation 更有效。也即,同样一批 rollout 数据,GSPO 把真正值得学的整条 response 留下来,GRPO 则让大量 token-level noisy weights 污染了梯度。 从 surrogate optimization 的角度看,这个现象很有代表性。GRPO 看上去保留了更多未被 clip 的 token,但这些 token 来自同一 response 时并不独立,它们共享同一个最终 reward,却被不同的局部 ratio 重新加权。因此“更多有效 token”不等于“更多有效训练信号”,很可能只是更多彼此冲突、难以解释的局部更新。GSPO 虽然在统计上更激进地丢弃了部分 response,但剩下样本的方向更一致,反而更容易转化成真实 benchmark gain。 这也帮助理解论文为什么强调 efficiency 而不只强调 stability。若一个目标函数只是更保守,它通常会表现为训练不崩,但收敛更慢;而 GSPO 的结果是同时更稳且更快,说明 sequence-level clipping 并没有单纯压小更新,而是在提升单位 rollout 的可学习性。作者借此论证,真正关键的不是保留多少 token,而是保留下来的梯度是否仍然对应“整条回答值不值得被提升”这一核心问题。

3.8 Pseudocode

下面的伪代码以 alibaba/ROLL@main@c09bc8bc 为准,反映 released code 的配置和训练流程,而不是只按论文文字重写。

import torch
 
 
def compute_group_advantages(response_rewards: torch.Tensor, group_size: int) -> torch.Tensor:
    rewards = response_rewards.view(-1, group_size)
    mean = rewards.mean(dim=-1, keepdim=True)
    std = rewards.std(dim=-1, keepdim=True).clamp_min(1e-8)
    return ((rewards - mean) / std).view(-1)
import torch
 
 
def compute_gspo_sequence_ratio(old_log_probs: torch.Tensor, new_log_probs: torch.Tensor, response_mask: torch.Tensor) -> torch.Tensor:
    token_log_ratio = (new_log_probs - old_log_probs) * response_mask
    lengths = response_mask.sum(dim=-1).clamp_min(1.0)
    avg_log_ratio = token_log_ratio.sum(dim=-1) / lengths
    return torch.exp(avg_log_ratio)
import torch
 
 
def apply_reward_and_advantage_postprocess(response_rewards: torch.Tensor, token_rewards: torch.Tensor, response_mask: torch.Tensor, reward_clip: float, advantage_clip: float) -> tuple[torch.Tensor, torch.Tensor]:
    clipped_response_rewards = torch.clamp(response_rewards, -reward_clip, reward_clip)
    clipped_token_rewards = torch.clamp(token_rewards, -reward_clip, reward_clip)
    advantages = clipped_token_rewards * response_mask
    advantages = torch.clamp(advantages, -advantage_clip, advantage_clip)
    return clipped_response_rewards, advantages
import torch
 
 
def gspo_train_step(batch, actor, reference, kl_controller, clip_eps_low: float, clip_eps_high: float):
    old_log_probs = batch["old_log_probs"]
    ref_log_probs = batch["ref_log_probs"]
    response_mask = batch["response_mask"][:, 1:]
 
    token_rewards = batch["token_level_rewards"]
    response_rewards = batch["response_level_rewards"]
    group_adv = compute_group_advantages(response_rewards, group_size=batch["num_return_sequences_in_group"])
 
    new_log_probs = actor.compute_log_probs(batch)
    seq_ratio = compute_gspo_sequence_ratio(old_log_probs, new_log_probs, response_mask)
 
    clipped_ratio = torch.clamp(seq_ratio, 1 - clip_eps_low, 1 + clip_eps_high)
    seq_obj = torch.minimum(seq_ratio * group_adv, clipped_ratio * group_adv)
 
    token_losses = []
    for i in range(response_mask.size(0)):
        token_logp = new_log_probs[i]
        token_loss = -(seq_obj[i] / response_mask[i].sum().clamp_min(1.0)) * token_logp
        token_losses.append(token_loss * response_mask[i])
 
    loss_mat = torch.stack(token_losses, dim=0)
    return loss_mat

这些伪代码体现了三个关键点:组内 reward 先归一化成 response-level advantage;sequence ratio 通过平均 token log-ratio 指数化得到;最终 loss 仍然施加在 token log-prob 上,但同一 response 内共享一个 sequence-level clipped weight。

3.9 Code-to-paper mapping

Code reference: main @ c09bc8bc (2026-05-11) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
GSPO/GRPO 训练配置 dataclass,含 importance_samplingnum_return_sequences_in_grouproll/pipeline/rlvr/rlvr_config.pyRLVRConfig
PPO/GSPO 通用超参数:reward_clipwhiten_advantagesadvantage_cliploss_agg_modedual_clip_lossnorm_mean_typenorm_std_typeroll/configs/base_config.pyPPOConfig
RLVR 主训练管线:生成、算 reward、算 advantage、更新 actorroll/pipeline/rlvr/rlvr_pipeline.pyRLVRPipeline
reward 后处理与 group normalization / clippingroll/utils/functionals.pyreward_postprocess
token-level KL reward / reward clippingroll/utils/functionals.pycompute_token_reward
advantage 计算与 advantage clippingroll/utils/functionals.pycompute_advantage
不同 loss 聚合策略;GSPO 文档推荐 seq-mean-token-meanroll/utils/functionals.pyagg_loss
官方 GSPO 文档与配置样例docs_roll/docs/User Guides/Algorithms/GSPO.md / examples/docs_examples/example_gspo.yaml文档与 YAML

论文公式与 released code 实现差异:论文把 GSPO 定义为 sequence-level importance ratio 与 sequence-level clipping 的算法;ROLL 当前公开实现并未暴露一个单独命名为 gspo_loss 的函数,而是通过 importance_sampling: seqadv_estimator: "grpo"loss_agg_mode: "seq-mean-token-mean"、以及 reward_postprocess 中对 adv_estimator == "grpo" 强制使用 group normalization 的组合来落地 sequence-level 训练语义。也就是说,论文是算法定义,released code 更像“在统一 RLVR/PPO 框架里用配置开关实现 GSPO 行为”。

4. Experimental Setup (实验设置)

  • 模型与训练对象:主实验基座是从 Qwen3-30B-A3B-Base 出发的 cold-start model,重点验证 reasoning-oriented RL 训练稳定性、效率和 benchmark 增益。
  • 评测基准:论文正文显式报告三项主 benchmark:AIME’24(32 samplings 的平均 Pass@1)、LiveCodeBench 202410–202502(8 samplings 的平均 Pass@1)、CodeForces(Elo rating)。训练阶段还同时记录 training reward 曲线。
  • 对比基线:核心基线是 GRPO;在 MoE 稳定性讨论里又区分 GRPO w/ Routing ReplayGRPO w/o Routing Replay。论文目标不是与各种 RL 算法大混战,而是专门验证“sequence-level vs token-level importance ratio”这一设计差异。
  • 关键训练设置(论文正文):每个 rollout batch 会被切成 4 个 minibatches 做 gradient updates。GSPO 在式 (5) 中使用左右 clipping range 分别为 3e-44e-4;GRPO 在式 (2) 中使用 0.20.27,作者说明这些值经过精细调节以确保公平对比。

从 released code 侧,官方公开的 GSPO 参考配置来自 examples/docs_examples/example_gspo.yaml。虽然文档明确声明这个 example_ 配置“仅作说明,不保证训练性能”,但它仍是公开实现中唯一直接标为 GSPO 的 launch config,因此可以用来记录实现接口与默认工程设定:

  • GSPO algorithm knobsadv_estimator: "grpo"importance_sampling: seqrollout_batch_size: 64num_return_sequences_in_group: 8prompt_length: 2048response_length: 4096
  • PPO / loss knobsppo_epochs: 1use_kl_loss: truekl_loss_coef: 0.001loss_agg_mode: "seq-mean-token-mean"whiten_advantages: falseadvantage_clip: 2.0dual_clip_loss: truereward_clip: 10add_token_level_kl: false
  • 硬件与并行num_gpus_per_node: 8。该示例把 actor_train 绑定到 device_mapping: list(range(0,16))、actor_infer 到 list(range(0,12))、reference 到 list(range(0,16)),对应的是多机/多卡 role mapping,而不是单机 8 卡即可完整复现实验。
  • 模型与优化器:示例配置使用 pretrain: Qwen/Qwen2.5-7Breward_pretrain: Qwen/Qwen2.5-7Bactor_train.training_args.learning_rate = 1.0e-6per_device_train_batch_size = 1gradient_accumulation_steps = 32warmup_steps = 20num_train_epochs = 50。这里必须注意:这些数值来自 example_gspo.yaml,不是论文正文的 Qwen3-30B-A3B 主实验配置,因此不能把它们误写成论文报告的正式实验超参数。

5. Experimental Results (实验结果)

5.1 主结果

论文没有给出大表格,而是通过三组曲线展示 GSPO 相对 GRPO 的优势。

  • Training reward:GSPO 全程稳定上升,而 GRPO 曲线更不稳定,且整体水平更低。
  • AIME’24 / LiveCodeBench / CodeForces:在相同训练 compute 和已消耗 query 下,GSPO 都比 GRPO 更早达到更高性能,说明 improvement 不是单靠更长训练时长硬堆出来,而是 training efficiency 本身更高。
  • Qwen3 真实贡献:作者明确声称,GSPO 已成功应用到最新 Qwen3 模型的 RL 训练中,并把它视为 Qwen3 性能显著改善的重要原因之一。

5.2 Ablation / analysis 结论

  • Clipping fraction 分析:GSPO 的 clipped token fraction 比 GRPO 高两个数量级,但训练效率更高。这支持论文核心论断:GRPO 的 token-level gradient estimate 噪声大、样本利用低效,而不是“clipped 少就一定更好”。
  • MoE 稳定性分析:GRPO 在 MoE 上若不做 Routing Replay 不能正常收敛;做了 Routing Replay 才能稳定。GSPO 则天然不依赖这个补丁,说明它确实缓解了 expert-activation volatility。
  • Infrastructure simplification:论文第 5.4 节进一步指出,由于 GSPO 只依赖 sequence-level likelihood,它对 train/infer engine 之间的精度差异更宽容,因此未来可能直接使用 inference engine 返回的 likelihood,避免 training engine 重算 old log-probs。

5.3 局限与边界

论文的局限主要体现在两个方面。第一,它是一篇短文风格的算法 paper,缺少大规模 benchmark 表格、缺少更系统的超参数扫描,也没有完整展开不同任务族、不同模型规模下的统计显著性。第二,公开实现层面目前更像在 ROLL 通用 RLVR 框架中通过配置开关支持 GSPO,而不是开源一套与论文公式一一对应的最小实现,因此读者在复现时需要自己把“算法定义”和“框架实现语义”对齐。

5.4 总结

GSPO 的结论可以浓缩成一句话:把 RL 后训练里最关键的 importance ratio 从 token level 改到 sequence level,既修复了 reward 粒度与优化粒度的不匹配,也显著改善了长序列与 MoE 场景下的训练稳定性。论文最有价值的地方不是提出一个更复杂的技巧,而是指出 GRPO 的不稳定来自 importance sampling 设计本身,并给出一个更贴合 language generation 本质的替代方案。