一文读懂GRPO算法&热门变体演化

LLM后训练算法梳理(2)-GRPO算法

在上一篇 PPO 算法中(https://zhuanlan.zhihu.com/p/2076432345247245043),我们已经介绍过,PPO 在训练 LLM 时主要需要维护 actor 和 critic 两个需要训练参数的网络。其中 actor 就是我们最终希望优化的语言模型,而 critic 则负责预测每一个状态的价值函数 \(V_\phi(s_t)\),并进一步通过 TD error 和 GAE 构造 advantage。

简单来说,PPO 中 advantage 的来源可以概括成

\[s_t \rightarrow V_\phi(s_t) \rightarrow \delta_t \rightarrow A_t^{GAE}. \]

critic 的存在能够为不同 token 提供更加细粒度的 credit assignment,但代价也非常明显:对于一个参数规模达到数十亿甚至数百亿的 LLM 来说,critic 通常同样需要一个规模很大的 Transformer backbone。也就是说,为了训练一个 policy,我们还需要额外维护和训练一个 value model。

GRPO(Group Relative Policy Optimization)最早由 DeepSeekMath 提出,它最核心的修改就是:直接删除 critic,通过同一个问题下多次 rollout 得到的相对 reward 来估计 advantage。

1. GRPO算法

对于一个问题 \(q\),GRPO 首先使用 old policy \(\pi_{\theta_{\text{old}}}\) 采样 \(G\) 个回答:

\[\{o_i\}_{i=1}^{G} \sim \pi_{\theta_{\text{old}}}(\cdot|q). \]

然后分别计算每个回答的 reward:

\[R_1,R_2,\ldots,R_G. \]

在最常见的 outcome supervision 场景下,GRPO 使用这一组 reward 的均值和标准差对每个回答进行标准化:

\[\hat A_i = \frac{ R_i-\operatorname{mean}(R_1,\ldots,R_G) }{ \operatorname{std}(R_1,\ldots,R_G) }. \]

这里的 \(\hat A_i\) 就取代了 PPO 中通过 critic 和 GAE 得到的 advantage。

举一个最简单的例子。假设对一道数学题 rollout 4 次,rule-based verifier 得到 reward

\[[1,1,0,0]. \]

那么均值为 \(0.5\),前两个正确回答得到正 advantage,后两个错误回答得到负 advantage。模型接下来就会提升正确回答中 token 的生成概率,并降低错误回答中 token 的生成概率。

因此 GRPO 的 advantage 实际上估计的是的是:

“这个回答,相比当前模型对同一道题生成的其他回答,到底表现得更好还是更差?”

GRPO在这种情况下,一个完整 response \(o_i\) 最终只得到一个 reward,因此同一个 response 中的所有 token 通常共享同一个 group-relative advantage:

\[\hat A_{i,1} = \hat A_{i,2} = \cdots = \hat A_{i,|o_i|} = \hat A_i. \]

这意味着 GRPO 的 credit assignment 相比 PPO+GAE 更粗粒度。它并不知道“究竟是哪一个 token 导致数学题最终算对了”,而只是认为:既然整个 response 比同组其他 response 更好,那么这个 response 中采样出来的 token 整体都应该受到正向强化。

但这并不意味着所有 token 最后的梯度完全一样,因为每个 token 仍然具有不同的生成概率、importance ratio 和 \(\nabla_\theta\log\pi_\theta\)

2. GRPO: 优化目标

GRPO 并没有抛弃 PPO 的 clipping 机制,而是基本继承了 PPO-Clip 的结构。

对于第 \(i\) 个 response 的第 \(t\) 个 token,定义 importance ratio:

\[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}) }. \]

它和 PPO 中的 ratio 完全是同一个含义:

  • \(\pi_{\theta_{\text{old}}}\) 是生成当前这批 rollout 数据的策略;
  • \(\pi_\theta\) 是当前正在进行梯度更新的策略;
  • \(r_{i,t}>1\) 表示 current policy 提升了这个 token 的概率;
  • \(r_{i,t}<1\) 表示 current policy 降低了这个 token 的概率。

原始 GRPO 的 clipped objective 可以写为

