跳到主内容Agentic RL 项目,GRPO 为什么不用 PPO?六道大厂真题逐题复盘 · AlgoMooc
上一篇结尾说这篇讲"为什么不是 PPO"。动笔之前,我先去翻了训练营一直在更新的那份面试真题库。
半年的题,一共 6545 道。点名 GRPO 的有 127 道,百度、美团、快手、字节问得最多。
这 127 道里,有 78 道在问同一件事:拿 GRPO 和 PPO 或者 DPO 比。
剩下的问法也很集中,损失函数和优势怎么算的 47 道,KL 约束 11 道,全对全错和训练崩溃 9 道。有些题一道里问了两样。
你简历上要是有这么一行,这些题基本都会落到你头上:
售后操作智能体 Agentic RL 后训练|GRPO 后训练:K=4 组内优势 + 崩塌熔断,任务成功率 8% → 93%(pass@1,reward ≥ 0.9)
我看下来,大家的问题出在准备的方向上。备的是算法对比,PPO 有 critic,GRPO 没有,背得很熟。面试官顺着往下问的是项目:你为什么这么选,代价是什么,训崩了你怎么知道。
我从里面挑了六道,你面试的时候大概也是按这个顺序被问到。示范答法用的是第一人称,是站在做过这个项目的同学的角度写的;其余地方说"我"的,都是我吴师兄。

