NPO:让"未来的自己"教会"现在的自己",RLVR走出Q/V困局
核心摘要
做过 RLVR 的人对两个画面应该不陌生:训练前 50 步,rollout 组里 8 条全是错的,advantage 全为零,loss 像一潭死水;训了几百步之后,validation 又卡死在某个 plateau 上不动了。NPO 这篇论文给出的方案出奇地朴素——在同一条训练曲线上,往后多跑 \(\Delta\) 步拿到一个稍微强一点的 checkpoint,让"几十步之后的自己"回头来教"现在的自己"。
听起来像 self-distillation 的某种变体,但作者把它拆成一个干净的 \(\mathcal{S}=Q/V\) 框架:信号质量 \(Q\) 和方差代价 \(V\)。外部老师(LUFFY)\(Q\) 高但 \(V\) 爆炸;经验回放 \(V\) 小但 \(Q\) 被早期 checkpoint 锁死;而"近未来的自己"恰好处在 \(\mathcal{S}\) 曲线的甜蜜点上。在 Qwen3-VL-8B-Instruct 上跑 GRPO,平均分从 57.88 涨到 62.84,AutoNPO 进一步推到 63.15。这个 +5.27 的幅度对一个不改 reward、不改 verifier、只换了一条 trajectory 来源的方法来说,已经相当能打。
更关键的是,作者还给了 AutoNPO——一个用 reward stagnation + entropy collapse 自动触发干预、用 \(\hat{Q}/\hat{V}\) 自动选回滚距离的 controller。这套东西不只是个 paper trick,而是能直接挂进生产 RLVR pipeline 的工程组件。
论文信息
- 标题:Near-Future Policy Optimization
- 作者:Chuanyu Qin, Chenxu Yang, Qingyi Si, Naibin Gu, Dingyu Yao, Zheng Lin, Peng Fu, Nan Duan, Jiaqi Wang
- 机构:Institute of Information Engineering, CAS(中科院信工所);School of Cyber Security, UCAS(中国科学院大学网络空间安全学院);JD.COM
- 发布日期:2026-04-22
- arXiv:2604.20733

图1:左图是训练奖励曲线,红色 AutoNPO 一上来就甩开蓝色 GRPO,并在后面的红色阴影区(晚期干预窗口)再次拉开差距;右图是雷达图,NPO/AutoNPO 在 8 个 multimodal 推理 benchmark 上几乎全方位包住 GRPO 和最强 baseline。
问题动机:辅助轨迹的来源,本身就是个 Q-V 难题
我之前在调一个 RLVR 任务的时候,被两个相反的现象同时折磨过:
早期,模型对绝大多数 prompt 都答不对,rollout 组里 8 条 trajectory 全是 reward=0。GRPO 的 advantage 是组内归一化的,全错就意味着 advantage 全为零,gradient 几乎不更新。模型卡在那儿空转,要熬好几百 step 才能出现第一个正确轨迹,整个早期窗口的算力基本是浪费的。
晚期,模型已经把"它能想到的解法"都收敛到了一个固定模式上。pass@1 还在涨,但其实只是 base model 已知解法之间的重新分配,不是真的学到了新东西。训练曲线变平,怎么再加 step、加 batch 都没用——这就是 [33] 里讲的 plateau 现象。
业界对这两个痛点的常见应对,是给 RLVR 加点"外援"——把 on-policy 改成 mixed-policy。但具体怎么"外援",存在两条相反的路线:
| 路线 | 代表方法 | 信号质量 \(Q\) | 方差代价 \(V\) | 痛点 |
|---|---|---|---|---|
| 外部老师 | LUFFY、Prefix-RFT、SRFT | 高(来自更强的模型) | 大(分布差距大) | 当前策略学不动 |
| 历史回放 | RePO、ExGRPO | 中(早期 checkpoint 的天花板) | 小(同源) | 信号上限被锁死 |
| 远未来回放 | RLEP | 高(用完整训练好的模型) | 大(参数漂移大) | 同样学不动 |
| 纯 on-policy | GRPO | 低(出不了当前策略边界) | 0 | 早期稀疏、晚期触顶 |
作者把这件事抽象成了一个清楚的 trade-off。对任何一个 off-policy 轨迹源,定义两个量:
- \(Q(\Delta)\):在当前策略答错的 prompt 里,这个源能产出 verifier 通过的正确轨迹的比例。
- \(V(\Delta)\):通过 importance sampling 把这个源的轨迹接进 RL 时,引入的梯度方差。
有效学习信号是它们的比值:
一句话讲清这个公式的工程意义:你给的"老师"必须强到能教新东西(高 \(Q\)),又近到学生能学得动(低 \(V\))——两个条件同时满足,这条轨迹才真正有用。
外部老师在 \(Q\) 上天花板很高,但 \(V\) 是爆炸的——LUFFY 在论文实验里甚至在 WeMath 上比 base model 还低,作者一句话点破:"a concrete instance of variance cost overwhelming signal quality."(一个变量成本碾压信号质量的具体案例)。这个判断挺扎心的——把更强的老师拉进来训练听起来很美,但实际效果可能还不如什么都不加。
方法核心:让未来的自己回头教现在的自己

