论文精读

精读:NGU 与 RL 里的马太效应

RLVR 的增益与模型初始水平成正比;论文把病因从「难题采不到正样本」改判为固定采样预算下的算力错配,给出按题几何续采样的修法。

论文: Learning to Solve Hard Problems in RL for LLMs by Never Giving Up
作者: Michael Noukhovitch, Hamish Ivison, Nathan Lambert, Aaron Courville
arXiv: 2609.13443
RLVR GRPO 采样预算 算力分配 马太效应 异步RL 难题求解 后训练

1 论文概览

一句话总结:这篇论文指出 RLVR 的收益在数据集上分布极不均匀——模型本来就会做的题涨得最多,本来一道都做不对的题几乎不动,并把病因定位在固定采样预算 KK 造成的算力错配,给出了一个按题动态续采样的修法。

核心问题。后训练阶段的 RL 通常被当成一把均匀的锤子:给一批从易到难的题,跑完就默认整条难度轴都被抬高了。作者拿三个公开 RL 训练模型(Olmo 3.1 RL-Zero 做数学、DeepCoder 做代码补全、DeepSWE-Preview 做智能体编码)按初始模型表现分桶,发现增益与初始正确率成正比。论文给这个现象起了名字:

The Matthew Effect in RL for LLMs: RL improves performance on a task in proportion to a model’s initial competence—making easy tasks easier while hard tasks often remain difficult.

—— §2「The Matthew Effect in RL for LLMs」

这个表述值得细读。它说的不是「难题不涨」,而是「涨的幅度与初始水平成正比」。两者差别很大:前者是一个绝对断言,后者允许难题也有增益,只是慢。后文的实验会证明,区分这两者对判断这篇论文的贡献有多重要。

主要贡献

  1. 命名并跨领域验证了一个现象:在数学、代码、智能体编码三个域、三个不同基座上,按初始表现分桶后都看到同一种单调偏斜。
  2. 否掉了主流解释:把「难题采不到正样本」(signal loss)这个直觉解释单独拎出来做实验,在固定总批大小下扫 K∈{4,8,16,32}K \in \{4,8,16,32\},结果最小的 K=4K=4 反而最好,包括在最难的题上。
  3. 提出替代解释 signal efficiency:问题不在难题采得不够,而在简单题采得太多。
  4. 给出 NGU 方法与一套工程最佳实践:几何续采样、过期完成过滤(TT)、正样本锚定(anchoring the positives),并逐条做了消融。
  5. 补了一个 harness-aware 的修正:在陌生 prompt 的任务上,马太效应要在模型适应完 prompt 之后才现形。

2 方法详解

从 GRPO 的零梯度条件说起。GRPO 对每条 prompt 采 KK 个完成,优势是单个奖励减组内均值 Ai=ri−1K∑iriA_i = r_i - \frac{1}{K}\sum_i r_i。论文抓住了这条公式的一个直接后果:

— if all KK completions fail and receive zero reward, the prompt contributes no gradient.

—— §3「Causes of the Matthew Effect」

这也是此前 Reinforce-Ada 一类方法的出发点:全对或全错的组不产生梯度,那就继续采,直到采出一个正样本。作者接受这个观察,但拒绝它的推论。

Signal loss 与 signal efficiency 的分野。在固定 N×KN \times K 的前提下扫 KK,每个 prompt 被采到的期望次数并不随 KK 变化——KK 真正控制的是「哪些 prompt 因为零梯度被丢掉」。KK 变大,一条本来会做的题只要混进一个错答案就被保留在训练批里;KK 变小,简单题很快被整组判对而滤除,省下的算力流向还没解开的题。论文把这个换位写成:

The central issue is not merely whether enough completions are sampled for difficult problems but whether excessive compute is spent oversampling easy ones.

—— §3「Signal Efficiency」

NGU 本体。对每个 prompt 先采 KK 个完成(主实验用 K=4K=4 或 K=16K=16):全对就快速滤除;全错则不再丢弃,而是以概率 pNGUp_{\text{NGU}} 再采 KK 个,以概率 1−pNGU1-p_{\text{NGU}} 放弃。总采样数服从几何分布,名义期望为 K/(1−p)K/(1-p)。