\[\begin{aligned} J_{\text{GRPO}}(\theta) = E\Bigg[ \frac{1}{G} \sum_{i=1}^{G} \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \Big\{ & \min[ r_{i,t}(\theta)\hat A_i,\\ & \operatorname{clip} (r_{i,t}(\theta),1-\epsilon,1+\epsilon)\hat A_i ] - \beta D_{\mathrm{KL}} (\pi_\theta\Vert\pi_{\mathrm{ref}}) \Big\} \Bigg]. \end{aligned} \]

其中 clipping 部分和我们在 PPO 中已经讨论过的逻辑完全一致。

\(\hat A_i>0\) 时,说明第 \(i\) 个 response 是一个相对较好的回答,因此希望提升其中 token 的概率;但是如果某个 token 已经满足

\[r_{i,t}>1+\epsilon, \]

则说明它的概率相对于 rollout 时已经被提升很多,这个 sample 不再提供继续增大其概率的梯度。

\(\hat A_i<0\) 时,说明这个回答相对较差,因此希望降低其中 token 的生成概率;但如果

\[r_{i,t}<1-\epsilon, \]

则说明其概率已经被降低很多,同样停止继续沿这个方向更新。

3. GRPO完整训练流程

GRPO 的整个训练过程可以概括为一个外层 reference 更新循环,以及一个内层 rollout-policy update 循环。

首先,在每一个 outer iteration 开始时,将当前 policy 保存为 reference policy:

\[\pi_{\text{ref}}\leftarrow \pi_\theta. \]

在接下来的这一整个 outer iteration 中,\(\pi_{\text{ref}}\) 保持固定,用于计算 KL regularization,限制当前 policy 不要偏离这一阶段开始时的模型太远。

随后进入内部的 GRPO 训练循环。

  • 首先,从训练集中采样一个 batch 的 prompts:

\[q_1,q_2,\ldots,q_B. \]

  • 将当前 policy 保存为 old policy用于进行rollout:

\[\pi_{\text{old}}\leftarrow\pi_\theta. \]

  • 对于每一个 prompt,使用 old policy rollout \(G\) 次(这里的 \(\pi_{\text{old}}\) 就是真正生成当前这批训练数据的策略,因此在之后计算 importance ratio 时,它会作为 denominator。):

\[q \xrightarrow{\pi_{\text{old}}} o_1,o_2,\ldots,o_G. \]

  • 然后使用 reward model 或 verifier 对每个 response 进行评分:

\[o_i \xrightarrow{\text{Reward/Verifier}} R_i. \]

  • 接着进行 group relative advantage estimation:

\[R_1,\ldots,R_G \rightarrow \hat A_1,\ldots,\hat A_G. \]

  • 然后重新使用当前 policy \(\pi_\theta\) 计算这些已经生成好的 token 的概率,并与生成这些数据时的 old policy 进行比较,从而得到 importance ratio:

\[r_{i,t}(\theta) = \frac{ \pi_\theta(o_{i,t}|q,o_{i,<t}) }{ \pi_{\text{old}}(o_{i,t}|q,o_{i,<t}) }. \]

  • 与此同时,使用在 outer iteration 开始时保存的 reference policy 计算 KL penalty:

\[D_{\mathrm{KL}} \left( \pi_\theta \Vert \pi_{\text{ref}} \right). \]

  • 因此,计算出GRPO 的优化目标

\[\min \left[ r_{i,t}(\theta)\hat A_i,\, \operatorname{clip} (r_{i,t}(\theta),1-\epsilon,1+\epsilon)\hat A_i \right]-\beta D_{\mathrm{KL}} \left( \pi_\theta \Vert \pi_{\text{ref}} \right). \]

用于更新更新当前 policy:

\[\theta \leftarrow \theta+\alpha\nabla_\theta J_{\text{GRPO}}. \]

经过若干次 update 后,当前 policy 已经发生变化。进入下一轮 rollout 时,再重新执行

\[\pi_{\text{old}}\leftarrow\pi_\theta, \]

使用最新的 policy 作为新的 old policy 生成下一批 responses,然后重复这一整个 inner training loop。此时 \(\pi_{\text{old}}\) 会随着每一轮新的 rollout 不断更新,而 \(\pi_{\text{ref}}\) 始终保持为该 outer iteration 开始时保存的模型。

