GiGPO
Paper · NeurIPS 2025 · arXiv 2505.10978

GiGPO:给 GRPO 的分组再套一层,让智能体知道哪一步做对了

长时程智能体往往只在最后拿到一个成功或失败信号,GRPO 把这个信号复制给整条轨迹的每一步。 GiGPO 把同一任务多次 rollout 中重复出现的状态当作锚点,在同一状态下比较不同动作的未来回报, 从而在不训练 critic、不增加 rollout 的前提下,得到每个动作的独立优势。

Lang Feng, Zhenghai Xue, Tingcong Liu, Bo An arXiv 2505.10978 ↗ 代码 verl-agent ↗
TL;DR · 30 秒抓住核心

长时程任务的奖励是稀疏且延迟的:ALFWorld 最多 50 步,WebShop 15 步,通常只有最后一步告诉你成功还是失败。信用分配要回答的是:这几十个动作里,哪一个该为结果负责?

GRPO 对同一任务采样 N 条轨迹,用整条轨迹的回报做组内比较。它不需要 critic,显存低、训练稳,但一条轨迹只有一个标量,所有步骤共享同一个 advantage——它分不清第 3 步和第 45 步。

GiGPO 的观察是:同一任务的 N 次 rollout 里,智能体会反复到达完全相同的状态(同一个房间、同一个搜索结果页)。把这些重复状态当作锚点,把不同轨迹中从同一状态出发的动作和它们的折扣未来回报放进一个组,就能算出状态条件下的步骤级优势 AS。

最终优势是 A = AE + ω·AS(主实验 ω=1)。整个过程只复用已有 rollout,不新增环境交互、不训练 critic;论文报告的额外耗时是每轮 0.54 秒,GPU 显存与 GRPO 相同。

+12.6 pp
ALFWorld 7B 成功率
GRPO 77.6 → GiGPO 90.2
+9.1 pp
WebShop 7B 成功率
GRPO 66.1 → GiGPO 75.2
0.54 s
单轮额外耗时
训练总时长 362.83 s
01

一条轨迹一个分数,等于让 50 个动作平摊同一笔账

先建立共同认知:信用分配难,不是因为奖励少,而是因为奖励来得太晚、太粗。

ALFWorld 是一个文本具身环境,包含 3,827 个任务实例、六类家务(Pick、Look、Clean、Heat、Cool、Pick2),每个回合最多 50 步;WebShop 模拟一个有一百多万件商品、12k 条指令的购物网站,每个回合最多 15 步。在这两个环境里,智能体看到的是文本观察,输出的是动作,只有回合结束才拿到成功或失败的奖励。

一条轨迹因此是一个很长的动作序列,但它的回报只是一个标量。任务失败时,环境不会告诉你“第 3 步拿错物品”还是“第 45 步放错位置”;任务成功时,它也不会告诉你“哪一步是关键”。这就是信用分配(credit assignment):把最终结果归因到中间动作。

核心区别

回合级问“哪条轨迹更好”,步骤级问“哪个动作更好”

回合级(episode-level):这条轨迹的整体回报,比同一任务的其他轨迹高还是低?
步骤级(step-level):在这个状态下,这个动作的后续回报,比从同一状态出发的其他动作高还是低?

前者给的是全局基调,后者才是精细信用。长时程任务真正缺的是后者。

GRPO 的做法属于前者:同一任务采样 N 条轨迹,计算每条轨迹的回报,减去组内均值,得到一个回合级优势,然后把它分配给这条轨迹的每一个 token、每一个步骤。这个估计是合法的策略梯度,也确实比 PPO 省显存、稳训练;但它有一个结构性上限——同一条轨迹里的所有步骤,拿到的是同一个数。

一个自然的补法是给每个状态学一个价值函数(PPO 的 critic),或者从每个状态多跑几条 rollout 来估计未来回报(逐步蒙特卡洛 / 树搜索)。两者都能给出步骤级信号,但代价都和“状态数量 × 每状态采样数”成正比。对 LLM 智能体来说,每次 rollout 都要调用大模型和环境,这个代价很难忽略。

论文要回答的问题因此很具体:能不能保留 group-based RL 的无 critic、低内存、稳定收敛,同时拿到细粒度的步骤级信用? 答案不是再加一个模型,而是去找一种已经存在于 rollout 数据里的步骤级比较信号。

02

两条现成的路:一条要评论家,一条只能看总分

PPO 精确但重,GRPO 轻但粗;GiGPO 要的是两者的交集,而不是折中。

PPO

学一个 critic,换每步优势