As certain problems may be too difficult, we actually continue sampling with probability pNGUp_{\text{NGU}} and give up on the problem with probability 1−pNGU1-p_{\text{NGU}}.

—— §4「Never Give Up」

这个「放弃」的动作是整套方法里最脆的一环,后文的消融会给出量化证据。

两个配套设计。其一是保留历史完成:一旦某条难题最终被采出正解,把此前所有完成并成一个大 GRPO 组,稀有正解的优势被放大。历史完成会带进 off-policy 的陈旧负样本,所以要按年龄过滤,只保留小于 TT 步的。扫 T∈{1,4,8,16}T \in \{1,4,8,16\} 的结果是 T=1→4T=1 \to 4 上升、T=8,16T=8,16 回落,最优 T=4T=4。

其二是正样本锚定。基线 rˉNGU\bar{r}_{\text{NGU}} 用全部历史完成算,但更新时只保留新鲜负样本,优势之和不再为零。论文的解法是保住正样本优势 (1−rˉ)(1-\bar{r}),把剩余负样本的优势统一缩放到 n+n−(1−rˉ)\frac{n_+}{n_-}(1-\bar{r})。

与基线的区别。NGU 不去改数据分布,而让算力在原有分布内部流动。论文明确对照了两条相反的路:不重采简单题(An et al. 2025)会因为假设模型不回退而把分布越推越难,作者实测连最容易的子集都开始退化;按初始难度静态分配 KK 的课程学习,则在难题上追平 NGU 却在简单题上大亏。Reinforce-Ada-Seq-Pos 形式上最接近 NGU,但不同步 RL、不放手、且丢负样本,三项差别逐条消融在 Table 1。

3 实验结果

主实验:Deepscaler(Qwen3-4B-Base,3 seeds,约 120 H100 小时算力对齐)

设置AIME 25BRUMO 25Average
Qwen 3 4B Base7.6316.312.6
N=2,K=64N{=}2, K{=}6420.3 ± 0.928.8 ± 0.724.5 ± 0.5
N=4,K=32N{=}4, K{=}3221.4 ± 1.329.2 ± 0.725.3 ± 0.5
N=8,K=16N{=}8, K{=}1620.0 ± 1.529.6 ± 1.424.8 ± 1.0
+ NGU p=0.875p{=}0.87521.8 ± 0.231.2 ± 1.326.5 ± 0.6
+ NGU p=0.75p{=}0.7521.3 ± 2.131.6 ± 1.526.4 ± 0.7
+ NGU p=0.5p{=}0.522.0 ± 0.730.1 ± 1.626.1 ± 0.6
Darling(原文,不同 10k 子集)*20.131.725.9

按难度子集拆增益(Table 3):

设置EasyMediumHardTotal
K=64K{=}64+23.3 ± 1.9+15.3 ± 1.5+2.5 ± 0.2+11.5 ± 0.5
K=32K{=}32+26.0 ± 2.5+15.4 ± 1.8+2.5 ± 1.1+12.2 ± 0.5
K=16K{=}16+26.8 ± 2.6+14.5 ± 3.6+1.6 ± 0.3+11.7 ± 1.0
NGU p=0.875p{=}0.875+26.8 ± 1.7+16.3 ± 0.9+4.3 ± 1.2+13.5 ± 0.6
NGU p=0.75p{=}0.75+28.1 ± 0.2+16.8 ± 3.3+3.0 ± 1.2+13.4 ± 0.7
NGU p=0.5p{=}0.5+25.1 ± 2.3+17.9 ± 2.2+3.3 ± 1.9+13.0 ± 0.6
采样课程+22.7 ± 1.6+15.5 ± 1.4+4.0 ± 1.1+12.1 ± 0.8

难度桶按初始模型的 pass@64 划分:hard 为所有 pass@64=0 的题,medium 平均 2.9%,easy 平均 46.1%。

