可验证环境是乐高积木:把环境"拼"起来,RL推理泛化能涨多少?

你有没有想过一个问题——做强化学习训练大模型推理,大家都知道"环境越多越好",可环境是哪来的?

要么人工写,要么用脚本一个一个合成。问题是,不管哪种方式,环境池的规模都是线性增长的:你想要 1000 个环境,就得付出 1000 个环境的构造成本。预算卡死了,能塞进去的多样性也就到头了。可推理泛化恰恰最吃多样性。这就成了一个死结。

这篇 6 月刚挂出来的论文(arXiv: 2606.12373)给了一个我觉得挺漂亮的破局思路:别再从零造新环境了,把已有的环境像乐高积木一样拼起来。 一个环境的输出类型如果能接上另一个环境的输入类型,它俩就能自动融合成一个新的、依然可验证的环境——而且可以递归地一直拼下去。论文管这套框架叫 RACES。


一段话讲清楚这篇论文

RL 训练大模型推理需要大量可验证环境(代码题、谜题这类输入确定、输出唯一、能程序化判分的任务),但现有的人工/脚本构造方式只能让环境池线性增长,成本高、多样性受限。RACES(Recursive Automated Composition for Environment Scaling)的核心洞察是:当环境 A 的输出类型(codomain)等于环境 B 的输入类型(domain)时,二者可以自动融合成一个新环境,因为确定性函数的复合仍然是确定性的、可验证的。基于这个"组合闭包"性质,RACES 用 300 个基础环境定义了四种组合算子(SEQUENTIAL、PARALLEL、SORT、SELECT),递归拼出数万个复合环境。实验上,它把 DeepSeek-R1-Distill-Qwen-14B 在 6 个未见过的基准上平均分从 48.2 拉到 51.3(涨 3.1 分),Qwen3-14B 从 58.8 提到 61.1。更狠的是,只用 50 个基础环境,效果就能追平用 300 个独立环境训练的水平。说白了不对——应该说,这是一篇把"环境复用率"这件事真正做出价值的工作,不是炫技,是实打实地把每个环境的利用效率撬起来了。

论文信息 - 标题:Verifiable Environments Are LEGO Bricks: Recursive Composition for Reasoning Generalization - 作者:Hao Xiang, Qiaoyu Tang, Le Yu, Yaojie Lu, Xianpei Han, Ben He, Le Sun, Bowen Yu, Peng Wang, Hongyu Lin, Dayiheng Liu - arXiv: 2606.12373(Submitted on 10 Jun 2026)


🤔 为什么"线性扩环境"是个真问题

先把背景补一下。所谓可验证环境(verifiable environment),指的是那种给定输入就有确定输出、能用代码自动判对错的任务——比如"返回斐波那契数列第 n 项"、"把字符串里每个数字映射成对应小写字母"。这类环境的好处是:能无限采样训练数据,判分不需要人,也不需要调外部工具,纯靠模型自己推理。

之前已经有工作(比如 RLVE 那条线)证明了一件事:环境数量越多,RL 训练出来的推理能力越强。这个结论很直接,于是大家自然想到扩环境池。

但扩法有问题。人工写环境贵,脚本合成虽然能自动化,可它每生成一个新环境,环境池只 +1,成本和规模是线性挂钩的。我之前做类似数据构造的时候也碰到过这个天花板——你的预算决定了环境数量上限,而环境数量上限又卡死了任务多样性的上限。对推理泛化来说,多样性几乎是最关键的变量。线性扩张这条路,注定走不远。

RACES 的切入点不一样:别造新的,重组旧的。 这个思路在数学上有依据——变换的复合具有闭包性(closure property),两个确定性映射复合后还是确定性映射。论文把这个抽象性质落地到了可验证环境上。


🏗️ 核心方法:把环境定义成"可拼接的四元组"

一个环境长什么样

RACES 把每个可验证环境 \(e\) 形式化成一个四元组:

\[e = (G_e,\ f_e,\ D_e,\ V_e)\]

