副标题:使用 LLM 和代码生成合成数据 + The ARChitects + TRM
我们解决方案的主要组件:
我们的整体工作流程可以通过这张图片概括。我们将在本文的其余部分回顾每个部分。
我们构建了一个包含 4 个主要阶段的合成数据生成 (SDG) 管道:
大部分生成数据是使用 gpt-oss-120b 模型并通过 NeMo-Skills 框架制作的。该框架为 LLM 开发提供了许多工具,包括在 Slurm 集群上的大规模 SDG 管道。您可以在此处找到有关如何使用此框架进行 SDG 的更多信息。在具有 8xH100 GPU 的单个节点上运行此模型可为我们提供 15k tokens/s 的生成吞吐量。
我们从两个主要来源收集谜题描述。首先,我们发现了 H-ARC,它在 ARC 社区中被意外地低估了。该数据集包含超过 1700 名人类对 ARC 问题的解决方案尝试,但更重要的是它包括自然语言解决方案描述。其次,我们从 BARC 获取了 160 个人类编写的描述。经过过滤和组合这些描述后,我们拥有了 ARC-AGI-2 中 716 个训练谜题的描述。
我们提示 LLM 连接两个谜题摘要,并通过结合两者的元素生成一个新的更复杂的谜题。总共,我们生成了 266,593 个新的谜题摘要。
我们没有生成具有输入/输出逻辑的完整谜题程序,而是决定将其分为两个阶段。第一阶段 - 生成输入网格逻辑的 Python 程序,第二阶段 - 生成输出网格逻辑的程序,即转换规则。为了生成可靠且良好的输入网格逻辑,我们提示 LLM 为输入网格生成额外的单元测试。总共,我们生成并过滤了 126,901 个 Python 代码形式的输入网格程序。
我们使用谜题描述和相应的输入网格程序提示 LLM 生成相关的输出网格程序。在这里我们应用了不同的验证策略。我们没有使用单元测试验证 Python 代码,而是针对每个输入网格逻辑多次提示 LLM,并过滤掉不一致的解决方案。过滤后,我们得到了 103,253 个谜题,其中每个谜题有 1 个输入网格程序和多个输出网格程序,但所有这些输出程序都产生一致的输出网格。
对于这种方法,我们尝试使用尽可能多的谜题。除了我们的合成数据外,我们还使用了一些真实的谜题数据集。我们的最终数据集包括 320 万个增强样本,其中每个样本最多有 7 个输入/输出对。
| 来源 | 独特谜题数 | 每个谜题的增强样本数 | 总样本数 | 占比 |
|---|---|---|---|---|
| MINI-ARC | 147 | 256 | 37632 | 1.2 |
| ConceptARC | 160 | 256 | 40960 | 1.3 |
| RE-ARC | 400 | 256 | 102392 | 3.2 |
| ARC-AGI-2 | 609 | 256 | 155904 | 4.8 |
| NVARC training | 47337 | 24 | 1132633 | 34.8 |
| NVARC full | 55886 | 32 | 1785960 | 54.9 |
| 104539 | 3255481 |
ARC-AGI-2 训练子集排除了 RE-ARC 谜题。NVARC 训练子集仅基于 ARC-AGI-2 的训练谜题。NVARC 完整子集使用 ARC-AGI-2 的训练和评估谜题。
ARChitects 方法将谜题简单表示为输入/输出网格列表。但我们使其更简单,使用了来自 Qwen3 模型的对话风格模板。例如,格式化消息表示 1 对输入/输出网格如下所示:
<|im_start|>user\n123\n456<|im_end|>
<|im_start|>assistant\n78\n90<|im_end|>
这种更简单的表示只需要 16 个 token:10 个用于数字,1 个用于换行,"user" 表示输入网格开始,"assistant" 表示输出网格开始,2 个特殊 token(<|im_start|>, <|im_end|>)和 1 个用于填充的 <|endoftext|>。我们在后训练阶段使用了 NeMo RL 框架。我们使用 Megatron 后端运行监督微调,这使我们能够有效地利用具有 H100 GPU 的多个节点的内存和计算资源。例如,要对 4B 模型进行全量微调,我们使用了 4 个节点(每个节点 8xH100)耗时 27 小时。
我们对每个谜题独立使用 LoRA 测试时微调,r = 256 且 alpha = 32。我们移除了梯度检查点,也移除了 4-bit 量化。测试时微调以 bfloat16 精度运行。我们还使用了 Unsloth 框架的 Flash Attention 2。您可以在我们的源代码中找到所有超参数。
我们在 ARChitects 方法中所做的主要优化是在解码阶段。我们实现了深度优先搜索 (DFS) 算法的批处理版本。然而,批处理实现有一个副作用。它变得非确定性。这种现象在 Thinking Machines Lab 的博客中有很好的解释。我们使用了 Thinking Machines Lab 的开源解决方案,并成功使推理批处理不变。然而,尽管精度更高,本地验证分数更好,但这个版本在 Kaggle 环境中运行时间长得多。大约慢 17%,我们在最终提交中没有使用它。
ARChitects 方法使用额外的增强功能来重新评分 DFS 阶段的候选者。我们在这里做了一个小改动。我们对每个候选解决方案只使用 8 个增强,但我们对每个候选解决方案使用完全相同的增强。这使得不同解决方案的分数更具可比性。在竞赛截止日期后,我们测试了不同的重新评分策略,并找到了选择正确候选者的更好方法。我们计算候选解决方案在 DFS 阶段被找到的次数,并使用来自不同增强的对数概率的几何平均集成进行调整。
在竞赛期间,我们在不同部分的合成数据上微调了模型。在图中您可以看到在预训练阶段添加更多数据对损失函数的影响。本地验证损失是在 120 个评估谜题的增强版本上测量的,我们看到了与公共排行榜的良好相关性。我们的最佳模型在竞赛期间得分 27.64%。
在竞赛的最后 10 天左右,我们探索了使用 Alexia Jolicoeur-Martineau 的微型递归模型 (TRM)。
在最后第二天,我们设法获得了一个将 TRM 与 Qwen3 2B 模型集成的工作提交。我们缺乏时间来调整集成和 TRM 模型本身,但我们很高兴能够测试这个想法。我们使用了几次晚期提交来完成集成测试并报告这些结果。在这些晚期提交中,我们只使用了在竞赛期间预训练的模型。
使用该代码,ARC Prize 组织通过将其适配为在 4 个节点(每个节点 8 H100 GPU)上运行,获得了 6.9% 的分数。在 Kaggle 上使用那么多计算资源是不可能的。更糟糕的是,鉴于我们必须将其余时间用于 ARChitects 方法,我们只能为 TRM 使用大约 2 小时。因此,我们必须使用不同的方法。我们首先预训练 TRM 模型,然后在提交期间使用测试数据微调 TRM 模型。
使用 3072 的批大小而不是 768,以及 3e-4 的学习率而不是 1e-4,我们可以在 8xH100 上花费 24 小时将 TRM 训练到与原始代码相同的准确度。在提交中使用此方法仅产生 2.08% 的分数。
随后我们调整了各种参数,以便在 Kaggle 上最多使用 2 小时运行时间的情况下获得最佳分数。我们最终确定了这些参数:4 个 H 周期而不是默认的 3 个,10 个最大停止步骤而不是 16 个。我们使用了 2000 个 epoch 和仅 200 个预热步骤。这使得 TRM 在 Kaggle 上运行约 2 小时。
为了评估 TRM 模型的强度,我们训练了它两次。我们使用 4k 谜题训练它并用于提交。我们还训练了它,但移除了竞赛评估数据集。然后我们在评估数据上对后者进行评分。随后我们查看了 pass@2 最佳检查点使用了多少训练步骤。我们最终选择了在所有 4k 样本上训练且训练步骤数最接近的检查点。未在评估数据上训练的模型在评估上的最佳 pass@2 为 9.44%。当提交匹配的检查点(使用评估数据训练)时,得分为 7.5%。这比我们之前的 2.08% 要好得多。
在竞赛截止日期后,我们提交了使用 4k epochs 而不是 2k 的最佳 TRM。它在不到 4 小时内产生了 10.0% 的分数。
为了将 TRM 与 ARChitects 方法一起使用,我们修改了 TRM,使其每个谜题生成 10 次尝试而不是 2 次。然后将这些尝试添加到 ARChitects 过程生成的尝试中。然后像其他尝试一样由 Qwen3 模型对这些尝试进行评分。
这运作良好但结果不一。大多数由 TRM 解决的谜题也由 Qwen3 解决,因此 TRM 在那里没有增加什么。然而,大约有 2 或 3 个由 TRM 解决的谜题未被 Qwen3 解决。不幸的是,这些并不总是被 Qwen3 评分选中。
通过两次晚期提交,我们发现可以将使用 Qwen3 2B 获得的 21.53 分提高到使用 TRM 集成的 22.50 分。我们还看到,当使用仅使用 10 小时、得分为 27.22 的 Qwen3 4B 提交时,添加 TRM 会产生相同的 27.22 分。
虽然我们认为这里有改进的潜力,但集成 Qwen3 4B 模型和 TRM 模型需要比我们能够执行的更多的调查和实验。
我们介绍了如何改进 The ARChitects 和 TRM 模型,以便在 ARC Prize 2025 竞赛的公共排行榜上获得最佳分数。在评估阶段资源有限的情况下,我们需要一种好方法来压缩学到的知识和技能。通过良好的合成谜题扩展预训练阶段是在这次 Kaggle 竞赛中取得成功的正确方向。但我们也相信,这种带有 Python 程序和推理轨迹的合成数据可用于其他研究方向。