消融:GSM8k 上拆掉 NGU 的三个设计决策(Qwen2.5-0.5B-Instruct)

变体easymediumhardextra
Baseline GRPO100.099.999.647.1 ± 6.4
+ NGU p=1.0p{=}1.0(永不放手)83.961.236.32.7 ± 1.0
+ NGU p=0.75p{=}0.75,同步 RL99.097.393.814.8 ± 5.2
+ NGU p=0.75p{=}0.75,异步 RL,负样本下采样99.596.795.463.9 ± 5.5
+ NGU p=0.75p{=}0.75,异步 RL,正样本锚定100.099.298.687.9 ± 2.2

Coding:Manufactoria。标准 GRPO 配 per-test 奖励能解出约 80% 的测试,但几乎学不会让一道题的测试全过;NGU 在同样的 per-test 奖励下持续啃最难的测试,最终转成整题通过。与「先 per-test 训练、平台期后换成 all-tests 奖励」这条两阶段方案相比,NGU 在算力维度上大致打平。

4 个人分析

亮点。把「难题学不动」从模型能力问题重新定义成算力预算问题,这一步是全文最有价值的地方。它把一个看似需要新损失函数的难题,降维成采样调度问题,落地成本极低——异步 RL 已是大规模后训练的标准配置,NGU 只改采样循环。

作者还主动给了两条对自己不利的证据。不重采简单题的那条消融里,最容易的子集早期就开始退化;静态难度课程在简单题上大亏。这两条合起来支撑了论文的核心主张:难度是动态的,任何一次性估好的分配都会过期。

第一处需要补的账:难题增益的显著性垫底。用论文自己的 3 seeds 做 Welch 检验,NGU p=0.875p{=}0.875 对最强基线 K=32K{=}32 的差距是:Total +1.3(p=0.047p=0.047)、Easy +0.8(p=0.674p=0.674)、Medium +0.9(p=0.496p=0.496)、Hard +1.8(p=0.129p=0.129)。也就是说,摘要里「especially on harder problems」这句恰恰是全套数据里最不显著的一条;唯一踩过 0.05 的是汇总列,而汇总列的低方差来自三个子集在同一个 seed 上同向波动。对 K=64K{=}64 那条基线,NGU 的 Average 差 +2.0、p=0.012p=0.012,这是全表唯一稳健的对比——但它比对的是最弱的基线。三个 NGU 配置对三条基线共九次两两比较,没有任何一次能过 Bonferroni 校正。

第二处:把 NGU 和课程学习放在一起看,结论会反过来。NGU p=0.875p{=}0.875 减采样课程:Hard +0.30(p=0.766p=0.766,完全平手)、Easy +4.10(p=0.039p=0.039,显著)。论文把 NGU 定位成解难题的方法,可它相对最廉价的静态替代方案,优势全在简单题上,难题上是平的。换个读法:静态课程已经拿到了 NGU 在难题上的全部收益,代价是砸掉简单题;NGU 真正的贡献是「不砸简单题」。这是一个和标题不同但更有工程价值的结论。

第三处:名义采样量 K/(1−p)K/(1-p) 不是平均值,而是上界。设单条完成的成功概率为 qq,NGU 的期望采样数是

E(q)=K1−p(1−q)KE(q) = \frac{K}{1 - p(1-q)^K}

K/(1−p)K/(1-p) 是 q=0q=0 处的值,只有当模型永远解不出这道题时才取到。取 K=16,p=0.875K=16, p=0.875(名义 128):

qq00.0010.010.020.050.10≥0.20
E(q)E(q)128.0115.262.843.626.019.116.0

在 q>0.0096q > 0.0096 的全部区间里,E(q)E(q) 低于最大的固定基线 K=64K=64。论文写「theoretical average sampling ranges of K=32,64,128K=32,64,128」,实际支出对多数 prompt 只有 16,名义值高估可达 4.9 倍。

这条恒等式还揭示了一件事:算力重分配几乎是个二值开关。qq 从 0 走到 0.05,E(q)E(q) 就从 128 掉到 26;q≥0.2q \ge 0.2 之后稳定在 16。真正决定 NGU 花掉多少算力的,不是 pp,而是数据集中「模型根本解不出来」的题占多大比例。pp 只是个上限旋钮。