用一个价值网络估计 V(s),再用 GAE 把回报和基线之间的差分解到每一步。优点是步骤级信号密集、理论成熟。

代价:多一个和策略网络同量级的价值模型,显存和训练成本都上去;长文本观察下的价值估计本身也很难,训练更容易不稳定。

论文 Table 1 里,7B PPO 在 ALFWorld 上是 80.4,仍然低于无 critic 的 GiGPO 90.2——有 critic 不等于信用分配就一定更好。

GRPO / RLOO

不要 critic,用组内相对回报

同一任务采样一组轨迹,直接用组内相对回报当优势。无 critic、低显存、训练稳定,这也是它在单轮数学推理里成功的原因。

盲区:一条轨迹只有一个标量,所有步骤共享。它知道“这条轨迹比平均好”,但不知道“好在哪一步”。对 50 步的 ALFWorld,这个粒度太粗。

7B GRPO 在 ALFWorld 上是 77.6,RLOO 是 75.5;两者都明显低于 GiGPO。

看起来最直接的补法,为什么没人用

既然缺的是“从同一状态出发的比较”,最直接的做法就是从每个状态多跑几条 rollout,用蒙特卡洛估计它的价值。这样得到的步骤级优势是无偏的,但代价是环境交互和 LLM 推理成倍增加:一个 50 步的任务、每状态采 8 条,就是几百次额外 rollout。对长时程智能体,这基本不可接受。

方案critic额外 rollout信用粒度主要代价
PPO需要不需要每步(GAE)第二个价值网络;显存与稳定性
GRPO / RLOO不需要不需要整条轨迹所有步骤共享一个标量
逐步 rollout / 树搜索不需要需要每步环境交互与推理成倍增加
GiGPO不需要不需要每步(状态重复时)要求状态可精确匹配、会重复

GiGPO 的关键观察是:你不需要为了“同一状态下的比较”去额外采样。同一任务的 N 条轨迹里,智能体本来就会反复到达相同的状态——同一个房间、同一个搜索结果页、同一个货架。这些重复状态是免费的锚点,不同轨迹从同一状态出发的动作和后续回报,已经躺在 rollout 数据里了。

03

两级分组:先用整条轨迹定基调,再用同一状态下的动作分高下

GiGPO 的机制可以压缩成三条公式:回合级优势、步骤级优势、以及它们的加权和。

记同一任务 x 采样 N 条轨迹 τ1…τN,每条最多 T 步,第 t 步的奖励是 rt。回合回报是 R(τi) = Σt rt。论文的 ALFWorld / WebShop 实验用 +10(成功)/ 0(失败)/ −0.1(无效动作);下面的玩具用二值奖励(成功 1、失败 0),公式完全一样,只是数字更好手算。

第一级:回合级优势 AE

AE(τi) = [ R(τi) − meanj R(τj) ] / Fnorm
这就是 GRPO 的优势:用同任务的其他轨迹当基线,衡量整条轨迹的相对好坏;Fnorm 取组内标准差(GRPO 默认)或 1(w/o std 变体)

这一项会被广播到该轨迹的每一步。它回答的是“这条轨迹整体比平均好多少”,不区分步骤。

第二级:步骤级优势 AS

先把 N 条轨迹里出现过的所有不同状态收集起来,记作 U = {s̃1, …, s̃U}。每个唯一状态就是一个锚点。对某个锚点 s̃,把所有轨迹中从该状态出发的动作和它们的折扣未来回报收集成一个组:

GS(s̃) = { (at(i), Rt(i))  |  st(i) = s̃,  1 ≤ i ≤ N,  1 ≤ t ≤ T }
一个状态一个组;如果同一条轨迹再次回到该状态,它也会贡献多个条目

折扣未来回报从当前步一直加到回合结束:

Rt(i) = Σk=tT γk−t rk(i)      (γ = 0.95)

步骤级优势就是在这个组内做一次相对比较:

AS(at(i)) = [ Rt(i) − mean( GS(s̃) ) ] / Fnorm
同一状态下,这个动作的后续回报比同组的其他动作高多少;组内只有一个动作时,AS = 0

合成:A = AE + ω·AS

A(at(i)) = AE(τi) + ω · AS(at(i))      (主实验 ω = 1)
蓝色是整条轨迹共享的全局基调,紫色是同一状态下的局部对比,陶土红是最终用于策略更新的优势

为什么两项都要?回合级项给整条轨迹一个共享的基线,保证策略仍然朝着“完成整个任务”的方向走;步骤级项在这个基线上再加一个状态条件下的对比,让同一条轨迹里的不同动作分开。只有 AS 会失去全局目标,只有 AE 就退回 GRPO——论文的消融显示,去掉任意一项都会明显掉点。

