从 GRPO 到 DAPO 和 GSPO:是什么、为什么、怎么做

社区文章 发布于 2025 年 8 月 9 日

在大型语言模型的强化学习阶段,PPO 曾是主流方法。然而,它对价值模型的依赖在处理长文本输出和复杂任务时显露出局限性。GRPO 摆脱了对价值模型的依赖,显著提升了可扩展性,但在效率和稳定性上仍有优化空间。这催生了 DAPO,它在采样、裁剪和梯度计算等细节上进行了优化。然而,在动态激活专家的 MoE 架构中,GRPO 框架下的令牌级优化仍然难以稳定收敛。GSPO 更进一步,将优化粒度转移到序列级别,从根本上降低了高方差和结构性噪声。本文将遵循这一演进路径:从 GRPO 出发,逐步揭示 DAPO 和 GSPO 背后的设计动机和实现细节。

在接下来的文章中,你将了解到

  1. 为什么 GRPO 摆脱了 PPO 对价值模型的依赖,但在某些场景下仍然会“崩溃”。
  2. “更高裁剪”(Clip-Higher)如何修复好令牌过早被限制的隐藏问题。
  3. 动态采样如何防止因无效样本而造成的大量计算浪费。
  4. 令牌级梯度损失如何确保长响应不再稀释有价值的梯度信号。
  5. 为什么 GRPO 的逐令牌重要性采样在 MoE 架构中会产生巨大方差。
  6. GSPO 如何用序列级优化取代令牌级优化,从根本上提高稳定性和效率。

GRPO 回顾

GRPO 的训练目标是:

JGRPO(θ)=EqP(Q), {oi}i=1Gπθold(Oq)[1Gi=1G1oit=1oi(min(ri,t(θ)Ai, clip(ri,t(θ),1ε,1+ε)Ai)− β DKL(πθ  πref))] \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_{t=1}^{|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}

其中

ri,t(θ)=πθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t) 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})}

Ai=rimean({r1,r2,,rG})std({r1,r2,,rG}) A_{i}=\frac{r_{i}-\text{mean}\left(\left\{r_{1}, r_{2}, \cdots, r_{G}\right\}\right)}{\text{std}\left(\left\{r_{1}, r_{2}, \cdots, r_{G}\right\}\right)}

理解了 GRPO 的目标后,我们首先需要明确**重要性采样**的作用和局限性,这不仅是理解 GRPO 的关键,也是理解 DAPO 和 GSPO 改进的切入点。

重要性比率的作用是什么?

重要性采样的本质是,我们希望计算新分布下的期望,但我们的数据是从旧分布中抽取的。因此,我们使用新旧策略下相同动作的概率比作为修正权重。

Epnew[f(x)]=Epold[pnew(x)pold(x)f(x)] \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**。在更新时,我们必须纠正分布不匹配的问题,这就是重要性采样的用武之地。将采样后每个令牌的重要性比率定义为:

rt=πθ(atst)πθold(atst), r_t = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)},

PPO/GRPO 的目标可以写成:

L(θ)=Et[min(rtAt,CLIP(rt,1ϵ,1+ϵ)At)] L(\theta) = \mathbb{E}_t \left[\min(r_tA_t, \text{CLIP}(r_t, 1-\epsilon, 1+\epsilon)A_t)\right]

在这里,AtA_t 是计算出的优势,而裁剪操作限制了更新幅度,以防止策略偏离旧策略太远。

有了对重要性采样的直观理解,我们可以进一步思考它在 PPO/GRPO 中的实际效果:优势函数 AtA_t 的符号和比率 rtr_t 共同决定了策略更新的方向和幅度。

AtA_trtr_t 的符号如何影响训练?

我们来分析一下各种情况。假设 At>0A_t > 0 (动作比预期要好),我们希望增加这个动作的概率。如果我们在裁剪中设置 ϵ=0.2\epsilon = 0.2,那么当 rt>1.2r_t > 1.2 时,`min` 和 `clip` 操作会将其限制在 1.2。当 rt<0.8r_t < 0.8 时,由于 `min` 操作,不会发生裁剪,因此正优势的向上变化是受限的。