第四处:p=0.95p=0.95 落在消融的盲区里。Deepscaler 扫的是 {0.5,0.75,0.875}\{0.5, 0.75, 0.875\},而 GSM8k 与 Manufactoria 两处主实验用的都是 p=0.95p=0.95。Table 1 显示 p=1.0p=1.0 是灾难(extra 从 47.1 崩到 2.7)。于是最敏感的那个参数,恰好在两个主实验的取值点上没有数据:被扫过的最大值是 0.875,失效点是 1.0,部署值 0.95 夹在中间。Manufactoria 的 K=16,p=0.95K=16, p=0.95 名义采样 320,是基线 K=16K=16 的 20 倍,而按上式只有当 q<0.34%q<0.34\% 时才真的会花到 10 倍。

第五处:编码那节没有做算力对齐。§5 明确写了「compute-match NGU by running all experiments for approximately 120 H100 hours」,§6 写的是「run NGU on Manufactoria with the same settings as the baseline, adding only pNGU=0.95p_{\text{NGU}}=0.95」——对齐的是步数。Figure 10 是 §6 唯一按算力时间画的一张图,且比的是 all-tests 奖励而非标准 GRPO。于是「GRPO 一道题的测试都过不了、NGU 能」这个最醒目的结果,是在论文自己的核心指标(每算力性能)没有被归一化的前提下得到的。§6 全程没有 seed 与误差棒,D.3 正文写 3000 步 / 28 小时,Table 6 却写 Total Steps 1500,文档与实跑不一致。

第六处:GSM8k 的收益是纯转移,且量表很粗。Table 1 里 NGU 相对基线:easy 100.0 对 100.0(已到顶)、medium −0.7、hard −1.0、extra +40.8。论文写「gains coming specifically on the extra hard problem subset」字面上成立,代价是另外两个未饱和的桶双双回退。这个评测量表本身也只有 32 道题——每个难度桶 8 道,1 道题等于 12.5 分,+40.8 分相当于 3.26 道题。

更有意思的是这个桶的标签会溶解。extra-hard 按初始模型 pass@1 为 0% 选出,其中 6/8 在 1024 次采样里一次都没解出;可是不加任何干预的 vanilla GRPO 就能把它做到 47.1%。所以马太效应是一个相对陈述(easy 到 100、extra 到 47),不是「难题原地不动」。

第七处:缺一条固定 K=128K=128 的对照臂。论文称 NGU p=0.875p=0.875 名义等价于 K=128K=128,基线的 KK 只到 64。按上面那条恒等式,真正公平的对照其实是 K=64K=64 甚至更低,所以这一条不构成致命伤;但论文既然用「名义 128」来定位自己,就没有理由不跑一条 K=128K=128。同一节还提到「we also ran N=16,K=8N=16,K=8 and it underperforms all other baseline settings」,却没有给出任何数字。

第八处:harness-aware 的修正把效应推向不可证伪。Manufactoria 上按初始表现分桶看不到马太效应,作者改到 step 100 之后再分桶,效应就出现了,于是把定义改成:

RL improves an LLM’s performance on a task in proportion to the model’s early performance on the task after accounting for adaptation to a prompt or harness.

—— §6「The Harness-Aware Matthew Effect」

两阶段适应(先适应 prompt,再解题)的解释是成立的。但「适应期到哪一步结束」是一个看着结果选的自由参数。任何看不到马太效应的域,都可以用「适应期还没结束」来解释,这让这个定义在经验上很难被推翻。附带一句:附带的统计假象可以排除——用 step 100 的噪声测量分桶、再测从 step 100 起的增益,会让高桶的增益被回归效应压低,观测到的方向与之相反。