论文用一个很直观的例子说明这个机制:两条轨迹都成功了,回合级优势相同;但其中一条在某一步经过了一个重复状态,另一条经过的是只出现一次的状态。前者在同状态组里可以比出“这个动作的后续回报更高”,拿到正的 AS;后者的组里只有自己,AS=0。于是两条成功轨迹在每一步上不再被同等对待。

边界情况

如果没有任何状态重复,GiGPO 就退回 GRPO

所有组的大小都是 1,组均值等于自身,AS 全是 0,最终优势只剩 AE。这不是崩溃,而是优雅退化:性能下限就是 GRPO。反过来说,GiGPO 的收益完全来自“状态会重复”这个数据性质。

自己动手:点开每一步,看两级优势怎么算

下面是一个 3 条轨迹、4 个步骤的玩具任务。每条轨迹的最终奖励只有成功(1)或失败(0),γ=0.95,归一化因子取 1(对应论文的 w/o std 变体)。格子里的数字是当前模式下这一步的 advantage;点任意格子,下面会拆开算给你看。

默认选中 τ1 第 2 步——这是 τ1 与 τ2 的分叉点,也是步骤级信号最强的地方。强调色格子表示该状态在 ≥2 条轨迹中出现过。

重复状态(锚点组 ≥2) 只出现一次(AS=0)
当前选中

切换上方按钮,对比 GRPO 和 GiGPO:GRPO 下同一条轨迹的每一格数字完全相同;GiGPO 下,分叉点和重复状态会拿到不同的步骤级信用。

这个模拟简化了什么?点开看与真实实验的差异

模拟用 3 条轨迹、4 个步骤,真实实验是 N=8、ALFWorld 最多 50 步。模拟用二值奖励(成功 1 / 失败 0),论文用 +10 / 0 / −0.1(无效动作扣 0.1)。模拟把归一化因子固定为 1,论文同时报告 std 和 1 两个变体。

模拟里的状态是离散标签(S0、A、B…),真实环境的状态是长文本观察;GiGPO 用状态本身作为哈希表的 key 做精确匹配。玩具保留了“同一状态被多条轨迹访问”这一因果结构,省略了真实文本状态的匹配细节。

另外,模拟里的 Rt 用 γ=0.95 从后往前算,和论文公式一致;回合回报 R(τ) 用未折扣的奖励和,也和论文一致。所有数字都可以按公式手算复核。

04

多出来的只是一个哈希表和一次反向扫描

GiGPO 之所以便宜,是因为它不新增任何环境交互或模型前向——所有信息都来自已经采到的轨迹。

把上面的公式放回训练循环,GiGPO 只比 GRPO 多两步:

  1. Rollout:每个任务采样 N=8 条轨迹,每轮 16 个任务,共 128 个环境;记录每一步的 (st, at, rt)。ALFWorld 最多 50 步,WebShop 15 步。
  2. 回合级优势:算每条轨迹的 R(τ)、组均值和 AE。纯算术,没有模型调用。
  3. 锚点分组:以状态为 key 建哈希表,把 (at, Rt) 追加进去。Rt 用一次从后往前的扫描算完。耗时 0.01s。
  4. 步骤级优势:对每个组算均值和 AS。耗时 0.53s。
  5. 合并并更新:A = AE + ω·AS,代进 GRPO 式裁剪目标,加 KL 正则。没有 critic,没有额外 rollout。
单轮环节耗时说明
rollout + 前后向 + 策略更新362.83 sGRPO 也要做的部分
锚点状态分组0.01 s哈希表查找
步骤级优势计算0.53 s纯算术
GiGPO 额外合计0.54 s相对 362.83s 约 0.15%
论文写 <0.002%,但按耗时算是约 0.15%——哪个对?点开看这笔账

论文原文说锚点分组 0.01s、步骤级优势 0.53s,合计 “account for < 0.002% of the total per-iteration training time”;同一段给出的主导操作总耗时是 362.83s。

按这些数字直接算:0.54 / 362.83 ≈ 0.00149,即约 0.15%。如果 0.002 指的是小数比例而不是百分数,那它等于 0.2%,和 0.15% 同量级;写成 “0.002%” 就小了 100 倍。

不管按哪种读法,结论不变:这两个环节的额外开销都在千分之一量级,真正的大头仍然是 rollout、前后向和策略更新。页面标题里的 0.54s 用的是论文给出的原始耗时,不依赖这个百分比。

