1. 从GRPO到DAPO再到GSPO强化学习优化算法的演进之路在大型语言模型的强化学习阶段PPOProximal Policy Optimization曾一度是主流方法。然而PPO依赖价值模型的特性使其在处理长文本输出和复杂任务时暴露出明显局限。GRPOGeneralized Reinforcement Policy Optimization通过移除对价值模型的依赖显著提升了扩展性但在效率和稳定性方面仍有优化空间。这催生了DAPODynamic Adaptive Policy Optimization它在采样、裁剪和梯度计算等细节上进行了精细化改进。而在专家混合MoE架构中动态激活的专家模块使得GRPO框架下的token级优化仍难以稳定收敛。GSPOGeneralized Sequence Policy Optimization更进一步将优化粒度从token级提升到序列级从根本上降低了高方差和结构噪声。本文将沿着这条演进路径从GRPO出发逐步拆解DAPO和GSPO背后的设计动机和实现细节。通过本文你将了解到GRPO如何摆脱PPO对价值模型的依赖却又在特定场景下可能崩溃Clip-Higher如何修复优质token被过早限制的隐藏问题动态采样如何避免无效样本造成的大规模计算浪费Token-Level梯度损失如何确保长响应不再稀释有价值的梯度信号为什么GRPO的逐token重要性采样在MoE架构中会产生巨大方差GSPO如何用序列级优化替代token级优化从根本上提升稳定性和效率1.1 GRPO回顾GRPO的训练目标函数可以表示为$$ \begin{aligned} \mathcal{J}{GRPO}(\theta) \mathbb{E}{q \sim P(Q),\ {o_{i}}{i 1}^{G} \sim \pi{\theta_{\text{old}}}(O | q)} \Bigg[\frac{1}{G} \sum_{i 1}^{G} \frac{1}{|o_i|} \sum_{t1}^{|o_i|} \Bigg(\min \Bigg(r_{i,t}(\theta) A_{i},\ \text{clip}\Big(r_{i,t}(\theta), 1-\varepsilon, 1\varepsilon\Big) A_{i}\Bigg) -\ \beta\ \mathbb{D}{KL}\left(\pi{\theta}\ |\ \pi_{\text{ref}}\right)\Bigg) \Bigg] \end{aligned} $$其中$r_{i,t}(\theta) \frac{\pi_{\theta}(o_{i,t}|q,o_{i, t})}{\pi_{\theta_{\text{old}}}(o_{i,t}|q,o_{i, t})}$是重要性比率$A_{i}$是优势函数。理解GRPO目标后我们首先需要明确重要性采样的作用和局限这不仅是理解GRPO的关键也是DAPO和GSPO改进的切入点。1.1.1 重要性比率的作用重要性采样的本质是我们希望在新分布下计算期望但数据来自旧分布。因此我们使用新旧策略下同一动作的概率比作为修正权重$$ \mathbb{E}{p\text{new}}[f(x)] \mathbb{E}{p\text{old}}\left[\frac{p_\text{new}(x)}{p_\text{old}(x)} f(x)\right] $$这使得我们可以利用旧策略的离线数据评估新策略下的期望值避免每次更新后重新采样从而降低成本。然而如果新旧策略差距过大权重的方差会变得很高导致训练不稳定。在PPO/GRPO中我们不直接从新策略采样数据而是先用旧策略生成数据因为采样成本高这个过程称为rollout。更新时我们必须修正分布不匹配的问题这就是重要性采样的用武之地。定义采样后每个token的重要性比率为$$ r_t \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}, $$PPO/GRPO目标可以写作$$ L(\theta) \mathbb{E}_t \left[\min(r_tA_t, \text{CLIP}(r_t, 1-\epsilon, 1\epsilon)A_t)\right] $$这里$A_t$是计算的优势函数裁剪操作限制了更新幅度防止策略偏离旧策略太远。1.1.2 $A_t$和$r_t$符号对训练的影响让我们分析不同场景。假设$A_t 0$动作比预期好我们希望增加该动作的概率。如果设置$\epsilon0.2$进行裁剪那么当$r_t 1.2$时min和clip操作会将其限制在1.2。当$r_t 0.8$时由于min操作不会发生裁剪因此正优势的向上变化受到限制。相反当$A_t 0$动作比预期差我们应该减少该动作的概率。如果$r_t 0.8$min操作会进一步限制上限为$0.8A_t$但当$r_t 1.2$时min操作不施加限制可以到$\infty$加上负号变为$-\infty$。因此负优势的向下调整也是有界的。$A_t$衡量当前动作/轨迹是否优于平均水平。如果$A_t$为正我们鼓励它如果为负我们惩罚它使其在未来出现更少。重要性比率$r_t$反映新策略选择该动作的概率比旧策略高或低多少。如果$r_t 1$新模型更偏好该动作如果$r_t 1$偏好更少。在$A_t$和$r_t$的四种可能符号组合中我们只希望其中两种当它们符号相同时正$A_t$与$r_t 1$强化或负$A_t$与$r_t 1$纠正错误。然而匹配$A_t$和$r_t$的符号还不够。在PPO/GRPO中裁剪操作对稳定训练同样关键因为它决定哪些token的梯度真正贡献于更新。1.1.3 裁剪对梯度和token效率的影响对于$A_t 0$当$r_t 1 \epsilon$即增加达到上限时我们应用裁剪梯度变为零。这实际上取消了该token对训练的贡献。类似地对于$A_t 0$如果$r_t 1 - \epsilon$即减少超过上限裁剪也将梯度设为零。一个常见的误解是裁剪使用直通估计器将裁剪值的梯度传回未裁剪值实际上这不会发生裁剪前的梯度直接设为零。至此我们对GRPO的机制、优势和局限有了相对完整的理解。接下来我们将看到DAPO如何在保留GRPO基本框架的同时引入更精细的改进来解决效率和稳定性挑战。2. 从GRPO到DAPO精细化改进DAPO从一个直接的动机出发在实际训练中GRPO常因裁剪范围不合理、冗余采样和长序列中的梯度稀释等问题浪费大量学习信号。DAPO通过四项针对性改进解决这些问题。DAPO的目标函数表示为$$ \mathcal{J}{DAPO}(\theta) \mathbb{E}{(q,a) \sim P(Q),\ {o_{i}}{i 1}^{G} \sim \pi{\theta_{\text{old}}}(O | q)}\Bigg[\frac{1}{\sum_{i1}^G |o_i|} \sum_{i 1}^{G} \sum_{t1}^{|o_i|} \min \Bigg(r_{i,t}(\theta) A_{i},\ \text{clip}\Big(r_{i,t}(\theta), 1-\varepsilon_{\text{low}}, 1\varepsilon_{\text{high}}\Big) A_{i}\Bigg) \Bigg] $$约束条件为$$ \text{s.t.}, 0 |{o_i | \text{is_equivalent} (a, o_i)}| G $$2.1 为什么DAPO提高上限$1\epsilon_{\text{high}}$而保持$1-\epsilon_{\text{low}}$不变作者观察到选择小的$\epsilon$作为裁剪上限会导致以下问题如果旧策略对采样token赋予非常低的概率但其优势为正意味着旧模型采样到了非常好的东西当前策略几乎没有空间增加其概率尽管增加正是我们想要的。例如如果旧策略的概率为0.9且$\epsilon0.2$上限为$0.9 \times 1.2 1.08$已经超过最大概率1.0所以永远不会被裁剪。但如果旧策略的概率为0.2上限变为0.24。这种情况下即使当前策略将概率提高到0.4很好的改进过小的$\epsilon$也会导致其被裁剪实际上丢弃了该token。这就是为什么DAPO采用Clip-Higher提高上限改善了token效率。这本质上就是我们所说的马太效应富者愈富穷者难以提升。如果旧策略勉强采样到一个关键token如Wait的概率非常低但当前模型显著提高了该概率它仍可能被裁剪掉剥夺模型翻盘的机会。Clip-Higher解决了优质token被过早限制的问题但没有解决另一个常见的浪费来源缺乏采样多样性。为解决这个问题DAPO引入了动态采样。2.2 DAPO - 动态采样DAPO的第二项创新是动态采样。动机如下假设对于给定查询我们采样10个响应所有10个要么非常好要么非常差一致获得最大奖励或零奖励。由于GRPO的计算方法所有10个样本的优势将为零因此贡献零梯度。这意味着有效梯度贡献样本的数量远低于名义样本数导致高方差、训练不稳定和样本浪费。这种效应在训练开始模型较差时和后期模型非常好经常产生完美响应时尤为明显。为应对这一点DAPO强制执行额外的采样规则对于每个查询采样响应集不能全为0或全为1奖励。如果所有样本为0或全为1则额外采样直到违反此条件。这表示为约束$$ \text{s.t.}, 0 |{o_i | \text{is_equivalent} (a, o_i)}| G $$确保同一输入的采样集包含正确和错误答案。除了采样多样性GRPO对长响应还有另一个隐藏缺陷token梯度随响应长度增加而被稀释。DAPO的第三项改进通过Token-Level梯度损失解决这一问题。2.3 DAPO - Token-Level梯度损失DAPO的第三项创新解决了GRPO中每个token的梯度权重随采样响应长度增加而减少的问题。为什么会这样假设我们采样两次一个响应有200个token另一个有10个token。在GRPO的公式中我们首先在每个样本内平均梯度然后在批次间平均。这给第一个响应中的每个token赋予$(1/200) \times (1/2)$的权重而第二个响应中的每个token获得$(1/10) \times (1/2)$。因此较短响应的token影响大得多。缺点很明显对于较难的问题长响应很常见。如果这些响应质量高它们有价值的梯度信号会被稀释。如果质量差且仅因重复或冗长而长纠正信号也会减弱。DAPO的解决方案计算梯度时对所有样本生成的总token数取平均。在我们的例子中长和短响应给每个token的权重都是$1/(20010)$。这平等对待所有token提高了长样本训练的效率。这对应于将损失聚合从GRPO的$$ \frac{1}{G} \sum_{i 1}^{G} \frac{1}{|o_i|} \sum_{t1}^{|o_i|} $$改为DAPO的$$ \frac{1}{\sum_{i1}^G |o_i|} \sum_{i 1}^{G} \sum_{t1}^{|o_i|} $$经验上token级损失带来更稳定的训练防止熵变得太高导致策略随机行动并避免熵太低时的探索崩溃Clip-Higher也有助于解决。通过从样本级转向token级损失DAPO确保长响应按比例贡献于最终梯度每个token直接影响整体梯度独立于其样本长度。最后一项改进也涉及响应长度但从不同角度处理过长响应对整体奖励的负面影响。2.4 DAPO - 过长奖励塑形DAPO的第四项改进使用软惩罚机制调整过长响应的奖励。具体来说一旦生成序列超过预定义的第一长度阈值就对token进行惩罚惩罚随长度增长线性增加。如果长度超过第二阈值惩罚大到足以抵消正确答案的原始奖励有效模拟过长响应被视为无效的场景。通过Clip-Higher、动态采样、Token-Level梯度损失和过长奖励塑形DAPO实现了对GRPO的精细化改进显著提高了训练效率和稳定性。然而在某些架构特别是MoE中GRPO仍存在DAPO无法完全解决的结构性问题这引出了GSPO。3. GSPO解决MoE训练中GRPO的不稳定性如果DAPO可视为GRPO框架内的微调与改进GSPO则迈出更根本的一步它将优化粒度从token级变为序列级。这一转变的动机源于在MoE架构训练中GRPO的重要性采样引入大方差和不稳定性。GSPO的核心思想是减少奖励处理中对逐token优化的依赖同时更强调整体序列结果。下面介绍GSPO背后的主要概念。TL;DR传统算法如PPO和GRPO通常单独优化模型输出中的每个token给某些token更高权重其他更低。虽然这旨在实现细粒度优化但在长文本、大模型场景中它反而会引入噪声和奖励偏差导致模型失去方向甚至突然崩溃。问题的根源在于我们基于完整响应评估模型却逐token训练它导致奖励粒度与优化目标不匹配。GSPO通过从逐token评分转向序列级优化使奖励和优化目标对齐。这一转变带来两个主要好处稳定性 - GSPO优化整个序列减少token级波动的训练噪声。 效率 - GSPO过滤并仅保留高质量样本进行优化加速收敛并改善结果。在MoE架构中好处更大由于每次推理仅激活专家模块的一小部分路由路径是动态且难以控制的。传统方法常依赖路由重放记录推理期间的专家激活并在训练期间强制执行相同路由以确保一致性。虽然有效但这大大增加工程成本并限制性能。GSPO的序列级逻辑自然避免了对路由重放的需求使MoE训练更轻量、更稳定。对于越来越多的大型MoE模型这是一项宝贵突破。例如QWen3系列已采用GSPO。从PPO → GRPO → GSPO我们看到LLMs的RL优化目标应与任务性质紧密对齐同时保持训练逻辑简单、可扩展和可部署。进步往往不是由复杂技巧驱动而是对核心问题的洞察。PPO在长文本和复杂任务中挣扎主要因其依赖价值模型当策略模型输出长序列时价值估计变得不准确难以从简单任务泛化到复杂任务。GRPO移除了这一依赖摆脱了价值模型瓶颈。然而GRPO在MoE训练或长时间训练中仍面临稳定性问题在某个时刻模型可能突然崩溃即使恢复训练或调整参数也难以恢复。接下来我们分析可能的原因和解决方案。3.1 重要性比率的作用及其在GRPO中的问题重要性采样允许我们在只有行为分布样本时估计目标分布下的期望。我们通过根据目标策略和行为策略的概率比加权样本来实现这一点。然而这种校正假设多个样本如果只有一个样本它无法有效调整分布偏移。大模型训练中的问题是重要性采样是逐token执行的单个token的比率无法有意义地执行分布校正。相反它引入了高方差噪声特别是在不稳定的MoE设置中。这表明GRPO的token级计算可能本质上次优。另一个不匹配我们的奖励是针对整个响应序列级给出的但在token级重要性采样中我们将此奖励均匀分布在token上奖励塑形并尝试单独调整它们。这造成奖励信号与优化目标间的粒度不匹配。既然我们已经有序列级奖励为什么不也使GRPO的优化序列级3.2 为什么GRPO在MoE架构中难以收敛专家激活波动新旧策略可能激活不同专家引入结构偏差和噪声。当$\pi_{\theta_{\text{old}}}$更新时路由器也可能改变因此两个策略可能激活完全不同的专家集即使仅经过一个训练步骤。这导致输出概率大幅波动异常频繁地触发裁剪。被裁剪的token不贡献梯度而保留的通常包含噪声。理论上重要性比率应反映相同结构下参数更新引起的概率变化。但专家变化导致与优化方向无关的不可预测、高方差波动。这种方差扭曲策略梯度估计使训练不稳定甚至导致崩溃。3.3 GSPO前的路由重放路由重放记录从$\pi_{\theta_{\text{old}}}$采样期间的专家激活并强制$\pi_{\theta}$在训练期间使用相同路由路径。缺点高工程和基础设施成本且效率低$\pi_{\theta}$可能找到更好的路由路径但被迫遵循旧的。虽然传统方法使用路由重放缓解专家激活不匹配GSPO完全绕过这一依赖从根本上减少结构方差。3.4 GSPO损失设计$$ \begin{aligned} \mathcal{J}{GSPO}(\theta) \mathbb{E}{q \sim P(Q),\ {o_{i}}{i 1}^{G} \sim \pi{\theta_{\text{old}}}(O | q)} \Bigg[\frac{1}{G} \sum_{i 1}^{G} \frac{1}{|o_i|} \sum_{t1}^{|o_i|} \Bigg(\min \Bigg(s_{i}(\theta) A_{i},\ \text{clip}\Big(s_{i}(\theta), 1-\varepsilon, 1\varepsilon\Big) A_{i}\Bigg) \Bigg] \end{aligned} $$$$ s_i({\theta}) {\left({\frac{\pi_\theta(o_i|q)}{\pi_{\theta_{\text{old}}}(o_i|q)}}\right)}^{\frac{1}{|o_i|}} \text{exp}\left(\frac{1}{|o_i|}\sum_{t1}^{|o_i|} \text{log} \frac{\pi_\theta(o_{i,t}|q,o_{i, t})}{\pi_{\theta_{\text{old}}}(o_{i,t}|q,o_{i, t})} \right) $$如果奖励是序列级的重要性比率也应是序列级的。从上式看GSPO用序列级比率$s_i(\theta)$替代GRPO的逐token比率$r_{i,t}(\theta)$不再与步骤索引$t$绑定。其思想是放弃token级目标转而采用序列级缩放。这自然引出GSPO的新优化目标用序列级重要性比率替代token级的。序列级比率经过长度归一化以减少方差并保持值在一致尺度上。没有归一化不同长度答案会使比率高度依赖长度。由于同一序列的所有token共享相同重要性比率裁剪如果触发将裁剪整个序列而非仅某些token。归一化因子$\frac{1}{|o_i|}$也防止长序列中少数波动token导致比率爆炸。为什么使用指数而非对数似然差直接指数化是必要的因为重要性采样的核心公式是$$ \mathbb{E}{z\sim \pi{\text{tar}}}[f(z)] \mathbb{E}{z\sim \pi{\text{beh}}} \left[ \frac{\pi_{\text{tar}}(z)}{\pi_{\text{beh}}(z)} f(z) \right] $$这里权重必须是概率比率$\ge 0$而非对数概率差。如果我们直接使用$\Delta \log p$相当于$$ \mathbb{E}\left[ \Delta \log p \cdot A \right], $$这不再是 unbiased 的重要性采样校正。GSPO通过对数空间中的$\frac{1}{|o_i|}$归一化然后指数化$$ s_i(\theta) \exp\left( \frac{1}{|o_i|} \sum_{t1}^{|o_i|} \log \frac{\pi_\theta(o_{i,t} \mid q, o_{i, t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i, t})} \right) $$这确保重要性比率在不同序列长度上缩放一致避免长序列中少数token概率偏移导致的极端值。保持在 log 空间而不指数化会使比率依赖长度需要调整裁剪范围并破坏与PPO/GRPO中使用的KL正则化的兼容性。3.5 理论梯度分析GSPO vs. GRPO从目标定义看关键区别在于如何定义和使用重要性比率进行梯度计算。没有裁剪时区别在于是否对同一响应中的token赋予不同权重。GRPO基于$r_{i,t}(\theta)$给每个token分配自己的权重而GSPO对序列中所有token应用相同的$s_i(\theta)$。GSPO的梯度$$ \nabla_\theta J_{\text{GSPO}}(\theta) \mathbb{E} \left[ \frac{1}{G} \sum_{i1}^G s_i(\theta) , A_i \cdot \frac{1}{|o_i|} \sum_{t1}^{|o_i|} \nabla_\theta \log \pi_\theta(o_{i,t} \mid q, o_{i, t}) \right] $$这里响应中的所有token共享相同权重$s_i(\theta) A_i / |o_i|$确保序列内梯度一致性。GRPO的梯度$$ \nabla_\theta J_{\text{GRPO}}(\theta) \mathbb{E} \left[ \frac{1}{G} \sum_{i1}^G \frac{\hat{A}i}{|o_i|} \sum{t1}^{|o_i|} r_{i,t}(\theta) , \nabla_\theta \log \pi_\theta(o_{i,t} \mid q, o_{i, t}) \right] $$这里权重$r_{i,t}(\theta) A_i / |o_i|$随token位置和上下文变化导致更高方差尤其在长序列或MoE模型中。另一个区别是裁剪如何与这些比率交互。对于正优势样本GRPO的比率范围大致为[0,1.x]对于负优势样本可为[0.x, ∞)范围大得多。在长序列中这种不对称性的噪声会累积导致GRPO下MoE的不稳定性。奖励指标在检测模型漂移时也滞后问题出现时模型可能已偏离一段时间。实验显示GSPO用更少有效token因更积极裁剪训练却实现更高训练效率。总之GSPO实现序列内一致梯度权重减少token间方差特别适合长序列和MoE场景的稳定训练。它的引入标志着从PPO → GRPO → GSPO的转变从依赖价值模型的token级优化转向与任务性质对齐的序列级优化。