← logs/

GRPO 家族树:每个后代变体到底修复了什么

我从 DeepSeekMath 论文实现了 GRPO,并用程序化验证器跑它,直到运行产出一个值得上线的 checkpoint。所以这篇不是一篇从论文摘要里写出来的综述。它是一棵家族树。GRPO 是祖先,每一个严肃的后代变体之所以存在,都是因为它修补了祖先身上的一个具体病理。一旦你知道每个补丁针对的是哪个病理,缩写动物园就变成了一份变更日志。

这棵树有两个分支。推理分支修复单个 rollout 内部的问题:DAPO 修复裁剪、采样与信用归一化;Dr. GRPO 修复隐藏在优势估计器中的长度偏差。agent 分支修复信用单位:GiGPO 和 ARPO 都以两种非常不同的方式,从轨迹级信用转向步骤级信用,因为多步 agent 轨迹不能像一道长数学题答案那样打分。

GRPO (DeepSeekMath, 2024) — group-relative advantage, no critic
├── DAPO (2025)          — clip collapse, zero-reward groups, token credit, length hacking
├── Dr. GRPO (2025)      — length-normalization and reward-standardization bias
├── GiGPO (NeurIPS 2025) — trajectory-level credit → step-level credit for agents
└── ARPO (ICLR 2026)     — trajectory-level sampling → step-level exploration after tool calls

祖先:构造上就无 critic

GRPO 是移除价值网络的 PPO。DeepSeekMath 每个 prompt 采样 G 个响应、为它们打分,并用分组本身作为基线。没有 critic、没有 bootstrap、没有学习得到的优势。整个估计器就是:

A_i = (r_i - mean(r)) / (std(r) + epsilon)

更新则是带 KL 惩罚的裁剪策略比率,惩罚针对冻结的参考策略,直接出自 PPO 手册。这给你带来的收益是具体的:一个 critic 消耗的内存大约与策略本身一样多,而一个糟糕的 critic 会以难以诊断的方式破坏训练稳定性。GRPO 用更嘈杂的分组基线换来移除 critic,就此收工。DeepSeek-R1 随后以同样的配方放大规模、配合简单的可验证奖励,产生了涌现的自我纠正与验证行为。

危险之处在于 GRPO 留下的开放空间。那个估计器的每一行都是一处隐藏的归纳偏差。奖励标准化让每个优势都取决于其分组内的其他样本。损失归一化让每个 token 的信用取决于响应长度。分组大小 G 是一个隐式的探索预算。大多数后代变体就是这样的论文:发现这些隐藏选择中的某一个是正在欺骗优化器的,然后精确修补那一行。

在家族树生长之前,还有一件事值得说一说。GRPO 假设奖励在分组内是可比较的。这对数学答案成立,因为验证器就是正确性检查。当奖励是代理指标、LLM 裁判、启发式或部分信用公式时,这一假设就变弱了,因为此时分组基线把噪声和信号一起归一化。这就是 agent 分支不断撞上的断层线。

DAPO:四个补丁,四种失败模式

DAPO 是 ByteDance Seed 和 Tsinghua AIR 为 GRPO 发布的开源补丁版,也是这个家族里最接近规范版本的东西。它随附一套完整的基于 verl 的 RL 系统,并用 Qwen2.5-32B 基础模型在 AIME 2024 上报告 50 分。四种技术与失败模式一一对应:

  • Clip-Higher。原版 GRPO 围绕 1 对称裁剪策略比率。当一个具有正优势的 token 概率持续上升时,上界裁剪会扼杀它的梯度,获胜响应上的熵随之坍缩。Clip-Higher 提高上界,让正优势 token 保持可学习。它修补的是过早的熵坍缩。
  • Dynamic Sampling。在数学 RLVR 中,很大一部分 prompt 产生的分组里每个样本都得零分。这些分组什么都教不了,却仍要花费一次完整的 rollout 开销。Dynamic sampling 丢弃样本得分全都相同的分组(全错或全对),并过采样仍然携带梯度信号的混合分组。
  • Token-level loss。GRPO 按响应归一化损失,所以一条 2000 token 的正确链条和一条 40 token 的正确链条贡献相同的梯度量。DAPO 按分组内 token 总数归一化,所以长链条获得与其所做工作成比例的信用。它修补的是长推理上的梯度稀释。
  • Overlong reward shaping。原始的正确性奖励留着一个长度作弊的口子:多写 token,提高正确 token 出现的概率。DAPO 对过长响应增加软惩罚。它修补的是规模化时最常见的 RLVR 失败。