直到当前 outer iteration 结束,进入下一轮 outer iteration 时,才再次执行:

\[\pi_{\text{ref}}\leftarrow\pi_\theta. \]

4. Dr.GRPO:重新检查GRPO中的Normalization

2025 年的论文 Understanding R1-Zero-Like Training: A Critical Perspective 对 R1-Zero 风格的 RL 训练进行了系统分析,并指出 GRPO 中存在两个非常重要的 optimization bias,随后提出 Dr.GRPO。

第一个问题来自 reward standard deviation normalization。原始 GRPO 使用

\[\hat A_i = \frac{R_i-\bar R}{\sigma_R}. \]

这里减去均值非常容易理解,因为我们希望衡量一个 response 相对于同组平均水平的好坏。但是为什么一定还要除以 \(\sigma_R\)?假设两个问题的 reward 分别为

\[[1,1,1,0] \]

\[[1,1,0,0]. \]

两组 reward 的标准差不同。如果再除以各自的 \(\sigma_R\),就意味着不同问题的 advantage 被乘上不同的缩放系数。

也就是说,group std normalization 改变了不同问题对最终 gradient 的相对权重。Dr.GRPO 将这种现象称为 question-level difficulty bias:std 较小的 group 会得到更大的缩放。这意味着模型会更倾向于优化那些 reward 波动较小的问题,而忽略 reward 波动较大的问题。

因此 Dr.GRPO 的一个核心修改是去掉 group std normalization,直接使用 centered reward:

\[\hat A_i = R_i-\bar R. \]

第二个问题来自 response length normalization。

原始 GRPO 对每一个 response 内部的 token loss 先求平均:

\[L_i = \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} L_{i,t}. \]

然后再在 \(G\) 个 responses 间求平均。这个看似非常自然的操作实际上会导致 length bias。例如有两个错误 response:

\[\hat A_1=\hat A_2<0, \]

其中一个长度为 100,另一个长度为 1000。由于每个 response 最后都除以自己的长度,长 response 中单个 token 对 loss 的贡献会更小。因此对于负 advantage 的错误回答,越长的 response 受到的单 token 惩罚反而越弱。反过来,对于正 advantage 的正确回答,短 response 中每个 token 所获得的正向更新会更强。

作者因此观察到一种不健康的优化倾向:

  • 正确回答倾向更短,错误回答反而可能越来越长

Dr.GRPO 对此采用固定常数而不是实际 response length 进行归一化。论文实现中使用整个训练过程中固定的最大生成长度 \(L\) 与 group 大小 \(G\) 的乘积 \(GL\) 进行归一化:

\[J_{\text{Dr.GRPO}} \propto \frac{1}{GL} \sum_{i=1}^{G} \sum_{t=1}^{|o_i|} L_{i,t}. \]

因为 \(GL\) 与具体 sample 的实际生成长度无关,因此它不会改变不同 response 之间本应具有的相对 gradient weighting。

最终,Dr.GRPO objective 是:

\[\boxed{ \begin{aligned} J_{\mathrm{Dr.GRPO}}(\theta) = \mathbb E_{\substack{ q\sim p_Q,\\ \{o_i\}_{i=1}^{G}\sim \pi_{\theta_{\mathrm{old}}}(\cdot|q) }} \Bigg[ \frac1G \sum_{i=1}^{G} \sum_{t=1}^{|o_i|} \min\Big( &r_{i,t}(\theta)\hat A_i,\\ & \operatorname{clip} (r_{i,t}(\theta),1-\epsilon,1+\epsilon) \hat A_i \Big) \Bigg]. \end{aligned} } \]

5.DAPO:面向大规模Reasoning RL的GRPO改造

DAPO,全称 Decoupled Clip and Dynamic sAmpling Policy Optimization,由 ByteDance Seed 等团队在 2025 年提出。作者使用 Qwen2.5-32B Base 进行大规模 RL,并在 AIME 2024 上取得 50 分,同时完整公开了训练 recipe、数据和基于 verl 的实现。

DAPO 是Seed团队对 GRPO 工程和算法层面的一次系统性修改,核心改动可以总结为:

  • Clip-Higher
  • Dynamic Sampling
  • Token-Level Policy Gradient Loss
  • Overlong Reward Shaping

