SPO
LLM-RL · arXiv 2025 · 2509.13232v2

SPO:扔掉 group,给每个 prompt 记一本「陈旧度会衰减」的账

GRPO 靠一次性生成 G 条回答、在组内做相对比较来降方差,代价是退化组白算和组内同步等待。 SPO 回到「一个 prompt 一条回答」的单流范式,用 KL 自适应的 Beta 追踪器给每个 prompt 维护一个持久基线,再在整个 batch 上归一化优势。 代价是多了一套需要离线预热的追踪器;另外 Algorithm 1 直接更新在线的 ṽ、而不是 Eq. 8 写的 ṽ−1,这一点下面单独说。

Zhongwen Xu, Zihan Ding · 腾讯(Equal contribution) arXiv 2509.13232v2 ↗
TL;DR · 30 秒抓住核心

组内基线的问题不是「不准确」,而是「不持久」。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 倍;代价是追踪器的表格化存储与冷启动。

63.8 vs 60.4
五基准平均 maj@32:SPO vs GRPO,绝对差 +3.4 个百分点(Qwen3-8B,32 次采样)
4.35×
凑齐 24 样本批次的吞吐:112 s vs 486 s(仿真,非真实 wall-clock)
2,048 vs 256
每步 prompt 数:SPO 单样本、GRPO 每 prompt 8 条,两者总 rollout 数对齐
01

组内基线把「降方差」和「同步等待」绑在了一起

先接受一个前提:策略梯度的方差要压,但压方差的手段不该反过来拖慢数据采集。

REINFORCE 的梯度估计是 E[R(x,y) ∇log π(y|x)]。减去一个与动作无关的基线 b(x),梯度仍无偏、方差更低(论文 §3.1),最优基线就是真值函数 Vπ(x)。问题在于 Vπ 未知。GRPO 的做法:同一 prompt 一次生成 G 条回答,用组均值当基线。

bGRPO(x) = (1/G) Σj R(x, yj)     bRLOO(x, yi) = (1/(G−1)) Σj≠i R(x, yj)
Eq. 4 · 组均值 / 留一法基线,都是「就地」估计

这套做法有两个结构性后果,两者都来自同一件事:基线只能从同组内少数几条回答里算出来。

后果一

退化组白算:全对或全错,优势为零

二元奖励下,G 条全 1 或全 0 的概率是 ZG(p) = pG + (1−p)G(Appendix C.2)。这些样本的梯度恰好为 0,生成的算力全打水漂。

后果二

组内同步:一条慢回答拖住整组

分布式训练里要等 G 条全部 rollout 完才能算优势。多轮工具调用时,单条轨迹的交互时间差异极大,一个 straggler 就让整组空转。

这两点是 推断:论文在 §1 与 Figure 1 之后分别论证它们,这里把它们归为同一根因——「基线必须来自当场生成的组」。作者的解法正是抽掉这根,而不是给组打补丁。补丁式做法(DAPO 的动态采样)见下一节。

02

两条已有的路:留在组里打补丁,或走离线最优值

对照组只有两路——组内派(GRPO / DAPO / RLOO 等)与离线最优值派(A*-PO)。SPO 恰好同时绕开两者的短板。

组内派

GRPO · DAPO · RLOO · OPO

做法:DAPO 用动态采样反复生成直到组内既有对也有错;RLOO 用留一法均值;OPO 用长度加权均值。

卡在哪:基线始终来自「并发生成的 G 条」,同步屏障与生成成本原样保留。论文 Appendix C.1 给了动态采样的期望代价 E[N|p] = 1/(p(1−p)) − 1。p = 0.1 时 E[N] ≈ 10.11,越接近全对/全错越贵。论文还提醒:报动态采样的结果时,横轴的「step」是学习步,采样步通常是其倍数(如 5×)。

离线最优值派

A*-PO

做法:两阶段。第一阶段离线估计最优值函数 V*;第二阶段在线训练时把它当固定基线做优势回归。

卡在哪:V* 绑在初始参考策略 πref 的 KL 正则目标上,训练中策略漂移越远,它越不代表当前的 Vπ。Appendix E 认为工具调用场景恰恰需要学新能力、策略漂移大,V* 的假设因此不再成立。论文还提到 A*-PO 更新时计算 πref 要多占一块 GPU 显存(论文未解释原因,这里照录)。

换个角度说:组内派把方差压低了,却把「估计的样本数」锁死在 G;A*-PO 把样本数放开到 1,却把估计锁死在离线那一刻。SPO 想两边都不锁——样本数 1,估计随时更新。

03

给每个 prompt 一本 Beta 账,策略变多少就忘多少