四个部件各管一摊:

  • 输入采样器 \(G_e\):从输入空间 \(\mathcal{X}_e\) 里程序化地源源不断吐出合法输入,保证训练数据无限供应;
  • 输出映射器 \(f_e: \mathcal{X}_e \to \mathcal{Y}_e\):环境的核心语义,用代码实现,给定输入产出唯一输出。它的定义域 \(\mathcal{X}_e\) 和值域 \(\mathcal{Y}_e\) 组成了类型签名 \(\tau_e=(\mathcal{X}_e, \mathcal{Y}_e)\)——这是判断两个环境能不能拼的关键依据;
  • 问题描述器 \(D_e\):把采样到的输入渲染成一道自然语言可解的题目;
  • 程序化验证器 \(V_e\):判断模型输出是否等于参考答案 \(f_e(x)\),返回 0 或 1。

这个四元组设计的精妙之处在于那个类型签名。它把"环境能不能组合"这件事,简化成了一个类型匹配问题。

组合闭包:codomain 接 domain

两个环境 \(e_i\)\(e_j\),如果前者的值域等于后者的定义域,即 \(\mathcal{Y}_{e_i}=\mathcal{X}_{e_j}\),它们就能复合:

\[(f_{e_j}\circ f_{e_i})(x) = f_{e_j}\bigl(f_{e_i}(x)\bigr)\]

因为两个映射都是确定性的,复合后依然确定、依然可验证,而且复合体的"对外接口"(定义域到值域)和单个环境一模一样——所以它能继续往下拼,递归地拼。一个域兼容的序列 \((e_1,\ldots,e_t)\) 就诱导出一个长链复合映射 \(F_{\pi_t}=f_{e_t}\circ\cdots\circ f_{e_1}\)

这就是整篇论文的灵魂。下面这张框架图把它讲得很清楚:

图1:RACES框架总览。环境被标准化为四部件结构,按类型签名组成环境池;当一个环境的输出类型匹配另一个的输入类型时,它们像乐高积木一样拼接;最终通过四种组合算子转化为面向模型的训练问题。

图1:RACES框架四步走。第2步是环境池——蓝积木"返回斐波那契第n项"(Int→Int)、绿积木"数字映射成字母"(Int→String)、黄积木"保留每个字符最后出现的那个"(String→String)。第3步演示拼接:蓝积木的输出 Int 匹配绿积木的输入 Int,于是 \(Y_{e_A}\) 接上 \(X_{e_B}\),拼完再接黄积木,递归延伸。第4步是四种组合算子,把拼好的链条变成不同的推理任务。

你看这个例子就很直观:斐波那契(输出整数)→ 数字转字母(输入整数、输出字符串)→ 字符去重(输入输出都是字符串)。三块积木严丝合缝地咬在一起,组成了一道全新的、需要多步推理的题。而这道题的标准答案,是程序自动算出来的,不需要任何人工标注。

怎么把环境真正拼起来

光有理论不够,RACES 用一个基于前沿(frontier)的搜索策略来实际构造复合环境,分三步:

组合路径发现。 给定初始输入 \(x_0\) 和环境池 \(\mathcal{E}\),RACES 搜索所有域兼容的组合路径,形成一棵以 \(x_0\) 为根的搜索树——每个节点是一个状态值,每条出边是一个域匹配该状态的环境。在每个前沿状态 \(y_t\),它检索所有类型兼容的候选环境并逐个执行。实现上是随机化的广度优先遍历,受最大组合深度、单步执行时限、每个状态的扩展上限约束。每个环境还有使用配额,按剩余配额加权采样,避免某几个环境被反复用、其它环境没人理。

质量保证。 这一步我觉得是工程上很必要的补丁。域兼容只是必要条件而非充分条件——因为每个 \(f_e\) 是真代码,域匹配的扩展在某个具体中间状态上可能照样跑挂:运行时异常、超出步数限制、超时、输出非法。所以 RACES 在搜索过程中做在线可执行过滤,只保留那些真能跑通、产出合法中间状态的扩展。这一步把"理论上能拼"收窄成了"实际上能跑且能判分"。

算子实例化。 拼出来的复合环境还只是个可执行的链条,不是模型能做的题。组合算子负责把它转成面向模型的问题——规定展示哪些信息、要模型预测什么、怎么验证。同一个复合环境可以套多个算子,产生不同的推理模式。这里有个关键变量:组合大小 \(t\)(链条长度),它直接衡量任务难度——链越长,模型要追踪的中间状态越多,误差累积也越严重。

四种组合算子:同一个链条,四种玩法

