三套卡跑了一周,reward 曲线终于没有再像心电图那样乱跳。我盯着监控面板里 reward 均值稳步爬升,脑子里还在反复回放和同事争论的那个问题:GRPO 训练里大家热衷的那一堆技巧,到底有几个是真有用的,又有多少只是在给训练加戏?
带着这个疑问,我把手头读过的 3 篇针对 GRPO 训练技巧做系统评测的论文翻了出来,又把自己复现过的 10 余项技巧挨个过了一遍筛子。先说结论:大部分复杂技巧在绝大多数场景里都不必要,甚至有害;真正决定成败的,往往是最朴素的学习率、采样数量和优势归一化。这篇文章就把这个结论背后的依据、逐项拆解和一套可以直接抄的配置讲清楚,适合正在用 GRPO 调模型、或者准备从 PPO/RLOO 切换到 GRPO 的算法工程师和研究者。
1. 为什么突然问“复杂训练技巧是否必要”?——背景与切入
1.1 GRPO 是什么,为什么它成了默认选择
GRPO(Group Relative Policy Optimization)是一类不需要 critic 价值模型来估算优势的强化学习算法。训练时处理一条 prompt,先从当前策略里采样 K 个回答,用奖励模型或规则奖励给这 K 个回答打分,然后在组内做标准化。每个回答的优势值,就是它相对这一组平均水平的偏离程度。写成简化形式大概是:A_i = (r_i - mean(r)) / std(r)。
这个“组内排名”的思路特别好理解。打个比方,这就是一个按全班相对成绩定奖励的机制,不看你考了多少绝对分,而是看你比班平均高多少。绝对分数容易被出题难度带偏,而相对位置基本不受整卷难度影响。放到 LLM 训练里,奖励模型或规则奖励的绝对输出经常忽高忽低,组内标准化就能天然抵消这种尺度漂移,训练信号稳定得多。
相对于传统 PPO 在 LLM 上的做法,GRPO 最吸引人的点是砍掉了 critic 价值模型。LLM 场景下训练价值模型本身就是个大麻烦,reward model 都未必训得准,再叠一个 value model,只会放大不稳定性、增加显存压力。所以 GRPO 从在数学推理任务中大规模应用之后,迅速成了可验证奖励场景里的事实默认选择。它实现简单,显存占用更低,还天然适配那种“一道题对 K 个候选答案”的打分逻辑。
1.2 “复杂训练技巧”都指哪些东西
围绕 GRPO,这些年冒出来的技巧数量相当可观。按作用位置,大概可以分成四类:
- 损失函数层:参考模型 KL 罚项、log-ratio 非对称剪裁、熵奖励、token 级 loss 掩码、长度归一化
- 采样流程层:优势归一化(组内/全局)、K 值设置、每个 rollout 后更新 epoch 数、动态采样低分 prompt、离线数据复用
- 奖励构造层:可验证奖励与奖励模型的选择、过程奖励混合、答案无关 token 的奖励过滤
- 工程与超参层:warmup 与余弦衰减、batch size 与微批次、梯度裁剪、生成温度和 top-p、训练生成并行
这些技巧背后的动机各不相同。有的为了解决熵坍缩,比如熵奖励;有的为了防止策略偏移太远,比如参考模型 KL 罚项;有的为了提高样本利用率,比如多次更新和动态采样。可问题是,技巧越多,互相之间的耦合就越深,调参空间也呈指数膨胀。一个技巧在小模型、特定数据集上有效,换到另一个任务上可能立刻变成负优化。
也正因为如此,才有必要用系统的消融实验去回答一个很实际的问题:在普通团队的计算预算下,究竟哪些技巧值得写进训练脚本,哪些技巧只是论文里的表演性创新?
2. 三篇论文在评测什么?——评测对象与方法论
2.1 第一篇:回归基线的超参扫描
第一篇论文的工作方式很朴素,就是在中等规模模型上,对一套标准 GRPO 训练做系统超参扫描,覆盖学习率、batch size、rollout 数量、warmup 比例、梯度裁剪等最基础的旋钮。它的评测重点是看这些基础超参的交互效应,而不是引入新技巧。
这篇工作的核心发现是:学习率、batch size、每条 prompt 的采样数 K 这三个变量解释了绝大部分训练效果差异,而 warmup 的具体比例、梯度裁剪阈值这类细节,只要设定在合理区间内,对最终指标的影响几乎可以忽略。它甚至专门对比了“精心调过的复杂变体”和“朴素 GRPO 加合理学习率”两组配置,结果在多个数学和代码数据集上,朴素配置的胜率并不低。
这篇论文给我的启发是:很多人遇到训练不稳就急着上复杂技巧,但其实先花时间把学习率和 K 调明白,问题往往已经解决一大半。技巧只是超参没调好的替罪羊。
2.2 第二篇:针对 GRPO 的逐项消融
第二篇是严格意义上的逐项消融,把我在上一节列出的那些技巧逐个摘掉或替换,在相同基线下比较效果。它的实验规模不小,每组配置跑多个随机种子,用统计显著性来判断差异,而不是只看单次曲线。
它有几个很尖锐的结论。去掉参考模型和 KL 罚项,在可验证奖励任务上不会导致训练崩坏;去掉优势归一化,训练 loss 几乎立刻开始震荡;熵奖励在小权重下能稳定提供几个点的提升,但权重超过某个阈值后反而压低了最终 reward;token 级掩码只在回答长度差异明显的任务里有收益,在大多数整齐切割的格式下没区别。
这篇对我的价值最大,因为它的消融逻辑和我自己复现实验的直觉高度吻合。它让人确信,不再需要把一堆论文里的 trick 全塞进训练脚本,按症状去选择性地用就好。
2.3 第三篇:聚焦 RLVR 场景下的技巧评测
第三篇聚焦在 RLVR(可验证奖励)场景,也就是数学、代码这类答案可以直接判对的领域。它比较了 oversampling、奖励归一化方式、动态采样、过程奖励融合等手段。
这篇最出人意料的结论是:把 K 从 4 提到 16 甚至 32,带来的收益超过任何损失函数层面的修改。原因是更大的 K 让组内均值更稳定,优势信号噪声更低,同时给策略提供了更多样的行为样本。在稀疏奖励任务里,它甚至能取代复杂的过程奖励设计,因为模型自己能通过大量正负样本学到哪些步骤会导致错误。
三篇论文放在一起看,方法论上有一个共同倾向:好的评测必须控制变量、多个种子、报告显著性。单次曲线的“看起来有用”实在不可靠,我见过太多调参实验因为一次运气好就跑偏的案例。
3. 逐项拆解:10 余项技巧的评测结果与原理
3.1 可以放下的“重装备”:参考模型、KL 罚项、长度归一化
先聊最重的装备:参考模型加 KL 散度罚项。这个设计的初衷很合理,防止当前策略偏离初始策略太远,避免 model collapse 和 reward hacking。但它的代价也很大,需要额外加载一份参考模型权重,显存多出一大截,而且要调 KL 系数,调大了策略学不动,调小了等于没有。
三篇论文的消融都指向一个结论:在可验证奖励环境下,只要使用了 log-ratio 剪裁,也就是把策略比率限制在 [1-ε, 1+ε] 范围内,参考模型可以直接去掉,KL 罚项也不需要。剪裁本身已经提供了本地化的约束,防止单次更新步子太大。而且去掉参考模型后训练曲线反而更平滑,我猜是因为少了一个会漂移的约束项,优化目标变得更加干净。
长度归一化也是个典型的“看似有用”技巧。它的目标是抵消 reward 对长回答的偏向,但评测结果显示,在加入熵奖励和 log-ratio 剪裁之后,长度归一化的边际收益趋近于零,有时还会因为过度压缩长回答而损失信息。我的看法是,如果发现回答长度在爆炸,优先查奖励函数本身的长度偏置,而不是在策略梯度里强行加长度惩罚。
3.2 值得保留的“轻变量”:优势归一化、K 值、熵奖励
如果要我保留 GRPO 里最重要的三样东西,那一定是组内优势归一化、合适的 K 值和适度的熵奖励。
优势归一化看起来不起眼,但它几乎是 GRPO 稳定的地基。奖励函数的绝对数值可能是正也可能是负,尺度可能从 0.01 到 1000 都不稀奇。如果不做组内标准化,策略梯度的大小就会跟着奖励尺度一起疯涨,梯度范数直接失控。实际操作中,我用过全局 batch 标准化,也用过组内标准化,两者都能稳住训练,但组内标准化对动态采样更友好,因为每个 prompt 的 K 个回答天然形成一个小单位,统计量不会跑偏。
K 值怎么强调都不过分。K 太小,组内均值被个别异常回答牵着走,优势信号噪声大;K 太大,计算量线性上涨,但收益在 16 到 32 之后明显递减。第三条论文里体现得很清楚:在困难数学题上,K=8 到 K=16 是收益最陡峭的阶段。我自己的准则是,显存允许就尽量把 K 拉到 16,这是性价比最高的操作。
熵奖励一般用很小的系数,比如 0.001 到 0.01。它存在的唯一理由是防止策略过早坍缩成只会输出少数几个模板的状态。在 RLVR 场景中,模型如果发现某个套路能拿分,会很快收敛到低熵分布,失去探索空间。评测结果显示熵奖励在训练前中期帮助最大,后期作用逐渐被剪裁机制吸收,所以很多实现里会在后 20% 步数把它线性退火到 0。
3.3 “争议项”:动态采样、token 掩码、多次更新
动态采样是这几篇论文里最依赖场景的技巧。它的思路是:把那些无法拿到正奖励的 prompt 收集起来提高采样权重,让模型有更多机会在难样本上做探索。评测发现它在 prompt 质量参差不齐、正样本稀疏的数据集上效果显著,但在 prompt 本身已经被筛选得很干净的任务里,动态采样不仅没有帮助,还会因为反复重放差 prompt 而拖慢收敛。这是一个典型的“对症下药”型技巧,没症状就不要上。
token 级掩码,也就是把损失限定在关键 token 上,比如跳过 reasoning 前的固定格式 token 或者与答案无关的说明 token。这项技巧的评测结论很有意思:在回答格式统一、所有样本长度相近时,它没有收益;只有当数据集存在大量格式噪声,或者模型会在无关区域浪费概率质量时,才能看到改善。本质上它是在修正数据格式问题,而不是增强学习能力。
多次更新 epoch 是另一个表现暧昧的选项。一次 rollout 后重复使用数据更新 2 到 4 次,能明显提高样本利用率,这在计算受限时非常诱人。但评测同时警告,超过 4 次之后优势信号会过时,策略开始反复覆盖自己,loss 回升。我实践的体验是,第一次提升贡献最大,后面几次的收益越来越虚,尤其在高学习率下极易过拟合。
4. 实操:我是怎么配置 GRPO 训练的——一套能直接用的配置
4.1 一套可直接参考的基础配置模板
这里给出我给 7B 模型做数学 RLVR 训练时用的配置,拿过去改成自己的路径就能跑。它刻意没有堆砌任何花哨技巧,但每一项数值背后都有明确理由。
{ "model": "7B-base", "per_device_train_batch_size": 1, "gradient_accumulation_steps": 16, "rollout_batch_size": 512, "responses_per_prompt": 16, "max_prompt_length": 1024, "max_response_length": 1024, "lr": 2e-6, "lr_scheduler_type": "warmup_constant_then_decay", "warmup_ratio": 0.1, "min_lr_ratio": 0.1, "optimizer": "adamw", "weight_decay": 0.0, "grad_clip": 1.0, "kl_penalty": "none", "ratio_clip_epsilon": 0.2, "advantage_norm": "group", "entropy_coef": 0.003, "entropy_final_ratio": 0.0, "update_epochs": 2, "reward_type": "rule_verifier", "reward_normalize": false, "reward_bias_correct": false }每个关键项的解释如下:
responses_per_prompt: 16。这是整个配置里对效果影响最大的一个数。K=16 在大多数数学数据集上已经能给出足够稳定的组内均值和足够的探索样本,再往上加,收益曲线开始变平。lr: 2e-6。7B 模型做 RL 时,这个量级是个安全起点。学习率太高,策略单步偏移大,即使有 ratio clip 也压不住;太低则收敛慢。三篇论文的共同结论也是 LR 比大多数技巧更敏感。kl_penalty: none+ratio_clip_epsilon: 0.2。去掉参考模型,用对称剪裁来约束策略更新幅度。这能省下接近一半的显存开销,省出来的显存正好给更大的 K。advantage_norm: group。始终保持组内标准化。这一条绝对不能省,省了几乎必炸。entropy_coef: 0.003。很小的熵奖励,配合线性退火,防止初期熵坍缩又不干扰后期收敛。
4.2 先跑通,再调优的路线
我自己的流程永远是三步走。第一步,用上面这个配置把完整训练流程跑通,不追求指标,只看能不能稳定过 500 步不崩。第二步,记录监控指标,重点看熵曲线、reward 均值和正样本率。第三步,根据信号决定是否加技巧,而不是预先全都打开。
如果熵曲线在训练前 10% 就断崖式下跌,再在entropy_coef上翻一倍重新跑。如果 reward 均值一直不涨而正样本率也不低,说明模型没有从正样本里学到东西,这时再加高学习率,而不是堆技巧。只有在这些基础手段都失效之后,才轮到动态采样和 token 掩码上场。这个顺序能最大限度避免多变量耦合导致的误诊。
4.3 监控指标与判断方法
监控什么比怎么调更关键。我常看的指标有五项:
| 指标 | 健康表现 | 危险信号 |
|---|---|---|
| reward 均值 | 平滑上升后收敛 | 单步跳变、反复大起大落 |
| 组内 reward 标准差 | 缓慢增大或稳定 | 突然归零/爆炸 |
| 策略熵 | 先降后稳 | 前 10% 步快速趋零 |
| 正样本率 | 稳步抬升 | 长期不涨或飙升到异常高 |
| 梯度范数 | 稳定在 1 附近 | 超过 5 且持续 |
这五项里,组内 reward 标准差最容易被忽视。标准差趋近于零就意味着组内样本几乎没差异,优势信号全部接近 0,模型已经退化成只会输出同一类回答。这时候加熵奖励或者增大 K 才有意义。
5. 避坑笔记与常见问题排查
5.1 常见问题的速查表
这几周实操下来,我遇到的典型问题基本都可以收进这张表:
| 现象 | 可能原因 | 处置方式 |
|---|---|---|
| reward 一直涨,但回答长度疯狂膨胀 | 奖励黑客或长度偏置 | 检查 reward 与长度相关性,修奖励函数;收紧 ratio clip,提高熵系数 |
| 熵几乎瞬间归零 | 探索不足,策略坍缩 | 提高 entropy_coef,增大 K,降低学习率 |
| 梯度范数突然冲高 | 优势未标准化或数据含异常 reward | 确认 advantage_norm 已开启,检查 reward 是否有 NaN 或极端离群值 |
| loss 回升,reward 反复震荡 | 更新 epoch 过多 | 把 update_epochs 降到 1 或 2,或者减少梯度累积步数 |
| 正样本率高但 reward 不涨 | 奖励函数对正样本区分度太低 | 检查奖励是否有天花板效应,考虑引入过程奖励 |
| 去掉参考模型后训练崩了 | 任务属于开放式生成,缺少强约束 | 这种情况就老老实实加回 KL 罚项或更严格的 ratio clip |
5.2 适用边界:这些结论会影响哪些场景与角色
这次评测结论的影响范围可以分成三层。第一层是正在做数学、代码等可验证奖励任务的团队,这类场景下朴素 GRPO 已经足够强,复杂技巧大概率是负优化,省下的显存可以直接换成更大的 K。第二层是做通用 RLHF、用学习得到的奖励模型的团队,这类场景不能完全去掉参考模型和 KL 罚项,因为奖励模型本身的可被攻击面更大,但优势归一化和熵奖励依然是核心竞争力。第三层是做长上下文或推理链优化的研究者,token 掩码、动态采样这些技巧在这里才有不可替代的价值。
换句话说,如果你的实验遇到了稳定性问题,先检查三层基础件:学习率、K 值、优势归一化。这三项都没问题再谈技巧。而如果你的任务是开放式对话这类高熵场景,再从参考模型和 KL 罚项开始搭起,不要一上来就挑战最激进的配置。
5.3 几点个人体会与一个小技巧
最后分享一个我踩过多次坑之后养成的习惯:每次只改一个变量,并且每次改动都存一条带 seed 的基线。GRPO 训练本身就带有随机性,同一配置不同 seed 的 reward 曲线能差出两三个点。没有多个 seed 的对照,你根本无法判断某个技巧到底是真有效,还是只是运气。
还有一个小技巧是给训练过程加一个“正样本率”探针,也就是在验证集上频繁判断当前策略生成的回答能不能被规则奖励判对。这个指标比 reward 曲线更不容易被奖励黑客干扰,因为它直接反映了任务层面的真实能力增长。我最后生产环境那套配置,没有用任何论文里发明的花哨变体,就是最朴素的 GRPO 加组内标准化、K=16 和一点熵奖励,效果反而比我之前抱着十几个超参魔改时好一大截。回头再看标题那个问题,我的答案很直接:大部分复杂技巧都在掩盖问题,而不是解决问题。先把朴素配置调到无可挑剔,再谈技巧。