LLM 面试备考
首页/后训练

GRPO 组相对策略优化(Group Relative Policy Optimization)

所属:01-fundamentals / 02-post-training
面试权重:★★★
来源:通用领域知识;未做一手考证
相关项目:Own — Race Bot / HKJC(Verl 框架,Qwen-32B 的 SFT + GRPO 两阶段训练,端到端问答准确率 63% → 92%)、Writing Copilot(DPO → GRPO)→ 见 02-interview/projects/race-bot-hkjc.md

一句话#

GRPO 把 PPO 里的价值网络(value / critic)整个删掉:对同一个 prompt 采样一组(group)回答,用组内奖励的归一化值直接当 advantage —— 组均值充当 baseline,组标准差做尺度归一化。少一个与策略同规模的模型,显存与工程复杂度显著下降,是推理模型(reasoning model)训练链路的主力算法。

为什么重要(面试角度)#

这是你有一手生产经验的题目(HKJC 项目跑的就是 Verl + GRPO),所以面试官会挖得比一般候选人深:

  • 「GRPO 为什么比 PPO 便宜」如果只答「不用 value model」,会被追问到 rollout 成本其实变高了 这一层。
  • 组内归一化带来的结构性缺陷(全对/全错的小组梯度为零、信用分配粗糙)是区分「跑过」和「调过」的关键。
  • 必须能说清奖励设计:什么时候可以完全不用 reward model(可验证任务),什么时候必须用。
  • Verl 是你在 CV 上写了的框架,被问到「Verl 的设计为什么能跑 RL」时要有可讲的架构层次。

核心内容#

从 PPO 到 GRPO:只改了一件事,但改动很大#

PPO 需要价值网络,是因为它要用 Vψ(st)V_\psi(s_t) 作为 baseline 来估计 advantage(通常配合 GAE)。baseline 的作用是降方差:减去一个与动作无关的基线,期望不变而方差下降。

GRPO 的观察是:如果同一个 prompt 我采样了 GG 条回答,那么这 GG 条回答的平均奖励,就是这个 prompt 的一个天然 baseline —— 不需要学一个神经网络来预测它。

A^i=ri−mean(r1,…,rG)std(r1,…,rG)\hat A_i=\frac{r_i-\mathrm{mean}(r_1,\dots,r_G)}{\mathrm{std}(r_1,\dots,r_G)}

其中 rir_i 是第 ii 条回答的奖励(整条回答一个标量)。这个组内归一化值直接作为该条回答中每一个 token 的 advantage。

对比一下 PPO 里这个 baseline 是什么:一个需要在线训练的、与 policy 同规模的神经网络,它的估计误差会直接进 advantage。GRPO 用采样出来的经验均值替换它 —— 无参数、无训练、无估计误差(只有采样噪声)。

目标函数#

GRPO 保留了 PPO 的 clipped 重要性采样比(每一步仍然是「近端」更新),只是把 advantage 换成了组内相对值:

JGRPO(θ)=E[1G∑i=1G1∣oi∣∑t=1∣oi∣(min⁡(ρi,tA^i, clip(ρi,t,1−ϵ,1+ϵ)A^i)−β DKL(πθ∥πref))]\mathcal{J}_{\text{GRPO}}(\theta)=\mathbb{E}\Big[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\Big(\min\big(\rho_{i,t}\hat A_i,\ \mathrm{clip}(\rho_{i,t},1-\epsilon,1+\epsilon)\hat A_i\big)-\beta\, D_{\text{KL}}\big(\pi_\theta\|\pi_{\text{ref}}\big)\Big)\Big]

其中 ρi,t=πθ(oi,t∣⋅)/πθold(oi,t∣⋅)\rho_{i,t}=\pi_\theta(o_{i,t}\mid\cdot)/\pi_{\theta_{\text{old}}}(o_{i,t}\mid\cdot)。

逐项读一遍:

项 来源 作用
A^i\hat A_i 组内归一化 替代价值网络,整条回答共用一个 advantage
ρi,t\rho_{i,t} + clip 继承自 PPO 限制单步更新幅度,稳定训练
βDKL\beta D_{\text{KL}} 继承自 PPO/RLHF 把策略锚在 reference 附近,见 rlhf-ppo.md
外层 1/G1/G、内层 $1/ o_i $