这是 RACES 制造推理多样性的核心机制。同样一条拼好的环境链,套上不同算子,就变成性质完全不同的推理任务:

算子 给模型什么 要模型做什么 奖励设计 训练什么能力
SEQUENTIAL 初始输入 + 按序排列的描述符 预测所有中间输出 \((\hat y_1,\ldots,\hat y_t)\) 奖励"最长正确前缀" \(R=K/t\),一步错则后续全废 状态接力、链式执行
PARALLEL \(n\) 个独立的环境-输入对 在同一上下文里同时解 \(n\) 道题 各题验证结果取平均 \(R=\frac{1}{n}\sum V_{e_i}\) 多线程并行、子问题隔离
SORT 初始输入 + 最终输出 + 打乱的描述符 输出一个能从 \(x_0\) 得到 \(y_t\) 的排列 \(\hat\sigma\) 执行预测顺序,结果对则给 1,否则 0 推断操作顺序
SELECT 初始输入 + 最终输出 + 含干扰项的环境集合 选出正确子集排好序 执行选中序列,结果对则给 1 干扰项辨别 + 顺序推断

SEQUENTIAL 的奖励设计值得多说一句。它不是全对才给分,而是奖励最长正确前缀

\[K = \min\bigl(\{i: V_{e_i}(\hat y_i,y_i)=0\}\cup\{t+1\}\bigr)-1, \qquad R^{\mathrm{Seq}}=\frac{K}{t}\]

意思是从头数,连续答对几步就给几步的分。这个设计捕捉了链式执行里的因果依赖——任何一步错了,后面全部作废。比起"全对才 1 分、否则 0 分",这种密集奖励对长链任务友好得多,不然链一长,模型几乎永远拿不到正反馈。

SELECT 我觉得是四个里最狠的。它的干扰项不是随机塞的负样本,而是搜索过程中遇到的、本身就能在中间状态上执行的域兼容环境。换句话说,这些干扰项"看起来完全合理、类型也对、甚至能跑",只是接上去得不到目标输出。这比随机负样本难太多了——模型不能靠类型筛选偷懒,必须真的去推演。


📊 实验:训练奖励涨得慢,泛化反而更好

主结果

主实验在两个 14B 骨干上做:DeepSeek-R1-Distill-Qwen-14B 和 Qwen3-14B。评测用 6 个训练时完全没见过的基准——LiveCodeBench(代码)、AIME 2024/2025(数学)、Enigmata(逻辑谜题)、IFEval(指令遵循)、LongBench-v2(长文本理解)。这一点很重要:训练环境和评测基准没有任何重叠,所以分数涨了就是真泛化,不是刷榜。

对照组 \(RL_{individual}\) 和 RACES 用完全相同的环境池、相同的 RL 数据规模、相同的步数,区别只在于:前者直接从池里采单个环境的实例,后者采组合算子拼出复合环境。

模型 LCBench Enigmata LBench-V2 IFEval AIME 平均
DeepSeek-R1-Distill-Qwen-14B
Base 47.2 32.3 32.5 70.6 58.5 48.2
\(RL_{individual}\) 46.9 34.2 33.7 69.3 59.8 48.8
\(RL_{RACES}\) 48.8 35.4 36.0 74.6 61.7 51.3
Qwen3-14B
Base 55.0 47.4 32.5 84.5 74.8 58.8
\(RL_{individual}\) 56.3 48.2 34.1 85.7 76.0 60.1
\(RL_{RACES}\) 57.0 49.2 35.5 86.7 77.0 61.1

看这张表有几个点很能说明问题。第一,\(RL_{individual}\) 在 DeepSeek 上几乎没涨(48.2→48.8,才 0.6 分),甚至 LCBench 和 IFEval 还掉了;而 RACES 涨到 51.3,比 individual 高出 2.5 分,IFEval 涨了 4.0 分、LongBench-v2 涨了 3.5 分。第二,RACES 在所有 6 个基准上、两个骨干上全部超过 individual,没有一个掉链子。

这里我得说句公道话:individual 这个 baseline 选得很扎实——同池、同量、同步数,唯一变量就是"组合 vs 不组合"。这种控制变量做得干净,比那种偷偷换数据规模、换训练步数的对比可信多了。RACES 的提升确实来自组合本身,不是别的。

反直觉的训练动态