反之,当 At<0A_t < 0(该行为差于预期)时,我们应该降低该行为的概率。如果 rt<0.8r_t < 0.8min 操作会进一步限制它,上限为 0.8At0.8A_t;但当 rt>1.2r_t > 1.2 时,min 操作则不施加限制(可以达到 ++\infty,带上负号后变为 -\infty)。因此,对于负优势的向下调整也是有界的。AtA_t 衡量当前行为/轨迹比平均水平好还是差。如果 AtA_t 为正,我们鼓励它;如果为负,我们惩罚它,使其在未来出现的可能性降低。重要性比率 rtr_t 反映了新策略选择该行为的可能性与旧策略相比增加了多少(或减少了多少)。如果 rt>1r_t > 1,新模型更偏好该行为;如果 rt<1r_t < 1,则不那么偏好。在 AtA_trtr_t 的四种符号组合中,我们只希望出现两种:当它们符号相同时,即正的 AtA_t 加上 rt>1r_t > 1(强化),或者负的 AtA_t 加上 rt<1r_t < 1(纠正错误)。

然而,仅仅匹配 AtA_trtr_t 的符号是不够的。在 PPO/GRPO 中,**截断操作 (clipping operation)** 对于稳定的训练同样至关重要,因为它决定了哪些词元 (token) 的梯度真正对更新做出贡献。

截断对梯度和词元效率的影响

对于 At>0A_t > 0 的情况,当 rt>1+ϵr_t > 1 + \epsilon,即增幅达到上限时,我们应用截断,梯度变为零。这有效地抵消了该词元对训练的贡献。类似地,对于 At<0A_t < 0,如果 rt<1ϵr_t < 1 - \epsilon,即降幅超过上限,截断也会将梯度置为零。一个常见的误解是,截断使用直通估计器 (straight-through estimator) 将截断值的梯度传回给未截断的值;实际上,这并不会发生:截断前的梯度直接被置为零。

至此,我们对 GRPO 的机制、优势和局限性有了较为完整的理解。接下来,我们将看到 DAPO 如何在保留 GRPO 基本框架的同时,引入更精细的改进来解决效率和稳定性方面的挑战。

从 GRPO 到 DAPO

DAPO 的出发点非常直接:在实际训练中,GRPO 常常因为不合理的截断范围、冗余采样以及长序列中的梯度稀释等问题,浪费了大量的学习信号。DAPO 通过四项针对性的改进来解决这些问题。

JDAPO(θ)=E(q,a)P(Q), {oi}i=1Gπθold(Oq)[1i=1Goii=1Gt=1oimin(ri,t(θ)Ai, clip(ri,t(θ),1εlow,1+εhigh)Ai)] \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_{i=1}^G |o_i|} \sum_{i = 1}^{G} \sum_{t=1}^{|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]

s.t.,0<{oiis_equivalent(a,oi)}<G \text{s.t.}, 0 < |\{o_i | \text{is\_equivalent} (a, o_i)\}| < G

为什么 DAPO 要提高上界 1+ϵhigh1+\epsilon_{\text{high}} 而保持 1ϵlow1-\epsilon_{\text{low}} 不变?

作者观察到,选择一个小的 ϵ\epsilon 作为截断上界会导致以下问题:如果旧策略对一个采样到的词元分配了非常低的概率,而其优势值为正(意味着旧模型采样到了非常好的东西),那么当前策略增加其概率的空间就很小,即使增加概率正是我们想要的。

例如,如果旧策略的概率是 0.9,且 ϵ=0.2\epsilon=0.2,上界为 0.9×1.2=1.080.9 \times 1.2 = 1.08,已经超过了最大概率 1.0,所以永远不会被截断。但如果旧策略的概率是 0.2,上界则变为 0.240.24。在这种情况下,即使当前策略将概率提高到 0.4(一个很好的改进),过小的 ϵ\epsilon 也会导致它被截断,从而有效地丢弃了这个词元。这就是为什么 DAPO 采用 **Clip-Higher**,提高上界能提升词元效率的原因。

这本质上就是我们所说的“马太效应”:富者愈富,穷者难以翻身。如果旧策略好不容易以极低的概率采样到一个关键的词元,比如 `“等等”`,但当前模型显著提高了这个概率,它仍然可能被截断掉,剥夺了模型“翻盘”的机会。

Clip-Higher 解决了“好词元过早被限制”的问题,但它没有解决另一个常见的浪费来源:缺乏采样多样性。为了解决这个问题,DAPO 引入了**动态采样 (Dynamic Sampling)**。

DAPO - 动态采样

DAPO 的第二项创新是**动态采样 (Dynamic Sampling)**。其动机如下:假设对于给定的一个查询,我们采样了 10 个回答,而这 10 个回答要么都非常好,要么都非常差,始终获得最大奖励或零奖励。由于 GRPO 的计算方式,这 10 个样本的优势值都将为零,因此贡献的梯度也为零。

这意味着有效贡献梯度的样本数量远低于名义上的样本数,这导致了高方差、不稳定的训练和样本浪费。这种效应在训练初期(模型较差时)和后期(模型非常好以至于频繁产生完美回答时)尤其明显。