重要口径提醒:不同实现(以及不同论文版本)对 KL 项是否保留、如何归一化、advantage 是否再乘一个系数,做法并不统一。有公开技术报告提到在可验证任务的 RL 阶段可以不引入 KL 项 —— 好处是不需要常驻 reference model,显存进一步下降;代价是失去对分布漂移的显式约束。面试时说清你所在实现的具体选择,不要把某一种做法说成「GRPO 的定义」。

为什么比 PPO 便宜#

维度 PPO GRPO
价值网络 有(与 policy 同规模,含梯度与优化器状态) 无
常驻模型数 4(policy / reward / ref / value) 2–3(policy / ref / reward),可验证任务下常只剩 1–2
Advantage 估计 GAE,需 value model 与逐 step bootstrap 组内经验均值,无需学习
工程复杂度 需要在线训 critic,超参更多 少一个训练目标、少一组超参

但必须主动补充一句:GRPO 不是无条件更便宜,它把成本从显存搬到了采样算力。

  • 每个 prompt 要采样 GG 条完整回答。GG 越大,baseline 越准(方差越低),但 rollout 的算力与时间线性上涨。
  • 生成(rollout)本身就是 RL 训练里最慢的一环(显存带宽受限,见 rlhf-ppo.md),所以 G 的放大往往是墙钟时间的主要来源。
  • 尤其对长思维链(long CoT)任务,一条回答可能就是几千 token,GG 倍放大非常可观。

所以准确的说法是:GRPO 用「可并行的采样算力」换掉了「必须常驻显存的参数化 critic」和「在线训练 critic 的稳定性风险」。在显存是真瓶颈、采样可以并行铺开的场景里,这是一笔非常划算的交易 —— 这是它能在推理模型训练中普及的直接原因。

结构性缺陷(面试的加分点,必须主动讲)#

1. 组内奖励完全一致时,梯度为零。 如果 GG 条回答全对或全错,std=0\mathrm{std}=0(实现上一般会加 ϵ\epsilon 防止除零,但即便加了,分子也都为 0),advantage 全为 0 —— 这个 prompt 对训练没有任何贡献。含义很实际:

  • 太简单(全对)和太难(全错)的 prompt 都是无效样本,它们只消耗采样算力。
  • 所以 GRPO 的实践里prompt 难度管理是一等公民:按 pass rate 过滤或分层采样,让每个 batch 里的样本都处在「有对有错」的区间。这是很多 GRPO 复现训不动的首要原因 —— 不是超参问题,是数据难度分布问题。
  • 同时也意味着评价指标上要监控「零梯度组的比例」,这个诊断指标比 loss 有用得多。

2. 信用分配(credit assignment)很粗糙。 整条回答共用一个 A^i\hat A_i,等价于假设「这条回答的每个 token 都有同等贡献」。对于长推理链,这是一种很粗的归因 —— 模型无法得知是哪一步推理出了错,只知道整条链的结局好不好。PPO 的 GAE 在这一点上更细粒度(代价就是需要 value model)。这是 GRPO 换取简洁性的真实代价,不要声称它「没有缺点」。

3. 组统计的噪声。 GG 小的时候,组均值/标准差本身是噪声估计,advantage 会抖;GG 大则算力吃不消。GG 是一个必须在实测中定的权衡参数。

4. 奖励设计仍然是全部难点。 删掉 value model 不等于删掉奖励设计问题。reward hacking 的分析在 GRPO 下完全适用(见 rlhf-ppo.md)—— 甚至更危险,因为 GRPO 常用于「规则奖励」场景,而规则是脆弱的:只要能被解析成正确格式就可能骗到分。

多轮场景会把这四条同时放大,并且多出两个上面没提的问题 —— 组内比较掺入环境噪声、token 级优化与 tool-call 级决策的粒度错配。那就是 Agentic RL:08-agentic-rl.md。一句话预告:GRPO 成立的前提是「短 horizon、强 verifier、组内 reward 有方差、一条 response 就是一次决策」,而多轮工具调用把这四条一起打破。

在推理模型训练中的角色(RLVR 路线)#

GRPO 的爆发式普及与推理模型的训练方式直接相关。对有客观正确答案的任务,奖励可以完全程序化计算,于是连 reward model 都不需要:

任务 可验证奖励
数学 最终答案与标准答案的等价判定(必要时做符号/数值归一化)
代码 单元测试 / 编译 / 执行结果
Text2SQL SQL 能执行 且 结果集与 ground truth 等价(HKJC 项目的设计)
格式合规 模板/正则检查(只能作为辅助项,绝不单独使用)

业界的通行叫法是 RLVR(RL with Verifiable Rewards,可验证奖励的强化学习) —— 这条路线之所以能在学术和工程界快速复现,正是因为:① 不需要训 reward model;② 不需要 value model(GRPO);③ 奖励客观、不易被 hack(相对而言)。公开的推理模型技术报告中,用 GRPO 配合规则化奖励训练数学/代码推理是主流做法之一。

但奖励设计的陷阱依然在(HKJC 项目的真实教训):如果只奖励「SQL 执行成功」,模型会学会生成永远能执行但返回空集的 SQL(例如恒真/恒假条件),因为这类 SQL 的执行成功率最高。所以:

  • 可执行性必须与结果正确性绑定,不能单独作为奖励;
  • 要对空结果、异常行数、超时做显式惩罚;
  • 每一项奖励都要做对抗检验:问「模型怎样在不真正完成任务的前提下拿到这一项的分」。

Verl 框架#

Verl(字节跳动开源的 RL / RLHF 训练库)是 HKJC 项目使用的框架,也是当前 GRPO/PPO 训练的主流选择之一。它值得讲的架构要点:

  • Hybrid Flow(混合控制器)架构:一个中心 controller 编排整个 RL 数据流(生成 → 打分 → 训练),把推理和训练拆成两类可以独立伸缩的 worker,而不是把两者塞进一个进程。
  • 基于 Ray 的分布式 worker:ActorRollout(生成)、Critic(价值,GRPO 下可不用)、RefPolicy、RewardModel 各自是独立的计算角色,可按需组合 —— 这就是为什么它同时支持 PPO / GRPO 等不同算法:换算法主要是换掉几个角色和 advantage 的计算方式。
  • 推理引擎可插拔:rollout 阶段对接 vLLM / SGLang 这类高吞吐推理引擎,训练阶段用 FSDP / Megatron 做参数切分。
  • 权重同步(resync)是关键工程点:同一批 GPU 在「推理模式」(KV cache、PagedAttention)和「训练模式」(激活、梯度)之间来回切换,每次切换都要把训练侧的新权重同步给推理侧。这个同步的带宽与频率往往就是端到端吞吐的瓶颈,也是各种异步/解耦方案要解决的问题。
  • SFT 与 RL 在同一套框架里,因此两阶段流水线(SFT 建立起点 → GRPO 对齐)的衔接成本低 —— 这正是 HKJC 项目用它的原因之一。

⚠️ 诚实提醒:Verl 迭代较快,不同版本的模块划分与 API 有差异。面试时讲架构思想(推理/训练解耦、Ray worker 角色化、权重同步是瓶颈)比背具体类名更安全,也更显水平。

GRPO 与 DPO 的定位差异(一句话)#

DPO 是离线的(在固定偏好集上做监督式优化,稳定但无探索),GRPO 是在线的(当前策略采样、按奖励信号探索,能走到数据之外,但更贵更不稳)。所以 Writing Copilot 的顺序是「DPO 先把分布挪到正确区域,GRPO 在该区域内做精细优化」。详见 dpo.md。

常见面试问法#

Q:GRPO 为什么可以不要 value model? A:advantage 需要一个 baseline 来降方差。PPO 用一个学出来的 VψV_\psi。GRPO 改成对同一 prompt 采样 GG 条回答,用这个组的平均奖励作为 baseline,并用组标准差做尺度归一化:A^i=(ri−mean)/std\hat A_i=(r_i-\mathrm{mean})/\mathrm{std}。这是无参数的 Monte-Carlo 估计,省掉一个与策略同规模的模型及其在线训练。

Q:GRPO 相比 PPO 真的更便宜吗? A:显存和工程复杂度上是的(少一个模型、少一个训练目标、少一组超参)。但算力上不一定 —— 每个 prompt 要采样 GG 条完整回答,而 rollout 生成本来就是 RL 训练中最慢的一环,GG 会线性放大采样成本,长 CoT 场景尤甚。准确的说法是:用可并行的采样算力换掉了必须常驻显存的 critic 与它的稳定性风险。