接下来这个分析是我觉得全文最有意思的地方。直觉上你会想:RL 里奖励涨得越快的方法,下游泛化应该越好吧?

结果恰恰相反。

图2:Qwen3-4B 上两种方法的训练奖励曲线。蓝色的 individual 奖励快速攀升并稳定在 0.7-0.8,橙色的 RACES 奖励始终在 0.45 上下、增长缓慢。

图2:训练奖励曲线。\(RL_{individual}\)(蓝)涨得又快又高,稳定在 0.7~0.8;\(RL_{RACES}\)(橙)一直在 0.45 附近爬,明显更难优化——因为复合环境难太多了。

图3:训练过程中的平均下游性能。individual 快速冲到 50.5 左右就见顶,RACES 起步相当但持续爬升,最终在第 200 步到达 51.9。

图3:下游平均性能。\(RL_{individual}\)(蓝)早期冲得快,到 50.5 左右就见顶不动了;\(RL_{RACES}\)(橙)起步和它差不多,但中后期持续超越,第 200 步达到 51.9,而 individual 只有 50.4。

把这两张图放一起看,故事就清楚了:individual 在训练环境上的奖励涨得飞快(说明模型很容易适应这些简单环境),但这种"会做训练题"的能力到 50.5 就见顶,泛化不出去。而 RACES 的奖励一直涨得磕磕绊绊(复合环境太难了),下游性能却能持续爬升不见顶

论文给的解释我觉得挺到位:individual 环境短、结构简单,容易优化,但提升基本被锁死在训练分布里——说白了就是过拟合了训练环境。而 RACES 的复合环境逼着模型维护中间状态、执行多步变换、有时还要推断操作顺序,这些任务虽然难、奖励涨得慢,却提供了更丰富的训练信号,催生出能迁移的推理行为。

这其实指向一个更本质的认识:训练奖励和泛化能力,根本不是一回事。奖励涨得快,可能只是任务太简单被你刷穿了。

环境利用效率:50 个顶 300 个

这是论文标题里"efficiency"的硬核证据。在 Qwen3-4B 上对比不同环境池大小:

设置 LCB Enigmata LBench-V2 IFEval AIME 平均
Qwen3-4B-Instruct-2507
Base 32.4 36.5 41.3 82.2 53.7 49.2
\(RL_{individual}\)(50 环境) 32.7 38.6 41.6 82.9 55.1 50.2
\(RL_{individual}\)(300 环境) 31.5 39.3 41.9 83.5 55.6 50.4
\(RL_{RACES}\)(50 环境) 33.2 38.7 42.4 82.8 57.0 50.8
\(RL_{RACES}\)(300 环境) 34.0 39.5 42.7 85.2 58.3 51.9
DeepSeek-R1-Distill-Qwen-14B
Base 47.2 32.3 32.5 70.6 58.5 48.2
\(RL_{individual}\)(300 环境) 46.9 34.2 33.7 69.3 59.8 48.8
\(RL_{RACES}\)(50 环境) 47.4 34.7 35.7 73.0 60.3 50.2

关键对比:\(RL_{RACES}\)(50 环境)拿到 50.8,超过了 \(RL_{individual}\)(300 环境)的 50.4——只用六分之一的基础环境,效果反而更好。在 DeepSeek-14B 上更夸张,RACES 用 50 个环境拿到 50.2,把 individual 用 300 个环境的 48.8 甩开了 1.4 分。

为什么能这样?道理其实顺着前面的逻辑就通了:一个独立环境只能提供单一变换族的实例,用一次就那样了。但一旦进入组合,同一个环境可以出现在不同位置、配不同邻居、套不同算子——它的"信息产出"被反复榨取。组合把固定的环境池,变成了一个大得多、结构也丰富得多的训练分布。这才是 RACES 相比线性扩张的根本优势:不是去合成更多独立环境,而是把每个已有环境的利用率撬上去。

组合大小不是越大越好

最后一个分析,关于组合大小 \(t\) 这个核心控制变量。论文固定环境池为 300,在 SEQUENTIAL 算子上把组合大小从 2 调到 6:

组合大小 平均分
2 50.8
3 50.7
4 51.0
5 51.2
6 50.7

非单调。从 2 涨到 5,平均分稳步爬到 51.2;再加到 6,反而掉回 50.7。训练曲线也显示,组合越深,奖励越低、奖励方差也越小(意味着对 RL 来说学习信号越不 informative——大家都做不对,advantage 就估不准了)。

