最近半年只要聊大模型推理能力训练很难绕开 GRPO 这三个字母。从 DeepSeek-R1 开源后很多团队开始在 7B、14B 甚至更大规模的模型上复现“纯强化学习增强推理”的路线而他们训练脚本里最常见的一行配置就是GRPOTrainer。很多人误以为 GRPO 是什么全新的强化学习算法其实它没有引入复杂的数学框架而是对 PPO 做了一个比较“狠”的减法把价值网络Critic直接从训练循环中拿掉用同一问题下的一组采样结果来做比较基线。如果只看表面很容易把 GRPO 理解成“给模型加一个奖励函数再微调”。但真正关键的地方在于它怎么把一条回答的分数转化成 token 级别的优势信号又是怎么用 clip 机制保证策略更新不失控。这两个点搞不清楚调参就只能靠猜训练崩了也不知道先查哪里。本讲H17会从 PPO 的痛点讲起把 GRPO 的数学推导拆开再给一个基于 TRL 的最小可运行示例最后梳理显存控制、KL 系数、奖励设计这些工程问题。适合两类读者一类是已经跑过 PPO 但想理解 GRPO 到底改了什么另一类是正准备在自己的模型上做推理 RLHF但显存预算比较紧张想少背一个价值网络的压力。1. 为什么大模型 RLHF 需要 GRPOPPO 的三座大山从 InstructGPT 开始基于人类反馈的强化学习RLHF的主流实现基本是 PPO 路线。PPO 的典型训练循环里需要四个模型Actor策略模型、Critic价值网络、Reward Model奖励模型、Reference Model参考模型。其中 Critic 的任务是估计状态价值也就是从当前 token 开始未来还能拿多少回报。有了这个价值估计策略更新时才能计算“这条 action 比平均预期好多少”也就是优势Advantage。这套机制在游戏、机器人等经典强化学习场景里经过了大量验证但放到大语言模型训练中压力主要来自三个方面。第一个是显存和算力成本。Critic 往往和 Actor 一样大全参数训练时等于多背了一份模型权重还要算它的梯度、优化器状态和激活值。很多团队想用 7B 模型做 RLHF结果光加载 Actor 加 Critic 加 Reward Model单卡就已经放不下了。第二个是价值网络本身难训。奖励模型的打分尺度在不同任务之间差异很大同一个任务的不同阶段也在波动Critic 的 loss 经常不稳定导致优势估计漂移策略更新方向被带偏。第三个是奖励尺度敏感。PPO 的优势来自“实际奖励减去价值估计”如果价值网络不准那么即使奖励函数本身是合理的学习信号也会被噪声淹没。GRPO 的思路是既然 Critic 这么贵又这么难训干脆不要它了。对同一个 prompt 采样 G 条回复把这 G 条回复的奖励均值当作基线用每条回复的奖励与组内均值、标准差的偏离程度作为优势。这就是“组相对”的含义策略更新不是看绝对好坏而是看这条回复在同一组采样里排在第几位。这里值得停下来强调一下GRPO 的核心不是换了一个 loss 函数而是换了一个“基线估计器”。PPO 用价值网络估计基线GRPO 用组内统计量估计基线。基线变廉价了代价是每个 prompt 都要额外采样很多条回复采样成本和显存占用被转移到了生成阶段。2. GRPO 核心设计组采样、基线替代与近端更新GRPO 的全称是 Group Relative Policy Optimization组相对策略优化。拆开来理解会更容易。组采样Group Sampling训练时从数据集中取一个 prompt再用当前策略模型采样 G 条不同的回复。这 G 条回复组成一个“组”。组的大小 G 是最重要的超参数之一它决定基线估计的稳定性。组内相对优势Group Relative Advantage对 G 条回复分别算奖励然后把这个组内的奖励均值当作基线。每条回复的奖励减去组内均值再除以组内标准差就得到一个标准化之后的相对分数。这个分数是正是负表示这条回复在这个组里是高于平均水平还是低于平均水平。组内标准化优势Standardized Advantage除以标准差这一步很关键。它把不同任务、不同奖励尺度的分数统一到同一个量纲。否则有的任务奖励范围是 0 到 1有的任务奖励范围是 0 到 1000clip 阈值就没法统一设置了。近端更新Proximal Update这个词其实继承自 PPO 的 Proximal。近端的意思是新旧策略之间的更新幅度要被限制在一个“近”的范围内。GRPO 在更新时计算新策略与旧策略的概率比 ratio如果 ratio 偏离 1 太多说明这一步更新步子迈大了clip 函数会把它的梯度信号截断。这是 GRPO 能保持训练稳定性的核心机制。下面把 PPO 和 GRPO 的训练结构对照一下。维度PPOGRPO策略模型ActorActor也就是被训练的模型基线估计Critic 价值网络组内奖励均值优势计算GAE广义优势估计组内相对标准化优势Reference Model需要需要用于 KL 约束Reward Model需要需要额外模型Critic无token 级优势每个 token 有独立估计整条回复共享同一优势核心超参数GAE 系数、clip、KL 系数组大小 G、clip、KL 系数从工程角度看GRPO 最大的吸引力是减少了模型数量。训练循环里没有再训练一个与 Actor 同等规模的价值网络显存占用自然下降。但要注意的是采样阶段因为要生成 G 条回复耗时和显存并不一定比 PPO 少。所谓省显存省的主要是 Critic 的模型权重、优化器和梯度而不是生成阶段的计算开销。还有一个容易混淆的点很多人以为 GRPO 的优势估计也像 PPO 那样逐 token 计算。其实 GRPO 中一条回复的所有 token 共享同一个优势值。原因很简单没有价值网络就没有办法把序列级奖励分解到 token 级别。对一条回复来说奖励是整个序列的总体评价所以 GRPO 只能把这一个优势值“平摊”到每个 token 的更新信号上。这一点在后面的数学公式里会看得更清楚。3. GRPO 数学推导从 PPO 目标函数到 GRPO 目标函数3.1 PPO 的目标函数回顾PPO 的目标函数可以写成下面这个形式$$ J_{\mathrm{PPO}}(\theta)\mathbb{E}{q \sim P(Q),, o \sim \pi{\theta_{\mathrm{old}}}(O \mid q)}\left[\frac{1}{|o|} \sum_{t1}^{|o|} \min\left(\rho_t(\theta) A_t,, \operatorname{clip}\left(\rho_t(\theta), 1-\epsilon, 1\epsilon\right) A_t \right)\right] $$其中$\rho_t(\theta)$ 是新旧策略在 token $o_t$ 上的概率比$$ \rho_t(\theta)\frac{\pi_{\theta}(o_t \mid q, o_{t})}{\pi_{\theta_{\mathrm{old}}}(o_t \mid q, o_{t})} $$$A_t$ 是优势值PPO 里通常用 GAE 来计算。$\operatorname{clip}(\cdot, 1-\epsilon, 1\epsilon)$ 把概率比限制在 $[1-\epsilon, 1\epsilon]$ 范围内。取 $\min$ 的目的是当优势为正时即使概率比很高也最多只按 clip 上限来计算梯度当优势为负时即使概率比被压得很低也最多只按 clip 下限来计算。3.2 GRPO 的目标函数与符号说明GRPO 对同一个 prompt $q$ 采样 $G$ 条回复记为 ${o_1, o_2, \dots, o_G}$。目标函数如下$$ J_{\mathrm{GRPO}}(\theta)\mathbb{E}{q \sim P(Q),, {o_i}{i1}^{G} \sim \pi_{\theta_{\mathrm{old}}}(O \mid q)}\left[\frac{1}{G}\sum_{i1}^{G} \frac{1}{|o_i|}\sum_{t1}^{|o_i|} \left[\min\left(\rho_{i,t}(\theta) A_{i,t},, \operatorname{clip}\left(\rho_{i,t}(\theta), 1-\epsilon, 1\epsilon\right) A_{i,t}\right)\right] - \beta , D_{\mathrm{KL}}\left[\pi_{\theta} ,|, \pi_{\mathrm{ref}}\right]\right] $$这里每个符号的含义如下。符号含义$q$输入 prompt$o_i$第 $i$ 条采样回复$G$组大小同一条 prompt 下的采样数量$\pi_{\theta}$当前待更新的策略模型$\pi_{\theta_{\mathrm{old}}}$采样时使用的旧策略$\pi_{\mathrm{ref}}$冻结的参考模型通常是 SFT 后的模型$\rho_{i,t}(\theta)$第 $i$ 条回复第 $t$ 个 token 的概率比$A_{i,t}$第 $i$ 条回复第 $t$ 个 token 的优势值$\epsilon$clip 范围阈值通常取 0.2 左右$\beta$KL 惩罚系数3.3 组内优势的计算公式GRPO 中第 $i$ 条回复的优势值计算公式为$$ A_{i,t}A_i\frac{r_i-\operatorname{mean}({r_1,r_2,\dots,r_G})}{\operatorname{std}({r_1,r_2,\dots,r_G})} $$这个公式有几个地方要特别注意。第一分子是“这条回复的奖励减去组内奖励均值”分母是“组内奖励标准差”。这本质上就是 z-score 标准化。标准化之后同一组内优势值的均值为 0标准差为 1。这意味着每组里必然有约一半的回复优势为负约一半优势为正。第二$A_{i,t}$ 的下标虽然是 $i,t$但实际取值和 $t$ 无关。一条回复里的所有 token 共享同一个优势值 $A_i$。这是 GRPO“序列级奖励 无 Critic”设计带来的必然结果。第三如果组内所有奖励完全相同标准差为 0公式会除以 0。工程实现里一般会加一个极小值 epsilon 防止数值溢出。这也是训练中一个容易遇到的坑奖励函数设计太稀疏比如大多数回复都得 0 分少数回复得 1 分组内方差可能仍然较小优势信号会被压缩。3.4 近端更新在 GRPO 中如何起作用GRPO 的近端更新逻辑和 PPO 是一样的。$\rho_{i,t}(\theta)$ 表示新策略对当前 token 的概率比$$ \rho_{i,t}(\theta)\frac{\pi_{\theta}(o_{i,t}\mid q,o_{i,t})}{\pi_{\theta_{\mathrm{old}}}(o_{i,t}\mid q,o_{i,t})} $$当优势 $A_i0$ 时我们希望增大这条回复中每个 token 的概率。但如果概率比已经超过 $1\epsilon$说明新策略在这条路径上的变化已经足够大不需要继续增加梯度所以 clip 后的值会限制更新幅度。当优势 $A_i0$ 时我们希望降低这条回复中 token 的概率。如果概率比已经被压到 $1-\epsilon$ 以下同样停止继续更新。这个机制是为了防止策略在单次更新中发生剧烈偏移。大模型策略的 KL 空间非常大如果没有 clip 约束模型很可能因为一两条高奖励回复就把输出风格彻底改掉后面对话格式崩坏、重复 token 增多这些都是常见症状。3.5 论文形式与 TRL 实现的细节差异在 DeepSeekMath 论文里KL 惩罚项被放在目标函数中用 $\pi_{\theta}$ 与 $\pi_{\mathrm{ref}}$ 的 KL 散度直接约束策略。但在实际工程库 TRL 的实现中更常见的做法是把 KL 惩罚先合并进奖励值也就是计算一条回复的奖励时变成$$ r_i r_i - \beta \cdot \mathrm{KL}(\pi_{\theta}, \pi_{\mathrm{ref}}) $$然后对 $r_i$ 再做组内标准化。这种方式最终得到的效果与论文公式不完全等价但因为实现简单、易于调试被很多开源项目采纳。对使用 TRL 的开发者来说理解这一点很重要你在训练日志里看到的reward可能已经是扣过 KL 惩罚的数值不再是原始奖励模型的分数。4. 理解组内标准化优势一个数字示例先看一个最简单的组。假设对同一个 prompt 采样了 4 条回复奖励模型打分分别为[2, 4, 6, 8]组内均值是 5组内标准差约为 2.236。标准化后的优势值约为[-1.34, -0.45, 0.45, 1.34]可以看到得分最低的 2 分回复优势为 -1.34这轮更新会显著降低这条回复对应 token 序列的概率。得分最高的 8 分回复优势为 1.34概率会被调高。中间两条优势绝对值较小受 clip 影响更大更新幅度有限。再换一组奖励值[1, 2, 7, 100]均值约为 27.5标准差约为 42.6。标准化后的优势值约为[-0.62, -0.60, -0.48, 1.70]这个例子更有意思。除了最高分 100 之外其他三条回复尽管绝对分数有 1、2、7 的区别但标准化后全部为负优势。也就是说在组内相对比较下只要不是最高分这一轮策略都会压低它们的概率。这说明 GRPO 的组内标准化优势会放大“赢家通吃”效应。采样组里只要有一条明显更好的回复模型就会快速向这条路径收敛。这也是 GRPO 为什么通常需要配合足够大的组大小 G。如果 G 太小比如 G2那么每组只有两个样本均值很容易被极端值带偏优势信号不够稳定。如果 G 较大比如从 8 到 64基线估计就更平滑。但 G 增大也意味着采样成本上升因为每个 prompt 都要生成更多回复。这个权衡是 GRPO 最核心的工程取舍。还有个容易被忽略的细节除以标准差不只是统一尺度它会让不同任务的 clip 阈值变得可比较。如果奖励模型的分数在不同任务上分布差异很大不做标准化那么 clip 的 $\epsilon0.2$ 在奖励分数范围大的任务上可能毫无约束力在分数范围小的任务上又可能过度约束。5. GRPO 训练全流程与最小可运行示例5.1 训练循环拆解GRPO 的完整训练循环可以分为下面几个步骤从训练集中取一个 batch 的 prompt。使用当前策略模型旧策略为每个 prompt 采样 G 条回复采样在推理模式下进行不计算梯度。对每条回复计算奖励可能包括正确性奖励、格式奖励以及 KL 惩罚。在同一个 prompt 的组内做标准化得到每条回复的优势值。把 prompt 与回复拼接成完整序列重新前向计算新策略的 logits得到每个 token 在新策略下的概率。计算新策略与旧策略的概率比乘上组内优势应用 clip形成最终的策略损失。反向传播更新策略模型参数。其中第 5 步和第 6 步是“on-policy”的关键采样时用旧策略更新时用新策略重新前向一次。如果跳过重新前向直接用采样时的概率算 ratio梯度无法正确流过当前策略参数。5.2 环境准备建议使用 Python 3.10 以上版本安装以下核心依赖pip install torch transformers trl datasets peft accelerate版本以实际安装为准。本文演示的 TRL 接口以较新的 0.x 版本 API 为主如果你的 TRL 版本较旧部分参数名可能有差异可以先查看GRPOConfig的签名确认。5.3 准备训练数据GRPO 训练需要的是 prompt 数据而不是“输入-输出”对照数据。每条样本只需要提供 prompt 字段回复由模型在训练时自行采样。下面构造一个极小的数学推理演示集。from datasets import Dataset dataset Dataset.from_dict({ prompt: [ 小明有 3 个苹果又买了 2 个一共有几个请只给出数字答案。, 一个直角三角形的两条直角边分别是 3 和 4斜边长度是多少请只给出数字答案。, ], answer: [5, 5], })注意这里加了answer列用于在奖励函数中校验结果。真实训练时数据量至少要几百条以上这里只是为了演示流程。5.4 定义奖励函数奖励函数是 GRPO 训练中最关键的部分。下面的例子同时检查答案是否正确以及输出是否只有数字。import re def combined_reward(completions, **kwargs): rewards [] answers kwargs.get(answer, []) for i, completion in enumerate(completions): text completion.strip() digits re.findall(r-?\d, text) if not digits: rewards.append(0.0) continue pred digits[-1] correct 1.0 if pred answers[i] else 0.0 # 额外给一个格式约束如果输出只包含数字给 0.5 格式分 format_score 0.5 if len(digits) 1 and len(text) 10 else 0.0 rewards.append(correct * 1.0 format_score) return rewards这个奖励函数把“答对”和“格式简洁”组合在一起。组合多个奖励是 GRPO 工程实践中的常见做法。需要注意的是不同 reward 函数之间需要协调权重否则某个奖励占比过大会扭曲优化方向。5.5 加载模型与 Tokenizer用一个小模型做演示可以减少显存压力。这里以 Qwen2.5-0.5B-Instruct 为例。from transformers import AutoModelForCausalLM, AutoTokenizer model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-0.5B-Instruct) ref_model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-0.5B-Instruct) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2.5-0.5B-Instruct) if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token参考模型ref_model用于计算 KL 惩罚需要冻结参数。实际项目中参考模型通常是训练前的 SFT 模型权重而不是随意初始化的模型。5.6 配置 GRPO 训练器并启动训练from trl import GRPOTrainer, GRPOConfig config GRPOConfig( output_dir./grpo_demo, per_device_train_batch_size2, gradient_accumulation_steps4, learning_rate1e-6, max_steps100, logging_steps1, save_steps50, num_generations8, max_completion_length128, temperature0.8, beta0.04, ) trainer GRPOTrainer( modelmodel, ref_modelref_model, reward_funcs[combined_reward], argsconfig, train_datasetdataset, tokenizertokenizer, ) trainer.train()参数说明num_generations对应公式里的组大小 G这里设为 8。max_completion_length采样回复的最大 token 长度。betaKL 惩罚系数。数值越大策略越不敢偏离参考模型。temperature采样温度温度过高会生成更多随机内容温度过低会导致组内回复多样性不足。learning_rate策略模型学习率通常要比 SFT 阶段更小。1e-6 是一个比较保守的起点。5.7 训练启动命令行执行python train_grpo.py如果想减少显存占用可以配合 transformers 的 4bit 量化和 PEFT LoRA 来训练from peft import LoraConfig, get_peft_model lora_config LoraConfig( r16, lora_alpha32, target_modules[q_proj, k_proj, v_proj, o_proj], lora_dropout0.05, ) model get_peft_model(model, lora_config)LoRA 方案下ref_model仍然需要用完整权重加载因为它负责提供 KL 约束的参考分布。如果显存不够可以对ref_model使用更低精度的加载例如torch_dtypetorch.bfloat16但要保证它和策略模型的 tokenizer 完全一致。6. 运行效果与验证方法GRPO 训练不像 supervised fine-tuning 那样直接看 loss 下降到某个值就结束。你需要同时观察几个信号。第一策略 loss 的绝对值本身参考意义不大。真正需要关注的是它是否平稳。如果 loss 在几十步内持续出现 spikes大概率是优势值或 KL 惩罚没有控制好。第二训练日志中的reward曲线是否上升。TRL 的日志里通常包含本轮采样的平均奖励和 KL 值。如果奖励上升但 KL 也快速上升说明模型在用“偏离参考模型”的方式刷奖励这是过拟合奖励模型的前兆。第三在验证集上检查生成文本是否真的变好了。下面的脚本可以用来做小规模验证from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2.5-0.5B-Instruct) model AutoModelForCausalLM.from_pretrained(./grpo_demo/final_checkpoint) prompts [ 小明有 3 个苹果又买了 2 个一共有几个请只给出数字答案。, 一个直角三角形的两条直角边分别是 3 和 4斜边长度是多少请只给出数字答案。, ] for prompt in prompts: messages [{role: user, content: prompt}] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) inputs tokenizer(text, return_tensorspt) outputs model.generate( **inputs, max_new_tokens128, temperature0.6, do_sampleTrue, pad_token_idtokenizer.pad_token_id, ) response tokenizer.decode(outputs[0][inputs[input_tokens].shape[1]:], skip_special_tokensTrue) print(Prompt:, prompt) print(Response:, response) print(---)注意这种最小示例只有 2 条训练数据、100 步训练效果只能证明流程可以跑通不能说明模型能力有真实提升。如果要用 GRPO 训练出可用的推理能力训练数据规模、组大小 G、KL 系数和步数都需要成倍增加。如果训练失败第一步先看日志里有没有 NaN。如果是 NaN优先检查优势计算是否出现除零比如组内所有奖励都相同导致 std 为 0。其次看 KL 系数是否过大把 loss 推爆。7. 常见问题与排查方法GRPO 训练里的问题表面看起来五花八门追到根上基本都在奖励设计、组大小、KL 系数、数值稳定性这四个方面。问题现象可能原因排查思路解决方案启动后直接 OOM组大小 G 太大或 batch size 过大查看显存占用、降低采样数减小num_generations使用 LoRA 4bit开启 gradient checkpointingloss 变成 NaN组内标准差为 0或学习率过大查看前几步日志中的 reward 分布在优势计算中加 epsilon降低学习率检查奖励函数方差reward 上升但输出质量恶化KL 约束不足模型偏离参考模型过远观察 KL 值是否快速增大调大 beta降低学习率增加参考模型约束输出全部变成重复短句clip 比例过高策略在局部过度更新检查日志中 policy clip fraction降低学习率增大组大小 G调低 temperature生成的回复为空或截断pad_token 设置不正确或 max_completion_length 过短检查 tokenizer 配置和生成日志设置pad_token eos_token增大max_completion_length优势值几乎全是 0奖励函数稀疏组内得分都一样打印每条回复的 reward设计更细粒度的奖励例如增加格式分、过程分、长度约束训练非常慢采样阶段耗时长观察采样 vs 更新耗时占比减小 G使用 vLLM 等加速推理后端或缩短 max_completion_length这里再展开说一下“clip fraction”的使用。TRL 和很多开源实现都会在日志中输出被 clip 掉的 token 占比。如果这个比例很高比如超过 30%说明每一步的更新幅度已经频繁触顶策略正在大步跳跃。很多团队的实践经验是把这个比例控制在 10% 以内做法通常是降低学习率或增加 KL 约束。8. 工程建议与最佳实践8.1 组大小 G 的选择G 是 GRPO 最重要的超参数。G 太小基线估计噪声大优势信号不稳定G 太大采样成本高训练速度慢。从公开资料看业界常见的取值在 8 到 64 之间。如果你的奖励函数比较稳定比如是规则计算判分G 可以小一些如果奖励来自一个训练出来的奖励模型打分噪声较大G 应该大一些。8.2 KL 系数 beta 的调节策略beta 控制策略模型与参考模型之间的距离。beta 太大会限制策略探索模型可能根本不会出现新行为beta 太小策略会快速漂移训练不稳定甚至出现“奖励黑客”行为比如生成大量无意义内容来刷格式分。调节 beta 的通用做法是先固定一个较小的学习率观察训练前 100 步的 KL 变化曲线。如果 KL 在稳步上升但速度可控说明 beta 基本合适如果 KL 在几十步内暴涨说明 beta 偏小。也可以动态调整 beta不过工程上建议先用固定 beta 跑通流程再考虑自适应版本。8.3 奖励函数设计是真正决定效果的部分GRPO 本身只是优化算法它不会判断什么行为值得奖励。奖励函数的正确性直接决定训练能否收敛到预期的行为。对于数学推理任务可以组合以下几种信号最终答案正确性奖励这是最核心的稀疏奖励。格式奖励鼓励模型按指定格式输出比如“先写推理步骤再给出答案”。长度奖励或长度惩罚防止模型为了刷分生成超长内容。过程奖励如果对推理步骤有监督信号可以对中间步骤也打分。从目前的趋势看过程奖励模型PRM和基于规则的可验证奖励Rule-based Reward是 GRPO 训练质量差异的重要来源。如果只有最终答案对错这样一个稀疏信号训练方差会非常大。8.4 长度控制与终止条件GRPO 训练中模型容易越来越啰嗦。因为只要回复被判定为正确更长内容不会降低奖励模型就会倾向于堆砌重复推理过程。建议在奖励函数中加入长度惩罚项或者在采样阶段设置终止条件。长度惩罚的经典示例def length_penalty(completions, **kwargs): rewards [] for completion in completions: length len(completion.split()) # 奖励包含一定长度但超过阈值后惩罚 if length 50: rewards.append(0.2) elif length 300: rewards.append(-0.5) else: rewards.append(0.0) return rewards真实场景中更推荐把长度惩罚与正确性奖励组成加权和而不是单独使用。8.5 参考模型与检查点管理参考模型应该是训练开始时的那个 SFT 模型并且在整个训练过程中冻结。不要在训练中途把参考模型替换成当前策略模型那样 KL 约束就失效了。每训练几百步保存一个检查点方便回滚到较稳定的版本。生产环境做 RLHF 训练前建议先在离线评测集上做一轮过滤确认新策略没有在对话安全、格式规范方面出现明显退化再考虑部署。9. 总结与后续学习方向GRPO 能成为大模型 RLHF 的主流方案核心原因是它用一个非常朴素的统计技巧替代了价值网络同 prompt 多采样几条回复用组内均值当基线用组内标准差做归一化再用 clip 限制策略更新幅度。这个替换同时规避了 Critic 显存开销大和难训练两个工程顽疾也把优势计算简化到几乎不需要额外实现的程度。但 GRPO 并不是银弹。它把基线的压力转移到了采样质量上G 不够大、奖励函数太稀疏、采样温度不合适都会让优势信号失真。真正跑好 GRPO要花大量时间在奖励函数设计、KL 系数调节和训练稳定性观测上。接下来值得继续深入的方向至少有四个。一是离线偏好优化路线比如 DPO 及其变种理解它们和在线强化学习的取舍关系二是过程奖励模型PRM让 GRPO 在数学、代码等长链推理任务上获得更密集的反馈信号三是探索长度控制、熵正则、动态 beta 这些工程技巧它们对最终模型质量的影响经常比算法本身还大四是在小模型上多做消融实验再迁移到更大规模。建议收藏这篇文章等你真正开始调 GRPO 的时候可以回来看第四节的优势示例、第五节的训练循环拆解和第七节的排查表。