合起来读,DAPO 论证的是:GRPO 并非错在本质上,只是工程化不足。这在很大程度上成立,而开源系统的可复现性是一项实实在在的贡献。但四个补丁共享一条边界:DAPO 塑造了长度激励,却没有移除它。裁剪界限是调出来的常数;没有人推导过它们。四个补丁没有一个触及信用单位:一条轨迹仍被当作一个整体来打分。那条边界正是接下来两个分支的起点。

Dr. GRPO:两行修复

Understanding R1-Zero-Like Training(Liu 等人)这篇论文戳破了「aha moment」的叙事,然后引入了一个名为 Dr. GRPO 的两行算法。发现:GRPO 存在一种优化偏差,人为地增加响应长度,尤其是错误输出的响应长度。机制存在于两种归一化的相互作用中。长度归一化将每个响应的损失除以它的 token 数,奖励标准化将分组的奖励除以它们的标准差。一个长而错误的响应获得的每 token 优势,并不是奖励本意的信号。实际效果是策略学会了写得更长,而不是写得更好。

Dr. GRPO 从估计器中移除响应长度归一化和奖励标准化。这就是全部补丁。论文报告它在保持推理性能的同时提高 token 效率,其极简配方用 7B 基础模型在 AIME 2024 上达到 43.3%。

这是家族里我最喜欢的补丁,因为它最诚实。DAPO 用奖励整形对抗长度作弊。Dr. GRPO 删除了制造作弊的偏差。但它也留下一个空洞:移除长度激励后,你仍然需要某种激励来支撑难题所需的额外思考。病理被修复了;问题没有。这没关系,只要你在选择补丁时知道这一点就行。

GiGPO:当分组是一条轨迹时

GiGPO(Feng 等人,被 NeurIPS 2025 接收)是第一次与单轮框架的认真决裂。一次 agent rollout 是一条环境交互轨迹,奖励在最后才到达,稀疏且延迟。轨迹级 GRPO 为每条轨迹分配一个优势,这就像用一个数字给一篇文章打分:好步骤和坏步骤共享同一份信用。

GiGPO 保留 episode 级分组,并新增一个步骤级分组。机制是锚点状态分组:当两条轨迹经过同一个环境状态时,在该状态采取的动作构成一个分组,每个动作的微优势相对于同一状态下的同类动作计算。重复出现的状态成为可分配步骤信用的锚点,无需学习得到的价值函数、无需额外 rollout、也无需额外内存。论文报告,在相同 GPU 占用下,相比 GRPO 在 ALFWorld 上提升超过 12 分、在 WebShop 上提升超过 9 分。

尚未修复的部分是结构性的。锚点状态只在环境暴露可观测、可重复的状态时存在。这在模拟家庭或网络商店中成立。在开放式编码或研究任务中大多失效——那里轨迹很少重访同一状态,步骤级分组因此落空。GiGPO 也继承了 GRPO 的分组敏感性:episode 级基线的好坏只取决于分组内部的多样性。锚点状态分组也是这棵家族树第一次从环境而非 rollout 中学习的地方:步骤分组是从观测到的状态中发现的,而不是由算法制造的。这是与 DAPO 不同的一种补丁,它指向下一代变体将出现的地方。

ARPO:tool call 后的熵飙升

ARPO(Dong 等人,ICLR 2026;arXiv 版本)从一个不同的观察出发。在一次 tool call 之后,模型的 token 熵会飙升。模型真的不知道工具返回了什么,这种不确定性正是关于哪里需要探索的信号。轨迹级采样忽略了它:每条轨迹的每一步都获得相同的 rollout 预算,无论策略是自信还是迷失。

ARPO 基于熵的自适应 rollout 把分组预算花在熵高的地方,在需要它们的 tool call 轮次分支步骤级样本,并用优势归因机制把步骤级信用推回工具使用交互。横跨计算推理、知识推理与深度搜索的 13 个 benchmark 上,ARPO 报告以大约一半的工具使用预算,一致地胜过轨迹级 RL 算法。半预算结果是我最关心的部分:它证明 rollout 预算被花在了策略困惑的地方——这比一个 benchmark 增量强得多的论断。