更新目标:仍然是 GRPO 那一套,只是 A 变细了

J = E[ min( ρ·A, clip(ρ, 1−ε, 1+ε)·A ) ] − β·DKL(πθ ‖ πref)
ρ 是新旧策略的概率比;A 是上面两级优势的和;KL 项把策略拉住参考模型。没有价值网络,也没有额外的环境交互。

两个工程细节:归一化和 ω

Fnorm 取 std 还是 1? GRPO 默认用组内标准差;GiGPO 同时报告了 Fnorm=1 的 “w/o std” 变体。论文附录说明,Fnorm=1 等价于 RLOO 乘上 N/(N−1),策略梯度的方向不变,仍然是无偏的。标准差归一化在长时程、低方差或组内极不均衡时,会把困难样本的梯度放大,训练更容易不稳;Fnorm=1 在 ALFWorld / WebShop 上更稳。论文的结论是:这个选择是任务相关的,不是 universally 谁更好。

ω 取多少? 主实验固定 ω=1,没有调。附录 E.5 在 WebShop 1.5B 上做了敏感性分析:ω=0.8 最好(Score 84.9 / Success 68.3),ω=1.0 是 83.5 / 67.4;在 [0.4, 1.2] 内比较平,1.4 明显下降(77.0 / 56.3)。所以“ω=1”是一个合理的默认值,但不是每个任务的最优值。

实现上,作者把代码整理成了 verl-agent,基于 veRL,专门面向长时程、多轮 LLM 智能体训练。论文的 1.5B 实验用 2×H100,7B 用 4×H100。

05

一条数据流:采样 → 两种分组 → 两个优势 → 一次更新

把上一节的公式放回训练循环,就是下面这张图。

1 · Rollout 2 · 两级分组 3 · Advantage → 更新 同一任务 x · N=8 条轨迹 τ1 0 A B C R = 1.00 τ2 0 A D E R = 0.00 τ3 0 F B G R = 1.00 重复状态(锚点) 只出现一次(A^S = 0) 回合级 GE 整条轨迹做组内比较 → AE 每条轨迹一个标量 步骤级 GS(s̃) 同一状态下的动作做组内比较 → AS 状态作 key,动作/回报进哈希表 一个状态一个组 两种分组共用同一批轨迹,不额外采样 A = AE + ω·AS ω = 1(主实验) GRPO 式裁剪目标 + KL 正则,无 critic 更新 πθ 下一轮 rollout:θ_old ← θ
图 1:GiGPO 的数据流(示意)。左:同一任务的 N 条轨迹,强调色圆点表示在 ≥2 条轨迹中重复出现的锚点状态;中:回合级与步骤级两种分组;右:两个优势相加后进入 GRPO 式裁剪目标。实际实验中 N=8、ALFWorld 最多 50 步,这里为了画图只画了 3 条轨迹、4 个状态。
展开说明 ▸
  • 为什么两种分组能互补? 回合级分组回答“这条轨迹整体比同任务的其他轨迹好多少”,是一个全局基线;步骤级分组回答“在这个状态下,这个动作比从同一状态出发的其他动作好多少”,是一个局部基线。两者相加,既保留长期目标,又把同一条轨迹里的动作分开。
  • 为什么不需要额外 rollout? 锚点状态、动作和奖励都是标准 rollout 已经记录下来的。分组只是把这些数据按状态 key 重新索引一遍,没有环境调用,也没有模型前向。
  • 为什么显存不变? 没有 critic、没有新模型、没有新激活。额外存储只是一个“状态 → (动作, 回报) 列表”的哈希表,相对 LLM 的激活和 KV cache 可以忽略;论文报告 GPU 显存与 GRPO 相同。
  • 图中的数字是示意。 玩具用 3 条轨迹、4 个状态,真实实验是 N=8、最多 50 步。颜色编码与下面的模拟器一致:强调色 = 重复状态,青灰 = 只出现一次。

这张图里最容易被忽略的一点是:分组发生在 rollout 之后、策略更新之前。也就是说,GiGPO 不改变采样过程,也不改变策略网络的结构;它只是在已有数据上多算了一个优势项。这也是它能和 DAPO 这类单轮 group-based RL 改进正交组合的原因。

06

每一类任务都涨,越难的任务涨得越多

ALFWorld 六个子类、WebShop、1.5B 与 7B:GiGPO 全面领先,且不需要 critic。