图2:作者最关键的观察图。中间的子图实测了 \(Q\) 和 \(V\) 随 \(\Delta\) 的演化——\(Q\) 蓝色曲线快速上升然后趋平,\(V\) 红色曲线先平后陡。右边的子图直接画出 \(\mathcal{S}(\Delta)\),从 base policy 出发最优 \(\Delta^* \approx 20\) 步,从 mid-training policy 出发偏移到 \(\Delta^* \approx 70\) 步,确实是一条带明显内点峰值的 U 型(倒 U 型)曲线。
直觉先讲清楚
NPO 的核心 idea 用一句话讲:与其去外面找老师,不如继续多训几十步,把那个稍微强一点的自己当老师。因为这个"近未来的自己"和当前模型共享 initialization、架构、optimization history,参数距离天然小,\(V\) 就小;同时它毕竟多优化了几十步,\(Q\) 比当前策略高、也比任何"等价参数距离"的历史 checkpoint 高。
\(\Delta\)(近未来检查点距离当前的步数)成了一个可以自由调的旋钮。这就是 NPO 相比所有 baseline 最关键的优势——以前的方法要么用固定的"远老师",要么用被动漂移的历史 checkpoint,没有一个旋钮能直接调 \(\mathcal{S}\)。
NPO 的核心操作(3.1)
具体怎么做?流程其实非常朴素:
- 训到 step \(t\),先继续训 \(\Delta\) 步拿到 \(\pi^{(t+\Delta)}\)。
- 用 \(\pi^{(t+\Delta)}\) 离线对每个 prompt \(x\) 做一次 rollout,verifier 通过的留下,每个 prompt 保留一条正确轨迹 \(o_x'\) 作为 guidance。
- 把模型权重和 dataloader 状态回滚到 step \(t\),重新跑 NPO 段(论文实验大约跨 40 步)。
- 在每个训练步,对 prompt \(x\) 先正常 sample \(n=8\) 条 on-policy trajectory,算 pass-rate \(\hat{p}(x)\)。
- 如果 \(\hat{p}(x) \leq \tau_{\mathrm{gate}}\)(论文设 0.6)且缓存里有 \(o_x'\),就把 group 里的第 \(n\) 条替换成 \(o_x'\);否则保持纯 on-policy。
- 剩下的 GRPO 流程一字不改:advantage 是 group-relative 归一化的,objective 是 clip 过的 surrogate loss。
注意第 5 步那个 gate——只有当前策略在这个 prompt 上"挣扎"的时候才注入 guidance,已经会做的就不打扰。这个设计避免了在简单 prompt 上人为引入 off-policy 噪声。
形式化地,replace 后的 group 是:
其中:
clipped objective 是标准 GRPO 形式:
整个修改只动了 group 的一个 slot,loss 形式、reward shape、KL penalty 都没改。这就是论文反复强调的 "plug-and-play and objective-preserving"——它和现有的 GRPO/DAPO 训练栈是兼容的。
两次手动干预:早期 bootstrapping 和晚期 plateau breakthrough
为了证明"近未来引导"在不同训练阶段都能帮到忙,作者跑了两次手动干预:
早期 bootstrapping:在最早期,rollout 组几乎全错,gradient 信号近乎为零。先训一个短的 scout run(论文中是几十 step),用 scout 的最后 checkpoint 当 \(\pi^{(t+\Delta)}\)。然后从 base 重新启动主训练,用 scout 提供 guidance。因为 scout 只比当前策略稍强一点,分布很接近,但已经能解出一些当前 fresh run 暂时解不出的题——刚好补上稀疏 reward 的缺口。结果是约 2.1× 的收敛加速。
晚期 plateau breakthrough:在 plateau 阶段,先继续训过 plateau 拿到一个明显更强的 checkpoint,然后回滚到 plateau 开始的位置,用这个更强的 checkpoint 作为 guide 重新跑一遍那一段。强 guide 在 plateau 模型解不出的 prompt 上能产出正确轨迹,把 on-policy ceiling 直接顶上去。
这两次手动干预其实是在"探针式"地告诉读者:早期和晚期,近未来引导都有用——只是用法不同。
AutoNPO:把"什么时候干预 + 回滚多远"自动化

图3:右边的 NPO 机制图很直观——粉色的 \(\pi_F\)(near-future policy)produce 一条 \(o_x'\),作为 group 中的一个 slot 替换上去;左边的 AutoNPO 是一个 controller pipeline,把"何时干预"和"回滚多远"两个手动决策自动化。
手动干预好用,但需要人盯着 training curve 找时机、调参数,对长 run 和多任务场景不友好。AutoNPO 把它工程化成了一个轻量 controller:
Mistake pool \(\mathcal{B}\):每个 batch 里 group accuracy 低于阈值的 prompt,连同失败步号 \(t_{\mathrm{fail}}\) 存进来——只存两个 ID,开销可以忽略。这个池子在三个阶段都会用到。
Trigger(什么时候干预):两段式检查。第一段是零成本的 warning——监测 reward 的 EMA 是否停滞、policy entropy 是否在同一时间下降。这两条曲线本来就在 training log 里,是"exploration collapse"的典型 signature。如果 warning 持续了几个 probe interval,就进入 confirmation:用 \(\pi^{(t)}\) 在 \(\mathcal{B}\) 的小子集上 rollout 一次,得到 pass-rate \(\hat{p}\),超过阈值就触发干预,同一次 rollout 的副产物正好是 \(\hat{Q}(\Delta)\)。
Rollback distance(回滚多远):直接最大化经验有效信号:
其中 \(\hat{Q}(\Delta) = \mathrm{pass\text{-}rate}(\pi^{(t)}; \mathcal{B}_\Delta)\) 是当前策略在"\(t-\Delta\) 那个段失败过的 prompt"上的 pass-rate;\(\hat{V}(\Delta)\) 是用 \(\pi^{(t)}\) 和 \(\pi^{(t-\Delta)}\) 之间 per-token KL 估计的方差代理(论文 Appendix B 给出指数上界)。
Execution:选定 \(\Delta^*\) 后,把 \(\pi^{(t)}\) 当 guide,只在 \(\mathcal{B}_{\Delta^*}\) 这个失败子集上生成 cache(不是整段所有 prompt 都做,省 cache 成本),然后回滚到 \(t-\Delta^*\) 重新训那一段,期间命中 \(\mathcal{B}_{\Delta^*}\) 的 prompt 走替换流程,其它走纯 on-policy。回到原 step \(t\) 后进一段 cooldown 再 arm。
这套 controller 漂亮的地方在于:所有信号都来自现有 training log,新增的 forward pass 只有一次 confirmation rollout,几乎没有额外开销。
实验结果:NPO 和 AutoNPO 的真实表现
实验设置
- 底座模型:Qwen3-VL-8B-Instruct(一个多模态推理模型)
- 训练数据:MMFineReason-123K,是从 1.8M 大集里按难度过滤出来的——每个样本用 Qwen3-VL-4B-Thinking 跑 4 次,全错的才留下。这种过滤很关键,留下的都是模型还没掌握、但有改进空间的题,正好对齐 NPO 设计的目标场景。
- 评测:8 个 multimodal benchmark:MathVista、MathVision、WeMath、MathVerse、MMMU-Pro、MMBench、MM-Star、ZeroBench(最难的 stress test,目前 frontier model 都做不全对)
- 配置:lr=\(1\times10^{-6}\),batch=256,每 prompt \(n=8\) rollouts,\(\epsilon_{\text{low}}=0.2\)、\(\epsilon_{\text{high}}=0.28\),没有 KL penalty 也没有 entropy 正则;mix_policy_accuracy_threshold=0.6
- 算力:4 节点 × 8 张 H200 140GB——这个配置不算小
主表:每个 baseline 都被踩在了 Q-V 平面的某个角落
| 方法 | MMMU-Pro | MathVista | MathVision | ZeroBench | WeMath | MMBench | MM-Star | MathVerse | Avg. |
|---|---|---|---|---|---|---|---|---|---|
| Qwen3-VL-8B-Instruct (Base) | 51.75 | 73.80 | 47.37 | 19.76 | 54.10 | 89.79 | 71.83 | 54.61 | 57.88 |
| LUFFY (external teacher) | 54.23 | 73.80 | 54.00 | 20.51 | 52.38 | 89.49 | 69.47 | 55.58 | 58.68 |
| GRPO (pure on-policy) | 55.78 | 76.20 | 48.82 | 22.60 | 56.57 | 90.29 | 72.20 | 59.52 | 60.25 |
| ExGRPO (historical replay) | 55.49 | 77.30 | 55.46 | 19.01 | 62.67 | 90.44 | 72.00 | 56.89 | 61.16 |
| RLEP (far-future) | 55.38 | 78.50 | 54.23 | 19.61 | 62.48 | 90.45 | 72.27 | 58.91 | 61.48 |
| NPO, early-stage only | 56.85 | 76.60 | 54.31 | 26.35 | 62.76 | 90.41 | 70.30 | 59.38 | 62.12 |
| NPO, early + late-stage | 57.07 | 76.30 | 54.61 | 24.85 | 66.95 | 90.30 | 72.20 | 60.00 | 62.84 |
| AutoNPO | 57.24 | 79.20 | 55.72 | 24.70 | 66.00 | 90.63 | 72.63 | 59.11 | 63.15 |
几个值得停下来看一眼的点:
LUFFY 居然在 WeMath 上掉到了 base 之下(52.38 vs 54.10)——这是论文 Q-V trade-off 论证的最有力证据。一个号称用更强老师的方法,居然把 base 训"歪"了。说实话第一次看到这个数据我有点惊讶——业界很多人对外部蒸馏类方法的预期都是"再差不会差到哪去",结果这里直接负向。换个角度看:你拿一个跨家族的强老师 trace 直接灌进 RLVR,分布差距大到 importance weight 一爆,整体梯度方向就会被带偏。
NPO early-only 在 ZeroBench 上拿到 26.35,比 GRPO 高 3.75 个点,比所有 baseline 高 5+ 个点。这个 benchmark 是专门做来"留在 frontier model 解不出的 long tail"的,正好对应 NPO 早期干预最擅长的场景:稀疏正例。这条数据相当能说明问题——能在难题上拉开差距,比在简单题上多 0.x 个点要值钱得多。
NPO early+late 在 WeMath 上从 56.57 直接拉到 66.95(+10.38)。WeMath 是数学推理深度型 benchmark,正好是晚期 plateau breakthrough 该发力的地方。这个幅度太大了,大到我会想问一句:是不是 plateau 之前的 GRPO 训练不够充分?但从 entropy collapse 的曲线来看(图 4b),GRPO 确实是已经 collapse 了,所以这个突破是 NPO 真的"撬"出了被压制的能力。
AutoNPO 拿了 5/8 个 best,比手动 early+late 还多一点,平均 +0.31。这个数听起来不大,但意味着自动化 controller 没有打折扣,人手能调出来的 sweet spot,机器也能找到。
训练动态:entropy 的故事比 reward 更关键

图4:三个 panel 讲了一个连贯的故事——AutoNPO 不是"一直猛踩油门",而是"在关键时刻精准踩"。看 (b) 这张 entropy 图最有意思:GRPO 的紫色曲线一路稳定下滑(典型的 exploration collapse signature),而 AutoNPO 的红色曲线在每次干预之后都会重新"鼓起",相当于把模型的探索性救回来一段。
这张 entropy 图其实是整篇论文最有信息量的图,比主表更能说明 NPO 在做什么。RLVR 训到后期会陷入一个怪圈——pass@1 还在涨,但 generation entropy 在塌——意思是模型把 rollout 集中到很窄的几条解题模板上,pass@1 只是在这几条模板里"内卷"。
NPO 的干预之所以能打破 plateau,就是因为它把"未来自己"的不同解题路径塞回当前 rollout 组,相当于强行扩张了探索空间。entropy 重新升起来之后,policy 才有机会探到原本被压制的解法。
我之前在做 reasoning RLVR 的时候也观察到类似现象——entropy collapse 一发生,再加 step 几乎没用,必须用某种方式重新注入多样性。一些做法是直接加 entropy regularization,但那会拖累 reward;另一些做法是加噪 prompt 或换数据集。NPO 这种"用更强自己的解法做扰动"明显更聪明——既扩张了探索,扰动来源还自带"已 verified 正确"的高质量保证。
IS correction 的消融:原来可以省掉
第三个 panel (c) 是个挺重要的工程细节。NPO 既然引入了 off-policy trajectory,按理论应该做 importance sampling correction(保留 \(\rho^q = \pi_\theta / \pi_{\mathrm{off-policy}}\) 的精确比值)。但论文做了个消融——发现带不带 exact IS correction,两条曲线几乎重合,都明显高于 GRPO。
于是可以直接把 guide 的 per-token log-prob 计算省掉,省内存、省 forward。但作者特意强调这个简化只对 NPO 安全:换成 LUFFY 这种远 guide,去掉 IS 直接训崩——因为分布差距大,\(\rho^q\) 偏离 1 太多,没有 clipping 兜不住。
这是个被 NPO 的 "near-policy" 性质保护出来的工程红利——guide 离当前策略足够近的时候,IS correction 本来就不重要。
我的判断:这是一篇值得细读的"框架补完"
亮点
第一,把"自己教自己"的直觉做实了。 ReST、STaR 这些 self-taught 方法很早就在用模型自己的成功 generation 当 SFT 数据,但没人把"未来自己"作为一个可调的 trade-off 参数来研究。NPO 的 \(\Delta\) 就是这个旋钮,理论上有 \(\mathcal{S}(\Delta)\) 的内点最优,实证上 figure 2(c) 证明了 U 型存在,工程上 AutoNPO 自动找峰。整套思路从理论到工程闭环了。
第二,AutoNPO 的工程性比 NPO 本身更值钱。 手动干预这种 trick 看起来很学术——找个机会注入一段,做实验吹一下。AutoNPO 把它产品化了:mistake pool + warning/confirmation 两段触发 + \(\hat{Q}/\hat{V}\) 找 \(\Delta^*\),所有信号都从已有 log 里出,几乎不增加额外训练成本。这种 controller 是真能挂到生产 RLVR pipeline 里的。
第三,对 entropy collapse 给了一个新角度的解释和应对。 RLVR 触顶很大程度是 entropy collapse 导致的,过去主流方案是加 entropy regularization 或调高温度。NPO 用"未来自己的不同解法"作为多样性源,质量和多样性同时给了——这个思路对工业 RL 训练很有借鉴意义。
我有疑虑的地方
第一,cost 的真实开销其实不小。 论文反复强调 NPO segment 是 40 步,cache 一次复用,开销不大。但你想想:要做一次干预,得先继续训 \(\Delta\) 步、做一遍离线 rollout、再回滚 \(\Delta\) 步重训。也就是说同一段被训了两遍。AutoNPO 在长训练里可能要触发多次,整体训练成本是 vanilla GRPO 的 1.5-2×。论文的对比其实是同样训练步数下的 final score,没有报"达到同样性能需要多少 wallclock time"这个更公平的指标。
第二,"近未来"的 \(\Delta\) 范围其实需要预先存好 checkpoint。 AutoNPO 选 \(\Delta^*\) 是在 \(\mathcal{D}\)(保存的 checkpoint 集合)里挑的。如果 checkpoint 间隔太稀,可调空间会很小;间隔太密,存储成本上来了。论文没详细讨论 checkpoint 保存策略对 AutoNPO 的影响,工程落地时这是个绕不开的细节。
第三,benchmark 选择有点偏巧。 WeMath 上 +10 个点的提升,主要来自 plateau 之后的 late-stage 干预——意味着 GRPO 在 WeMath 上其实是被 entropy collapse 卡住了,而不是真的能力到顶。如果 baseline 是配了 entropy regularization 或者 DAPO 那种带 dynamic clipping 的更强 GRPO 变种,差距还会不会有这么大?论文没回答这个问题。说实话我觉得 NPO 在跟 vanilla GRPO 比的时候确实漂亮,但跟 SAPO、GSPO 这些更新一些的 on-policy 优化对照,可能没这么戏剧。
第四,多模态场景的特异性。 整篇论文都在 Qwen3-VL-8B 多模态推理上验证,没有纯文本数学/代码的实验。多模态 RLVR 本身就有更高的方差和更稀疏的正例,NPO 的"近未来引导"在这种场景下天然更有用武之地。在纯文本数学(比如 GSM8K、MATH)上能不能复现这个 +5 个点的幅度,是个值得跟进的问题。
跟同期工作的位置
NPO 和最近几个方向有微妙的关系:
- 跟 on-policy distillation([1] Agarwal et al.、[10] Hübotter et al.)的核心区别在于操作粒度。on-policy distillation 在 token 级别给软目标分布,NPO 在 sequence 级别替换整条 trajectory。两条路线在最近半年都在升温,conclusion 里作者也明确说后续会探索把 NPO 思路嫁接到 on-policy distillation 上。
- 跟 ExGRPO/RePO 的回放思路相比,NPO 不是回放历史,而是"主动用未来自己重新生成"针对当前 prompt 的 guidance。这个差别其实挺大——历史 trajectory 是被锁死的,未来自己的 trajectory 是 freshly generated 针对当前 prompt 的,prompt-aligned 性大幅提升。
- 跟 RLEP 的"far-future"对比正好说明 \(\Delta\) 不是越大越好。RLEP 用 fully-trained model 当 seed,NPO 用近未来 checkpoint,论文实验里 NPO 全面压过 RLEP,是 \(\mathcal{S}(\Delta)\) 内点最优的直接证据。
作者还在 conclusion 里把这篇定位成一个三部曲的第二篇:第一篇研究 "informed self"(带 privileged context 的自己),这一篇是 "temporal self"(未来的自己),下一篇要做 "parallel self"(并行的自己)。这个研究 program 蛮有野心,把 self-taught RLVR 系统化成一个三轴框架——值得持续关注。
工程启发
如果你也在做 RLVR/GRPO 训练,这套思路可以马上试:
最低成本的尝试:在你现有的 GRPO 流程里,每隔一段时间存一个 checkpoint,然后在感觉训练快要 plateau 的时候,手动跑一次"未来 checkpoint 当 guide"的实验——只需要一次 offline rollout + 替换 group 中的一个 slot。改动不超过 100 行代码。这就是手动 NPO,论文证明了即使是手动版也能拿不少收益。
进一步:把 entropy 和 reward 的 EMA 监测加到训练 logger 里——这两个曲线本来就该有,加一个简单的 stagnation detector,就能复现 AutoNPO 的 warning 阶段。
真正的产品化:把 mistake pool 和 \(\hat{Q}/\hat{V}\) 估计器搭起来,就是完整的 AutoNPO controller。
最关键的一个启发:当你的 RLVR 训练触顶的时候,先别急着加数据、加算力——先看看 entropy 是不是塌了。如果是 entropy 塌了,那真正的解法不是更多 rollout,而是更聪明的 rollout 多样性来源。NPO 给了一个高质量、近分布的多样性源——这个 idea 比方法本身更值得记住。
参考文献
- 论文:Near-Future Policy Optimization, arXiv:2604.20733
- 主要 baseline:
- GRPO:DeepSeek-R1, arXiv:2501.12948
- LUFFY:mixed-policy with external teacher
- ExGRPO:historical replay 的代表
- RLEP:far-future replay 的代表
- 相关方向:On-Policy Distillation [Agarwal et al., 2024]、ReST [Gulcehre et al., 2023]、STaR
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我