GRPO原理与实战:大模型后训练策略优化算法全解析
打开任何一份近期的大模型后训练技术文档你大概率第一个撞见的名字就是 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 年后训练的核心战场是 GRPO2026 年后训练在模型能力建设里的权重已经完全不亚于预训练。一个底座模型能不能变成“会思考”的模型关键看后训练阶段有没有做对强化学习让模型在答题、写代码、调用工具的过程中不断试错并收到可验证的反馈。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 的超参数里对训练结果影响最大的几个我列在下面并附上实际训练中比较稳的取值范围。超参数常见取值我的经验备注组大小 G4 ~ 16G8 在多数数学、代码任务上够用任务太难或 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 个 promptG8每步就是 1024 条 rollout如果平均生成长度 1024 token那一轮 rollout 大约要生成一百万 token。这个量级用一张 A 系列的推理卡跑几分钟到十几分钟不等取决于推理引擎的吞吐和 batch 方式。生成温度建议 1.0top_p 0.95max length 根据任务设但要留足推理空间数学题限制太短会让模型根本没机会写出完整推导。资源估算要记住一件事GRPO 省的是训练侧显存没省 rollout 侧。rollout 的算力消耗往往占总训练的六成以上这也是为什么 2026 年的后训练系统都在做异步 rollout——用一批卡持续采样另一批卡做梯度更新两边流水线并行。4.3 训练循环里的实现细节与监控指标实现层面reference 模型必须冻结KL 估计建议用无偏的 k3 估计器而不是简单近似。混合精度 bf16 基本是标配梯度裁剪设 1.0 防止个别样本把更新带飞。checkpoint 每隔固定步数存一份同时用留出的验证集算 passk注意这里的 passk 要用采样多次求正确率而不是只看 greedy 解码。监控指标我最看重五个组内奖励均值、组内标准差均值、KL 散度、输出长度、策略熵。前两个告诉你奖励信号还有没有效第三个告诉你策略有没有漂移第四个告诉你长度有没有坍缩第五个告诉你探索够不够。五个一起看基本能判断训练是健康还是正在酝酿事故。如果组内标准差均值持续接近 0大概率是模型开始摆烂输出趋同了。4.4 PPO 老手迁移时的几个易错点如果你之前是 PPO 玩家迁移到 GRPO 有几个点容易搞错。第一别再惦记 GAE 和 discount factorGRPO 不需要它们硬塞进去只会把目标函数弄拧。第二没有价值网络了所以你也不应该再监控什么 critic loss那东西已经不存在了。第三KL 的正则写法要么全用奖励惩罚式要么全用目标正则式混用会让你查问题的时候疯掉。第四GRPO 对 rollout 多样性的依赖比 PPO 更重因为组内相对比较的前提就是这组样本足够多样采样温度千万别习惯性调低。5. 常见问题与排查技巧实录5.1 现象训练几千步奖励曲线纹丝不动先别急着调学习率。按顺序查三样奖励函数本身在验证集上是否正确prompt 难度是不是两极分化rollout 温度是不是太低导致组内样本同质化。我遇到过最诡异的一次是奖励脚本里布尔比较写反了模型实际上的好回答全被判 0 分GRPO 再怎么优化也是在跟空气搏斗。任何 RL 训练之前先用一批固定样本把奖励函数单测一遍这个习惯能帮你省掉大量无效训练。5.2 现象组内优势全部为 0loss 恒为常数大概率是标准差除零。当 G 条输出奖励完全一样std0归一化后全是 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 年远没到终局但对正在一线训练的我们来说先把手里这套跑稳比追逐下一个新名字重要得多。