Q:如果一组样本奖励全都一样会发生什么? A:组标准差为 0,归一化后 advantage 全为 0,这个 prompt 对梯度没有贡献(实现上通常加 ϵ\epsilon 防除零,但分子仍为 0)。含义是:太简单(全对)和太难(全对错)的 prompt 都是无效样本。所以实践中要做 prompt 难度管理(按 pass rate 过滤/分层采样),并把「零梯度组占比」作为关键监控指标。

Q:GRPO 的 advantage 对整条回答是同一个值,这有什么问题? A:信用分配粗糙。等价于假设每个 token 贡献相同,模型无法知道长推理链里是哪一步出了错,只知道整体结局。PPO 的 GAE 通过价值模型做逐 step bootstrap,粒度高得多 —— 这是 GRPO 换取简洁性的真实代价,不是白拿的。

Q:Text2SQL 的 GRPO 奖励你会怎么设计? A:分三项加权:① 可执行性;② 结果正确性(执行结果与 ground truth 等价,需处理排序、浮点容差、空结果);③ 格式合规。关键约束是①不能单独作为奖励 —— 否则模型会退化成生成永远能执行但无意义的 SQL(如恒真条件),所以可执行性必须与结果正确性绑定,并对空结果、异常行数做惩罚。此外每项都要做对抗检验,防止 reward hacking。

Q:Verl 是什么?为什么用它? A:字节开源的 RL/RLHF 训练框架。核心设计是 hybrid flow:把推理(rollout)与训练拆成可独立伸缩的 Ray worker 角色(ActorRollout / Critic / RefPolicy / RewardModel),rollout 阶段对接 vLLM/SGLang,训练阶段用 FSDP/Megatron,中心 controller 编排整个数据流。选它的原因:GRPO 是现成支持的、SFT 与 RL 在同一框架内衔接低、以及这套解耦架构让「采样慢」这个 RL 的主要瓶颈可以被单独优化。

易错点#

  • ❌ 说「GRPO 不需要 baseline」—— 它只是把参数化 baseline 换成了组内经验均值,baseline 依然存在且是它的核心。
  • ❌ 把「省掉 value model」直接等同于「更省钱」而不提 rollout 成本随 GG 上升。
  • ❌ 忘记 clip / importance ratio 仍然存在 —— GRPO 不是纯 REINFORCE,它保留了 PPO 的近端约束。
  • ❌ 把 GRPO 说成「不需要 reward model」—— 那是可验证任务的特性,主观任务下仍需要 reward model 或 LLM 裁判。
  • ❌ 不提「全对/全错组无梯度」这个结构性问题 —— 这是最能体现你真调过模型的一点。
  • ❌ 把 KL 项的存在当作 GRPO 的定义 —— 不同实现差异很大,要说明自己用的那套。
  • ❌ 在 Text2SQL 这类场景把「执行成功」当奖励的全部。
  • ❌ 背 Verl 的类名/API,却讲不出「推理与训练解耦、权重同步是瓶颈」这个架构层理解。

自测#

1. 用「baseline 的降方差作用」这条线,解释 GRPO 为什么能删掉价值网络,并说明它付了什么代价。

答案

policy gradient 的原始估计方差极大,需要减去一个与动作无关的 baseline(期望不变、方差下降)。PPO 用一个学出来的价值函数 Vψ(st)V_\psi(s_t) 当 baseline。GRPO 的观察是:对同一 prompt 采样一组 GG 条回答时,这组回答的平均奖励本身就是该 prompt 的天然 baseline —— 它是对「这个 prompt 下的期望奖励」的一个 Monte-Carlo 估计,不需要任何参数。

于是 advantage 退化为 A^i=(ri−mean(r))/std(r)\hat A_i=(r_i-\mathrm{mean}(r))/\mathrm{std}(r),价值网络与它的在线训练一起被删除。

代价有三:① 每个 prompt 必须采样 GG 条完整回答,采样算力线性上升(而 rollout 本就是最慢的一环);② 信用分配变粗 —— 整条回答共用一个 advantage,无法像 GAE 那样逐 token 归因;③ 组内奖励一致时 advantage 全为 0,这些 prompt 完全无效,因此必须做难度管理。

