在大语言模型的强化学习中,PPO、GRPO、DAPO、GSPO 和 GEPO 经常被画成一条不断演进的路线。这个说法大体正确,却容易掩盖一个关键事实:它们并非都在修改同一个部件。

  • PPO → GRPO:主要改变优势(advantage)的估计方式,以同一问题下多个回答的相对奖励取代价值模型;
  • GRPO → DAPO:保留 token 级重要性比率,重点修正采样、裁剪、损失归一化和超长回答的奖励;
  • GRPO → GSPO → GEPO:逐步将重要性权重的统计粒度从 token 提升到 sequence,再提升到 group,以降低长序列及异步训练中的梯度噪声。

理解这三个方向,比记住五个缩写更重要。

统一记号:LLM强化学习究竟在优化什么?

给定问题(prompt)xx,策略模型逐 token 生成回答

yi=(yi,1,yi,2,,yi,Ti).y_i=(y_{i,1},y_{i,2},\ldots,y_{i,T_i}).

记当前待优化的策略为 πθ\pi_\theta,生成训练数据时使用的旧策略为 πold\pi_{\mathrm{old}}。回答 yiy_i 获得一个序列级奖励 Ri=R(x,yi)R_i=R(x,y_i)。对于可验证的数学或代码任务,RiR_i 可以直接表示答案是否正确;对于一般对齐任务,它也可以来自奖励模型。

因为数据来自 πold\pi_{\mathrm{old}},更新的却是 πθ\pi_\theta,需要用重要性比率修正分布差异。token 级比率为

ρi,t(θ)=πθ(yi,tx,yi,<t)πold(yi,tx,yi,<t).\rho_{i,t}(\theta) =\frac{\pi_\theta(y_{i,t}\mid x,y_{i,<t})} {\pi_{\mathrm{old}}(y_{i,t}\mid x,y_{i,<t})}.

以下算法的共同骨架,都是让高优势样本的概率上升、低优势样本的概率下降,同时限制新旧策略一次变化得过大。它们的主要分歧是两个问题:

  1. 优势 A^\hat A 从哪里来?
  2. 重要性比率应该按 token、按整个回答,还是按一组回答计算?

PPO:用价值模型估计每一步的优势

PPO(Proximal Policy Optimization)的核心是 clipped surrogate objective。只看策略模型部分,其目标可以写为

JPPO(θ)=E[1Tt=1Tmin(ρtA^t,clip(ρt,1ϵ,1+ϵ)A^t)].\mathcal J_{\mathrm{PPO}}(\theta) =\mathbb E\left[ \frac{1}{T}\sum_{t=1}^{T} \min\left( \rho_t\hat A_t, \operatorname{clip}(\rho_t,1-\epsilon,1+\epsilon)\hat A_t \right) \right].

其中 ρt\rho_t 衡量新旧策略对已采样 token 的概率变化。裁剪的作用可以分两种情况理解:

  • A^t>0\hat A_t>0 时,希望提高该 token 的概率,但当 ρt>1+ϵ\rho_t>1+\epsilon 后不再给予额外收益;
  • A^t<0\hat A_t<0 时,希望降低该 token 的概率,但当 ρt<1ϵ\rho_t<1-\epsilon 后不再给予额外收益。

因此,PPO 不是禁止策略走出裁剪区间,而是让目标函数不再鼓励它继续向外走。实践中通常还会配合 value loss、entropy bonus 和 KL 约束,但这些不是上面 PPO-Clip 公式的核心。

价值模型与GAE

PPO 通常同时训练一个价值模型 Vψ(st)V_\psi(s_t),并用 GAE(Generalized Advantage Estimation)估计优势:

δt=rt+γVψ(st+1)Vψ(st),\delta_t=r_t+\gamma V_\psi(s_{t+1})-V_\psi(s_t),

A^tGAE(γ,λ)=l=0Tt1(γλ)lδt+l.\hat A_t^{\mathrm{GAE}(\gamma,\lambda)} =\sum_{l=0}^{T-t-1}(\gamma\lambda)^l\delta_{t+l}.

