
Comparison of RL Algorithm —— PPO、GRPO、DPO、DAPO、GSPO技术详解与对比
从12个核心维度系统对比PPO、GRPO、DPO、DAPO与GSPO五种大模型强化学习对齐算法,剖析其技术演进脉络、核心机制与适用场景,揭示从"通用重器"到"专属利刃"的进化逻辑。
阅读文章ZHY's Blog
A UNIVERSE OF IDEAS · BY ZHANG HAOYI
让好奇心 点亮知识宇宙
在代码、模型与思想之间自由漫游。这里持续记录人工智能、机器学习、软件工程与成长实践,让每次阅读都成为一次新的发现。
ARTICLE NOTE
Important
在前四篇文章中,我们沿着 PPO → DPO → GRPO → DAPO 的脉络,见证了大模型强化学习对齐的持续演进。GRPO通过”组内相对优势”的设计移除了Critic网络,DAPO则通过四项工程优化将GRPO打造成了工业级工具。
然而,即便DAPO已经解决了长CoT场景下的熵崩塌和样本效率问题,GRPO框架本身仍然存在一个根本性的算法设计缺陷。
2025年7月,阿里Qwen团队发表了GSPO(Group Sequence Policy Optimization,群组序列策略优化) 。论文指出:GRPO训练不稳定的根源,在于其重要性采样比率在算法设计层面存在根本性的误用和失效。
要理解GSPO,首先要理解GRPO在算法设计层面的根本问题。
回顾GRPO的核心机制:
要理解这个问题的严重性,我们需要回到重要性采样(Importance Sampling) 的基本理论。
然而,GRPO的做法是将这个比率分解到每个token上,为每个token独立计算ri,t(θ)。
GSPO团队指出,GRPO的根本问题并非简单的”粒度错配”,而是重要性采样理论的误用 —— 每个token只被采样一次,无法实现有效的分布校正。基于此诊断,GSPO提出的解法才是将优化粒度从token级提升到序列级,从而实现奖励单位与优化单位的对齐。
GRPO的token级问题在MoE(混合专家)模型上被进一步放大。
在MoE模型中,每个token的生成会激活一组特定的专家(experts)。GRPO在计算每个token的重要性比率时,会独立地影响各个专家的激活模式。MoE模型训练不稳定的根源在于路由(Routing)的离散性:训练中参数更新会导致专家的激活模式频繁跳变,进而导致计算token级重要性比率时所依赖的条件概率分布发生剧烈波动,这被称为”专家震荡”。
为了抑制这种震荡,此前的研究采用路由回放(Routing Replay) 等复杂工程策略——在计算重要性比率时”回放”缓存中之前激活的专家路由模式。这种做法虽然能在一定程度上稳定训练,但会产生额外的内存和通信开销,并可能限制MoE模型的实际可用容量。关键的是,路由回放并非万灵药——它只是”治标”而非”治本”。GRPO在MoE上的训练仍然极其不稳定,稍有不慎就会导致训练崩溃。
GSPO之所以能从根本上摆脱对路由回放的依赖,是因为其采用的序列级联合概率在数学计算上已经边缘化掉了具体的专家路由路径,因此对单个token的路由变化天然不敏感。
GSPO的解决方案直击问题根源:放弃token级的重要性比率,转而采用序列级的重要性比率。
在GSPO中,对于整个回答yi,其重要性比率定义为:
si(θ)=(πθold(yi∣x)πθ(yi∣x))∣yi∣1=exp(∣yi∣1∑t=1∣yi∣logπθold(yi,t∣x,yi,<t)πθ(yi,t∣x,yi,<t))
各符号的含义:
| 符号 | 含义 | 说明 |
|---|---|---|
| πθ(yi∣x) | 当前策略联合概率 | 当前策略πθ生成完整回答yi的概率,即 ∏t=1∥yi∥πθ(yi,t∣x,yi,<t) |
| πθold(yi∣x) | 旧策略联合概率 | 采样时使用的旧策略生成完整回答yi的概率 |
| πθold(yi∣x)πθ(yi∣x) | 联合概率比 | 整个序列的概率比,未归一化时随长度指数级变化 |
| ∥yi∥ | 序列长度 | 回答的token数量(不含prompt),用于长度归一化 |
| si(θ) | 序列级重要性比率 | 每个token的平均概率比的几何平均,衡量”平均而言”新策略相比旧策略更倾向生成这个回答的程度 |
为什么需要长度归一化? 如果不做长度归一化,联合概率比会随序列长度指数级变化:
πθold(yi∣x)πθ(yi∣x)=∏t=1∣yi∣ri,t(θ)
这会导致数值不稳定和梯度方差爆炸。长度归一化(开∣yi∣次方)将si(θ)的数值范围统一到合理的尺度上,大幅降低了方差——si(θ)的典型值在[0.5,2.0]区间内。
几何平均:si(θ)衡量的是——平均而言,当前策略生成这个回答中每个token的概率,相比旧策略提升了多少。如果si(θ)>1,说明新策略平均而言更倾向于生成这个回答;如果si(θ)<1,则相反。
有了序列级重要性比率si(θ),GSPO的优化目标与GRPO在形式上保持了一致,但核心变量从token级换成了序列级:
JGSPO(θ)=Ex∼D,{yi}i=1G∼πθold(⋅∣x)[G1∑i=1Gmin(si(θ)A^i,clip(si(θ),1−ϵ,1+ϵ)A^i)]
关键变化:
层面一:方差消减与梯度优势(统计层面)
在GRPO中,每个token的重要性比率独立计算,误差随序列长度线性累积:
Var(logri,t)≈σ2⇒Var(∑t=1∣yi∣logri,t)≈∣yi∣⋅σ2
而在GSPO中,si(θ)是整个序列的几何平均:
logsi(θ)=∣yi∣1∑t=1∣yi∣logri,t
Var(logsi(θ))=∣yi∣21⋅∣yi∣⋅σ2=∣yi∣σ2
方差被显著降低——从O(L)降至O(1/L),其中L是序列长度。在长CoT场景中(L∼104),这种方差消减是数量级的。从统计学的角度看,GSPO的si(θ)是一个比GRPO的ri,t更有效的估计量,具有更小的均方误差。
层面二:优化粒度与奖励单位的对齐(算法设计层面)
奖励是在序列级别给出的,GSPO的优化也是在序列级别进行的。这种粒度对齐使得梯度信号更加直接、清晰,避免了token级优化中”为每个token分配序列级奖励”这种本质上不合理的操作。
层面三:对MoE的天然友好(架构层面)
GSPO只关心序列级别的似然πθ(yi∣x),而对单个token的似然πθ(yi,t∣x,yi,<t)不敏感。这意味着,只要整个序列的生成质量不变,个别token的专家激活模式发生波动并不会显著影响si(θ)的计算。
更精确地说,MoE模型的路由选择仅通过单个token的条件概率πθ(yi,t∣⋅)进入损失函数。由于GSPO的si(θ)是token级对数概率的平均,路由波动对对数概率的影响被长度归一化平滑化。因此,GSPO从根本上消除了对路由回放策略的依赖。
后续的理论工作为GSPO提供了更深刻的理解。研究发现,GSPO的长度归一化重要性比率si(θ)可以等价地表示为:
logsi(θ)=logPerplexityθ(yi)Perplexityθold(yi)=−ΔCrossEntropyθ→θold(yi)
这个发现揭示了GSPO与语言模型经典指标之间的深层联系:
这一视角将序列级强化学习与语言模型困惑度最小化联系了起来,提供了更直观的理解——GSPO本质上是在鼓励模型在序列级别上做出更”自信”的预测(即更低的困惑度),而非在token级别上逐点优化。
1import torch2import numpy as np3
4# ==================== 超参数配置 ====================5GROUP_SIZE = 166EPSILON = 0.27LEARNING_RATE = 1e-68EPOCHS_PER_ITER = 59
10# ==================== 主训练循环 ====================11for iteration in range(total_iterations):12
13 # ---------- Step 1: 组采样 (与GRPO相同) ----------14 groups = []15 for prompt in prompts_batch:16 responses = model_actor.sample(prompt, num_samples=GROUP_SIZE)17 # 计算旧策略的序列级log概率 (用于后续重要性比率)18 # 注意: GSPO只需要序列级log概率,不需要token级19 old_log_probs = model_actor.compute_sequence_log_probs(responses)20 ref_log_probs = model_ref.compute_sequence_log_probs(responses)21 rewards = [model_rm.score(prompt, resp) for resp in responses]22 groups.append({23 "prompt": prompt,24 "responses": responses,25 "old_log_probs": old_log_probs, # [G] 序列级26 "ref_log_probs": ref_log_probs, # [G] 序列级27 "rewards": rewards # [G]28 })29
30 # ---------- Step 2: 奖励归一化 (与GRPO相同) ----------31 for group in groups:32 rewards = group["rewards"]33 mean_r = np.mean(rewards)34 std_r = np.std(rewards) + 1e-835 group["advantages"] = [(r - mean_r) / std_r for r in rewards]36
37 # ---------- Step 3: 策略更新 (GSPO的核心差异) ----------38 dataset = flatten_experiences(groups)39
40 for epoch in range(EPOCHS_PER_ITER):41 for batch in sample_batches(dataset, BATCH_SIZE):42 # 计算当前策略的序列级log概率43 new_log_probs = model_actor.compute_sequence_log_probs(batch["responses"])44
45 # ---------- GSPO: 序列级重要性比率 ----------46 # 长度归一化: 除以序列长度,取几何平均47 seq_lengths = batch["seq_lengths"] # [B]48 # s_i(θ) = exp((log π_θ - log π_θ_old) / length)49 log_ratio = new_log_probs - batch["old_log_probs"] # [B]50 s = torch.exp(log_ratio / seq_lengths) # [B], 序列级标量51
52 # ---------- GSPO: 序列级裁剪 ----------53 advantages = batch["advantages"] # [B]54 surr1 = s * advantages55 surr2 = torch.clamp(s, 1 - EPSILON, 1 + EPSILON) * advantages56 policy_loss = -torch.min(surr1, surr2).mean()57
58 # ---------- KL散度 (可选) ----------59 # GSPO保留了KL约束,但同样在序列级别计算60 kl = (new_log_probs - batch["ref_log_probs"]) / seq_lengths61 kl_loss = kl.mean()62
63 loss = policy_loss + KL_BETA * kl_loss64
65 optimizer.zero_grad()66 loss.backward()67 optimizer.step()关键差异:
| 步骤 | GRPO | GSPO |
|---|---|---|
| log概率粒度 | token级 ([B, seq_len]) | 序列级 ([B]) |
| 重要性比率 | 每个token独立计算 | 整个序列的长度归一化几何平均 |
| 裁剪 | token级硬裁剪 | 序列级硬裁剪 |
| 损失聚合 | token级平均 | 序列级平均 |
Qwen团队在Qwen3-30B-A3B-Base微调的冷启动模型上进行了实验:
| 维度 | GRPO | GSPO |
|---|---|---|
| 训练稳定性 | 需要Routing Replay才能收敛 | 无需任何额外策略,天然稳定 |
| 训练效率 | 基线 | 显著更高 |
| 可扩展性 | 性能容易饱和 | 可通过增加算力获得持续性能提升 |
| MoE训练 | 极其不稳定,需复杂策略 | 根本解决稳定性问题 |
在CodeForces任务中,GRPO的最终得分收敛于2000分以下,而GSPO随着训练计算量的增加持续提升成绩,展现出更强的可扩展性。
GSPO所裁剪的token比例比GRPO高两个数量级,但却具有更高的训练效率。这进一步表明,GRPO的token级优化目标存在噪声大、效率低的问题,而GSPO的序列级优化目标提供了更可靠、有效的学习信号。
| 创新点 | 说明 |
|---|---|
| 序列级重要性比率 | 基于整个序列的联合概率比,而非逐token的概率比 |
| 长度归一化 | 通过几何平均将序列概率比归一化到统一的数值范围,大幅降低方差 |
| 序列级裁剪 | 裁剪操作在序列级别进行,而非token级别 |
| 优化粒度对齐 | 优化单位(序列)与奖励单位(序列)完全对齐 |
| MoE原生友好 | 无需路由回放等复杂 stabilization 策略 |
| 基础设施简化 | 对精度容忍度更高,可直接复用推理引擎的似然 |
| 优势 | 说明 |
|---|---|
| 算法层面根治不稳定性 | 从根源上解决了GRPO中重要性采样权重的设计缺陷 |
| 训练极其稳定 | 无需Routing Replay等额外策略即可稳定收敛 |
| MoE原生友好 | 从根本上解决了MoE的专家震荡问题 |
| 可扩展性强 | 可通过增加算力获得持续性能提升 |
| 基础设施友好 | 对精度容忍度高,可简化RL系统设计 |
| 优化粒度对齐 | 优化单位与奖励单位完全一致 |
| 已被广泛采用 | 已被HuggingFace TRL v0.20原生支持 |
| 局限 | 说明 |
|---|---|
| 牺牲了token级信用分配 | 整个序列共享同一个重要性比率,无法区分序列中哪些token对最终奖励贡献更大 |
| 硬裁剪的”一刀切”问题 | 当一个序列包含少数高度离策略(off-policy)的token时,GSPO会抑制该整个序列的所有梯度 |
| 可能引发”长度坍塌” | 研究发现GSPO存在固有的长度偏好,可能导致回答长度随着训练逐渐坍缩 |
| 对密集模型效果可能有限 | 有观点认为GSPO对MoE模型效果显著,但对密集(dense)模型可能效果有限或无明显提升 |
| 序列级粒度可能过粗 | 对于需要细粒度反馈的复杂推理任务,序列级优化可能不如token级精细 |
| 硬裁剪固有的学习信号丢失 | 被裁剪区间外的梯度全部丢弃,影响样本效率 |
GSPO虽然从根本上解决了GRPO的稳定性问题,但研究者们已经识别出几个关键问题,并催生了后续算法的演进:
问题一:硬裁剪的”一刀切”问题。 GSPO的序列级硬裁剪意味着,只要序列中有一个token”出格”,整个序列的梯度就被全部抑制。这催生了SAPO(Soft Adaptive Policy Optimization)——其核心创新在于引入连续的、平滑的软门控机制(Soft Gating)来替代GSPO和GRPO中”截断即丢弃”的硬裁剪(Hard Clipping)。在保持序列级优化连贯性的同时,实现了Token级别的自适应调整,能够根据每个token的离策略程度动态赋予权重,从而保留了更多有效的学习信号。
问题二:长度坍塌。 后续研究发现,GSPO的损失函数本身在数学设计上就存在固有的长度偏好(Length Bias),这种偏好会在训练中诱发”响应长度崩溃(Response Length Collapse)“现象,即模型倾向于生成越来越短的回答。这催生了LUSPO(Length-Unbiased Sequence Policy Optimization)——其核心目标正是精准纠正GSPO损失函数中这种固有的长度偏差项,使梯度信号在数学上对响应长度呈严格的无偏状态,从而从根本上遏制长度坍塌。
问题三:粒度过粗。 GSPO的序列级粒度可能过粗,无法对序列内部不同部分进行差异化的信用分配。这催生了SSPO(Sub-sentence-level Policy Optimization)——将整个回答拆分为若干句子,在子句级别进行优化,在序列级的稳定性和token级的精细度之间寻找平衡。
问题四:Token级与序列级的融合。 研究者尝试在单个目标函数中同时融合token级和序列级的重要性比率。这催生了DHPO(Dynamic Hybrid Policy Optimization)——通过加权机制动态结合两种粒度的优势。其核心创新在于在同一个裁剪后的替代目标函数(clipped surrogate objective)内部,通过动态权重机制精细地融合token级和序列级的重要性比率,实现了两种粒度在优化路径上的有机统一,而非外在的线性组合。
问题五:理论基础深化。 后续工作从困惑度-熵等价性的角度重新审视了GSPO,揭示了其与语言模型经典指标之间的深层联系。
Note如果说DAPO回答的是”如何将GRPO从实验室打磨成工业级工具”的问题,那么GSPO回答的则是一个更为根本的问题:GRPO算法设计本身是否存在缺陷?如何从根源上修复它?
GSPO通过一个看似简单但影响深远的改动给出了答案:
- 问题诊断:GRPO的token级重要性采样,在”每个token只采样一次”的前提下,无法实现有效的分布校正,反而引入高方差噪声——这是对重要性采样理论的误用
- 核心洞察:既然奖励是在序列级别给出的,优化也应当在序列级别进行——让优化粒度匹配奖励粒度
- 具体方案:用序列的联合概率比的几何平均(长度归一化)替代逐token的概率比
- 连锁效应:序列级优化不仅解决了方差累积问题,还顺便解决了MoE的专家震荡——因为GSPO对单个token的似然不敏感
这个改动从算法设计的层面,而非工程调优的层面,根治了GRPO的不稳定性。GSPO无需Routing Replay等复杂的策略即可稳定训练MoE模型。
从PPO到GRPO到DAPO到GSPO,我们看到了大模型强化学习对齐的一条清晰的演进脉络:
算法 核心创新 解决的问题 遗留/新问题 PPO 裁剪代理目标 + KL约束 策略更新稳定性 需要价值网络,资源消耗大 GRPO 组内相对优势 移除价值网络 token级方差累积,MoE不稳定 DAPO 四项工程优化 熵崩塌、样本效率 token级根本缺陷未解决 GSPO 序列级重要性比率 token级方差、MoE震荡 长度坍塌、硬裁剪”一刀切” GSPO的发布标志着大模型强化学习对齐从”工程修补”进入了”算法重构”的新阶段。它不仅是Qwen3模型卓越性能的算法基石,也为整个社区提供了一个更稳定、更可扩展的RL训练范式。
按顺序完成这组文章,循序渐进地掌握主题
发现错误、内容过时或有改进想法?欢迎告诉我
根据本文分类与标签,为你推荐可能感兴趣的内容

从12个核心维度系统对比PPO、GRPO、DPO、DAPO与GSPO五种大模型强化学习对齐算法,剖析其技术演进脉络、核心机制与适用场景,揭示从"通用重器"到"专属利刃"的进化逻辑。
阅读文章
系统梳理DAPO解耦裁剪与动态采样策略优化的核心技术原理,解析Clip-Higher、Dynamic Sampling、Token-Level Loss与Overlong Reward Shaping四项创新如何解决GRPO在长CoT场景下的熵崩塌与训练不稳定问题,将GRPO从实验室算法打磨为工业级系统。
阅读文章
系统梳理GRPO群体相对策略优化的核心原理、组内相对优势估计机制与训练流程,解析其如何通过移除价值网络实现显存占用降低40%以上,并对比GRPO与PPO、DPO的差异及各自适用场景。
阅读文章请使用微信扫描二维码分享
当前文章会保持在原页面