局限性(合并论文自陈)。附录 B 写得很直白:NGU 靠快速滤除简单题来腾算力,隐含前提是训练分布里有足够多的简单题;如果任务本身就偏难,NGU 大概率无效,因为续采样会让整组完成更 off-policy。作者也不建议设 K=1K=1。补两条论文没写的:其一,全部结论建立在二值或近二值奖励、contextual bandit 式设定上,论文自己也说当前 RL for LLM 是 contextual bandit 而非 MDP;其二,附录 C.1 说「unlikely negative samples as noise」,这等于承认了简单题上的偶然失败不该进训练——可这也意味着 NGU 在奖励连续或稠密的场景里,连「什么算已解决」都需要重新定义。

对领域的影响。这篇论文真正的产出不是一个新算法,而是一个评测纪律:平均分会掩盖结构。AIME+BRUMO 上,按初始 pass@64 分桶后 hard 桶占约 46%(我用 Table 3 的 Easy/Medium/Hard/Total 四列做最小二乘反推得 easy 26% / medium 28% / hard 46%,残差 ≤0.06;用基座 46.1% 与 2.9% 反算得 12.80,与报告的 12.6 吻合)。在这种构成下,一个 +1.3 的总分增益可以由 easy 涨 0.8、medium 涨 0.9、hard 涨 1.8 拼出来,也可以由完全相反的结构拼出来。只报一个标量,等于放弃了这个信息。

5 实践启示

可以直接搬走的三件事

  1. 把分桶评测做进训练监控。按初始 pass 率分桶、每桶单独画曲线,成本几乎为零。Olmo / DeepCoder / DeepSWE 三个公开项目都能复现出同样的偏斜,说明这不是个例。
  2. KK 是先于 pp 的旋钮。在 N×KN \times K 固定的前提下,KK 决定哪些 prompt 被滤除,比 NGU 的 pp 更早地决定训练批的难度构成。论文自己的 GSM8k 扫描里,K=4K=4 就已经赢了 K=32K=32。
  3. 不要用「不重采简单题」和静态难度课程。两条都被作者实测打脸,前者连最容易的子集都会退化,后者砸掉简单题换难题(easy −4.1 换 hard +0.3,与 NGU 对照)。要动态分配,就得在线分配。

落地前要自己复算的三件事

  • 先估计你的训练集里 pass@kk 为 0 的题占多少。按 E(q)E(q) 那条恒等式,这个比例直接决定 NGU 会花掉多少算力,pp 只封顶不决定支出。数据集整体偏难时,论文自己预判 NGU 无效。
  • 单 seed 的结论不可信。Deepscaler 上三个只差 KK 的基线之间有 0.8 分的散布,而最强 NGU 与最强基线的差是 1.2 分——增益只有基线内部噪声的 1.5 倍。要做决策,种子数得堆到能把 0.5 分分辨出来。
  • 编码或多测试场景要自己补算力对齐。论文在数学上做了 120 H100 小时对齐,在编码上只对齐了步数。

潜在应用场景。凡是一道样本有明确成败判定、且难度跨度大的 RLVR 场景都合适:数学竞赛题、竞争性编程、带单元测试的代码生成、有多档测试用例的工具调用。Manufactoria 那组结果指向一个更具体的用法——当奖励被拆成 per-test 这类部分分、模型卡在「会做一部分但做不全」的平台期时,NGU 是一条比换奖励更省事的出路(它追平了「换成 all-tests 奖励」这条两阶段方案)。反过来的场景也清楚:奖励稠密、需要多步信度分配、或者训练集本身几乎全是难题时,这篇论文的方法与它的理论前提都不成立。

参考文献

Noukhovitch, M., Ivison, H., Lambert, N., & Courville, A. (2026). Learning to Solve Hard Problems in RL for LLMs by Never Giving Up. arXiv:2609.13443 [cs.LG]. Mila, Université de Montréal; Allen Institute for AI; University of Washington; Trillium Labs. 代码:github.com/mnoukhov/never-give-up

相关精读

本专栏连续四十三期追问同一个命题——“训练信号到底该从哪儿来”。本篇的位置是:前三期默认”挑对数据就有收益”,本篇把问题从”选哪些题”换成”每题给多少算力”,并在 RLVR 层次上给出了一个分布不均匀的负诊断。