我们来依次讲解

5.1 Clip-Higher

PPO/GRPO 中通常使用对称的 clipping:

\[r_{i,t}\in [1-\epsilon,1+\epsilon]. \]

但根据我们上一篇 PPO 中讨论过的 clipping 机制,当 advantage 为正时,真正限制 probability 上升的是 upper clip:

\[1+\epsilon. \]

DAPO 观察到 reasoning RL 训练过程中可能出现 entropy collapse:模型越来越倾向于少数高概率 token,探索能力逐渐下降。因此 DAPO 将上下 clipping threshold 解耦:

\[\operatorname{clip} ( r_{i,t}, 1-\epsilon_{\text{low}}, 1+\epsilon_{\text{high}} ), \]

并设置

\[\epsilon_{\text{high}} > \epsilon_{\text{low}}. \]

也就是说,对于一个正 advantage 的好 response,如果其中某些 token 原本概率较低,但当前训练信号认为它们应该被提升,那么允许 policy 对这些 token 做更大的概率增长。

也就是说,DAPO 更倾向于降低概率仍然谨慎,提高 promising token 的概率可以更大胆一些.作者将这一方法称为 Clip-Higher,并观察到它有助于保持训练过程中的生成 diversity,缓解 entropy collapse。

5.2 Dynamic Sampling

考虑 RLVR 中最常见的 \(0/1\) reward。假设对一个 prompt rollout 8 次:

\[[1,1,1,1,1,1,1,1]. \]

那么

\[R_i-\bar R=0. \]

所有 response 的 advantage 都为 0。同理,如果是

\[[0,0,0,0,0,0,0,0], \]

同样没有任何有效梯度。

这意味着两种问题实际上都不能为当前训练提供有效的 group-relative signal:

  • 太简单:所有 rollout 都答对;
  • 太困难:所有 rollout 都答错。

如果一个 batch 中包含很多这样的 prompt,那么虽然 GPU 做了大量 rollout 和 forward,但真正参与 policy gradient 的有效样本却很少。DAPO 因此使用 Dynamic Sampling:持续采样 prompts,并过滤掉 group accuracy 等于 0 或 1 的 group,直到 batch 中包含足够数量具有有效梯度的 prompts。

5.3 Token-Level Policy Gradient Loss

原始 GRPO 的 loss 是 sample-level reduction:

\[\frac{1}{G} \sum_i \frac{1}{|o_i|} \sum_t L_{i,t}. \]

这意味着无论一个 response 有 100 个 token 还是 5000 个 token,最终每个 response 对 loss 的整体权重基本相同。

DAPO 认为这在 long-CoT 场景下存在明显问题。

假设一个 5000-token 的错误回答中充满 repetition、gibberish 或其他低质量模式,如果先对这 5000 个 token 求平均,那么每个错误 token 对最终 objective 的贡献就会非常小。这意味着模型对于长度较长的错误回答的惩罚会被稀释,从而可能无法有效学习到避免长错误回答。

于是 DAPO 改成在整个 batch/group 的 token 层面统一求平均:

\[J_{\text{DAPO}} = E \left[ \frac{ 1 }{ \sum_{i=1}^{G}|o_i| } \sum_{i=1}^{G} \sum_{t=1}^{|o_i|} L_{i,t} \right]. \]

这样每一个 token 在 aggregation 中拥有更一致的权重,长 response 中大量低质量 token 不再因为 sequence-level averaging 而被稀释。作者将其称为 Token-level Policy Gradient Loss。

5.4 Overlong Reward Shaping

reasoning RL 通常会给模型设置最大生成长度 \(L_{\max}\)。如果一个 response 达到最大长度但仍然没有完成答案,最简单的处理方式就是直接给予一个固定负 reward。然而这会形成非常突然的 reward cliff:长度稍低于阈值时可能正常获得奖励,而只多生成几个 token、恰好被 truncation 后,reward 就发生剧烈变化。

DAPO 认为这种做法会引入较大的 reward noise,因此对接近最大长度的 response 使用更加平滑的 overlong reward shaping,使 reward 随着 response 接近 truncation threshold 逐渐受到惩罚,而不是突然发生跳变。


