GRPO 靠一次性生成 G 条回答、在组内做相对比较来降方差,代价是退化组白算和组内同步等待。 SPO 回到「一个 prompt 一条回答」的单流范式,用 KL 自适应的 Beta 追踪器给每个 prompt 维护一个持久基线,再在整个 batch 上归一化优势。 代价是多了一套需要离线预热的追踪器;另外 Algorithm 1 直接更新在线的 ṽ、而不是 Eq. 8 写的 ṽ−1,这一点下面单独说。
组内基线的问题不是「不准确」,而是「不持久」。GRPO 每次重新抽 G 条回答估计基线,G 小则噪声大;更要命的是当 G 条全对或全错时,优势全归零——论文的 Figure 3a 画出了 GRPO 退化组比例的完整训练曲线(文中描述为「从大约 60% 升到超过 80%」),以及 SPO 的近零优势比例。
SPO 把基线从「横截面」改成「时间序列」。每个 prompt 维护一对 Beta 参数 (α, β),后验均值就是成功率估计 ṽ;每观察一次结果,先用 ρ = 2−D/D_half 把旧证据打折(D 是策略 KL),再吸收新证据。策略变得越多,忘得越快。
省掉 group 之后,同步屏障自然消失,采样前缀也变成「收集最先完成的样本」。论文的仿真里,组流策略要 486 s 才凑齐 24 个样本,单流只要 112 s,即 486 / 112 ≈ 4.35 倍;代价是追踪器的表格化存储与冷启动。
先接受一个前提:策略梯度的方差要压,但压方差的手段不该反过来拖慢数据采集。
REINFORCE 的梯度估计是 E[R(x,y) ∇log π(y|x)]。减去一个与动作无关的基线 b(x),梯度仍无偏、方差更低(论文 §3.1),最优基线就是真值函数 Vπ(x)。问题在于 Vπ 未知。GRPO 的做法:同一 prompt 一次生成 G 条回答,用组均值当基线。
这套做法有两个结构性后果,两者都来自同一件事:基线只能从同组内少数几条回答里算出来。
二元奖励下,G 条全 1 或全 0 的概率是 ZG(p) = pG + (1−p)G(Appendix C.2)。这些样本的梯度恰好为 0,生成的算力全打水漂。
分布式训练里要等 G 条全部 rollout 完才能算优势。多轮工具调用时,单条轨迹的交互时间差异极大,一个 straggler 就让整组空转。
这两点是 推断:论文在 §1 与 Figure 1 之后分别论证它们,这里把它们归为同一根因——「基线必须来自当场生成的组」。作者的解法正是抽掉这根,而不是给组打补丁。补丁式做法(DAPO 的动态采样)见下一节。
对照组只有两路——组内派(GRPO / DAPO / RLOO 等)与离线最优值派(A*-PO)。SPO 恰好同时绕开两者的短板。
做法:DAPO 用动态采样反复生成直到组内既有对也有错;RLOO 用留一法均值;OPO 用长度加权均值。
卡在哪:基线始终来自「并发生成的 G 条」,同步屏障与生成成本原样保留。论文 Appendix C.1 给了动态采样的期望代价 E[N|p] = 1/(p(1−p)) − 1。p = 0.1 时 E[N] ≈ 10.11,越接近全对/全错越贵。论文还提醒:报动态采样的结果时,横轴的「step」是学习步,采样步通常是其倍数(如 5×)。
做法:两阶段。第一阶段离线估计最优值函数 V*;第二阶段在线训练时把它当固定基线做优势回归。
卡在哪:V* 绑在初始参考策略 πref 的 KL 正则目标上,训练中策略漂移越远,它越不代表当前的 Vπ。Appendix E 认为工具调用场景恰恰需要学新能力、策略漂移大,V* 的假设因此不再成立。论文还提到 A*-PO 更新时计算 πref 要多占一块 GPU 显存(论文未解释原因,这里照录)。
换个角度说:组内派把方差压低了,却把「估计的样本数」锁死在 G;A*-PO 把样本数放开到 1,却把估计锁死在离线那一刻。SPO 想两边都不锁——样本数 1,估计随时更新。
三个组件:KL 自适应价值追踪器、全 batch 优势归一化、按不确定度优先采样。追踪器是灵魂。
二元奖励用 Bernoulli 过程建模,成功率的后验取 Beta 分布,估计值就是后验均值 ṽ = α/(α+β)。每次拿到新结果 r ∈ {0,1}:
论文把这一步等价写成 EMA:ṽ = ṽ−1 + η(x)(r − ṽ−1),学习率 η(x) = (ρ·Neff,−1(x) + 1)−1(Eq. 7),Neff = α + β + 1。推断:该式在初始化 N0 = 1/(1−ρmin) 下与 Eq. 5 并非逐位等价,细节见下一节的手算块。推断:ρ 越大,历史权重越大、单条新回答改动越小,所以 D 越大(策略变得越多)时,追踪器反应越快——这正是「KL 自适应」的含义。
初始化用离线样本:每个 prompt 采 n0 条,ṽ0 = 均值;初始证据量取平衡态 N0 = 1/(1−ρmin),α0 = N0·ṽ0、β0 = N0(1−ṽ0)(Eq. 6、Algorithm 2,实验取 n0 = 8)。Appendix D 给出 ρmin = 0.875、ρmax = 0.96,于是 N0 = 8。
这一项把「课程」做成了前置调度:不是生成之后再挑,而是在生成之前就知道该抽谁。论文 §4.4 的说法是,这让 SPO 在 response generation 之前 就解决了调度问题。
下面这个模拟器按 Eq. 5 更新追踪器、按 Eq. 11 算采样权重。ρmin、ρmax、ϵ 逐字取自 Appendix D 与 §4.3;n0 = 8 取自 Appendix A;初始成功数、KL 与三条新观察由你设定。Eq. 7 的原文读数在日志第二行给出,供与 Eq. 5 对账(两者不等的原因见手算块)。
左列第一个 ṽ 是上面日志的 ṽ₀(超过 0.99 时显示为 0.99),其余为参考点;调度权重 = √(ṽ(1−ṽ)) + ϵ,ϵ = 0.05。条形按同一缩放因子画出,只比较相对长短——注意 ṽ = 0.2 与 ṽ = 0.8 权重相同,Bernoulli 标准差关于 0.5 对称。
口径。ρ = 2−D/D_half 再夹到 [0.875, 0.96];N0 = 1/(1−0.875) = 8;ṽ0 = c0/n0,α0 = N0ṽ0,β0 = N0(1−ṽ0);每步按 Eq. 5 更新后取 R = α/(α+β)。本交互不涉及标准差。
组 A:n0 = 8、c0 = 4、D/Dhalf = 1、r = (1, 0, 1)。ρ = 2−1 = 0.5 → 夹到 0.875。ṽ0 = 0.5,α0 = β0 = 4。
0.5625000.4921880.555664组 B:n0 = 8、c0 = 2、D/Dhalf = 2、r = (1, 1, 0)。ρ = 2−2 = 0.25 → 夹到 0.875。ṽ0 = 0.25,α0 = 2,β0 = 6。
0.3437500.4257810.372559Eq. 7 原文写法(η = (ρNeff,−1+1)−1,Neff = α+β+1)作对照:两组初始都有 α+β = 8,Neff,−1 = 9,η = 1/8.875 ≈ 0.112676。组 A 第 1 步 0.5 + 0.112676×0.5 ≈ 0.556338(表更新为 0.562500);组 B 第 1 步 0.25 + 0.112676×0.75 ≈ 0.334507(表更新为 0.343750)。
差异从哪来。推断:Eq. 5 可精确改写成 δnew = ρδ−1 + (1−ρ),其中 δ = α+β+1;于是 R 的 EMA 系数应是 ρδ−1/(ρδ−1+1−ρ)。当 α+β = N0 = 1/(1−ρ) 时它恰好等于 1−ρ = 0.125(组 A 手算一致),而原文 Eq. 7 在同一初始化下给出 1/8.875,差的就是被省掉的 (1−ρ);ρ = 1 时二者重合。原文没说明 Eq. 7 是近似,所以本页模拟器以 Eq. 5 为唯一结果,并把 Eq. 7 的读数放在日志第二行作对照。
Appendix D 的「window sizes Wmin = 1/(1−ρmin) = 8、Wmax = 25」在 PDF 里公式被压成乱码,但数值自洽:1/(1−0.875) = 8、1/(1−0.96) = 25。本页的 N0 = 8 借的是同一个式子,含义不同(证据量 vs 窗口长度)。
SPO 的工程价值不在公式复杂,而在于每一步都不再需要等其他 prompt。
Algorithm 1 的主循环只有几行:按 Eq. 11 算权重 → 按权重抽 B 个 prompt → 每个 prompt 采 1 条回答、算优势、更新追踪器 → 在 batch 上归一化 → 用 PPO-Clip 更新。SPO 与 GRPO 在训练开销上的差异,可以逐项对照:
| 环节 | GRPO(随机多项式训练配置,Appendix D) | SPO(同文配置) |
|---|---|---|
| 每步 prompt 数 | 256 | 2,048 |
| 每 prompt 回答数 | 8 | 1 |
| 每步 rollout 总数 | 2,048 | 2,048 |
| 基线来源 | 同组 8 条回答的均值 | 历史追踪器 ṽ−1(x) |
| 归一化分母 | 组内标准差 σG | batch 内标准差 σℬ |
| 每步梯度更新次数 | 8 | 8 |
| max response tokens | 16,384 | 16,384 |
据 Appendix D 整理。两边的 rollout 总数对齐(256×8 = 2,048×1),论文的目的就是让「单流」不是靠少采样取胜。
除此之外的训练设定(Appendix D):verl + ReTool 实现;策略学习率 1×10−6;沿用 DAPO 的 Clip-Higher,εlow = 0.2、εhigh = 0.28;采样 temperature 1.0、top-p 1.0;工具交互最多 8 轮。评估时 temperature 0.6、top-p 0.95、top-k 20,最长 32,768 token。
开销侧还有一笔账:每个 prompt 至少要存一对 (α, β) 和「上次作用该 prompt 的策略」,后者的 KL 每次都要重算或缓存 log-prob。论文没有报告这部分的内存与计算量,推断:在 prompt 数以百万计时,这是表格型追踪器的主要成本。
论文 Figure 1 与 §5.4 的仿真放在一起读,组内派与单流派的差别只在「等谁」这一件事上。
Figure 4a 给的是低方差对照:轨迹耗时接近时,组完成时间 133 s,等待代价可忽略。所以瓶颈不是「组」本身,而是「耗时分布的长尾」——推断:越接近长程、多轮工具调用的任务,单流的收益越大;任务链越短、方差越小,两者越接近。
Table 1 是在 Qwen3-8B 上训练 TIR 后的对比,五个数学竞赛基准,maj@32 与 avg@32 并用。
表 1(Table 1,单位为 %,每个单元格独立采样 32 次):
| 方法 | AIME 24 | AIME 25 | BeyondAIME | BRUMO 25 | HMMT 25 | 平均 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| maj@32 | avg@32 | maj@32 | avg@32 | maj@32 | avg@32 | maj@32 | avg@32 | maj@32 | avg@32 | maj@32 | avg@32 | |
| Qwen3-8B(未训练) | 77.8 | 64.4 | 70.5 | 58.4 | 45.2 | 38.0 | 55.1 | 49.4 | 36.8 | 30.3 | 57.1 | 48.1 |
| GRPO | 83.3 | 77.6 | 72.1 | 64.2 | 45.6 | 39.0 | 56.7 | 56.9 | 44.2 | 40.9 | 60.4 | 55.7 |
| SPO | 84.0 | 74.9 | 76.5 | 65.0 | 46.9 | 40.3 | 64.0 | 59.0 | 47.5 | 40.6 | 63.8 | 56.0 |
maj@32 上 SPO 在五个基准上都高于 GRPO,逐项绝对差(SPO − GRPO,单位:个百分点):
avg@32 上优势小得多:平均 56.0 vs 55.7,绝对差 +0.3 个百分点(相对 +0.5%);单看不稳定的项,AIME 24 反而低 2.7 个点(74.9 vs 77.6),HMMT 25 低 0.3 个点(40.6 vs 40.9)。论文自己的定性是「GRPO 在 avg@32 上仍具竞争力,SPO 在 maj@32 上稳定占优」(§5.2)。
拆项看:+3.4 的平均里有 7.3 来自 BRUMO 25,占五项差值总和的 17.0 中的 7.3(约 43%)。去掉 BRUMO 25,其余四项分别 +0.7、+4.4、+1.3、+3.3,平均 +2.4。
Figure 3a:GRPO 的退化组占比(蓝线)从约 60% 升到 80% 以上。SPO 统计的是 |A| ≤ τ 的「近零优势」比例,τ = 10−4(红线)与 0.02(绿线);原文说即便 τ = 0.02 也远低于 GRPO 的退化率,但没有给出具体数值。Figure 3b:SPO 的基线相比无基线(原始奖励方差)的方差降低「nearly 50%」——同样只有定性描述,没有数字。
吞吐:Figure 5 是仿真,不是真实训练 wall-clock。组流策略即使并行跑 6 组、取最快的 3 组,仍需 486 s 凑齐 24 个样本;单流从 48 条里取最早完成的 24 条,112 s 完成。推断:486 / 112 = 4.343,论文写作 4.35× 是四舍五入;若以 GRPO 的 486 s 为分母写相对节省,(486 − 112)/ 486 = 77.0%,等价说法;这里统一报倍数,避免与「相对提升百分比」混淆。
这三项消融只有曲线(Figure 6),没有以数字形式给出终值,所以这一页不报具体点数。
论文自己也承认的局限,加上几处从公式和实验条件读出来的边界。
追踪器需要离线估计 ṽ0(实验取 n0 = 8)。Appendix A 的消融(Figure 6c)显示没有离线初始化的训练前期会不稳。推断:论文说共享了离线数据集以让人跳过这一步,但换任务/换模型时这笔预热仍要自己付。
每个 prompt 一对 (α, β),没见过的 prompt 无从估计。prompt 种数极多时存储开销线性增长,论文未讨论。推断:这也是为什么离线初始化与共享数据集对复现如此关键。
全部主实验只有 Qwen3-8B、DAPO 数据集的英文子集、TIR 场景,五个基准都是数学竞赛。更大的模型、非数学域、非二元奖励都没有主实验;推广到一般奖励时,论文建议直接用同样的 EMA 去跟踪 ṽ,而不是走 α、β。
Figure 4/5 是构造出来的耗时分布,不是实跑吞吐。另外 Eq. 8 说基线 ṽ−1 必须来自更新前,但 Algorithm 1 第 9 行在归一化之前就用本次结果 r 更新了追踪器;推断(由 Algorithm 1 与 §4.1 的顺序读出):若实现照字面先更新再算下一轮基线,基线就依赖本次动作,无偏性论证不再严格成立。结论仍然成立与否,需要看代码,而论文没有公开代码链接。
一句话:SPO 换掉的不是「少算」,而是「等谁」。它最适合的场景是 rollout 耗时方差大、奖励二元、且 prompt 集合有限可维护的 agentic RL;如果奖励连续、prompt 海量、或者你要的是真实训练墙钟数据,它目前给出的证据还不够。