
GSPO (Group Sequence Policy Optimization) -- 群组序列策略优化
系统梳理GSPO群组序列策略优化的核心原理,解析其如何通过序列级重要性比率与长度归一化从根本上修复GRPO的token级采样缺陷,解决MoE专家震荡与长序列方差累积问题,并探讨GSPO的局限与后续演进。
阅读文章ZHY's Blog
A UNIVERSE OF IDEAS · BY ZHANG HAOYI
让好奇心 点亮知识宇宙
在代码、模型与思想之间自由漫游。这里持续记录人工智能、机器学习、软件工程与成长实践,让每次阅读都成为一次新的发现。
ARTICLE NOTE
Important
在前两篇文章中,我们分别探讨了两种主流的对齐范式:
PPO(Proximal Policy Optimization) :通过裁剪机制和KL散度约束实现稳定策略更新,是RLHF的事实标准。但需要同时维护四个模型(Actor、Critic、Reward Model、Reference Model),其中Critic(价值网络)的规模与策略模型相当。在千亿参数大模型时代,这意味着双倍的显存占用和计算开销。更关键的是,Critic网络需要根据已生成的部分内容预测最终累积奖励——这在长链推理场景中极易出现预测偏差,且训练本身就不稳定。
DPO(Direct Preference Optimization) :通过数学推导将RLHF简化为监督学习,只需两个模型。但作为离线算法,DPO完全依赖静态偏好数据,无法像PPO那样在训练中动态探索新策略。对于需要模型自主探索推理路径的复杂任务(如数学推理、代码生成),DPO的能力边界明显。
这引出了一个关键问题:能否在保留PPO在线探索能力的同时,移除那个昂贵的Critic网络?

2024年,DeepSeek团队在DeepSeekMath论文中给出了答案——GRPO(Group Relative Policy Optimization,群体相对策略优化) 。其核心思想是:优势函数不一定要通过”预测绝对价值”来获得。对于同一个prompt生成的一组回答,它们的相对优劣本身就蕴含了足够的更新信号。
换言之,GRPO不再训练一个价值网络来估计”这个回答的绝对分数是多少”,而是让模型对同一个prompt生成一组回答,直接用组内的相对排名来指导学习。这就像一场考试:PPO需要一个”绝对分数标准”来评判每个学生(Critic网络),而GRPO只需要看每个学生在班级里的相对排名就够了。
这一设计将RLHF的模型数量从4个降至3个(移除Critic),显存占用降低40%以上,同时保留了在线探索能力。它随后被用于DeepSeek-R1-Zero和DeepSeek-R1的训练,成为支撑其突破性推理能力的核心方法论。

在PPO中,优势函数的计算依赖Critic网络对状态价值的估计: At=Q(st,at)−V(st)
其中 V(st) 是Critic网络预测的”当前状态的平均期望回报”。这个设计的核心问题在于:

GRPO的解决方案直击要害:对于同一个prompt,从旧策略中采样G个回答组成一个”组”,直接用组内奖励的均值和标准差来归一化每个回答的奖励,作为优势估计。
具体来说,对于prompt q,从旧策略πθold中采样G个回答{o1,o2,...,oG},每个回答通过奖励模型得到一个奖励值{R1,R2,...,RG}。对于第i个回答中的第t个token,其优势为:
A^i,t=std({Rj}j=1G)Ri−mean({Rj}j=1G)
mean({Rj}j=1G)=G1∑j=1GRj,std({Rj}j=1G)=G1∑j=1G(Rj−μ)2+ϵ
这个公式的含义非常直观:
关键设计决策:组内所有token共享同一个优势值——因为奖励通常是在整个回答层面计算的(如数学题答案是否正确)。这意味着GRPO不进行token级别的细粒度优势分配,而是将回答级别的”好/坏”信号均匀地传递给生成过程中的每一个token。
从对比学习的视角来看,GRPO的组内归一化实际上构建了一个对比目标:组内奖励较高的回答获得正优势(被鼓励),较低的获得负优势(被抑制)。这相当于在回答空间中执行了一个soft ranking——模型不仅要知道”什么是好的”,还要学会在候选集中区分好坏。
与PPO类似,GRPO也采用裁剪代理目标 ,并加入KL散度约束(通常以奖励塑形的形式实现):
JGRPO(θ)=Eq∼P(Q),{oi}i=1G∼πθold(O∣q)[G1∑i=1G∣oi∣1∑t=1∣oi∣min(ri,t(θ)A^i,t,clip(ri,t(θ),1−ϵ,1+ϵ)A^i,t)]−βDKL(πθ∣∣πref)
其中ri,t(θ)=πθold(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t)是重要性采样比率,衡量新策略与旧策略在生成该token上的概率比值。
这个目标函数与PPO的核心差异只有一处:优势A^i,t的计算方式。PPO依赖Critic网络估计的V(st),而GRPO直接用组内归一化奖励替代。所有其他组件——裁剪机制、KL约束、重要性采样——都得以完整保留。
实际实现中的简化:DeepSeek团队的实现采用了一种更简洁的形式,直接最大化以下目标:
JGRPO(θ)≈E[G1i=1∑Gmin(πθold(oi∣q)πθ(oi∣q)Ai,clip(πθold(oi∣q)πθ(oi∣q),1−ϵ,1+ϵ)Ai)]其中 Ai=A^i,t(组内所有token共享同一优势值),整体概率比基于整个回答序列计算。这种简化利用了语言模型自回归分解的性质,在工程实现上更加高效。
GRPO对组内奖励进行均值-标准差归一化(又称白化),这并非可有可无的设计,而是有深刻的统计学考量。
用代码来理解会更直观:
1def grpo_advantage(rewards: List[float]) -> List[float]:2 """3 计算GRPO的组内相对优势4 Args: rewards: 组内G个回答的奖励值列表5 Returns: 归一化后的优势值列表,每个回答对应一个优势6 """7 G = len(rewards)8 mean_reward = sum(rewards) / G9 # 计算样本标准差(Bessel校正)10 variance = sum((r - mean_reward) ** 2 for r in rewards) / G11 std_reward = variance ** 0.5 + 1e-8 # 加小常数防止除零12
13 advantages = [(r - mean_reward) / std_reward for r in rewards]14 return advantages2026年的一项理论工作为GRPO提供了更深层的数学理解。研究发现:GRPO的策略梯度本质上是一个U-统计量(U-statistic) ——一类在统计学中具有优良渐近性质的估计量——它在估计总体参数时具有最小渐近方差。
具体来说,GRPO使用基于组的平均作为优势估计器,其梯度可以表示为:
g^GRPO=G1i=1∑G∇θlogπθ(oi)⋅σRi−μ这一估计器具备以下理论性质:
这一理论分析揭示了GRPO的一个深层特性:虽然GRPO去掉了显式的价值网络,但通过组内采样和归一化,它隐式地实现了与”拥有完美价值网络”的算法渐近等价的效果。换句话说,当组大小G足够大时,GRPO的优势估计精度可以逼近甚至达到完美Critic的水平。
然而,同期另一项研究也指出了GRPO的理论边界:GRPO本质上是一个保守的重新加权方案,其探索边界受限于基座模型的分布——这意味着它无法自主发现完全新颖的解决方案。这一发现与后来的实践观察一致:GRPO在需要模型”跳出框架”进行创造性思考的任务中,表现确实存在天花板。
实际工程中的优化:
1import torch2from typing import List, Dict3from transformers import AutoModelForCausalLM4
5# ==================== 初始化阶段 ====================6# 1. 加载参考模型 (通常是SFT后的模型,冻结)7model_ref = AutoModelForCausalLM.from_pretrained("sft_model")8for param in model_ref.parameters():9 param.requires_grad = False10
11# 2. 加载待训练的策略模型 (从SFT模型初始化)12model_actor = AutoModelForCausalLM.from_pretrained("sft_model")13
14# 3. 加载奖励模型 (或使用可验证的规则,如数学答案检查器)15model_rm = AutoModelForCausalLM.from_pretrained("reward_model")16
17# 4. 加载prompt数据集18prompts_dataset = load_prompts("math_train_prompts.jsonl")19
20# 超参数21GROUP_SIZE = 16 # 组大小G22EPSILON = 0.2 # 裁剪范围23KL_BETA = 0.01 # KL惩罚系数24LEARNING_RATE = 1e-625EPOCHS_PER_ITER = 5 # 每批数据的复用轮数26BATCH_SIZE = 12827
28optimizer = torch.optim.AdamW(model_actor.parameters(), lr=LEARNING_RATE)29
30# ==================== 主训练循环 ====================31for iteration in range(total_iterations):32
33 # ---------- Step 1: 组采样 (Group Sampling) ----------34 # 对于每个prompt,从当前策略并行采样G个回答35 grouped_experiences = [] # 存储所有组的经验36
37 for prompt_batch in dataloader(prompts_dataset, batch_size=BATCH_SIZE):38 # 对batch中的每个prompt,采样G个回答39 # 这里使用并行采样提升效率,实际可用vLLM等推理框架40 for prompt in prompt_batch:41 # 从当前策略采样G个回答42 responses = model_actor.sample(43 prompt,44 num_samples=GROUP_SIZE,45 temperature=0.7, # 适度温度确保组内多样性46 max_length=204847 )48
49 # 计算每个回答的生成概率 (用于后续重要性比率的计算)50 log_probs = model_actor.compute_log_probs(responses)51
52 grouped_experiences.append({53 "prompt": prompt,54 "responses": responses,55 "log_probs": log_probs, # shape: [G, seq_len]56 "ref_log_probs": model_ref.compute_log_probs(responses)57 })58
59 # ---------- Step 2: 奖励计算与组内归一化 (Reward & Normalization) ----------60 for group in grouped_experiences:61 # 计算每个回答的奖励 (通过奖励模型或规则)62 rewards = []63 for response in group["responses"]:64 reward = model_rm.score(group["prompt"], response)65 # 可选: 加入格式奖励、长度惩罚等辅助信号66 rewards.append(reward)67
68 # 组内归一化 -> 优势值69 group["rewards"] = rewards70 group["advantages"] = grpo_advantage(rewards) # shape: [G]71
72 # 计算最终奖励 = 原始奖励 + KL惩罚 (每个token)73 # 注意: 实际训练中,KL惩罚通常与原始奖励合并后再做组归一化74 # 即在奖励计算阶段就加入 -beta * KL 项75 kl_penalized_rewards = []76 for i, response in enumerate(group["responses"]):77 kl_div = group["log_probs"][i] - group["ref_log_probs"][i]78 # 每个token的KL惩罚,累加后从总奖励中扣除79 total_kl = kl_div.sum().item()80 kl_penalized_rewards.append(rewards[i] - KL_BETA * total_kl)81
82 # 重新用KL惩罚后的奖励进行归一化83 group["kl_penalized_rewards"] = kl_penalized_rewards84 group["advantages"] = grpo_advantage(kl_penalized_rewards)85
86 # ---------- Step 3: 策略更新 (Policy Optimization) ----------87 # 将所有组的数据展平为统一的训练集88 dataset = flatten_experiences(grouped_experiences)89
90 for epoch in range(EPOCHS_PER_ITER):91 for batch in sample_batches(dataset, BATCH_SIZE):92 # 计算当前策略下的概率比93 new_log_probs = model_actor.compute_log_probs(batch["responses"])94 # ratio: [B, seq_len],每个token的π_θ / π_θ_old95 ratio = torch.exp(new_log_probs - batch["log_probs"])96
97 # 获取优势 (每个回答一个标量,广播到所有token)98 advantages = batch["advantages"].unsqueeze(-1) # [B, 1]99
100 # ---------- 裁剪策略损失 ----------101 surr1 = ratio * advantages102 surr2 = torch.clamp(ratio, 1 - EPSILON, 1 + EPSILON) * advantages103 policy_loss_per_token = -torch.min(surr1, surr2)104
105 # 按回答长度平均 (而非按token求和)106 # 这是为了防止长回答获得不成比例的梯度107 seq_lengths = batch["seq_lengths"] # [B]108 policy_loss = (policy_loss_per_token.sum(dim=-1) / seq_lengths).mean()109
110 # ---------- KL散度约束 (可选,也可在奖励中处理) ----------111 # 这里作为额外的正则项加入损失112 kl_loss = (new_log_probs - batch["ref_log_probs"]).mean()113
114 # ---------- 熵奖励 (可选) ----------115 entropy = model_actor.compute_entropy(batch["responses"]).mean()116 entropy_bonus = -ENTROPY_COEFF * entropy # 最大化熵117
118 # ---------- 总损失 ----------119 loss = policy_loss + KL_BETA * kl_loss + entropy_bonus120
121 optimizer.zero_grad()122 loss.backward()123 torch.nn.utils.clip_grad_norm_(model_actor.parameters(), max_norm=1.0)124 optimizer.step()125
126 # ---------- Step 4: 迭代结束 ----------127 # 下一轮迭代中,model_actor即为当前最新策略,用于采样新数据128 print(f"Iteration {iteration}, Average Reward: {avg_reward:.2f}")要点总结:
| 创新点 | 说明 |
|---|---|
| 去价值网络化 | 彻底移除Critic网络,消除其带来的显存占用和训练不稳定性 |
| 组内相对优势估计 | 用组内奖励的均值-标准差归一化替代价值函数估计,实现”相对排名”式的优势计算 |
| 奖励白化 | 通过除以组内标准差将优势值统一尺度,提升训练稳定性,使不同batch间的更新步长一致 |
| 保留PPO核心框架 | 保留了裁剪代理目标和KL散度约束,继承了PPO的稳定性优势 |
| 天然适配并行采样 | 组内采样天然支持并行化,与vLLM等高效推理框架无缝配合,采样吞吐量提升数倍 |
| 无需GAE超参数 | 去除了γ和λ,降低了超参数调优的复杂度 |
| 优势 | 说明 |
|---|---|
| 资源效率高 | 移除价值网络,显存占用降低40%以上,训练速度提升约30% |
| 训练更稳定 | 绕过价值网络预测误差,优势估计更可靠,减少了训练崩溃的风险 |
| 超参数更少 | 无需调优GAE的γ和λ参数,降低了工程门槛 |
| 保留在线探索 | 持续从当前策略采样,适合需要探索的复杂任务 |
| 并行友好 | 组内采样天然支持高吞吐并行推理,与vLLM等推理框架完美配合 |
| 理论有保障 | 策略梯度本质是U-统计量,具有优良的渐近性质 |
| 局限 | 说明 |
|---|---|
| 组大小敏感 | 组大小G是关键超参数,太小则统计估计不准(高方差),太大则计算开销增加(采样成本线性增长),通常G=16是经验最优值 |
| 稳定性问题依然存在 | 尽管比PPO有所改善,GRPO仍然存在训练崩溃的风险,尤其是在高温度采样和复杂任务中 |
| 探索能力受限 | 理论上受限于基座模型的分布,难以发现完全新颖的解决方案——GRPO是”优化”而非”发明” |
| 组内多样性不足时失效 | 当组内回答的奖励差异很小时(如全0或全1),归一化后的优势趋近于0,更新信号消失 |
| 隐式优势对称性问题 | 研究表明GRPO存在隐式的优势对称性,影响探索效率和难度自适应能力 |
| 所有token共享优势 | 组内所有token共享同一个句子级优势,缺乏token级别的细粒度反馈,在需要逐词判断的任务中可能不够精确 |
| 对奖励模型质量敏感 | 如果奖励模型本身不能准确反映任务质量,GRPO的效果将大打折扣——“Garbage in, garbage out” |
| 维度 | PPO | DPO | GRPO |
|---|---|---|---|
| 模型数量 | 4个(Actor+Critic+Reward+Reference) | 2个(Actor+Reference) | 3个(Actor+Reward+Reference) |
| 价值网络 | 需要,规模与Actor相当 | 不需要 | 不需要 |
| 训练方式 | 在线强化学习 | 离线监督学习 | 在线强化学习 |
| 优势来源 | Critic网络估计 V(st) | 隐式奖励 βlog(πθ/πref) | 组内奖励归一化 |
| 奖励信号 | 显式奖励模型打分 | 隐式奖励(概率比) | 显式奖励模型打分 |
| 优势估计 | GAE(依赖Critic预测V(s)) | 不适用(分类损失) | 组内归一化奖励 |
| 超参数数量 | 多(ε, β, λ, γ, lr等) | 少(主要是β) | 适中(ε, β, G) |
| 细粒度反馈 | token级别 | 序列级别 | 序列级别 |
| 稳定性 | 中等(需精细调优) | 高(监督学习) | 较高(优于PPO,但仍有风险) |
| 在线探索能力 | 高 | 无 | 高 |
| 显存占用 | 最高 | 最低 | 中等(降低40%) |
| 典型应用 | ChatGPT、Claude等顶流模型 | 开源模型快速对齐 | DeepSeek-R1等推理模型 |
NoteGRPO通过一个极其简洁的设计—“用组内相对比较替代价值网络估计” —实现了多方面突破:
- 问题识别:PPO中的Critic网络是资源消耗和训练不稳定的主要来源
- 核心洞察:优势函数不一定要通过”预测绝对价值”来获得,可以通过”组内相对比较”来估计——这是一种从”绝对评分”到”相对排名”的思维转变
- 具体方案:对每个prompt采样一组回答,用组内奖励的均值-标准差归一化直接作为优势
- 保留精华:继承PPO的裁剪代理目标和KL散度约束,确保更新稳定性
- 保留在线探索:通过不断从当前策略采样,模型能够持续探索新的推理路径
这个设计将模型数量从4个减少到3个,显存占用降低40%以上,同时保留了在线探索的能力。正是这一效率革命,使得DeepSeek团队能够在有限的算力资源下,训练出DeepSeek-R1-Zero和DeepSeek-R1这样具有突破性推理能力的模型。
然而,GRPO并非完美的终点。它的稳定性问题、探索能力边界、组大小敏感性等缺陷,催生了DAPO、GSPO、RC-GRPO等一系列改进方案。这些演进表明,大模型强化学习对齐仍然是一个高度活跃的研究前沿——每一次效率的提升,都会揭示新的瓶颈;每一个瓶颈的突破,都会打开新的可能性空间。
Note从PPO到DPO再到GRPO,我们看到了一条清晰的演进脉络:
对比维度 PPO DPO GRPO 核心问题 如何稳定地优化策略? 能否绕过强化学习? 能否在保留在线探索的同时降低资源消耗? 解决方案 裁剪代理目标 + KL散度约束 隐式奖励的闭式推导(直接偏好优化) 组内相对比较替代价值网络(省去Critic) 主要代价 资源消耗最大(需Actor/Critic双网络 + 奖励模型,最重) 失去在线探索(依赖静态偏好数据集,最静态) 需维护奖励模型(虽去掉了价值网络,但资源介于两者之间) 优化哲学 最全面、最稳健,追求全局最优 最轻量、最简洁,数学优美且高效 保留在线探索的灵活性,剔除冗余的价值估算 适用场景 资源充足、对生成质量与稳定性要求极高的生产级场景 快速迭代实验、资源受限、偏好数据充分且静态的场景 推理增强与持续在线学习,需实时反馈但算力适中的场景 工程生态位 全面稳健的“黄金标准”基石 轻量快速的“降本增效”替代方案 推理增强的“竞争力尖兵”(如DeepSeek-R1的成功实践) 核心总结:三者并非简单的取代关系,而是在稳健性、轻量性与在线灵活性之间做了不同取舍。PPO守正,DPO出奇,而GRPO则是在推理这一特定维度上找到了极具性价比的中间突破口。理解这张表的权衡,即是选择对齐方案的正确起点。
按顺序完成这组文章,循序渐进地掌握主题
发现错误、内容过时或有改进想法?欢迎告诉我
根据本文分类与标签,为你推荐可能感兴趣的内容

系统梳理GSPO群组序列策略优化的核心原理,解析其如何通过序列级重要性比率与长度归一化从根本上修复GRPO的token级采样缺陷,解决MoE专家震荡与长序列方差累积问题,并探讨GSPO的局限与后续演进。
阅读文章
系统梳理DAPO解耦裁剪与动态采样策略优化的核心技术原理,解析Clip-Higher、Dynamic Sampling、Token-Level Loss与Overlong Reward Shaping四项创新如何解决GRPO在长CoT场景下的熵崩塌与训练不稳定问题,将GRPO从实验室算法打磨为工业级系统。
阅读文章
从12个核心维度系统对比PPO、GRPO、DPO、DAPO与GSPO五种大模型强化学习对齐算法,剖析其技术演进脉络、核心机制与适用场景,揭示从"通用重器"到"专属利刃"的进化逻辑。
阅读文章请使用微信扫描二维码分享
当前文章会保持在原页面