最终,DAPO 首先保留 GRPO 的 token-level importance ratio:

\[r_{i,t}(\theta) = \frac{ \pi_\theta(o_{i,t}\mid q,o_{i,<t}) }{ \pi_{\theta_{\mathrm{old}}}(o_{i,t}\mid q,o_{i,<t}) }. \]

group-relative advantage 仍然是

\[\hat A_{i,t} = \frac{ R_i-\operatorname{mean}(\{R_i\}_{i=1}^{G}) }{ \operatorname{std}(\{R_i\}_{i=1}^{G}) }. \]

DAPO 没有采用 Dr.GRPO 去 std 的修改,它仍然使用标准差归一化。原论文 Eq. (9) 明确如此。

DAPO 最终的 policy objective 是:

\[\boxed{ \begin{aligned} J_{\mathrm{DAPO}}(\theta) = \mathbb E_{\substack{ (q,a)\sim\mathcal D,\\ \{o_i\}_{i=1}^{G}\sim \pi_{\theta_{\mathrm{old}}}(\cdot\mid q) }} \Bigg[ \frac{1}{ \sum_{i=1}^{G}|o_i| } \sum_{i=1}^{G} \sum_{t=1}^{|o_i|} \min\Big( &r_{i,t}(\theta)\hat A_{i,t},\\ &\operatorname{clip} (r_{i,t}(\theta), 1-\epsilon_{\mathrm{low}}, 1+\epsilon_{\mathrm{high}}) \hat A_{i,t} \Big) \Bigg] \end{aligned} } \]

同时满足 Dynamic Sampling 的约束:

\[\boxed{ 0< \left| \left\{ o_i\mid \operatorname{is\_equivalent}(a,o_i) \right\} \right| <G } \]

6.GSPO:从Token-Level Importance Ratio走向Sequence-Level

GRPO 和前面的 DAPO 虽然修改了很多东西,但它们仍然保留了 PPO 最核心的 token-level importance ratio:

\[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}) }. \]

2025 年 Qwen 团队提出 GSPO(Group Sequence Policy Optimization),开始进一步质疑这个设计:

既然 reasoning RL 的 reward 是 sequence-level 的,advantage 也是根据整个 response 的 reward 构造出来的,那么为什么 importance sampling 和 clipping 却要分别作用于每一个 token?他们不应该在 sequence level 上作用吗?

GSPO 因此把 importance ratio 从 token level 提升到 sequence level。对于一个 response \(o_i\),完整 sequence probability 为

\[\pi_\theta(o_i|q) = \prod_{t=1}^{|o_i|} \pi_\theta(o_{i,t}|q,o_{i,<t}). \]

因此最直接的 sequence likelihood ratio 是

\[\frac{ \pi_\theta(o_i|q) }{ \pi_{\text{old}}(o_i|q) }. \]

但由于一个 sequence 往往包含上千个 token,直接把所有 token probability ratio 相乘会导致这个数值随着 sequence length 剧烈变化。

GSPO 因此定义长度归一化后的 sequence-level importance ratio:

\[s_i(\theta) = \left( \frac{ \pi_\theta(o_i|q) }{ \pi_{\text{old}}(o_i|q) } \right)^{1/|o_i|}. \]

将 sequence probability 展开,可以得到

\[s_i(\theta) = \exp \left( \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \log \frac{ \pi_\theta(o_{i,t}|q,o_{i,<t}) }{ \pi_{\text{old}}(o_{i,t}|q,o_{i,<t}) } \right). \]

所以 \(s_i\) 实际上就是所有 token importance ratios 的几何平均。

GSPO 最终优化目标写成

\[J_{\text{GSPO}}(\theta) = E \left[ \frac{1}{G} \sum_{i=1}^{G} \min \left( s_i(\theta)\hat A_i,\, \operatorname{clip} (s_i(\theta),1-\epsilon,1+\epsilon)\hat A_i \right) \right]. \]

也就是说,同一个 response 中不再有

\[r_{i,1},r_{i,2},\ldots,r_{i,T} \]

这样一系列独立的 clipping decision,而是整条 response 只有一个\(s_i.\)。整条 sequence 要么处在合理的 trust region 中,要么被认为已经过于 off-policy。不再用于产生梯度信号。

