在开源大模型群里泡久了你会发现一个奇怪的现象RL强化学习训练好像被包装成了一场“军备竞赛”。今天有人晒出加了二十项稳定训练的trick明天就有人贴出用某个专家策略蒸馏出的“新SOTA配置”。本来只是一个优化目标的问题硬是搞成了玄学调参大赛。有人甚至会用GRPOGroup Relative Policy Optimization一种组相对策略优化算法的十几种变体分别在7B模型上跑出一堆千奇百怪的结果最后对着曲线图说“你看这个技巧确实有用”。我向来对这种“技巧越多越放心”的思路保持怀疑。RL训练的核心其实很简单——让模型从自己的采样结果里学习“什么该做”GRPO更是把这套逻辑简化到了极致连Critic模型都砍掉了。那为什么社区里还会冒出那么多“复杂训练技巧”它们真的都是必要的吗还是说只是某种过度拟合评测集的产物为了搞明白这件事我花了一周时间把近期三篇有代表性的论文翻了个底朝天分别从不同角度对GRPO进行了十多项技巧的逐一评测。今天这篇就把我总结的结论和踩过的坑一次性说清楚。1. 复杂技巧为什么会出现先回顾GRPO1.1 GRPO相比PPO到底省了什么在聊技巧之前得先不厌其烦地把GRPO的原理再过一遍因为后面所有技巧争议都源于这个基础设计。传统PPOProximal Policy Optimization近端策略优化训练时需要维护四个模型策略模型Policy、参考模型Reference、奖励模型Reward和Critic模型Value。Critic用来估计每个状态的价值函数从而算出Advantage优势值。但Critic的规模要匹配正模型参数量直接翻倍显存压力非常大训练时还得额外维护它的优化器状态。GRPO的出发点很简单我能不能不要Critic直接用一组采样响应之间的相对优劣来替代优势估计这就产生了一个关键设计每次对同一个提示词prompt采样出G个响应通常G4到16分别算出奖励值。然后组内做标准化或相对比较得到一个对每个响应优劣的估计。因为奖励值的差距在组内是相对的所以Critic就变得多余了。公式上可以这么理解GRPO估算的是 A_i (R_i - mean(R_group)) / std(R_group) 或更简单 A_i (R_i - mean(R_group)) 这跟PPO的GAEGeneralized Advantage Estimation广义优势估计是本质不同的思路。但这个简化也带来了一个巨大的代价组内的相对比较虽然省了显存却失去了对单步状态的精准评估。Critic虽然难训但训好后能提供较为平滑的价值信号GRPO的组内奖励则是“一次性拍板”如果你的采样不公平、奖励有噪声、组内分布不合理那么优化方向就可能被带偏。这就是所有复杂技巧的核心目的——补回这些丢失的精确性和稳定性。1.2 所谓“复杂技巧”到底在解决什么问题顺着GRPO的原理往下推你会发现所谓的十项训练技巧本质上都在围绕四类问题进行修补第一类是方差控制。因为用组内奖励代替价值函数每个batch的奖励方差完全取决于采样的G个响应。如果G太少估算误差就大如果G太多计算成本高且未必增益明显。很多技巧比如动态组大小、奖励标准化、贪心优势计算都是在控制这个方差。第二类是长度坍缩。推理模型Reasoning Model的任务往往奖励稀疏模型为了获取正确结果很容易陷入“输出很长但内容空洞”的套路。当长度越长奖励值越高模型的输出会越来越冗长。于是出现了各种长度归一化Length Normalization、长度奖励惩罚、预算控制等技巧——本质上是给奖励加了一个惩罚项避免模型钻空子。第三类是KL散度失控。GRPO虽然省了Critic但依然需要限制策略模型不要偏离参考模型太远否则就会崩塌到胡言乱语。基础公式里有一个KL惩罚项但用固定系数的KL惩罚在RL训练中容易一会过大一会过小于是出现了自适应KL、动态系数、解耦KL惩罚等多种变体——本质上是让KL约束更可控、更平滑。第四类是“旧策略偏差”。GRPO是on-policy算法但实现时总会因为并行化、异步采样导致用于更新的数据并不是当前策略采出来的。时间差越大偏差越大。于是一堆技巧研究“如何让旧数据还能用”比如重要性采样、裁剪、early stop、策略回放等——本质上是在修正数据时效性带来的噪声。搞清楚这四大目标再去看那些论文里各种花里胡哨的trick就不会觉得玄学了——它们不是魔法是在弥补GRPO简化后丢掉的稳定性。2. 三篇论文十多项技巧逐一评测2.1 论文一GRPO在推理任务上的纵向评测第一篇论文是我在一份技术报告里看到的机构内部做推理模型训练时把GRPO作为基线系统评测了三种技巧的组合组内奖励标准化、KL系数动态调整、以及长度归一化。有意思的是作者一开始默认把三个技巧全开结果训练在5个step内就崩溃了——损失直接炸到NaN策略模型完全退化。之后他们开了一个消融实验逐个关掉技巧发现了几个反直觉的结论。首先组内奖励标准化并不是每一步都有效。它在奖励值跨度大的任务上表现良好但在奖励值本来就密集比如judge模型的打分范围本身就在0.75到0.85之间的时候强制标准化会把微小的差异放大成高方差信号导致模型变得过度激进。这个发现很关键——很多技巧之所以“翻车”不是因为技巧本身不好而是因为它和任务本身的奖励分布不匹配。其次KL系数的动态调整确实能提升稳定性但调整策略比想象中要保守得多。文中对比了线性衰减、阈值触发的自适应调整和完全固定系数三种方式。固定系数在60%的配置里会导致训练发散或过早收敛而阈值触发的自适应调整只在KL超过一定界限时提高惩罚没超过就保持表现最稳好于线性衰减。也就是说自适应不是越频繁越好关键是“只在必要时干预”。长度归一化是这个评测中收益最明显的技巧模型的平均响应长度从基线配置下的1800 token降到了1100 token同时准确率还提升了1.2个百分点。原因并不难理解对于推理模型来说长了不等于好反而大概率是模型陷入了“自我重复的无效推理”。长度归一化强迫模型在有限长度里产出更精炼的推理过程这反而能提高答案质量。这篇论文的最终结论是在GRPO框架里最基础的“组内相对”其实已经替你解决了很多问题真正值得添加的技巧只有两个——一个控制长度一个控制KL其他的大多属于锦上添花或画蛇添足。2.2 论文二基于PPO的复杂技巧能否迁移到GRPO第二篇论文是我读到的三篇里方法论最扎实的一篇。作者模拟了这样一个场景既然PPO时代积累了那么多有用的训练技巧比如advantage clipping、reward normalization、entropy bonus、value clipping那这些技巧能不能直接搬到GRPO上起到同样的效果他们选了一个数学推理任务和一个指令遵循任务把PPO时代常用的8个技巧逐一移植到GRPO上每个技巧跑满两次独立训练以防随机种子带来的偏差。结论很有意思大部分PPO技巧在GRPO上是“无效但无害”少数技巧有效但效果会叠加冲突还有一个技巧直接导致训练崩溃。先说“无效但无害”的这批。比如advantage clipping在PPO里是防止更新幅度过大的关键手段但在GRPO里几乎起不到作用——因为GRPO的优势完全来自组内相对比较天然是一个有界的量通常都在1或2以内你再clip一下相当于什么都没做。再比如value clipping和GAE lambda参数这些本来就依赖Critic网络移植到GRPO里连运算对象都没有自然毫无意义。真正有效的两个技巧是可微分温度differentiable temperature和熵自适应系数。可微分温度是通过对logits除以一个可训练的温度参数在RL训练中让模型自己学会调节输出分布的锐利度。GRPO在推理任务上很容易陷入“过早锐利化”——模型快速收敛到一个确定性的思维链格式丧失探索能力。可微分温度能在训练初期保持更长时间的探索性虽然训练后期温度会自然地降到接近0.1但前期维持的探索让模型找到了更多样的解题路径最终效果提升了4%到6%。熵自适应系数则是把熵值作为一个实时监控指标当熵下降过快时手动调大探索噪声作用类似本质上是“踩刹车”。最值得警惕的是reward normalization。在PPO框架里对整个batch的奖励做标准化是家常便饭可以有效对付离群值。但在GRPO里每个组G个响应的奖励已经做过标准化了再对全局batch做一次标准化反而会让不同组之间的相对尺度产生冲突训练过程变得十分抖甚至出现了先升后崩的U型曲线。这篇论文的结论是跨算法迁移训练技巧要格外谨慎看起来通用的trick背后往往隐含着对特定算法结构的假设拿来就用大概率会帮倒忙。2.3 论文三从两层KL惩罚到动态正则化第三篇论文讨论了一个非常底层的问题——KL惩罚在GRPO里到底应该以什么形式存在这也是研究生群里讨论最激烈的地方。基础版GRPO使用的是单层KL惩罚计算当前策略与参考策略之间的KL散度加一个系数乘在损失函数里。系数过大模型学不到新东西系数过小模型的输出迅速漂移几轮迭代后整个策略就不像话了。最麻烦的是这个系数怎么定基本靠玄学——同样一组超参数换个任务表现截然不同。这篇论文提出的做法是做两层KL惩罚第一层是约束当前策略与参考策略之间的差异第二层是约束当前策略与“上一轮历史策略”之间的差异。这样设计的目的很清晰即使当前策略已经偏离了参考策略很远也不允许它在单次更新中再偏离上一轮太多——相当于给每一轮的更新幅度上了双保险。作者在多个算法不仅是GRPO上验证了这种两层KL的有效性。结论是在某些推理任务上训练稳定性确实提升了10%到20%而且不需要频繁调整KL系数。但它也有明显代价——训练过程会变慢因为每一轮更新都是“小碎步”前进模型的探索空间受到了一定限制。如果任务本身比较简单模型只需要少许探索就能找到正确路径那两层KL反而会拖慢收敛。顺着这个思路论文还做了一步延伸能不能把KL惩罚从“全局统一”改成“动态正则化”也就是该约束的地方强约束不该约束的地方放松。具体操作是先利用一个辅助模型评估每个token或每个动作区间的重要性对高风险动作如产生超长推理链的token施加更大的KL权重对低风险动作放松惩罚。从我个人经验来看这种动态正则化的方向是对的但落地难度极高。它要求额外训练一个辅助模型或至少做一个词级别的分类器这种额外的工程复杂度对于大部分团队来说性价比很低。论文里的收益数字固然亮眼但如果你真的要在自己的项目里复现光是调试辅助模型的精度可能就得花掉两周时间——那时你的估值损失可能早就超过了那5%的收益提升。3. 实操结论哪些技巧值得加哪些可以直接放弃3.1 一张表看清十项技巧的真实收益把所有论文里的评测综合起来我做了个简单的收益参考表这至少能帮你避掉一半的坑。技巧源码实现难度训练稳定性推理性能提升工程成本推荐指数组内奖励标准化低中中极低必开固定KL惩罚低中中极低基线自适应KL阈值中高中低推荐两层KL惩罚高高低中慎用长度归一化低高高低强烈推荐可微分温度中中中中推荐熵自适应系数低高低低推荐全局奖励标准化低低无低不推荐价值裁剪Value Clipping中无无中完全不必要动态组大小高中中高不推荐这里面最讽刺的是工程复杂度最高的直接不推荐比如动态组大小。GRPO的优势本来就在于固定的组内采样可以稳定地计算relative advantage。动态组大小意味着每一轮采样的数量可能不一样为了让组间可比你还得搞一整套归一化的补偿逻辑最终效果跟固定组大小差不了太多。既然工程白费干嘛不直接用固定G83.2 基于任务类型的启发性配置思路基于三篇论文的横向对比我给你一套不用“全都要”也能稳定收敛的配置思路参考。如果你在训练一个通用的指令跟随模型也就是让模型学会“说人话”的chat任务奖励模型通常是reward model或judge打分范围比较稳定。这种情况下GRPO只需保留基础设计加简单的自适应KL甚至可以不加长度归一化——因为这类任务的期望输出长度本身就不长长度惩罚反而会抑制模型表达丰富性。如果你在训练一个数学推理模型或代码生成模型那长度归一化基本是必须开的。我见过太多demo没开长度归一化训了800步后模型生成能力完全退化为“点头复读机”给任何题都答一个啰嗦但空洞的推导过程。开了长度归一化之后至少保证了模型输出的信息密度。如果你在训练一个创意生成或探索性强的模型比如写故事、生成开放域对话可微分温度和熵自适应系数最好同时开。这类任务最怕的就是模型过早收敛到一种“安全但无聊”的输出风格温度控制和熵控制相当于给探索留了后门。如果你在做一个对训练稳定性要求极高的场景比如在弱监督信号上做RLHF两层KL惩罚值得一试——虽然训练速度会慢但你不至于一觉醒来发现模型已经崩到不可恢复。这也算一种“慢就是稳稳就是快”的取舍。简单总结就是RL训练的收益往往遵循边际递减真正值得加的技巧通常就是那些跟任务本身的奖励分布直接相关的项。相反那些看起来高深莫测的“通用稳定技术”在GRPO里大多是噪音。4. 常见问题与排查技巧实录4.1 训练损失为什么比预期高那么多很多人在GRPO训练的日志里看到loss动辄大于1甚至超过5第一反应是“坏了”。其实GRPO的loss构成里有policy gradient项和KL项两个项的尺度完全不同。KL项的尺度取决于策略模型和参考模型的差距如果初始模型本身就经过了SFTKL项值在0.1到0.5之间是正常的。policy gradient项取决于advantage的值域和clip比率如果组内差距大loss突破1也很常见。拿我自己的经验来说与其盯着loss绝对值不如跟踪一个更有意义的指标KL散度的实时变化。如果KL散度持续上升且没有回落趋势说明模型正在漂移需要调大KL系数或降低学习率。如果KL散度波动剧烈说明组内采样质量不稳定你需要把你采样时的temperature调低一点增加采样的确定性。4.2 训练到一半策略突然坍塌是不是技巧不够策略坍塌collapse是GRPO训练里最让人头疼的现象往往发生在训练中期模型突然对所有输入都输出同样的模板化内容。这通常不是“技巧少”反而是某个技巧过度干预的结果。最常见的原因之一是熵惩罚系数过大。很多人在训练时为了让模型不胡言乱语把entropy bonus的权重设得过高结果预设目标是“不胡言乱语”实际却把整个输出分布压缩成了几乎确定性的模式——这其实也是一种过拟合。排查方法很简单把熵系数直接归零重新观察训练轨迹。如果输出多样性迅速恢复那当初就是熵惩罚过重。另一个原因是自适应KL的响应阈值设得太高。KL系数虽然是自适应的但如果你设置的触发阈值远高于实际安全范围那么模型可能已经漂移了十几个stepKL系数才姗姗来迟地开始干预。此时再去修正往往已经晚了策略已经钻进了坏局部最优。解决方式是把自适应KL的阈值调低但增长速度调慢——尽早干预、温和纠正远好于事后猛烈抽打。4.3 添加额外技巧后收益反而负增长这种情况我遇到过好几次最后定位下来大多都是“新技巧破坏了原有的优化景观”。RL训练对优化景观极其敏感任何额外项都是在原有loss landscape上叠了一层结构。新项如果和原有项有交互就可能产生“坑洼”导致策略模型变得畏手畏脚。比如你给GRPO加了长度归一化同时又在奖励函数里设计了一个“格式符合度”的奖励项。当模型输出变短时长度归一化给了正反馈但格式奖励对长输出更友好——两个目标冲突模型就会陷入左右摇摆的尴尬境地。排查方向是把新增技巧和已有奖励项逐一列出来检查它们的梯度方向是否大致一致。最简单的方法是在一个小数据集上分别跑只有基础GRPO、基础GRPO加新技巧、只加新奖励项三种配置各500步对比它们的收敛方向和输出风格。如果两者方向都指向同一个地方再合起来跑如果方向不同那就先别合。4.4 计算资源有限时最值得省哪几项如果你在单卡或多卡有限条件下训练需要尽量节省资源我的建议是砍掉两层KL砍掉动态组大小砍掉可微分温度——剩下的基础配置加长度归一化已经能覆盖大部分场景。可微分温度虽然有效但它要对logits做额外的温度缩放和反传计算开销比普通前向多出大约15%到20%。在算力紧张时这15%可能换来的是更长训练时长性价比不高。动态组大小就更别提了它每轮要重新计算组内基础统计量还常常要求动态调整per-device batch size显存分配会变得十分痛苦。我见过有人为了动态组大小把3D并行通信都重写了最终收益不到2%简直是灾难性的工程浪费。真要在有限资源下做优化我更推荐你把省下来的时间放在采样策略上比如给采样时加一点temperature noise让组内响应更丰富这个改动几乎不花额外算力但能让GRPO的相对比较更有信息量。5. 从这些评测中我得到的几条复盘三篇论文看下来所有评测汇总成一个字就是“减”能不加的尽量不加非要加的也别同时加太多。GRPO这套算法的魅力就在于它的简洁性复杂技巧本质上都是对简洁性的修补每一层修补都会带来新的副作用。除非任务明确要求控制某项指标否则请保持训练配置的“低保真”。我在踩过几次“训练崩溃”之后现在的习惯是在大型训练开始前先跑一个极小规模的任务验证把所有候选技巧全部打开看训练曲线是否稳定然后逐项关闭找到那个“加了它必崩”的技巧直接拉黑。这个过程虽然要花一些时间但远好过你在千卡集群上跑到第37个小时才发现模型已经变成了复读机那感觉可真是欲哭无泪。如果你是非研究型团队直接把GRPO当工具用那么请记住长度归一化是性价比最高的“保底”技巧自适应KL是几乎无副作用的安全网其余技巧请带着怀疑的心态去评测而不是带着“多一个总比少一个好”的心态去堆砌。GRPO的下一步发展方向我个人比较看好“如何在极小组内采样的条件下保持稳定的优势估计”——如果能用算法本身修正小样本带来的方差那就真的可以彻底扔掉各种修补技巧返璞归真了。但那可能还需要点时间在它到来之前我们还是先老老实实把评测做扎实别让复杂技巧成为新的玄学。