为了解决这个问题,DAPO 强制执行一个额外的采样规则:对于每个查询,采样到的回答集合不能全部奖励为 0 或 1。如果所有样本都是 0 或所有都是 1,则会抽取额外的样本,直到这个条件被打破。这在约束条件中表示为

s.t.,0<{oiis_equivalent(a,oi)}<G \text{s.t.}, 0 < |\{o_i | \text{is\_equivalent} (a, o_i)\}| < G

这确保了对于相同的输入,采样集合中既包含正确答案,也包含错误答案。

除了采样多样性之外,GRPO 对长回答还有一个隐藏的缺陷:**随着回答长度增加,词元梯度被稀释**。DAPO 的第三项改进通过**词元级梯度损失 (Token-Level Gradient Loss)** 来解决这个问题。

DAPO - 词元级梯度损失

DAPO 的第三项创新修复了 GRPO 中每个词元的梯度权重随着采样回答长度增加而减小的问题。

为什么会这样?假设我们采样了两次:一个回答有 200 个词元,另一个有 10 个词元。在 GRPO 的公式中,我们首先在每个样本内部平均梯度,然后在整个批次中平均。这使得第一个回答中的每个词元权重为 (1/200)×(1/2)(1/200) \times (1/2),而第二个回答中的每个词元权重为 (1/10)×(1/2)(1/10) \times (1/2)。因此,较短回答的词元影响力要大得多。

缺点很明显:对于更难的问题,长回答很常见。如果这类回答质量很高,其宝贵的梯度信号会被稀释。如果它们质量差,仅仅因为重复或冗长而变长,那么纠正信号也会减弱。

DAPO 的解决方案是:在计算梯度时,对所有样本生成的总词元数进行平均。在我们的例子中,长回答和短回答都使每个词元的权重为 1/(200+10)1/(200+10)。这使得所有词元被同等对待,提高了长样本训练的效率。

这对应于将损失聚合方式从 GRPO 的

1Gi=1G1oit=1oi \frac{1}{G} \sum_{i = 1}^{G} \frac{1}{|o_i|} \sum_{t=1}^{|o_i|}

改为 DAPO 的

1i=1Goii=1Gt=1oi \frac{1}{\sum_{i=1}^G |o_i|} \sum_{i = 1}^{G} \sum_{t=1}^{|o_i|}

经验表明,词元级损失能带来更稳定的训练,防止熵变得过高(导致策略随机行动),并避免熵过低时的探索崩溃(Clip-Higher 也有助于解决此问题)。通过从样本级损失转向词元级损失,DAPO 确保长回答对最终梯度的贡献是成比例的:每个词元直接影响整体梯度,与其所在的样本长度无关。

最后一项改进也与回答长度有关,但从另一个角度切入:**过长回答对整体奖励的负面影响**。

DAPO - 过长奖励调整

DAPO 的第四项改进使用一种**软惩罚**机制来调整过长回答的奖励。具体来说,一旦生成的序列超过预定义的第一个长度阈值,它就会对词元进行惩罚,惩罚力度随着长度线性增加。如果长度超过第二个阈值,惩罚力度将大到足以抵消正确答案的原始奖励,有效地模拟了过长回答被视为无效的情景。


通过 Clip-Higher、动态采样、词元级梯度损失和过长奖励调整,DAPO 对 GRPO 进行了精细的优化,显著提高了训练效率和稳定性。然而,在某些架构中,特别是混合专家模型 (MoE),GRPO 仍然存在 DAPO 无法完全解决的结构性问题,这就引出了 GSPO。

GSPO:解决 MoE 训练中 GRPO 的不稳定性

如果说 DAPO 是在 GRPO 框架内的“微调和完善”,那么 GSPO 则迈出了更根本的一步:它将优化粒度从词元级改为序列级。这一转变的动机源于,在使用 MoE 架构进行训练时,GRPO 的重要性采样会引入较大的方差和不稳定性。GSPO 的核心思想是在处理奖励时减少对逐词元优化的依赖,而更加强调整体序列的结果。下面,我们介绍 GSPO 背后的主要概念。