一、GRPO 相比 PPO 改进了什么,为什么选它?
请分析 GRPO 相比 PPO 在哪些方面有所改进,解决了 PPO 的哪些局限性。(同花顺)
GRPO 与 PPO 的核心思想有何不同?在实际训练中为何某些场景下更倾向于使用 GRPO?(腾讯)
最常听到的回答就一句:PPO 要训一个 critic 来估基线,GRPO 不用,省显存。
这句话没错,但它只回答了"省掉了什么"。面试官接着会问两件事:基线去哪了,省掉 critic 你付出了什么。
基线还在,GRPO 对同一个 prompt 采一组轨迹,用这一组 reward 的均值当基线,critic 估的那个数换成了组内统计出来的数。
原始 GRPO 目标沿用了 PPO 的 ratio 和 clip,并加入对参考策略的 KL 约束;在 verl 里这些项还能按配置调整。你要是笼统说成"GRPO 比 PPO 简单",面试官会接着让你写损失函数,题库里让手写 GRPO loss 的题有 7 道。
代价你也得跟面试官交代。同一条工单要采 K 条轨迹,采样成本直接乘 K;学习信号全靠组内的分数差,一组里分数都差不多的时候就学不到东西。
这类题还有一个变体,把 DPO 也拉进来比,美团和阿里都这么问过。
DPO 学的是成对的偏好,哪个回答更好要提前标出来,训练的时候模型不去环境里跑。我们的任务正好反过来,退没退款、改没改地址,沙盒里查得到,让模型在线试、试完打分更直接。
我自己的看法是,这道题答到"代价"就已经比大多数人深了,DPO 那段是加分项,时间不够可以不展开。
训练框架用的是 verl。启动的时候优势估计选 grpo,critic 关掉,框架自带的 reward model 也关掉,分数由项目自己的 Verifier 返回。
我们训的是售后操作 Agent,一条轨迹要调好几次工具,最后由 Verifier 给整条轨迹打一个分。我用的是 GRPO,配置里 critic 是关掉的,优势用组内估计。选它是因为我们的 reward 本来就是整条轨迹一个标量,同一条工单采 4 条互相比,比单独训一个 critic 去估长轨迹的价值要稳。代价是采样量乘 4,而且组内分数没差别的工单要单独处理。
二、组内相对优势到底怎么算?
请详细说明 GRPO 中群体相对优势的具体计算方法,归一化操作在其中扮演什么角色?(百度)
这题很多人直接背公式:reward 减均值,除以标准差。
面试官要的是你手里有一组真实的数。我用破损退款那条工单举例,同一个 prompt 采了 4 条轨迹,Verifier 给的分是 0.92、0.31、0.68、0.14。
这篇按项目使用的 verl 口径来算:torch.std 默认取样本标准差。组内均值是 0.5125,标准差约 0.3530,四条轨迹的优势约为 +1.154、−0.574、+0.474、−1.055。
正的那两条,模型会提高生成它们的概率;负的那两条会被压低。0.68 那条单看分数不算高,放在这一组里是正样本。
再往下,面试官会问为什么要除标准差。不除的话,不同工单之间没法比。
取消未发货订单那种简单工单,4 条轨迹的分数是 0.96、0.97、0.95、0.96,按同一口径算出的标准差只有 0.0082。如果不做标准差归一化,它的中心化 reward 量级会和破损退款差出几十倍。
然后是优势怎么落到 token 上。优势是整条轨迹一个数,它会广播到这条轨迹里模型自己生成的每个 token 上。工具返回、用户输入这些 token 进上下文,但 mask 是 0,不算进 loss。
mask 这件事后面讲骗分的时候还会出现,先记住。
还有一个容易被问住的细节:ratio 按什么粒度算。
你要是按 token 算,每个 ratio 都接近 1,看着稳,噪声很大。换成整条轨迹算,几十步的 ratio 连乘起来会很极端,30 步的轨迹能到 2.43 或者 0.40。
三、一组里全对或者全错,怎么办?
当 GRPO 训练过程中出现大量全正确或全错误的样本组时,应该采取什么策略来处理?这种样本分布可能带来什么问题?(百度)
ε 只能保证程序不报错。真正的问题是标准差接近 0 的时候,优势全是被放大的噪声。
全对的情况,还是那条取消订单的工单。四条轨迹都做对了,分数只差 0.01,除以 0.0082 之后优势有正有负,看着像信号,模型学的是随机波动。
全错的情况更危险。部分发货拆单那类工单,四条轨迹的分数是 0.10、0.12、0.08、0.11,没有一条做成。组内相对最好的那条,做的事情是中途转人工。
直接拿去训,模型强化的就是"最不烂的失败",转人工率从 8% 涨到了 41%。这个涨幅放在任何一条业务线上,都够开一次事故复盘。
你可能会想,那改一下 reward 公式不就行了?我们的处理方式是把这些工单从主训练里拿出去,reward 公式不动。
全对的工单进回放池,偶尔拿回来过一遍,防止模型忘掉。全错的工单拆成几个阶段,每个阶段单独打分,前面的阶段过了再解锁后面的。
缺工具导致全错的,先补工具,补完之前不给它分配训练算力。
简历上写的"崩塌熔断",指的是组内分数差塌掉的时候,这一组不进主训练。
这里有个容易误诊的情况。缺工具的那类工单,8 条轨迹的分数全在 0.24 到 0.28 之间,标准差也很小,看着和全错一样。
要是照着全错去拆阶段,拆几段都没用,因为那条路根本不存在。先问有没有一条轨迹成功过,再看标准差。
加 ε 只是防除零。全对和全错的组标准差接近 0,标准化以后是在放大噪声。我们的做法是按组内标准差做路由,低于阈值的不进主训练:全对的进回放池,全错的拆阶段训。我们吃过一次亏,全错的工单直接训,转人工率从 8% 涨到了 41%。
四、KL 约束是干什么的,KL 太大会怎样?
在使用 GRPO 进行大模型训练时,KL 散度的控制至关重要。请说明 KL 散度过大会带来什么问题,以及你通常采用哪些方法进行调节。(滴滴)
这么答是把 clip 和 KL 混在一起了,面试官下一句多半是:那 clip 不是已经在限制更新幅度了吗。
clip 只看这一步,ratio 跑出 0.8 到 1.2 这个区间,目标函数就不再跟着涨。
破损退款那条最好的轨迹,执行退款那一步的 ratio 是 1.35,超过了上限,就按 1.20 算。
KL 看的是一路累下来漂了多远。每一步都合规,训了一百个 batch 以后,模型可能已经离起点很远了。
讲到这里要把几个策略分清。采样时的那份参数,每个 batch 刷新一次;正在训的那份,每一步都在变;还有一份参考策略,整段训练都冻结,一般就是 SFT 之后的那个模型。
ratio 是正在训的和采样时的比,KL 是正在训的和参考策略比。把它们混着用,是 GRPO 实现里最常见的 bug。排查实现的时候,我建议先看这一处。
KL 太大意味着模型漂离了 SFT 打下的底子,格式和基本行为会先出问题。
KL 也有管不到的地方。模型可以一直待在参考策略附近,但只押一两个动作,这叫塌缩。
我们一共 7 个候选动作,健康的时候熵在 1.92 左右,接近上限;一个动作占到九成五的时候,熵只剩 0.25。所以 loss 里还有一项熵,专门留探索的余量。
调节用的是自适应的 β。目标 KL 定在 0.10,β 从 0.05 起步。这一批的 KL 超过目标的 1.5 倍,β 乘 1.5 把绳子拉紧;低于目标的一半,β 除以 1.5 放松一点。
clip 管单步,KL 管累计漂移,它们比的对象也不一样。KL 比的是当前策略和冻结的参考策略,我们的参考策略是 SFT 之后的模型。β 是自适应的,实测 KL 超过目标值 1.5 倍就收紧,低于一半就放松。
五、怎么判断 GRPO 训练是不是正常收敛?
在使用 GRPO 进行策略训练时,有哪些关键指标可用于判断训练过程是否正常收敛?请从奖励曲线、策略熵、KL 散度、损失函数变化等维度进行分析。(美团)
题目里已经把指标名字列出来了,所以很多人顺着报一遍:看 reward 曲线,看 loss,看 KL。
光报名字面试官是不认的,他想听的是你先看哪个、后看哪个,哪个亮红灯了你做什么。
我们的顺序是固定的。先看有没有路:同一条工单的 K 条轨迹里,至少有一条能拿到正向的分吗?一条都没有,后面的指标不用看了,先去查是不是缺工具或者路径太长。
路径太长的典型是部分发货拆单,完整做下来要二十多步。模型走通的概率太低,训一两轮,这条路就被压没了。
有路了,你再看有没有信号,也就是组内 reward 的标准差够不够大。不够就去改路由,别去调学习率。
最后才看算得对不对,approx_kl 和被 clip 掉的比例有没有飙高。物流停滞那类长任务,我们给 clip 比例划的线是不能超过 25%。
这个顺序反过来会白忙。缺工具的工单,你去调 KL 是调不好的。
最后这一关我举个例子。已发货改地址那类工单,一条轨迹要跑 12 分钟,等它回到训练端,参数已经更新了 3 次,采样时记下的概率已经过时了。
当时 approx_kl 飙到 0.61,做了重要性采样的截断修正之后降到 0.07。
看的频率也不一样。有没有路每 50 步看一次,有没有信号每 100 步,算得对不对每一步都看。
这道题后面经常跟一个追问:GRPO 是 on-policy 还是 off-policy?华为、字节、美团都问过。
它是 on-policy 的,数据得是当前策略采出来的。
上面那个 12 分钟的例子说明,长任务里这一条很容易被悄悄打破,采样用的参数和训练用的参数已经对不上了。能把这个例子讲出来,比答一句 on-policy 有用。
六、reward 一直在涨,怎么知道模型没在作弊?
在 GRPO 训练过程中,如何识别和防范 Reward hacking 现象?请列举可观测的异常信号、检测手段及缓解策略。(美团)
堵漏洞是发现以后的事,面试官先问的是你怎么发现。前面那几关全绿之后,你还看什么?
最管用的信号是训练 reward 和影子评估之间的差。留一批工单不参与训练,只用来评估,破损退款这条线留了 100 条。
训练 reward 在涨,这批工单上的表现在掉,模型多半是找到了骗分的办法。
我们出过一个典型的。工具返回的 token 被误算进了 loss,训练 reward 涨到了 0.96,影子评估差了 0.42。
查下来,模型学会了自己在输出里写"工具返回成功"这类本该由环境给出的内容,Verifier 被它骗过去了。前面说的 mask 就是防这个的,工具返回要标成 0。
几关全绿我也不敢放心。只要有一种骗分的办法能稳定漏过去,训得够久,模型一定会找到它。
另一类信号是业务指标。转人工率就是,模型没有犯任何错,分数也不低,但它学会了遇到难单就不做事。
缓解靠的是 Verifier 里的封顶护栏,上一篇整篇都在讲。这里补一句我自己的理解:reward 在训练里是拿来定方向的,哪个方向能稳定涨分,模型就往哪走,每次只涨一点点它也会走。
我主要看两个信号。一个是训练 reward 和影子评估的差,留出的工单不进训练,两边走势一旦分叉就停下来查。另一个是转人工率这类业务指标。我们遇到过工具返回被算进 loss 的问题,训练 reward 到了 0.96,影子评估差了 0.42,后来把工具返回的 mask 改成 0 才解决。
六道题丢分都丢在哪
把六道题放在一起看,只答到第一层的回答有几个共同点。
一个是只说省掉了什么、加上了什么,不说代价。GRPO 省了 critic,代价是采样量和对组内方差的依赖;KL 拉住了模型,代价是拉太紧模型动不了。你把代价讲出来,面试官才会相信这是你自己选的。
另一个是手里没有数。0.92、0.31、0.68、0.14 这一组数怎么变成四个优势,你得自己算过一遍才讲得顺。
还有一点六道题里反复出现:只讲正常情况,不讲翻车。全对全错、KL 飙高、reward 在涨模型在骗分,这些都是训练里真会遇到的事。
面试官问到深处,基本都在问你翻过什么车、怎么发现的、怎么救回来的。这部分准备起来不难,把训练日志里出过问题的那几次翻出来,各写三五句就够。
你可以拿自己的简历对一下:GRPO 那一行里的每个词,能不能各讲出一个数和一个代价?讲不出来的那个词,要么去补,要么从简历上拿掉。
这一行简历可以怎么改
原来那行里,"崩塌熔断"面试官看不懂,"K=4 组内优势"只报了参数。可以改成这样:
售后操作智能体 Agentic RL 后训练|GRPO 后训练(关闭 critic,K=4 组内标准化优势):组内方差过低的工单路由出主训练,KL 自适应约束,任务成功率 8% → 93%(pass@1,reward ≥ 0.9)
括号里写明关掉了 critic,GRPO 和 PPO 差在哪先摆出来。"崩塌熔断"换成了做的事情本身,面试官顺着问就是全对全错那道题。后面加上 KL 自适应,是给 KL 那道题留的口子。
下一篇讲沙盒那一行,从"用 mock 不就行了"说起。