【LLM-RL】GSPO算法Group Sequence Policy Optimization

note

  • 相关实践经验:
    • 如果你在用 GRPO 且遇到:训练不稳定、loss/奖励发散、MoE 特别难训------可以考虑 GSPO 这套"序列级重要性比 + 序列级 clip"的替代路线。

文章目录

一、GSPO算法解析

论文标题:Group Sequence Policy Optimization

论文链接:https://huggingface.co/papers/2507.18071

博客链接:https://qwenlm.github.io/blog/gspo/

1、GRPO 的问题:逐 token 重要性采样的不稳定性

最近 Qwen 的研究表明,使用 GRPO 训练大语言模型时存在严重的稳定性问题,往往会导致模型不可逆地崩溃。他们认为 DeepSeek 的 GPRO 方法存在一些严重问题:

  • 在每个 token 级别应用重要性采样,会在长序列中积累高方差,导致训练不稳定。
  • 这一问题在 专家混合模型(Mixture-of-Experts, MoE) 中尤为严重,因为 token 级别的路由变化会加剧不稳定性。
  • 为缓解这一问题,基于 GRPO 的训练流程通常需要依赖一些额外策略,例如 路由重放(Routing Replay)。

因此,Qwen 团队声称 GRPO 的 token 级重要性采样无法达到稳定训练,其优化目标是「病态的(ill-posed)」。为了解决这些问题并训练其最新的 Qwen3 系列模型,Qwen 团队提出了一种新的强化学习算法 ------ 组序列策略优化(Group Sequence Policy Optimization, GSPO)。

GRPO 的根本问题:「逐 token 重要性采样」的不稳定性

GRPO 是在每一个 token 的生成步骤上单独计算重要性权重的: w i , t ( θ ) = π θ ( y i , t ∣ x , y i , < t ) π θ old ( y i , t ∣ x , y i , < t ) w_{i, t}(\theta)=\frac{\pi_\theta\left(y_{i, t} \mid x, y_{i,<t}\right)}{\pi_{\theta_{\text {old }}}\left(y_{i, t} \mid x, y_{i,<t}\right)} wi,t(θ)=πθold (yi,t∣x,yi,<t)πθ(yi,t∣x,yi,<t)

2、GSPO:重要性采样从 token 级转移至序列级

GSPO 的核心在于将重要性采样从 token 级转移至序列级,其重要性比值基于整个序列的似然度计算: s i ( θ ) = ( π θ ( y i ∣ x ) π θ old ( y i ∣ x ) ) 1 ∣ y i ∣ = exp ⁡ ( 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ log ⁡ π θ ( y i , t ∣ x , y i , < t ) π θ old ( y i , t ∣ x , y i , < t ) ) s_i(\theta)=\left(\frac{\pi_\theta\left(y_i \mid x\right)}{\pi_{\theta_{\text {old }}}\left(y_i \mid x\right)}\right)^{\frac{1}{\left|y_i\right|}}=\exp \left(\frac{1}{\left|y_i\right|} \sum_{t=1}^{\left|y_i\right|} \log \frac{\pi_\theta\left(y_{i, t} \mid x, y_{i,<t}\right)}{\pi_{\theta_{\text {old }}}\left(y_{i, t} \mid x, y_{i,<t}\right)}\right) si(θ)=(πθold (yi∣x)πθ(yi∣x))∣yi∣1=exp ∣yi∣1t=1∑∣yi∣logπθold (yi,t∣x,yi,<t)πθ(yi,t∣x,yi,<t)

这种采样权重的设计自然地缓解了逐 token 方差的累积问题,从而显著提升了训练过程的稳定性。注意,指数中的因子用于「长度归一化」。如果不进行长度归一化,仅仅几个 token 的似然变化就可能导致序列级重要性比值的剧烈波动,而不同长度的生成响应在目标函数中也将需要不同的裁剪范围,这会进一步增加训练的不稳定性。

二、重要性采样比的区别

版本依赖:ms-swift>=3.7

Group Sequence Policy Optimization中指出GRPO在计算重要性采样权重时,是在token级别进行操作的。然而,这种做法由于每个token仅采样一次,无法实现有效的分布校正,反而会在模型训练过程中引入高方差噪声,极易导致模型的梯度估计不稳定,最终造成模型训练的崩塌。

因此,论文认为,优化目标的单位应该与奖励的单位保持一致。由于奖励通常是在序列级别(即完整生成的回复)给出的,因此更合理的做法是将 off-policy 校正和优化也提升到序列级别,而非 token 级别。以下是三种计算策略对比:

  1. GRPO
    对每个 token 独立计算重要性采样比,具体公式为

w i , t G R P O = π θ ( y i , t ∣ x , y i , < t ) π θ o l d ( y i , t ∣ x , y i , < t ) w^{\mathrm{GRPO}}{i,t} = \frac{\pi\theta (y_{i, t} \mid x, y_{i, <t})}{\pi_{\theta_{\mathrm{old}}} (y_{i, t} \mid x, y_{i, <t})} wi,tGRPO=πθold(yi,t∣x,yi,<t)πθ(yi,t∣x,yi,<t)

  1. GSPO (Sequence-Level)

在序列级别上计算重要性采样比,具体公式为