三个组件:KL 自适应价值追踪器、全 batch 优势归一化、按不确定度优先采样。追踪器是灵魂。

组件一:KL 自适应价值追踪器(Eq. 5–7)

二元奖励用 Bernoulli 过程建模,成功率的后验取 Beta 分布,估计值就是后验均值 ṽ = α/(α+β)。每次拿到新结果 r ∈ {0,1}:

α = ρ(x)·α−1 + r(x,y)     β = ρ(x)·β−1 + (1 − r(x,y))
ρ(x) = 2−D(x)/D_half    D(x) = 当前策略与本 prompt 上次作用时策略的 KL
Eq. 5 + §4.1 · 红字:陈旧证据按策略漂移打折,D_half 控制遗忘速率(ρ 被夹在 [ρmin, ρmax])

论文把这一步等价写成 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。

组件二:优势与归一化(Eq. 8–10)

A(x,y) = r(x,y) − ṽ−1(x)     Ã = (A − μℬ) / σℬ     LCLIP(Eq. 10)
Eq. 8–10 · 基线用更新前的 ṽ−1;μℬ、σℬ 取自整个 prompt batch ℬ,而非单个 group

组件三:优先采样(Eq. 11)

wi(x) ∝ √( ṽ−1(x)(1 − ṽ−1(x)) ) + ϵ
Eq. 11 · 第一项是 Bernoulli 的标准差,越高越「半懂不懂」;ϵ 默认 0.05,保证每个 prompt 都有非零概率

这一项把「课程」做成了前置调度:不是生成之后再挑,而是在生成之前就知道该抽谁。论文 §4.4 的说法是,这让 SPO 在 response generation 之前 就解决了调度问题。

动手:追踪器与采样权重

下面这个模拟器按 Eq. 5 更新追踪器、按 Eq. 11 算采样权重。ρmin、ρmax、ϵ 逐字取自 Appendix D 与 §4.3;n0 = 8 取自 Appendix A;初始成功数、KL 与三条新观察由你设定。Eq. 7 的原文读数在日志第二行给出,供与 Eq. 5 对账(两者不等的原因见手算块)。

ρ = 2−D/D_half
—
KL 折扣因子(夹在 [0.875, 0.96])
N₀ = 1/(1−ρmin)
8
初始证据量(由 ρmin=0.875)
ṽ₀ = α₀/(α₀+β₀)
—
离线初值估计
跟踪日志 · D_half 取 0.05(假设值,论文未给)
同一批 KL 下的六个 prompt

左列第一个 ṽ 是上面日志的 ṽ₀(超过 0.99 时显示为 0.99),其余为参考点;调度权重 = √(ṽ(1−ṽ)) + ϵ,ϵ = 0.05。条形按同一缩放因子画出,只比较相对长短——注意 ṽ = 0.2 与 ṽ = 0.8 权重相同,Bernoulli 标准差关于 0.5 对称。

手算对账:两组参数,逐位核对与上方读数同一套逻辑,D_half = 0.05

口径。ρ = 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。

  • 第 1 步:α = 0.875×4 + 1 = 4.5,β = 0.875×4 + 0 = 3.5 → R = 4.5/8 = 0.562500
  • 第 2 步:α = 0.875×4.5 + 0 = 3.9375,β = 0.875×3.5 + 1 = 4.0625 → R = 3.9375/8 = 0.492188
  • 第 3 步:α = 0.875×3.9375 + 1 = 4.4453125,β = 0.875×4.0625 + 0 = 3.5546875 → R = 4.4453125/8 = 0.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。

  • 第 1 步:α = 0.875×2 + 1 = 2.75,β = 0.875×6 + 0 = 5.25 → R = 0.343750
  • 第 2 步:α = 0.875×2.75 + 1 = 3.40625,β = 0.875×5.25 + 0 = 4.59375 → R = 0.425781
  • 第 3 步:α = 0.875×3.40625 + 0 = 2.98046875,β = 0.875×4.59375 + 1 = 5.01953125 → R = 0.372559

Eq. 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 窗口长度)。

04

把「组」拆成流水线:采样、基线、归一化各自解耦

SPO 的工程价值不在公式复杂,而在于每一步都不再需要等其他 prompt。

Algorithm 1 的主循环只有几行:按 Eq. 11 算权重 → 按权重抽 B 个 prompt → 每个 prompt 采 1 条回答、算优势、更新追踪器 → 在 batch 上归一化 → 用 PPO-Clip 更新。SPO 与 GRPO 在训练开销上的差异,可以逐项对照:

环节GRPO(随机多项式训练配置,Appendix D)SPO(同文配置)
每步 prompt 数2562,048
每 prompt 回答数81
每步 rollout 总数2,0482,048
基线来源同组 8 条回答的均值历史追踪器 ṽ−1(x)
归一化分母组内标准差 σGbatch 内标准差 σℬ
每步梯度更新次数88
max response tokens16,38416,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 数以百万计时,这是表格型追踪器的主要成本。

05

一张图看清:同步屏障是怎么被拆掉的

论文 Figure 1 与 §5.4 的仿真放在一起读,组内派与单流派的差别只在「等谁」这一件事上。

GRPO · 组内同步 1 prompt → 8 条轨迹,必须全部完成 t=0 t=508s 空转等待 508s / 444s / 409s:三条 straggler 组完成 508s SPO · 单流采集(仿真) 48 条独立轨迹,取最先完成的 24 条 t=0 t=112s 已完成 12 条(示意,非逐条数据) 48 条中已有 24 条完成即开训 批次齐 112s 486s → 112s,4.35×(Figure 5c 的速度比;按 486/112 复算为 4.34)
图 1:左为 Figure 4b / Figure 5a 的组内瓶颈(6 条快轨迹被迫等 3 条 straggler);右为 Figure 5b 的单流采集(48 取 24)。图中条长为示意,时间数字取自 §5.4。

Figure 4a 给的是低方差对照:轨迹耗时接近时,组完成时间 133 s,等待代价可忽略。所以瓶颈不是「组」本身,而是「耗时分布的长尾」——推断:越接近长程、多轮工具调用的任务,单流的收益越大;任务链越短、方差越小,两者越接近。

06

平均 maj@32 高 3.4 个点,但这 3.4 主要来自 BRUMO 25 一项

Table 1 是在 Qwen3-8B 上训练 TIR 后的对比,五个数学竞赛基准,maj@32 与 avg@32 并用。

表 1(Table 1,单位为 %,每个单元格独立采样 32 次):

方法 AIME 24 AIME 25 BeyondAIME BRUMO 25 HMMT 25 平均
maj@32avg@32maj@32avg@32maj@32avg@32maj@32avg@32maj@32avg@32maj@32avg@32
Qwen3-8B(未训练) 77.864.470.558.445.238.055.149.436.830.357.148.1
GRPO 83.377.672.164.245.639.056.756.944.240.960.455.7
SPO 84.074.976.565.046.940.364.059.047.540.663.856.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%,等价说法;这里统一报倍数,避免与「相对提升百分比」混淆。

消融(附录 E,AIME 25,avg@16,256 对 batch)

这三项消融只有曲线(Figure 6),没有以数字形式给出终值,所以这一页不报具体点数。

07

什么时候别用:奖励不是二元、prompt 海量、或想拿 wall-clock 说事

论文自己也承认的局限,加上几处从公式和实验条件读出来的边界。

边界一

冷启动不是免费的

追踪器需要离线估计 ṽ0(实验取 n0 = 8)。Appendix A 的消融(Figure 6c)显示没有离线初始化的训练前期会不稳。推断:论文说共享了离线数据集以让人跳过这一步,但换任务/换模型时这笔预热仍要自己付。

边界二

表格型追踪器不泛化

每个 prompt 一对 (α, β),没见过的 prompt 无从估计。prompt 种数极多时存储开销线性增长,论文未讨论。推断:这也是为什么离线初始化与共享数据集对复现如此关键。

边界三

实验面很窄:一个 8B 模型 + 一个训练集

全部主实验只有 Qwen3-8B、DAPO 数据集的英文子集、TIR 场景,五个基准都是数学竞赛。更大的模型、非数学域、非二元奖励都没有主实验;推广到一般奖励时,论文建议直接用同样的 EMA 去跟踪 ṽ,而不是走 α、β。

边界四

「4.35×」来自仿真,且是无偏性上的取舍

Figure 4/5 是构造出来的耗时分布,不是实跑吞吐。另外 Eq. 8 说基线 ṽ−1 必须来自更新前,但 Algorithm 1 第 9 行在归一化之前就用本次结果 r 更新了追踪器;推断(由 Algorithm 1 与 §4.1 的顺序读出):若实现照字面先更新再算下一轮基线,基线就依赖本次动作,无偏性论证不再严格成立。结论仍然成立与否,需要看代码,而论文没有公开代码链接。

一句话:SPO 换掉的不是「少算」,而是「等谁」。它最适合的场景是 rollout 耗时方差大、奖励二元、且 prompt 集合有限可维护的 agentic RL;如果奖励连续、prompt 海量、或者你要的是真实训练墙钟数据,它目前给出的证据还不够。