γ\gamma 控制未来奖励的折扣,λ\lambda 在偏差与方差之间折中。优势能够细化到每个 token,但代价也很明显:在 LLM 场景中,value model 往往与 policy model 同量级;而奖励又常常只在回答结尾出现,准确估计每个中间 token 的价值并不容易。

这正是 GRPO 想解决的问题。

GRPO:用组内相对奖励取代价值模型

GRPO(Group Relative Policy Optimization)对同一个问题 xx 一次采样 GG 个回答 {yi}i=1G\{y_i\}_{i=1}^G,并用组内奖励的均值和标准差估计优势:

Rˉ=1Gi=1GRi,A^i=RiRˉstd(R1,,RG)+εA.\bar R=\frac{1}{G}\sum_{i=1}^{G}R_i, \qquad \hat A_i=\frac{R_i-\bar R}{\operatorname{std}(R_1,\ldots,R_G)+\varepsilon_A}.

对于 outcome reward,回答 yiy_i 中的所有 token 共享同一个优势:

A^i,t=A^i.\hat A_{i,t}=\hat A_i.

于是 GRPO 的策略目标为

JGRPO(θ)=E[1Gi=1G1Tit=1Ti(min(ρi,tA^i,clip(ρi,t,1ϵ,1+ϵ)A^i)βDKL(πθπref))].\begin{aligned} \mathcal J_{\mathrm{GRPO}}(\theta) =\mathbb E\Bigg[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{T_i} \sum_{t=1}^{T_i}\Big(& \min\big( \rho_{i,t}\hat A_i, \operatorname{clip}(\rho_{i,t},1-\epsilon,1+\epsilon)\hat A_i \big)\\ &-\beta D_{\mathrm{KL}}(\pi_\theta\Vert\pi_{\mathrm{ref}}) \Big)\Bigg]. \end{aligned}

原始 GRPO 将 KL 项直接加进目标函数,而不是先把它并入奖励再计算优势。它最大的变化并不在 PPO 式裁剪,而在 baseline:

PPO: A^t 依赖 Vψ(st)GRPO: A^i 依赖同一问题的组内奖励.\text{PPO: }\hat A_t\text{ 依赖 }V_\psi(s_t) \quad\Longrightarrow\quad \text{GRPO: }\hat A_i\text{ 依赖同一问题的组内奖励}.

这省掉了 critic/value model,显著降低显存和计算开销,但也带来三项代价。

第一,每个问题必须生成多个回答,省下的 value 计算被一部分 rollout 成本替代。第二,优势只有相对意义:一个回答是否值得提高概率,取决于它相对同组回答是否更好。第三,如果组内奖励完全相同,则所有优势都为零;这批样本即使全部答错,也无法提供直接梯度。

还要注意一个容易被忽略的不对称:GRPO 的奖励和优势是 sequence level,但重要性比率与裁剪仍然是 token level。这一处不匹配,后来成为 GSPO 的主要切入点。

DAPO:不改token级比率,先把长思维链训练做稳

DAPO(Decoupled Clip and Dynamic sAmpling Policy Optimization)可以理解为一套面向 long-CoT 训练的 GRPO 改造方案。令

i,t(θ)=min(ρi,tA^i,clip(ρi,t,1ϵlow,1+ϵhigh)A^i),\ell_{i,t}(\theta)= \min\left( \rho_{i,t}\hat A_i, \operatorname{clip}(\rho_{i,t},1-\epsilon_{\mathrm{low}},1+\epsilon_{\mathrm{high}})\hat A_i \right),

其核心目标写为

JDAPO(θ)=E[1i=1GTii=1Gt=1Tii,t(θ)],\mathcal J_{\mathrm{DAPO}}(\theta) =\mathbb E\left[ \frac{1}{\sum_{i=1}^{G}T_i} \sum_{i=1}^{G}\sum_{t=1}^{T_i}\ell_{i,t}(\theta) \right],

并要求可验证任务中的有效组满足

0<#{i:yi 回答正确}<G.0<\#\{i:y_i\text{ 回答正确}\}<G.

这个目标看起来与 GRPO 相似,但包含四个很实用的变化。

1. Clip-Higher:解耦上下裁剪边界

PPO 和 GRPO 通常采用对称区间 [1ϵ,1+ϵ][1-\epsilon,1+\epsilon]。DAPO 改用