悬而未决的问题与贯穿整个 agent 分支的是同一个:熵信号说的是该往哪里看,而不是什么是对的。ARPO 修复了轨迹级 RLVR 的采样病理。最初让 agent 信用变得困难的奖励稀疏性,仍然属于验证器的问题;算法无法修复它。

我的立场:维护病理账本,而不是变体动物园

这棵树只在远处看起来像个动物园。从一次训练运行的内部看,每个后代变体都是对一个可度量失败的一处修复:

| 病理 | 所在位置 | 补丁 | 变体 | | --- | --- | --- | --- | | 获胜响应上的熵坍缩 | 对称裁剪 | 非对称上界 | DAPO | | 零奖励组浪费算力 | 采样 | 丢弃与过采样 | DAPO | | 长链梯度被稀释 | 损失归一化 | token 级损失 | DAPO | | 长度作弊 | 奖励 | 过长整形 | DAPO | | 优势中的长度与标准差偏差 | 估计器 | 移除两项归一化 | Dr. GRPO | | 轨迹级信用 | 优势单位 | 锚点状态分组 | GiGPO | | tool call 后的不确定性被忽略 | rollout 策略 | 熵自适应分支 | ARPO |

在此基础上,有用的产物是一个诊断 harness;目标函数本身可以保持不变。在选择变体之前,为一个 GRPO 运行针对这七种病理埋点:每个 prompt 的零奖励占比、正确与错误输出之间的长度分歧、工具边界处的熵轨迹、agent 环境中的状态重现率、随步骤发生的分组标准差坍缩。每个测量到的信号都对应账本中的一个补丁,于是变体选择不再凭感觉,而是凭读数。我怀疑大多数真实运行需要同时用两到三个补丁,而账本是挑选它们的唯一诚实方式。

落点:我自己的训练循环

我已在 RLVR 及其裂缝 中单独写过 RLVR 的奖励侧,在 验证器工程 中写过验证器质量。这篇是同一故事中的算法侧。

VerifierForge 用 GRPO 对着程序化验证器训练。验证器是可执行的,不是模型:提取一条只读 SQL 语句、解析它、对冻结的 schema 运行,并把结果集与期望行进行比较。有效且可执行的 SQL 获得部分信用;只有结果集完全匹配才获得全额奖励。训练循环每个 prompt 采样 G=8 个补全,将每个奖励对其分组归一化,并应用带 KL 惩罚的裁剪更新。那个估计器正是 DeepSeekMath 论文里的那个。我在我的 HoReN-paper-reproduction 仓库里自己按那篇论文实现了 GRPO,这个实现驱动着 VerifierForge 的训练循环。

那次运行中有三个细节值得写进这篇。第一,长度张力是刻意为之的。估计器保留了 GRPO 原版的逐响应损失归一化和分组奖励标准化——正是 Dr. GRPO 标记为偏差来源的那两行——而验证器对任何超过 400 个字符的补全减去 0.05,也就是把 DAPO 式过长整形直接附加在奖励本身上。我故意这样组合:教科书式估计器是我的复现所实现、也是我调试过的那个,整形项位于我可以审计的验证器代码里,所以我用一个可见的奖励补丁为已知的估计器偏差买单。在这种工作负载上这种取舍的哪一侧占主导,我还没有测量过;即使你不用论文里的名字称呼它,病理账本也是真实的,而账本会指出哪些仪器能告诉我答案。第二,配置启用了一个熵刹车——一道对抗熵坍缩的绊线,正是 DAPO 的 Clip-Higher 所要对抗的那种坍缩——在完整 400 步中它从未触发。未触发的守卫仍然是一种读数:在这种工作负载上,坍缩从未开始。第三,运行在验证器运行旁边配了一个刻意不完美的随机奖励对照,而上线的 checkpoint 是在冻结的留出考试集上挑选的,而不是取最后一步。家族树里满是巧妙的目标函数手术,但让手术保持诚实的是枯燥的选择与证伪纪律。

模式

GRPO 之所以赢,是因为它移除了 critic。它的后代变体之所以在赢,是因为它们一次一行地移除剩余的隐藏偏差。现在我读到新的 GRPO 变体时,只问一个问题:它点出了哪个病理?点出一个病理的变体,是一个你可以评估的工程修复。一个都不点的变体,很可能是在用一种偏差换另一种。这棵树让这个领域一目了然:同一个祖先、同一条分组基线、每个分支移除一个具体的谎言。

本文链接的来源均已抓取并验证。