w i G S P O = [ π θ ( y i ∣ x ) π θ o l d ( y i ∣ x ) ] 1 ∣ y i ∣ = exp ⁡ ( 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ log ⁡ π θ ( y i , t ∣ x , y i , < t ) π θ o l d ( y i , t ∣ x , y i , < t ) ) w^{\mathrm{GSPO}}{i} = \left[ \frac{\pi\theta (y_i \mid x)}{\pi_{\theta_{\mathrm{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_{\mathrm{old}}} (y_{i, t} \mid x, y_{i, <t})} \right) wiGSPO=[πθold(yi∣x)πθ(yi∣x)]∣yi∣1=exp ∣yi∣1t=1∑∣yi∣logπθold(yi,t∣x,yi,<t)πθ(yi,t∣x,yi,<t)

  1. GSPO-token
    GSPO-token 结合了序列级与 token 级的重要性采样思想

w i , t G S P O − t o k e n = s g [ w i G S P O ] ⋅ π θ ( y i , t ∣ x , y i , < t ) s g [ π θ ( y i , t ∣ x , y i , < t ) ] w_{i, t}^{\mathrm{GSPO-token}} = \mathrm{sg}\left[w_i^{\mathrm{GSPO}}\right] \cdot \frac{\pi_{\theta}(y_{i, t} \mid x, y_{i, < t})}{\mathrm{sg}\left[\pi_{\theta}(y_{i, t} \mid x, y_{i, < t})\right]} wi,tGSPO−token=sg[wiGSPO]⋅sg[πθ(yi,t∣x,yi,<t)]πθ(yi,t∣x,yi,<t)

其中, ( s g [ ⋅ ] ) (\mathrm{sg}[\cdot]) (sg[⋅]) 表示梯度截断(detach())。

注意:根据梯度推导(即论文中的公式(11)和(18)),当各 token 的 advantage 相同时,GSPO-token 与 GSPO 等价。当前的 GRPO 实现中,所有 token 的 advantage 实际上都是基于句子级 reward 并在 group 内进行归一化,因此在这种设置下,GSPO-token 和 GSPO 在理论上是等价的。不过,GSPO-token 为未来更细粒度(token 级别)的 advantage 提供了支持。

伪代码实现

python 复制代码
log_ratio = per_token_logps - old_per_token_logps
# GRPO
log_importance_weights = log_ratio

# GSPO (Sequence-Level)
seq_weight = (log_ratio * mask).sum(-1) / mask.sum(-1)
log_importance_weights = seq_weight.unsqueeze(-1)  # (B,1)

# GSPO-token
seq_weight = (log_ratio * mask).sum(-1) / mask.sum(-1)
log_importance_weights = seq_weight.detach().unsqueeze(-1) + (per_token_logps - per_token_logps.detach())

importance_weights = torch.exp(log_importance_weights)

我们可以在 GRPO 训练的基础上,通过参数 --importance_sampling_level 选择不同的算法:

  • importance_sampling_level token (默认,GRPO 实现)
  • importance_sampling_level sequence (GSPO)
  • importance_sampling_level sequence_token (GSPO-token)

其中 sequence_token 要求 ms-swift > 3.7 (源码安装)

论文其他超参

bash 复制代码
    --epsilon 3e-4 # from paper section 5.1
    --epsilon_high 4e-4 # from paper section 5.1
    --steps_per_generation 4 # from paper section 5.1 (each batch of rollout data is partitioned into four minibatches for gradient updates)
    --beta 0 # zero kl regularization https://github.com/volcengine/verl/pull/2775#issuecomment-3131807306

训练可以参考该脚本

效果优势体现如下图:

  • 在相同训练计算资源时,GSPO比GRPO训练的模型效果更好
  • w/with的缩写,这里对照组GRPO还是使用了routing replay优化过的GRPO。这里是把旧策略(或生成时)的专家激活路径记录下来,并在训练时强制/复用同样的路由,让新旧策略对该 token 经过同一组专家,从而稳定比率与训练。

Reference

1\] [DeepSeek的GRPO会导致模型崩溃?看下Qwen3新范式GSPO](https://mp.weixin.qq.com/s/YSlp-SXzi7bSW2Y-shJ8ww) \[2\] 博客链接:https://blog.netmind.ai/article/Qwen_Team_Proposes_GSPO_for_Qwen3%2C_Claims_DeepSeek's_GRPO_is_Ill-Posed

相关推荐
Irissgwe4 小时前
LangChain之核心组件(少样本提示词)
人工智能·langchain·llm·langgraph
litble5 小时前
如何速成LLM以伪装成一个AI研究者(4)——PPO,GRPO,DAPO,GSPO
人工智能·llm·ppo·grpo·gspo·dapo
强殖装甲凯普6 小时前
我把「3小时播客变成可搜索文本」做成了 Claude Code 的一条命令
llm·skill·播客·claude code
Baihai IDP6 小时前
为什么 AI Agent 重新爱上了文件系统(Filesystems)
人工智能·ai·llm·agi
雪碧聊技术7 小时前
一文讲透AI大模型相关的专业名词
llm·token
joshchen2159 小时前
强化学习基础(赵世钰)第一章
人工智能·深度学习·算法·机器学习·强化学习
山顶夕景9 小时前
【多模态RAG】Purifying Multimodal Retrieval
大模型·llm·mllm·多模态rag
joshchen21510 小时前
强化学习基础(赵世钰)第二章 贝尔曼方程
人工智能·python·机器学习·强化学习
swipe1 天前
别再把 AI 聊天做成纯文本:从 agui 这个前后端项目,拆解“可感知工具调用”的流式 AI UI
后端·langchain·llm
TheRouter1 天前
Agent Harness系列(三):记忆层的3种持久化架构——从SQLite到向量库
人工智能·架构·sqlite·llm·ai-native