最终 objective 为:

\[\boxed{ \begin{aligned} J_{\mathrm{GSPO}}(\theta) = \mathbb E_{\substack{ q\sim\mathcal D,\\ \{o_i\}_{i=1}^{G}\sim \pi_{\theta_{\mathrm{old}}}(\cdot|q) }} \left[ \frac1G \sum_{i=1}^{G} \min\left( s_i(\theta)\hat A_i,\, \operatorname{clip} (s_i(\theta),1-\epsilon,1+\epsilon)\hat A_i \right) \right]. \end{aligned} } \]

实际上,关于重要性采样作用在 token level 还是 sequence level 的讨论,仍然是当前 reasoning RL 研究中的一个开放问题。

7.重要性采样作用在 token level 还是 sequence level 的讨论

关于 importance sampling 到底应该作用在 token level 还是 sequence level,实际上已经成为当前 reasoning RL 中一个很值得关注的开放问题。我们先来回顾一下,PPO中原生的token level重要性采样是如何得到的:

PPO的重要采样是这样的,从

\[\nabla J(\pi_\theta) = E_t \left[ A(s_t,a_t)\nabla_\theta\log\pi_\theta(a_t|s_t) \right] \]

跳到

\[\nabla J(\pi_\theta) = E_t \left[ \frac{\pi_\theta(a_t|s_t)} {\pi_{\text{old}}(a_t|s_t)} A(s_t,a_t) \nabla_\theta\log\pi_\theta(a_t|s_t) \right] \]

这中间少了一步重要的近似,我们来严格推导一下。首先,我们真正希望优化的是 current policy:

\[J(\theta) = \mathbb E_{\tau\sim\pi_\theta} [R(\tau)]. \]

但手里的数据来自old模型的rollout \(\tau\sim\pi_{\text{old}}\),严格来说,完整的重要性采样应该写成产生轨迹的概率比值,而非采取下一步action的概率比值:

\[\mathbb E_{\tau\sim\pi_\theta}[R(\tau)] = \mathbb E_{\tau\sim\pi_{\text{old}}} \left[ \frac{P_{\pi_\theta}(\tau)} {P_{\pi_{\text{old}}}(\tau)} R(\tau) \right]. \]

轨迹概率为

\[P_{\pi_\theta}(\tau) = p(s_0) \prod_{t=0}^{T-1} \pi_\theta(a_t|s_t) P(s_{t+1}|s_t,a_t). \]

新旧 policy 在同一个环境里,所以初始状态分布和 transition probability 全部约掉:

\[\frac{ P_{\pi_\theta}(\tau) }{ P_{\pi_{\text{old}}}(\tau) } = \prod_{t=0}^{T-1} \frac{ \pi_\theta(a_t|s_t) }{ \pi_{\text{old}}(a_t|s_t) }. \]

定义

\[r_t(\theta) = \frac{ \pi_\theta(a_t|s_t) }{ \pi_{\text{old}}(a_t|s_t) }, \]

那么严格 trajectory importance ratio 是

\[\boxed{ W(\tau) = \prod_{t=0}^{T-1}r_t(\theta). } \]

如果引入RL中的经典概念\(d_{\pi}(s)\) : state visitation distribution(状态访问分布),也就是:当智能体按照策略 \(\pi\) 和环境交互时,它“有多大概率会走到某个状态 \(s\)。真正的梯度应该写为:

应该写:

\[\begin{aligned} \nabla J(\theta) = \mathbb E_{\substack{ s_t\sim d_{\pi_{\text{old}}}\\ a_t\sim\pi_{\text{old}} }} \Bigg[ & \underbrace{ \frac{d_{\pi_\theta}(s_t)} {d_{\pi_{\text{old}}}(s_t)} }_{\text{state distribution correction}} \\ &\cdot \underbrace{ \frac{\pi_\theta(a_t|s_t)} {\pi_{\text{old}}(a_t|s_t)} }_{\text{action distribution correction}} A_{\pi_\theta}(s_t,a_t) \nabla\log\pi_\theta(a_t|s_t) \Bigg]. \end{aligned} \]

PPO 里面只保留了第二项:

\[r_t= \frac{\pi_\theta(a_t|s_t)} {\pi_{\text{old}}(a_t|s_t)}, \]

而没有显式保留

\[\frac{d_{\pi_\theta}(s_t)} {d_{\pi_{\text{old}}}(s_t)}. \]

那 PPO 为什么“原生”只有 token-level \(r_t\)

因为 PPO 是从 TRPO 的 surrogate objective 出发,而不是直接对完整 \(J(\pi_\theta)\) 做 trajectory importance sampling。

TRPO 使用 performance difference 的思想,构造一个局部 surrogate:

\[J(\pi_\theta) = J(\pi_{\text{old}}) + \Big[ J(\pi_\theta)-J(\pi_{\text{old}}) \Big]. \]

\[L_{\pi_{\text{old}}}(\pi_\theta) = J(\pi_{\text{old}}) + \mathbb E_{\substack{ s\sim d_{\pi_{\text{old}}}\\ a\sim\pi_\theta }} [ A_{\pi_{\text{old}}}(s,a) ]. \]

故意把 state distribution 固定成了\(d_{\pi_{\text{old}}}(s)\),而不是 \(d_{\pi_\theta}(s)\). 因此不再需要校正 state distribution。

现在唯一的问题是里面 action 来自

\[a\sim\pi_\theta, \]

而我们的实际数据是

\[a\sim\pi_{\text{old}}. \]

这时只需要对 action 做普通 importance sampling:

\[\begin{aligned} & \mathbb E_{a\sim\pi_\theta(\cdot|s)} [A_{\text{old}}(s,a)] \\ =& \mathbb E_{a\sim\pi_{\text{old}}(\cdot|s)} \left[ \frac{ \pi_\theta(a|s) }{ \pi_{\text{old}}(a|s) } A_{\text{old}}(s,a) \right]. \end{aligned} \]

这个 surrogate 凭什么能近似真正的 objective?

答案就是:

\[\boxed{ \pi_\theta\text{ 必须离 }\pi_{\text{old}}\text{ 足够近。} } \]

如果策略只发生很小的变化,那么

\[d_{\pi_\theta}(s) \approx d_{\pi_{\text{old}}}(s). \]

于是忽略 state visitation distribution 的变化问题不大。这也是 TRPO 要限制 KL、PPO 要限制 ratio/clipping 的一个更深层原因。

2026 年,更准确的认识应该是:PPO/GRPO 的 token-level ratio 是一种建立在“新旧策略足够接近、可以忽略 state-visitation shift”上的低方差 local surrogate;GSPO 从 reward granularity 和训练稳定性角度把 correction 提升到 length-normalized sequence level,但它并不是严格的 trajectory importance sampling;严格 full-trajectory ratio 数学最干净却方差过大。近期仍有不少工作在探索,重要性采样时如何平衡方差与偏差,以及如何在实际应用中更有效地使用这些方法。

8 end. GRPO、Dr.GRPO、DAPO、GSPO总结

方法 最核心的问题 最核心的修改
PPO Policy update 太大、不稳定 Importance ratio + clipping + critic
GRPO Critic/value model 成本高 Group-relative advantage,删除 critic
Dr.GRPO GRPO normalization 引入优化偏差 去 std normalization + 固定长度归一化
DAPO 大规模 long-CoT RL 不稳定且采样低效 Clip-Higher + Dynamic Sampling + Token-level Loss + Overlong Shaping
GSPO Token-level importance ratio 与 sequence reward 粒度不匹配 Sequence-level importance ratio + sequence-level clipping

GRPO 之后的大部分 reasoning RL 算法,本质上都仍然是在这条 pipeline 上重新设计其中一两个环节。

参考文献

  1. Shao et al., DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models, 2024. GRPO 最初来源。
  2. Liu et al., Understanding R1-Zero-Like Training: A Critical Perspective, 2025. 提出 Dr.GRPO,并分析 response-length bias 与 question-level difficulty bias。
  3. Yu et al., DAPO: An Open-Source LLM Reinforcement Learning System at Scale, 2025。
  4. Zheng et al., Group Sequence Policy Optimization, 2025。
posted @ 2026-08-30 23:43  bradinz  阅读(4)  评论(0)    收藏  举报