长话短说: 像 PPO 和 GRPO 这样的传统算法通常会单独优化模型输出中的每个词元,给予某些词元更高的权重,而另一些则更低。虽然这旨在实现精细化优化,但在长文本、大模型的场景中,它反而会引入噪声和奖励偏差,导致模型迷失方向,甚至突然崩溃。问题的根源在于,我们基于完整的回答来评估模型,却逐个词元地训练它,导致奖励粒度与优化目标不匹配。GSPO 通过从逐词元评分转向序列级优化,使奖励和优化目标保持一致。这种转变为带来两大好处:

  1. 稳定性 – GSPO 优化整个序列,减少了来自词元级波动的训练噪声。
  2. 效率 – GSPO 筛选并仅保留高质量样本进行优化,从而加速收敛并改善结果。
    在 MoE 架构中,好处更大:由于每次推理只激活一小部分专家模块,路由路径是动态且难以控制的。传统方法通常依赖**路由重放 (Routing Replay)**,即在推理时记录专家激活,并在训练时强制使用相同的路由,以确保一致性。虽然有效,但这极大地增加了工程成本并限制了性能。GSPO 的序列级逻辑自然地避免了对路由重放的需求,使得 MoE 训练更轻便、更稳定。对于越来越多的大型 MoE 模型来说,这是一个宝贵的突破。例如,Qwen2 系列就采用了 GSPO。从 PPO → GRPO → GSPO,我们看到大语言模型的强化学习优化目标应与任务性质紧密对齐,同时保持训练逻辑简单、可扩展和可部署。进步往往不是由复杂的技巧驱动,而是源于对核心问题的洞察。

PPO 在长文本和复杂任务中表现不佳,主要因为它依赖于价值模型:当策略模型输出长序列时,价值估计变得不准确,使其难以从简单任务泛化到复杂任务。GRPO 摆脱了这种依赖,打破了价值模型的瓶颈。然而,GRPO 在 MoE 训练或长时间训练中仍然面临稳定性问题:在某个时刻,模型会突然崩溃,即使恢复训练或调整参数也常常无法挽救。接下来,我们来分析可能的原因和解决方案。

重要性比率扮演什么角色,为什么它在 GRPO 中存在问题?

重要性采样使我们能够在我们只有来自行为分布的样本时,估计目标分布下的期望值。我们通过根据目标策略和行为策略之间的概率比率对样本进行加权来实现这一点。然而,这种校正假设有多个样本,如果只有一个样本,它无法有效地调整分布偏移。

在大模型训练中的问题在于,重要性采样是**按词元 (per-token)** 执行的,单个词元的比率无法有意义地进行分布校正。相反,它引入了高方差的噪声,尤其是在不稳定的 MoE 环境中。这表明 GRPO 的词元级计算可能在根本上是次优的。

另一个不匹配之处:我们的奖励是针对**整个回答**(序列级)给出的,但在词元级重要性采样中,我们将这个奖励均匀地分散到各个词元上(奖励塑造),并试图单独调整它们。这在奖励信号和优化目标之间造成了粒度不匹配。既然我们已经有了序列级奖励,为什么不也让 GRPO 的优化成为序列级的呢?

为什么 GRPO 在 MoE 架构中难以收敛?

专家激活的波动性: 新旧策略可能会激活不同的专家,从而引入结构性偏差和噪声。当 πθold\pi_{\theta_{\text{old}}} 被更新时,路由器 (router) 可能也会改变,所以即使只经过一个训练步骤,两个策略也可能激活完全不同的专家组。这会导致输出概率的大幅波动,从而异常频繁地触发截断。被截断的词元不贡献梯度,而剩下的词元通常包含噪声。

理论上,重要性比率应反映在**相同**结构下由参数更新引起的概率变化。但专家的改变会导致与优化方向无关的、不可预测的高方差波动。这种方差扭曲了策略梯度的估计,使训练不稳定,甚至导致崩溃。

GSPO 之前的路由重放

路由重放(Routing Replay)在从 πθold\pi_{\theta_{\text{old}}} 采样期间记录专家(expert)的激活情况,并强制 πθ\pi_{\theta} 在训练期间使用相同的路由路径。其缺点是:工程和基础设施成本高、效率低下,并且 πθ\pi_{\theta} 可能已经找到了更好的路由路径,却被迫遵循旧的路径。

传统方法使用路由重放来缓解专家激活不匹配的问题,而 GSPO 则完全绕过了这种依赖,从根本上减少了结构方差。

GSPO 损失函数设计