2. 训练中出现「reward 上升但模型并没有真的变好」,在 GRPO 里你会优先怀疑哪两件事?怎么查?

答案

① 奖励被 hack(规则/奖励模型有漏洞):例如 Text2SQL 里只奖励可执行性会让模型生成恒真条件或空结果的 SQL。查法:对每一项奖励做对抗检验 —— 主动构造「能拿这项分但没完成任务」的样例,看奖励是否照给;分析高分样本的错误模式(空结果率、异常行数、格式但内容空泛)。

② 零梯度组主导 + 有效训练信号很少:如果大部分 prompt 全对或全错,真正贡献梯度的样本很少,reward 的上升可能来自少数被过度优化的样本(过拟合到容易刷分的子集)。查法:监控每个 batch 里「奖励全同的组占比」与「有效(非零 advantage)样本数」,按时段/prompt 类型切分看 reward 增益的分布。

两者共同的验证手段是:用不被优化的留出评测(人工或第三方 judge)交叉验证。

3. 为什么说 GRPO 特别适合推理模型训练?请从奖励来源和成本结构两方面回答。

答案

奖励来源:推理任务(数学、代码、结构化查询)通常有客观可验证的正确答案,奖励可以程序化计算 —— 判定最终答案等价、跑单元测试、比对 SQL 结果集。于是连 reward model 都不需要,这条路线(业界称 RLVR)省掉了奖励模型这一整套建模与维护成本,同时奖励不易被 hack(相对主观偏好而言)。

成本结构:GRPO 省掉 value 网络的收益,正好落在显存最紧张的地方;而它增加的采样成本,在推理任务里本来就是必须的 —— 推理模型的训练本来就依赖大量采样来探索解路径,GG 条采样并非额外浪费。此外组内相对比较天然契合「同一道题的解有难易之分」这一结构。

注意:这不等于 GRPO 没有奖励设计问题。规则奖励很脆弱,每一项仍要做对抗检验;且「全对/全错组无梯度」意味着题目难度分布必须被主动管理。

4. 你在 Verl 里跑 GRPO,发现 GPU 利用率低、每轮迭代很慢。你会从哪里入手排查?

答案

先分清是采样慢还是训练慢,因为 RL 的墙钟时间通常被 rollout 支配:

① 采样侧:rollout 是否用了高吞吐推理引擎(vLLM/SGLang)、是否开了连续批处理、batch 与并发是否够大;GG 是否过大(GG 线性放大采样量);生成序列是否过长(长 CoT 场景下单条样本成本极高)。

② 同步开销:训练引擎与推理引擎之间的权重 resync 是否成为瓶颈 —— 同步频率、参数量与带宽决定了这块开销;考虑减少同步次数或采用异步/解耦设计。

③ 有效样本比例:如果大量组奖励全同(全对/全错),这些采样是纯浪费 —— 检查零梯度组占比,做难度过滤,把算力花在有效样本上。

④ 并行策略不匹配:生成偏好张量并行/长序列的切分方式,训练偏好参数切分(FSDP/Megatron),两者若用了同一套布局会有浪费;检查是否有不必要的参数 offload 造成的通信。

⑤ batch/累积策略:一批 rollout 做几次梯度更新(提高样本利用率,代价是 off-policy 程度上升)。

5. 如果 GRPO 里某个 prompt 的 GG 条回答奖励全部相同(都正确或都错误),训练会怎样?你怎么在流水线里处理它?

答案

组标准差为 0 → 归一化后所有 advantage 为 0 → 该 prompt 对该步梯度贡献为零(实现中通常加 ϵ\epsilon 防除零,但分子仍为 0)。它不产生错误梯度,但白白消耗了 GG 次采样算力,并稀释了 batch 中有效信号的比例。

流水线处理:① 统计每条 prompt 的 pass rate,把「长期全对/长期全错」的样本从训练池里过滤或降采样;② 保持难度分层 —— 让 batch 里大部分样本处在「有对有错」的区间,这也是课程学习思想的一种体现;③ 把「零梯度组占比」作为一等监控指标(它比 loss 更能解释「为什么训练不动」);④ 注意过滤本身会改变数据分布(全对的样本被删掉可能意味着模型在简单题上的稳定性不再被巩固),所以过滤要按比例而非一刀切,并周期性重新评估难度(模型变强后原来的难题会变简单,难度的划分是动态的)。