打开任何一份近期的大模型后训练技术文档,你大概率第一个撞见的名字就是 GRPO,全称 Group Relative Policy Optimization。这个从数学推理场景里跑出来的策略优化算法,在短短一两年内几乎成了开源社区做后训练的事实默认起点。它解决的痛点非常直白:传统 PPO 那一套需要额外训练一个价值网络来估计收益基线,显存和实现复杂度都高得让人头疼;GRPO 用一组采样输出的相对比较替代了价值估计,把大模型强化学习训练的门槛硬生生降了一截。
到了 2026 年,各家团队的重心已经从“堆参数预训练”转向“用后训练榨出能力”,GRPO 以及围绕它生长出来的一大批变体,就是这场后训练战役中最核心的武器。这篇文章我从原理、变体到真实训练里踩过的坑,一次性给你理清楚。适合正在搭 RL 训练流程的工程师,也适合想理解“推理模型为什么这么训”的研究者。
1. GRPO 为什么会成为后训练的主角
1.1 从 PPO 到 GRPO:价值网络为什么成了累赘
要理解 GRPO 的价值,得先回头看 PPO 在大模型场景里有多别扭。经典的 PPO 是 actor-critic 架构,actor 负责生成动作,critic 也就是价值网络,负责估计当前状态能拿到的期望收益,然后通过广义优势估计 GAE 得到每个 token 的 advantage。
问题在于语言模型场景下这个 critic 极难训。一条轨迹动辄上千 token,而真正的奖励往往只在最后一步给出,中间每一步的价值全靠 critic 自己脑补。训练数据分布还在不断变化,因为策略每更新一次,后面采样到的状态就不一样了。我在实际训练中就见过价值网络 loss 怎么训都降不下来、advantage 估计飘得没谱的情况。更要命的是显存:一个典型配置要同时加载 actor、冻结的 reference 模型、奖励模型、价值模型,相当于四份模型权重,再加上优化器状态和梯度,小一点的集群根本转不动。
GRPO 直接把价值网络这一路给砍了。它不需要估计每一步的绝对价值,而是对同一个 prompt 采一组输出,用组内相对比较来折算收益。这一步省下来的不只是显存,还有一大堆调参负担,比如 GAE 的 lambda、价值网络的训练比例、TD 误差的裁剪范围,全部消失。几乎每个从 PPO 迁移过来的团队,第一感觉都是“原来 RL 训练可以这么清爽”。
1.2 核心思想:组内相对排名代替绝对打分
GRPO 的思路如果你上过学,一定秒懂。一次考试里,绝对分数受试卷难度影响很大,但班内排名相对稳定;GRPO 做的就是把“绝对分”换成“组内排名”。对每个 prompt,用当前策略采样 G 条输出,算出各自的奖励,然后在这个小组内部做标准化,得到每条输出的优势值。
为什么不能全 batch 一起归一化?因为不同 prompt 难度天差地别。一个简单 prompt 的 0.9 分和一个困难 prompt 的 0.3 分,直接比较没有意义。组内归一化天然把 prompt 难度这个因素消掉了:同一个 prompt 下谁表现好、谁表现差,才是策略真正该学习的信号。
直觉上,GRPO 是在逼模型每轮都“比组内平均水平做得更好”。这个目标不像 PPO 那样追求绝对收益最大化,但胜在稳定、可解释,而且不需要额外训练任何辅助模型。对于奖励稀疏的推理场景,这个性质尤其宝贵。
1.3 为什么 2026 年后训练的核心战场是 GRPO
2026 年,后训练在模型能力建设里的权重已经完全不亚于预训练。一个底座模型能不能变成“会思考”的模型,关键看后训练阶段有没有做对强化学习:让模型在答题、写代码、调用工具的过程中不断试错并收到可验证的反馈。
GRPO 恰好踩中这个节点。首先,可验证奖励场景(数学答案比对、代码测试用例、工具执行结果)天然适合组内相对比较,信号虽然稀疏但真实。其次,开源生态里大量团队没有几千张卡,GRPO 省掉价值网络之后,一套中等规模集群就能跑起来推理强化学习。再加上围绕 GRPO 出现的变体越来越多,每篇都在解决一个具体病症,这种“主干稳定、枝叶茂盛”的局面本身就是一个技术战场成熟的标志。
2. GRPO 的原理拆解:分组相对优势到底在算什么
2.1 一次完整更新,从头到尾发生了什么
我把一次典型的 GRPO 更新拆成六步,你在代码里看到的无非就是这些操作的组合。
- 从训练集里取一个 batch 的 prompt。
- 对每个 prompt,用当前策略采样 G 条完整回答,构成一组。
- 用规则脚本或奖励模型给每条回答打分,得到 r_1 到 r_G。
- 在每组内部做标准化:A_i = (r_i - mean(r)) / (std(r) + epsilon)。
- 计算重要性采样比率 rho_i = π_θ(o_i) / π_θ_old(o_i),用裁剪目标限制单步更新幅度。
- 再加上对 reference 策略的 KL 正则项,合并成最终 loss 做梯度下降。
对应的目标函数写出来长这样:
J_GRPO(θ) = − E[ (1/G) Σ_i min(rho_i A_i, clip(rho_i, 1−ε, 1+ε) A_i) − β·KL(π_θ || π_ref) ]
这个公式里,mean(r) 和 std(r) 都是针对同一 prompt 的 G 条输出算的,不是跨 batch 算。也就是说,模型学的是“在这个问题上,我要比同组的其他回答做得更好”,至于别的 prompt 表现如何,与当前更新无关。
2.2 公式背后的直觉:为什么组内归一化有效
策略梯度的核心难点是方差。原始策略梯度用采样回报直接乘梯度,方差大得根本训不动;PPO 引入价值网络做 baseline 来降方差,GRPO 则用组内均值充当这个 baseline。组内均值可以看成对“当前 prompt 在当前策略下的期望奖励”的一次蒙特卡洛估计,把它减掉,大部分与动作无关的波动就被中和了。
除以组内标准差则是对奖励尺度做了一次自动校准。不同任务、不同 prompt 的奖励量纲可能差出几个数量级,直接比较会让模型被高奖励的任务牵着走。标准归一化之后,每个组内的优势值都落在差不多的量级,训练更新也就更均衡。
如果 G 条输出奖励完全一样,标准差为 0,优势全变成 0,这一组样本等于白采。所以实现里一定要给 std 加个小 epsilon 做保护,或者干脆检测到零方差就跳过这组。这个细节看着不起眼,真跑起来少踩一次坑就值回票价。
2.3 最关键的几个超参数与我的经验取值
GRPO 的超参数里,对训练结果影响最大的几个我列在下面,并附上实际训练中比较稳的取值范围。
| 超参数 | 常见取值 | 我的经验备注 |
|---|---|---|
| 组大小 G | 4 ~ 16 | G=8 在多数数学、代码任务上够用;任务太难或 batch 偏小时可以提到 16,但采样成本线性上涨,收益递减明显 |
| 裁剪系数 ε | 0.2 | 稀疏奖励场景建议用 DAPO 式正负分离裁剪,后面会细说 |
| KL 系数 β | 0.001 ~ 0.01 | 偏好小一点让模型学得动,但不能太小,否则 KL 飞快飙升 |
| 学习率 | 1e-6 ~ 5e-6 | 后训练阶段学习率高很容易把已经对齐好的能力冲坏 |
| rollout 温度 | 0.7 ~ 1.0 | 太低会让组内样本多样性不足,优势估计失真 |
| Rollout 数量 | 每步数百至数千条 | 取决于 batch 和 G 的乘积,而不是只看 batch |
还有一个隐藏选项是 KL 怎么算。有的实现把 KL 当成每个 token 的奖励惩罚直接加进奖励里,有的实现把它放进目标函数做整体正则。两种写法在直觉上差不多,实际训练曲线差不少,尤其 KL 那一项忽大忽小的时候,先排查是不是两种写法混用了。
3. 主要变体与演进方向:战场上的各支突击队
3.1 GSPO:承认“组内样本并不是独立同分布”
GRPO 一个隐含假设是组内 G 条样本互相独立,可以放在一起算均值方差。但仔细想,采样的先后顺序、生成过程对 basline 的估计是有影响的。更重要的是,原版 GRPO 有一个被反复观察到的现象——过早收敛:组里那些“不特别好但也不差”的样本,奖励只比均值低一点点,却被赋予负优势,持续被压下去。结果模型的输出分布迅速收窄,探索性提前耗尽。
GSPO 的解法是引入一个容错的基线区间,Tolerant Baseline Interval。落在区间内的样本被视为“足够好”,不再施加强烈的惩罚信号,相当于给策略画了一个“差不多就行”的中性区。这样组内中间样本不会被过度压制,策略保留了继续探索的余地。我在自己的训练里加过类似思路的改造,直观感受是训练曲线更平稳,最终收敛点往往也更高。
3.2 Dr. GRPO:用动态重加权对抗奖励噪声
原版 GRPO 在每组内部一视同仁地对待所有样本,前提是这些奖励信号质量相近。但真实训练里,奖励可能是规则脚本判出来的,也可能是奖励模型打出来的,噪声水平差别很大。有的样本被误判为失败,有的被误判为成功,静态归一化无法区分这些情况。
Dr. GRPO 的核心改动是动态重加权:根据奖励信号的可信度动态调整每个样本在损失里的权重,而不是用固定的百分位权重。同时它给 KL 约束做了一个更长期的视角,叫 Long-sighted Balanced KL,整体分配 KL 预算并加收敛约束。效果上,这个变体对奖励带噪声的任务明显更抗干扰,reward hacking 的出现频率也低一些。打个比方,GRPO 是一张固定难度的卷子按排名算分,Dr. GRPO 则是先检查哪些题有争议、给争议题降权,再算排名。
3.3 DAPO:给稀疏奖励场景打的四块补丁
DAPO 是我个人觉得目前最“实用主义”的一个变体,它专门解决 0/1 稀疏奖励下的训练病。四个改动分别对四个病:
第一,Clip-Higher,把正负优势的裁剪边界拆开。正优势允许更大步长,负优势保持紧缩。稀疏奖励下正样本本来就少,如果还按对称裁剪限制学习幅度,模型很快就什么都不学了;放开正侧边界能维持探索动力,防止熵坍缩。
第二,动态采样。稀疏奖励下大部分样本都是负样本,梯度被大量无效样本稀释。DAPO 会按修正损失的大小对样本做重采样,让那些真正对策略有纠偏价值的样本获得更高的参与权重。
第三,token 级损失修正。很多实现里 advantage 最终要除以序列长度折算成 token 平均损失,这会让短回答天然占便宜,模型慢慢被推向输出越来越短。DAPO 修正了这种长度偏差。
第四,rollout 阶段的 advantage 估计,让经验可以更高效地重复利用,在大规模异步训练里尤其关键。
这四个改动没有一个涉及高深理论,全是针对实际训练病开的药方,也正因如此它的大规模训练效果非常能打。
3.4 更远的融合方向:价值函数、搜索与过程奖励
除了上面三个有明确出处和名字的变体,2026 年 GRPO 的战场还向几个方向蔓延。一个方向是 VAPO 式的混合体,小组规模下组内均值方差太大,就引入一个轻量价值函数辅助降方差,相当于让 GRPO 和 PPO 相互输血。另一个方向是过程奖励模型 PRM 的接入,给每个推理步骤打分,把 token 级优势直接建立在步骤奖励上,这比整个回答一个分数要细致得多。
还有一个方向是 GRPO 与搜索结合的工程化:用树搜索、多轮采样生成更高质量的 rollout,再喂给 GRPO 训练,相当于把推理时计算力的一部分转移到训练时。这条路线在 2026 年的后训练系统里已经相当常见,GRPO 在其中扮演的是策略吸收器角色——不管探索过程多复杂,最终都要压缩回策略参数里,而压缩这个动作,仍然离不开 GRPO 这类算法。
4. 实操要点:把你的模型后训练跑稳的完整流程
4.1 数据与奖励设计是第一关卡,不是第二关
很多人上来就调 GRPO 参数,结果训半天不涨分,最后发现是奖励设计烂。GRPO 的前提是奖励“可验证且信号方向正确”。数学题能不能用答案比对判分,代码能不能用测试用例判分,工具调用能不能用执行结果判分,这个必须先想清楚。如果只能用一个软性的奖励模型打分,GRPO 也能跑,但分布偏移的风险会明显上升,模型很容易找到奖励模型的盲区去钻。
数据这边,prompt 的难度分布最要紧。太简单,模型全都答对,组内标准差极低,学不到东西;太难,全都答不对,奖励全是 0,同样学不到东西。我比较常做的操作是对一批 prompt 先用当前模型采样一遍,把全对率和全错率都偏高的样本滤掉,保留一部分“踮脚能够到”的题目。另外 prompt 要去重,相似题目反复出现会让模型过早拟合某一种题型。
4.2 采样配置与训练资源估算
给你一个可以直接抄的起步配置。batch 设为 128 个 prompt,G=8,每步就是 1024 条 rollout;如果平均生成长度 1024 token,那一轮 rollout 大约要生成一百万 token。这个量级用一张 A 系列的推理卡跑,几分钟到十几分钟不等,取决于推理引擎的吞吐和 batch 方式。生成温度建议 1.0,top_p 0.95,max length 根据任务设,但要留足推理空间,数学题限制太短会让模型根本没机会写出完整推导。
资源估算要记住一件事:GRPO 省的是训练侧显存,没省 rollout 侧。rollout 的算力消耗往往占总训练的六成以上,这也是为什么 2026 年的后训练系统都在做异步 rollout——用一批卡持续采样,另一批卡做梯度更新,两边流水线并行。
4.3 训练循环里的实现细节与监控指标
实现层面,reference 模型必须冻结,KL 估计建议用无偏的 k3 估计器而不是简单近似。混合精度 bf16 基本是标配,梯度裁剪设 1.0 防止个别样本把更新带飞。checkpoint 每隔固定步数存一份,同时用留出的验证集算 pass@k,注意这里的 pass@k 要用采样多次求正确率,而不是只看 greedy 解码。
监控指标我最看重五个:组内奖励均值、组内标准差均值、KL 散度、输出长度、策略熵。前两个告诉你奖励信号还有没有效,第三个告诉你策略有没有漂移,第四个告诉你长度有没有坍缩,第五个告诉你探索够不够。五个一起看,基本能判断训练是健康还是正在酝酿事故。如果组内标准差均值持续接近 0,大概率是模型开始摆烂,输出趋同了。
4.4 PPO 老手迁移时的几个易错点
如果你之前是 PPO 玩家,迁移到 GRPO 有几个点容易搞错。第一,别再惦记 GAE 和 discount factor,GRPO 不需要它们,硬塞进去只会把目标函数弄拧。第二,没有价值网络了,所以你也不应该再监控什么 critic loss,那东西已经不存在了。第三,KL 的正则写法要么全用奖励惩罚式,要么全用目标正则式,混用会让你查问题的时候疯掉。第四,GRPO 对 rollout 多样性的依赖比 PPO 更重,因为组内相对比较的前提就是这组样本足够多样,采样温度千万别习惯性调低。
5. 常见问题与排查技巧实录
5.1 现象:训练几千步,奖励曲线纹丝不动
先别急着调学习率。按顺序查三样:奖励函数本身在验证集上是否正确;prompt 难度是不是两极分化;rollout 温度是不是太低导致组内样本同质化。我遇到过最诡异的一次,是奖励脚本里布尔比较写反了,模型实际上的好回答全被判 0 分,GRPO 再怎么优化也是在跟空气搏斗。任何 RL 训练之前,先用一批固定样本把奖励函数单测一遍,这个习惯能帮你省掉大量无效训练。
5.2 现象:组内优势全部为 0,loss 恒为常数
大概率是标准差除零。当 G 条输出奖励完全一样,std=0,归一化后全是 0,梯度自然消失。代码里必须对 std 加 epsilon 保护,或者检测到零方差直接跳过这一组。另一种可能是温度太低、模型输出退化成模板复读,G 条结果几乎相同,奖励自然相同。调高温度、加大 top_p,或者换更难一点的 prompt 集,通常能解决。
5.3 现象:KL 散度快速飙升,模型开始胡言乱语
KL 涨得快说明策略正在跟 reference 脱节。最常见原因是 β 太小、学习率太高,或者 rollouts 里混进了奖励异常的样本让策略被带偏。排查的时候先看单步 KL 曲线是缓涨还是跳涨:缓涨就调大 β 或降学习率;跳涨八成是数据里有脏样本,单条高奖励的异常轨迹让策略一步跨太大。后训练阶段模型已经积累了大量能力,策略一旦崩掉很难修回来,所以 KL 监控一定要设阈值,超了就自动暂停保存 checkpoint。
5.4 现象:输出长度越训越短,指标反而越好看
这就是 token 级损失的长度偏差在作怪。很多实现把 advantage 除以序列长度变成每个 token 的平均损失,短序列天然占优,模型就会悄悄缩短回答来刷指标。解法是 DAPO 式的序列级损失修正,或者在奖励里显式加入长度收益。更稳妥的做法是既监控长度曲线,又在验证集上用固定长度预算评估,不要只看训练集分数。
5.5 现象:熵坍缩与奖励黑客同时出现
这是后训练末期最头疼的组合。策略熵掉到接近 0,意味着模型输出变成确定性模板,但训练奖励还在涨,因为模型学会了钻奖励函数的空子——比如在数学格式题里疯狂写“因此答案是”但过程是瞎编的。对付奖励黑客没有银弹,只能把奖励函数做得更硬:格式作弊直接判负、答案必须能被解析器提取、必要时加人工抽检。熵坍缩则靠 DAPO 的 clip-higher 和动态采样来缓解,保留必要的探索空间。
6. 一点个人体会:GRPO 不是银弹,但它是当前最好的底色
我自己在多个后训练任务里反复调 GRPO 和它的变体,最深的体会是:GRPO 强在“奖励透明、信号真实”的场景,数学、代码、工具调用这类任务它如鱼得水;一旦奖励本身含糊不清,奖励模型又带偏见,那再先进的变体也救不回来。所以每次开新任务,我花在奖励设计和数据筛选上的时间,从来都比调 RL 超参数的时间多。
另一个体会是,变体虽多,但别急着全上。先跑通原版 GRPO,把监控指标看明白,再根据你观察到的具体病症引入对应变体:长度缩了就上 token 级修正,熵坍缩了就上 clip-higher,奖励噪声大就试动态重加权。后训练是一场持久战,稳定的训练循环比花哨的算法改动值钱得多。GRPO 这个战场在 2026 年远没到终局,但对正在一线训练的我们来说,先把手里这套跑稳,比追逐下一个新名字重要得多。