模型方法ALFWorld All ↑ (%)WebShop Score ↑WebShop Succ ↑ (%)
Qwen2.5-1.5BPPO54.473.851.5
RLOO69.773.952.1
GRPO72.875.856.8
GiGPO w/ std86.783.165.0
GiGPO w/o std86.183.567.4
Qwen2.5-7BPPO80.481.468.7
RLOO75.580.365.7
GRPO77.679.366.1
GiGPO w/ std90.884.472.8
GiGPO w/o std90.286.275.2

表中为 3 个种子的均值,标准差见论文 Table 1。GiGPO w/ std 在 ALFWorld 上略高(1.5B 86.7,7B 90.8),w/o std 在 WebShop 上更好;论文把 w/o std 作为主要增益来源。

ALFWorld 六个子类:增益集中在需要多步组合的任务

切换模型尺寸,看六个子类的成功率。Pick / Clean 这类任务在 7B 上本来就接近饱和(GRPO 下 90.8 / 89.3),提升空间小;Look(找灯)、Pick2(拿两件物品)需要更多步骤和组合,增益最大;Cool / Heat 居中。

PPO(有 critic) RLOO GRPO GiGPO(w/o std)

几个值得注意的结论:

更多结果:搜索 QA、VLM、与 DAPO 的组合点开看 v3 新增实验

搜索增强 QA(Qwen2.5-3B / 7B,NQ + HotpotQA 训练,7 个测试集平均):GiGPO 42.1 / 47.2,Search-R1 32.5 / 38.5,ZeroSearch 31.7 / 39.1,R1-Instruct 27.1 / 22.4。7B 上单跳平均约 0.9 次工具调用,多跳约 1.6 次,上限 3 次。

VLM 智能体(Qwen2.5-VL-3B,Sokoban 6×6 / EZPoints):GiGPO 81.0 / 100.0,GRPO 67.1 / 86.9,提示基线 11.7 / 3.1。说明这套优势估计不局限于纯文本状态。

与 DAPO 组合(WebShop,1.5B,Score / Success):GiGPO + DAPO 的动态采样与 clip-higher 得 87.5 / 75.0,DAPO 单独 84.6 / 66.1,GRPO 75.8 / 56.8。两级优势与单轮 group-based RL 的改进是正交的。

07

它依赖“状态会重复”这个前提,而这在真实世界里最脆弱

GiGPO 的收益和它的假设是同一件事:状态能精确匹配,且真的会重复。

边界一

精确状态匹配是最脆弱的一环

ALFWorld 和 WebShop 的状态是结构化文本,可以用状态本身作为哈希 key 做精确匹配。到了噪声大、连续、高维或视觉输入的环境,“完全相同的状态”很少出现,精确匹配会失效。论文自己把这一点列为局限,并把基于状态嵌入的近似匹配留作未来工作;v3 在搜索 QA 上改用相似度分组:两个状态的“最长匹配子序列”相似度 >0.9 就算同一锚点,但这只是针对该任务的启发式。

边界二

没有重复状态,AS 直接归零

如果所有状态都只出现一次,每个步骤组的大小都是 1,AS=0,GiGPO 退化成 GRPO。它不会比 GRPO 更差,但也拿不到任何步骤级收益。换句话说,GiGPO 的收益上限由数据的“状态重复率”决定。论文的 Fig. 5 显示 ALFWorld 里超过 65% 的状态会重复,所以这个假设在该环境成立;换一个环境,需要先验证这一点。

边界三

归一化因子不是中性的

Fnorm=std 是 GRPO 的默认,但在长时程、低方差或组内极不均衡时,它会把困难样本的梯度放大,训练更容易不稳;Fnorm=1 在 ALFWorld / WebShop 上更稳,但论文也指出它在其他任务上不一定更好。这个选择是任务相关的,不能默认“std 一定对”或“1 一定对”。

边界四

折扣会吃掉远距离信用

这是从公式可以直接推出的,不是论文的实验结论:Rt 用 γ=0.95 做折扣,0.9520 ≈ 0.36,0.9547 ≈ 0.09。也就是说,第 3 步的奖励传到第 50 步时只剩约 9% 的权重(50 步全折扣是 0.9550 ≈ 0.08)。锚点分组给了一个更好的基线,但没有改变折扣视野;如果任务的关键因果链跨越几十步,远距离信用仍然会被衰减。

什么时候别用:先问三个问题

一句话总结:GiGPO 不是免费午餐,而是免费复用。 它把 rollout 里本来就存在的重复状态用起来;数据里有这个结构,它几乎零成本;没有,它就退回 GRPO。这个设计很漂亮,但它的适用边界和它的假设是同一件事。