论文把这总结成泛化能力和可训练性之间的权衡:组合太小,超出环境本身的扩展有限;组合变大,引入更丰富的多步推理模式、泛化更好;但一旦太深,优化难度反客为主——奖励掉、方差信息少、最终性能恶化。所以组合大小应该当成一个可控的课程学习变量来调,而不是一味往大了堆。

这个结论挺实在的。它没有说"我们的方法在任何配置下都最好",而是诚实地指出了甜区在中等偏大的范围(这里是 5),这种不藏着掖着的态度我喜欢。


🔬 行为层面发生了什么

光看分数还不够,论文还做了定性分析,对比 base 模型、\(RL_{individual}\)\(RL_{RACES}\) 在同样的 AIME 和 Enigmata 题上的解题过程。几个观察挺有说服力:

在 AIME 的 2×2 网格染色题上,base 模型列对了枚举框架但填表时把变量搞混了,\(RL_{individual}\) 在一条内部边的颜色上做了个不一致的更新——两个都是局部小错,却传导到最终答案错了。而 \(RL_{RACES}\) 引入了一个紧凑的函数 \(f(x,y)\),把每对内部边颜色映射到边界赋值数,统一套用,还用独立的分组计算交叉验证总数——用"表示驱动的计数 + 自洽验证"替代了易错的手工填表。

在 Enigmata 的列表变换题上,base 和 individual 都在表层规则里打转,提出的假设明明在早期样例上就失败了却不肯放弃——individual 甚至自己注意到了矛盾,还硬着头皮用那个被证伪的规则继续。而 \(RL_{RACES}\) 维护显式的"索引-值"追踪,拿每个候选规则去对照所有示例,最终找对了规则。

这些行为差异恰好对应四种算子的训练信号:SEQUENTIAL 训状态接力、PARALLEL 训子问题隔离、SORT 训顺序推断、SELECT 训干扰辨别。最终模型学到的是一组可迁移的推理套路——稳定的中间表示、约束保持、假设修正、最终答案验证。这些套路不依赖和训练环境的表面相似性,所以才能泛化到 AIME、代码这些八竿子打不着的任务上。


💡 我的判断

这篇论文我读下来,最值钱的不是那 3.1 分的提升,而是它把"组合闭包"这个抽象的数学性质,干净利落地落地成了一套可执行的环境扩展框架。类型签名匹配 → 自动复合 → 在线可执行过滤 → 算子实例化,这条链路设计得很顺,工程上是真能跑的(VERL + vLLM,32 张 A100,GRPO,clip 0.28,无 KL 正则)。

几个我觉得特别漂亮的点:

一是把"环境能否组合"约化成"类型能否匹配",这个抽象抓得准,让递归组合变得可自动化。二是 SEQUENTIAL 的最长正确前缀奖励、SELECT 的可执行干扰项,这些细节都透着对 RL 训练实际困难的理解——不是拍脑袋设计的。三是那个反直觉的训练动态分析(奖励涨得慢、泛化反而好),直接戳破了"训练奖励 = 泛化能力"的迷思,对做 RL 的人是个很有价值的提醒。

当然也有让我想多问几句的地方。比如初始那 300 个环境的"类型系统"到底有多丰富?组合能拼出多少多样性,根本上受限于基础环境的类型分布——如果类型种类太少,能拼的花样也就那么多,所谓"无界扩展"可能只是理论上的。再比如,这套方法本质上还是在"程序可验证"的任务空间里打转,能不能迁移到那些没法用代码精确判分的开放任务(比如开放问答、创意写作),是个更大的问号。论文没声称能解决这些,这点我倒是认可它的克制。

跟同期工作比,RLVE 那条线证明了"环境数量重要",自动合成那条线(如 SCALER、ReSyn)解决了"怎么造更多环境",而 RACES 解决的是一个被忽略的维度:已有环境的复用率。它和那些方法不是竞争关系,更像是正交的——你完全可以先用合成方法造一批基础环境,再用 RACES 把它们组合起来,两条腿走路。

如果你也在搞可验证环境的 RL,这套组合思路我觉得真值得试试。尤其是组合大小当课程变量调这一点,落地成本不高,但可能直接影响泛化上限。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我