JGSPO(θ)=EqP(Q), {oi}i=1Gπθold(Oq)[1Gi=1G1oit=1oi(min(si(θ)Ai, clip(si(θ),1ε,1+ε)Ai)] \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_{t=1}^{|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}

si(θ)=(πθ(oiq)πθold(oiq))1oi=exp(1oit=1oilogπθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t)) 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_{t=1}^{|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 将 GRPO 的逐词元(per-token)比率 ri,t(θ)r_{i,t}(\theta) 替换为序列级别(sequence-level)的比率 si(θ)s_i(\theta),后者不再与步长索引 tt 绑定。其思想是放弃词元级别的目标,转而采用序列级别的缩放。这自然引出了 GSPO 的新优化目标:用序列级别的重要性比率替换词元级别的重要性比率。

序列级别的比率经过长度归一化(length-normalized),以减少方差并将数值保持在一致的尺度上。若不进行归一化,不同长度的回答会使比率对长度高度敏感。由于同一序列中的所有词元共享相同的重要性比率,裁剪(如果触发)将裁剪整个序列,而不仅仅是某些词元。归一化因子 1oi\frac{1}{|o_i|} 也防止了长序列中少数不稳定的词元导致比率爆炸。

为什么要使用指数化,而不是直接使用对数似然差异?

指数化是必要的,因为重要性采样的核心公式是:

Ezπtar[f(z)]=Ezπbeh[πtar(z)πbeh(z)f(z)] \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]

在这里,权重必须是概率比率0\ge 0),而不是对数概率的差值。如果我们直接使用 Δlogp\Delta \log p,它将等价于:

E[ΔlogpA], \mathbb{E}\left[ \Delta \log p \cdot A \right],

这不再是一个无偏的重要性采样校正。

GSPO 在对数空间中通过 1oi\frac{1}{|o_i|} 进行归一化,然后进行指数化:

si(θ)=exp(1oit=1oilogπθ(oi,tq,oi,<t)πθold(oi,tq,oi,<t)) s_i(\theta) = \exp\left( \frac{1}{|o_i|} \sum_{t=1}^{|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)

这确保了不同序列长度的重要性比率能够一致地缩放,避免了长序列中少数词元概率变化导致极端值。如果不进行指数化而停留在对数空间,会使比率对长度敏感,需要调整裁剪范围,并破坏与 PPO/GRPO 中使用的 KL 正则化的兼容性。

理论梯度分析:GSPO 与 GRPO 的对比

根据目标的定义,关键区别在于重要性比率在梯度计算中的定义和使用方式。

在不进行裁剪的情况下,区别在于是否对同一回应中的不同词元赋予不同的权重。GRPO 根据 ri,t(θ)r_{i,t}(\theta) 为每个词元分配其自身的权重,而 GSPO 则对一个序列中的所有词元应用相同的 si(θ)s_i(\theta)

GSPO 的梯度

θJGSPO(θ)=E[1Gi=1Gsi(θ)Ai1oit=1oiθlogπθ(oi,tq,oi,<t)] \nabla_\theta J_{\text{GSPO}}(\theta) = \mathbb{E} \left[ \frac{1}{G} \sum_{i=1}^G s_i(\theta) \, A_i \cdot \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \nabla_\theta \log \pi_\theta(o_{i,t} \mid q, o_{i,< t}) \right]

在这里,一个响应中的所有词元(token)共享相同的权重 si(θ)Ai/ois_i(\theta) A_i / |o_i|,确保了序列内部梯度的一致性。

GRPO的梯度

θJGRPO(θ)=E[1Gi=1GA^ioit=1oiri,t(θ)θlogπθ(oi,tq,oi,<t)] \nabla_\theta J_{\text{GRPO}}(\theta) = \mathbb{E} \left[ \frac{1}{G} \sum_{i=1}^G \frac{\hat{A}_i}{|o_i|} \sum_{t=1}^{|o_i|} r_{i,t}(\theta) \, \nabla_\theta \log \pi_\theta(o_{i,t} \mid q, o_{i,< t}) \right]

在这里,权重 ri,t(θ)Ai/oir_{i,t}(\theta) A_i / |o_i| 因词元位置和上下文而异,导致方差更高,尤其在长序列或混合专家(MoE)模型中。

另一个区别在于裁剪(clipping)如何与这些比率相互作用。对于正优势(positive-advantage)样本,GRPO 的比率范围大约是 [0, 1.x];对于负优势(negative-advantage)样本,其范围可以是 [0.x, ∞),这是一个更宽的范围。在长序列中,这种不对称性产生的噪声会累积,导致 GRPO 下 MoE 的不稳定性。

奖励指标在检测模型漂移方面也存在滞后,当问题出现时,模型可能已经偏离了一段时间。实验表明,GSPO 用更少的有效词元(由于更激进的裁剪)进行训练,却实现了更高的训练效率。


总而言之,GSPO 实现了序列内一致的梯度权重,减少了词元间的方差,特别适用于长序列和 MoE 场景下的稳定训练。它的引入标志着从 PPO → GRPO → GSPO 的转变,从依赖价值模型的词元级优化转向与任务性质更一致的序列级优化。

社区

注册登录 以发表评论