[1ϵlow,1+ϵhigh],ϵhigh>ϵlow.[1-\epsilon_{\mathrm{low}},1+\epsilon_{\mathrm{high}}], \qquad \epsilon_{\mathrm{high}}>\epsilon_{\mathrm{low}}.

较高的上界让低概率但具有正优势的探索性 token 获得更大的上升空间;保守的下界则避免某些 token 的概率过快被压到接近零。它主要针对训练中的 entropy collapse。

2. Dynamic Sampling:过滤零梯度问题

如果同一问题的 GG 个回答全对或全错,那么组内标准化后的优势均为零。DAPO 持续过采样并过滤这类问题,直到 batch 中拥有固定数量的有效组。这里的“dynamic”指每次为了填满有效 batch 而消耗的原始问题数是动态的。

它提高的是有效梯度密度,并没有凭空从全错样本中恢复学习信号。

3. Token-Level Policy Gradient Loss:改变损失归一化

GRPO 先对每个回答内部取平均,再对回答取平均:

1Gi1Titi,t.\frac{1}{G}\sum_i\frac{1}{T_i}\sum_t\ell_{i,t}.

这使每个回答权重相同,但长回答中的单个 token 权重更小。DAPO 改成对 batch 内全部 token 统一取平均:

1iTiiti,t.\frac{1}{\sum_iT_i}\sum_i\sum_t\ell_{i,t}.

因此每个 token 的基础权重相同,长回答整体会占据更大的梯度份额。这既加强了对高质量长推理的学习,也加强了对冗长、重复和乱码模式的惩罚。

4. Overlong Reward Shaping:平滑处理截断样本

直接给所有被截断的回答同样的负奖励,会把“推理正确但略微超长”与“无休止重复”混为一谈。DAPO 在最大长度 LmaxL_{\max} 前设置一个缓冲区 LcacheL_{\mathrm{cache}}

Rlength(y)={0,TLmaxLcache,LmaxLcacheTLcache,LmaxLcache<TLmax,1,T>Lmax.R_{\mathrm{length}}(y)= \begin{cases} 0,&T\le L_{\max}-L_{\mathrm{cache}},\\ \dfrac{L_{\max}-L_{\mathrm{cache}}-T}{L_{\mathrm{cache}}}, &L_{\max}-L_{\mathrm{cache}}<T\le L_{\max},\\ -1,&T>L_{\max}. \end{cases}

越接近上限,惩罚越平滑地增大,从而减少截断带来的奖励噪声。

此外,DAPO 在 long-CoT、可验证奖励的设定中移除了相对 reference policy 的 KL 惩罚,允许策略明显偏离初始模型。这个选择服务于论文的特定训练目标,并不意味着所有 RLHF 场景都应删除 KL。

总结来说,DAPO 的重要性比率仍是 ρi,t\rho_{i,t}:它修复的是 GRPO 的训练配方,而没有改变重要性采样的 token 粒度。

GSPO:让重要性比率与奖励都落在sequence level

GSPO(Group Sequence Policy Optimization)认为,GRPO 用 sequence-level reward 评价整个回答,却用每个位置唯一采到的 token 计算分布修正,容易引入高方差噪声。长序列会累积这种噪声,MoE 模型的路由变化还会进一步放大 token 概率的波动。

为此,GSPO 定义长度归一化的序列重要性比率:

si(θ)=(πθ(yix)πold(yix))1/Ti=exp[1Tit=1Tilogρi,t(θ)].\begin{aligned} s_i(\theta) &=\left( \frac{\pi_\theta(y_i\mid x)}{\pi_{\mathrm{old}}(y_i\mid x)} \right)^{1/T_i}\\ &=\exp\left[ \frac{1}{T_i}\sum_{t=1}^{T_i}\log\rho_{i,t}(\theta) \right]. \end{aligned}

也就是说,sis_i 是一条回答中 token 重要性比率的几何平均。1/Ti1/T_i 可以避免比率的数值范围随回答长度指数扩张,并让不同长度的回答共用同一套裁剪尺度。

GSPO 的目标为

JGSPO(θ)=E[1Gi=1Gmin(siA^i,clip(si,1ϵ,1+ϵ)A^i)].\mathcal J_{\mathrm{GSPO}}(\theta) =\mathbb E\left[ \frac{1}{G}\sum_{i=1}^{G} \min\left( s_i\hat A_i, \operatorname{clip}(s_i,1-\epsilon,1+\epsilon)\hat A_i \right) \right].

此时 advantage、importance ratio 和 clipping 都以完整回答为单位。忽略裁剪后,其梯度为

θJGSPO=E[1GisiA^i1Titθlogπθ(yi,tx,yi,<t)].\nabla_\theta\mathcal J_{\mathrm{GSPO}} =\mathbb E\left[ \frac{1}{G}\sum_i s_i\hat A_i\cdot \frac{1}{T_i}\sum_t\nabla_\theta \log\pi_\theta(y_{i,t}\mid x,y_{i,<t}) \right].

与之相比,GRPO 会让回答内不同 token 分别乘上 ρi,t\rho_{i,t}。GSPO 则让同一回答的所有 token 共享 sis_i:如果该回答整体过于 off-policy,就裁掉整条回答;否则所有 token 以一致的序列权重更新。

这种设计牺牲了一部分 token 级分布修正的细粒度,换来更低的梯度噪声以及对 MoE 路由变化的容忍度。若任务确实拥有 token-level advantage,论文还给出了 GSPO-token 变体;它仍以序列比率决定裁剪,只允许每个 token 使用不同优势。

GEPO:用组期望进一步平滑异步策略的分布差异

本文所说的 GEPO 特指 Group Expectation Policy Optimization。这个缩写也被其他工作使用,因此讨论时最好写出全称。

GEPO 面向比普通 mini-batch 更新更强的 off-policy 场景:rollout sampler 与 learner 异步运行。记采样时的旧策略为

q=πθk,q=\pi_{\theta_k},

learner 收到数据并更新时的策略为

p=πθk+τ,p=\pi_{\theta_{k+\tau}},

其中 τ\tau 表示由网络延迟或异构算力造成的 policy staleness。τ\tau 越大,ppqq 的 KL divergence 通常越大,标准重要性比率 p/qp/q 的方差也更容易爆炸。

从序列概率到组期望分母

先定义第 ii 个回答在两个策略下的长度归一化序列概率:

pi=exp(1Titlogp(yi,tx,yi,<t)),p_i=\exp\left(\frac{1}{T_i}\sum_t\log p(y_{i,t}\mid x,y_{i,<t})\right),

qi=exp(1Titlogq(yi,tx,yi,<t)).q_i=\exp\left(\frac{1}{T_i}\sum_t\log q(y_{i,t}\mid x,y_{i,<t})\right).

GSPO 使用每个回答自己的分母 qiq_i,即 pi/qip_i/q_i。GEPO 则先用同一问题下的 GG 个回答估计行为策略概率的组期望:

E^q[q(yx)]=j=1Gqjk=1Gqkqj=j=1Gqj2j=1Gqj.\widehat{\mathbb E}_q[q(y\mid x)] =\sum_{j=1}^{G}\frac{q_j}{\sum_{k=1}^{G}q_k}q_j =\frac{\sum_{j=1}^{G}q_j^2}{\sum_{j=1}^{G}q_j}.

然后定义 Group Expectation Importance Weight:

wiGEPO=piE^q[q(yx)].w_i^{\mathrm{GEPO}} =\frac{p_i}{\widehat{\mathbb E}_q[q(y\mid x)]}.

因此,粒度变化可以概括为

pi,tqi,tGRPO:每个 token 一个分母piqiGSPO:每个回答一个分母piE^q[q]GEPO:整组共享分母.\underbrace{\frac{p_{i,t}}{q_{i,t}}}_{\text{GRPO:每个 token 一个分母}} \quad\Longrightarrow\quad \underbrace{\frac{p_i}{q_i}}_{\text{GSPO:每个回答一个分母}} \quad\Longrightarrow\quad \underbrace{\frac{p_i}{\widehat{\mathbb E}_q[q]}}_{\text{GEPO:整组共享分母}}.

如果某个旧策略概率 qiq_i 偶然极小,GSPO 的 pi/qip_i/q_i 可能很大;GEPO 的分母由整组样本平滑,不会被单个极端值直接决定。它真正修改的是重要性权重的分母,而优势仍可沿用组内奖励 baseline。

用偏差换方差

标准重要性采样满足

Eq[p(y)q(y)]=1,\mathbb E_q\left[\frac{p(y)}{q(y)}\right]=1,

是无偏的。GEPO 的新权重一般不再满足这一性质:

Eq[p(y)Eq[q(y)]]=p,qq221.\mathbb E_q\left[ \frac{p(y)}{\mathbb E_q[q(y)]} \right] =\frac{\langle p,q\rangle}{\lVert q\rVert_2^2}\ne 1.

所以 GEPO 的本质不是“更准确的 importance sampling”,而是有偏、低方差的平滑估计。论文证明,在满足其条件的高 KL 区域,标准权重与组期望权重的方差差距至少包含一个随 DKL(pq)D_{\mathrm{KL}}(p\Vert q) 指数增长的项;但论文也明确指出,该优势并非在所有分布区域都成立,低 KL 的某些区域可能出现轻微方差增加。

论文附录还给出 defensive smoothing:

wifinal=piαstopgrad(pi)+(1α)E^q[q],w_i^{\mathrm{final}} =\frac{p_i} {\alpha\,\operatorname{stopgrad}(p_i) +(1-\alpha)\widehat{\mathbb E}_q[q]},

其中 α\alpha 随组内 qiq_i 的方差增大。α0\alpha\to 0 时接近 GEPO,α1\alpha\to 1 时逐渐接近普通 policy-gradient 的缩放方式。它是对偏差与稳定性的进一步折中;论文的主要对比实验并未启用该机制。

五种算法的核心区别

算法 优势从哪里来 重要性权重粒度 裁剪/聚合单位 是否需要critic 主要解决的问题
PPO value model + GAE token token 限制单次策略更新,稳定 policy gradient
GRPO 同一问题下的组内标准化奖励 token token;每个回答先取 token 均值 去掉昂贵且难训练的 value model
DAPO 组内标准化奖励 token 非对称 token clip;全 batch token 均值 long-CoT 下的熵坍缩、无效样本、长度偏置和截断噪声
GSPO 组内标准化奖励 sequence 整个回答共享比率并整体裁剪 token 级重要性权重的高方差,以及长序列/MoE 训练不稳定
GEPO 组内奖励 baseline group expectation 组内回答共享重要性分母 异步、异构训练中 policy staleness 导致的权重方差爆炸

这张表也揭示了两个常见误解。

第一,DAPO 不是 sequence-level 算法。它虽然采用 token-level loss reduction,但重要性比率仍按 token 计算;这里的 “token-level loss” 指损失如何在不同长度回答之间归一化,而不是把奖励变成 token-level reward。

第二,GSPO 和 GEPO 不只是换了一种 advantage。它们保留了组相对优势的思想,真正改变的是 off-policy correction 的统计单位。

如何理解这条演进路线?

可以把五种方法压缩成四次选择:

  1. 如何估计优势? PPO 学习 VψV_\psi;GRPO 及其后续方法用同题多回答的相对奖励。
  2. 如何利用 rollout? DAPO 过滤零优势组,并重新处理不同长度回答和截断样本。
  3. 在哪个粒度修正新旧策略差异? GRPO/DAPO 按 token,GSPO 按 sequence,GEPO 进一步借助 group statistics。
  4. 愿意接受怎样的偏差—方差折中? 标准 importance sampling 更接近无偏;GEPO 主动引入偏差,以换取 stale-policy 场景中的低方差。

因此,这些方法没有脱离 PPO 的基本思想:都在最大化 advantage 加权的 log-probability,并设法让策略更新不要被高方差估计带偏。它们真正的演进,是逐渐把 LLM 的特殊结构纳入算法设计——奖励往往属于完整回答,回答需要成组比较,推理链很长,rollout 与训练还可能来自不同设备、不同时间的策略。

从这个角度看,PPO 到 GEPO 的路线不是一串名字,而是一个越来越明确的问题:用于评价、采样和优化的统计单位,究竟应该是 token、sequence,还是 group?

- - - - - -