Skip to content
汉松札记
Go back

不需要人类教练的o3:OpenAI用强化学习训练出编程"六边形战士"

技术笔记

TLDR

OpenAI在最近的发表的对比研究中发现:在编程竞赛任务中,人类精心设计的策略败给了强化学习训练的通用模型。论文名称:《Competitive Programming with Large Reasoning Models》。

在o1出现之前,在Codeforces编程竞赛AI是没有一席之地,GPT-4o排名垫底,只超过11%的人。在o1诞生之后,AI直接就从吊车尾杀到了头等舱,超过了89%的参赛选手。

image

OpenAI当然不会止步于此,他们给o1传授了人类的解题策略:先进行问题分解,然后大规模生成解法,最后对解法筛选和排序。于是o1升级成o1-ioi,变成了一个竞赛特种兵,成功超过了98%的选手。

image

o1-ioi的庆功宴还没结束,o3就横空出世了。它不像o1-ioi需要依赖人类的辅助,是完全依赖RL训练的通用模型。结果却轻松超过了o1-ioi的成绩,排名前99.8%。o3甚至自己发明了一种更强的策略:先实现一个暴力解法,然后在用它来验证优化后的方案。

image

从o1-ioi到o3,我们可以发现与其让模型依赖人类“精雕细琢”的策略,不如让它在强化学习中“自主进化”。从人类自己的成长过程也是这样,很多问题都没有一招鲜吃遍天的解法,我们就是在不断的碰壁中才能找到正确的答案。

‍这篇论文对AI从业者提供了一个重要的洞见:模型能力是第一位(o3>o1-ioi),但在模型能力达到一定的水平之前(o3),专家策略也是有效的(o1-ioi>o1)。

最后我有个问题很好奇:那就是o3-ioi会超过o3吗?论文中并没有做这个实验对比,算是一个小小的遗憾吧。

论文译文

摘要

我们证明了将强化学习应用于大型语言模型(LLMs)能显著提升其在复杂编程和推理任务上的表现。此外,我们比较了两个通用推理模型——OpenAI o1 和 o3 的早期检查点——与一个领域特定系统 o1-ioi,后者使用专门为 2024 年国际信息学奥林匹克竞赛(IOI)设计的人工推理策略。我们使用 o1-ioi 参加了 2024 年 IOI 现场比赛,通过使用人工制定的测试时策略,获得了第 49 百分位的成绩。在放宽比赛限制的情况下,o1-ioi 获得了金牌。然而,在评估更新的模型(如 o3)时,我们发现 o3 无需人工制定的领域特定策略或放宽限制就能获得金牌。我们的发现表明,尽管像 o1-ioi 这样的专门化流程能带来显著改进,但规模更大的通用 o3 模型无需依赖人工制定的推理启发式就能超越这些结果。值得注意的是,o3 在 2024 年 IOI 获得金牌,并在 CodeForces 上获得与顶尖人类选手相当的评分。总的来说,这些结果表明,扩展通用强化学习,而不是依赖领域特定技术,为在推理领域(如竞争性编程)实现最先进的 AI 提供了一条可靠的路径。

1 介绍

显著提升了 AI 模型的推理能力。与 o1-ioi 或 AlphaCode 不同,o3 不依赖于由人类定义的特定于编程的测试时策略。相反,我们发现复杂的测试时推理策略自然地从端到端强化学习中涌现,从而在竞争性编程基准测试上实现了前所未有的性能。

本报告提供了一个关于推理在编程任务(如竞争性编程)中的重要性的高层次概述,介绍了 OpenAI 大型推理模型在编程能力方面的进展,以及我们在各种竞争性编程和编程基准测试上的评估方法和结果。竞争性编程被广泛认为是评估推理和编程能力的一个具有挑战性的基准测试 [2]。解决复杂的算法问题需要高级的计算思维和问题解决能力。此外,这些问题还可以进行客观评分,使其成为评估 AI 系统推理能力的理想测试平台。

最近关于使用大型语言模型进行程序生成的研究 [1] 表明,即使是相对通用的模型(参数规模从 2.44 亿到 1370 亿不等)也能够根据自然语言指令生成简短的 Python 脚本。值得注意的是,性能随着模型规模的增加呈对数线性提升,而微调可以显著提高准确性。同时,Codex [2](一个早期以代码为重点的 LLM)在 Python 程序生成方面表现出色,并为 GitHub Copilot 提供了支持。进一步的进展来自 AlphaCode [7],它通过大规模代码生成和推理中的启发式方法解决了竞争性编程任务;随后发布的 AlphaCode2 [6] 进一步改进了 AlphaCode,将其解决问题的数量几乎翻倍,并使其在 CodeForces 平台上进入了第 85 百分位。两个 AlphaCode 系统都使用了大规模采样,每个问题最多生成一百万个候选解决方案,然后通过人工设计的测试时策略选择其中的前 10 个提交。

自那以后,人们在利用强化学习提升大型语言模型推理能力方面取得了显著进展。这促使大型推理模型(LRMs)的出现:通过强化学习训练的语言模型能够“推理”和“思考”复杂的思维链条。特别是,OpenAI 的 o1 [4, 12] 及其即将发布的继任者 o3 [13] 使用思维链推理来解决复杂任务,例如数学和编程。DeepSeek-R1 [3] 和 Kimi k1.5 [15] 的研究独立表明,学习思维链能够提升数学和编程挑战的表现。

一个悬而未决的问题是,领域特定的人工设计推理策略与模型自主生成和执行的学习方法相比表现如何。我们有三个系统可以揭示这一问题:o1、o1-ioi 和 o3 的早期检查点。OpenAI o1 是第一个大型推理模型,它使用通用方法来提升编程性能。在此基础上,o1-ioi 是一个经过微调的系统,专门用于参加 2024 年国际信息学奥林匹克竞赛(IOI),并使用了类似于 AlphaCode 系统的测试时策略。这种专门化在 2024 年 IOI 和 CodeForces 等竞争性编程平台上带来了显著的性能提升。随后的进展推动了 o3 的开发。

2 OpenAI o1

我们从 OpenAI o1 开始,这是一个通过强化学习训练的大型语言模型,用于解决复杂的推理任务。在回答问题之前,o1 会生成一个扩展的内部思维链 [16],类似于一个人逐步、有条不紊地解决一个具有挑战性的问题。强化学习优化了这一思维链过程,帮助模型识别并纠正错误,将复杂任务分解为可管理的部分,并在某种方法失败时探索替代的解决路径。这些上下文推理能力显著提升了 o1 在广泛任务上的整体表现。

此外,OpenAI o1 被训练使用外部工具 [14],尤其是在安全环境中编写和执行代码的能力。这一功能使得 o1 能够验证其生成的代码是否可以编译、通过提供的测试用例并满足其他正确性检查。通过测试和改进其输出,o1 在单个样本的过程中能够迭代地优化其解决方案。

CodeForces 是一个编程竞赛网站,举办实时竞赛,具有国际竞争性,并吸引了世界上一些最优秀的竞赛程序员。为了评估我们模型的竞赛编程能力,我们模拟了 CodeForces 的竞赛,并尽可能接近真实竞赛条件。这包括为每个问题使用完整的测试集,并对解决方案施加适当的时间和内存限制。

我们的评估重点是 2024 年和 2023 年 12 月的 Division 1 竞赛,确保所有测试竞赛都发生在预训练和强化学习的数据截止时间之后。此外,我们还进行了污染检查作为合理性验证,利用 OpenAI embedding API 来确认测试问题在训练期间未被见过。

image

我们将 o1 与一个非推理型 LLM(gpt-4o)以及一个较早的推理模型(o1-preview)进行了比较。图 1 显示了 o1-preview 和 o1 如何显著优于 gpt-4o,突显了强化学习在复杂推理中的有效性。o1-preview 模型在 CodeForces 上达到了 1258 的评分(第 62 百分位),相比之下,gpt-4o 的评分仅为 808(第 11 百分位)。进一步的训练将 o1 的评分提升到了 1673(第 89 百分位),为 AI 在竞赛编程中的表现树立了新的里程碑。

3 OpenAI o1-ioi

在开发和评估 OpenAI o1 的过程中,我们发现增加强化学习(RL)计算量和测试时推理计算量都能持续提升模型的性能。

image

如图 2 所示,扩展 RL 训练和延长测试时推理显著提高了性能,这突显了优化这两个计算维度的重要性,以推动性能超越传统大型语言模型(LLM)预训练的水平。

基于这些见解,我们创建了 o1-ioi 系统,用于参加 2024 年国际信息学奥林匹克竞赛(IOI)。除了针对编程任务进行持续的 RL 训练外,o1-ioi 还融入了为竞赛编程设计的专门测试时推理策略。

3.1 Coding RL Fine-tuning

我们的第一步是扩展 OpenAI o1 的强化学习阶段,重点关注编程任务。通过将额外的训练计算资源投入到编程问题上,我们增强了模型在规划、实现和调试更复杂解决方案方面的能力。具体来说:

  1. 我们从 OpenAI o1 的检查点恢复了强化学习训练。
  2. 我们特别强调了具有挑战性的编程问题,帮助模型改进 C++ 代码生成和运行时检查能力。
  3. 我们引导模型生成符合 IOI 提交格式的输出。

这一针对编程的额外关注使 o1-ioi 能够在推理过程中编写和执行 C++ 程序。通过迭代运行和优化解决方案,模型改进了其推理能力,从而加强了其编程和问题解决技能。

3.2 o1-ioi Test-time Strategy

从高层次来看,我们将每个 IOI 问题分解为其组成的子任务,为每个子任务从 o1-ioi 中采样了 10,000 个解决方案,然后采用基于聚类和重新排序的方法来决定从这些解决方案中提交哪些方案。

问题表述 对于 o1-ioi,我们选择分别尝试解决每个问题的各个子任务,因为 IOI 的评分是基于每个子任务逐一进行的,并且会为每位参赛者在每个子任务上所有尝试中取得的最高分数进行计分。为此,我们将每个 IOI 问题划分为其组成的子任务(根据每个问题评分指南中的划分)。具体做法是为每个子任务创建一个版本的文档,并移除与其他子任务相关的信息。

聚类 我们根据模型生成的测试输入的输出对生成的解决方案进行聚类。对于每个子任务,我们首先提示模型根据问题描述和子任务用 C++ 编写随机测试输入生成器。然后,我们使用这些生成器生成 256 个随机测试输入。为了确保这些测试输入的有效性,我们进一步提示模型用 C++ 编写测试输入验证器,以检查给定的测试输入是否满足子任务的约束。最终,我们接受至少通过 75% 验证器的测试输入。对于每个子任务,我们生成了 256 个这样的随机测试用例输入,并根据这些测试用例的输出进行聚类。任何在所有测试输入上的输出一致的程序都会被归入同一个聚类。

重新排序 接下来,我们实施了测试时计算策略的核心重新排序步骤。我们根据以下标准为每个解决方案打分:

每个聚类的得分被定义为其包含的样本的平均得分减去每次从该聚类提交样本时的惩罚分。这些惩罚权重通过对往年 IOI 问题的解决方案进行随机搜索调整,并直接模拟提交过程进行优化。

提交 我们随后以轮转方式为每个子任务提交最多 50 个(人类参赛者允许的最大数量)解决方案,从最难的子任务开始。对于每个子任务,我们选择排名最高的聚类中的排名最高的解决方案。当一个子任务被解决(即达到最高分)时,我们停止对此子任务的采样。当提交任何属于已解决子任务严格超集的子任务的解决方案时,我们会过滤掉任何未能在已解决子任务的测试输入上匹配输出的解决方案,从而快速缩小更难子任务的候选解决方案范围,排除那些几乎肯定会在较简单子任务上失败的解决方案。

3.1CodeForces 基准测试

我们再次模拟 CodeForces 比赛来评估 o1-ioi 的编程能力,尽可能接近真实竞赛条件,包括为每个问题使用完整的测试集,并施加适当的时间和内存限制。

图 3 显示,o1-ioi 达到了 1807 的 CodeForces 评分,超过了 93% 的参赛者,表明针对编程任务的额外 RL 训练带来了明显的改进。当我们应用一个简单的过滤器来拒绝任何未通过公开测试的解决方案时,评分上升到 2092(第 96 百分位)。我们完整的测试时策略进一步提升了性能,达到了 2214 的评分(第 98 百分位)。这些结果证实了领域特定的 RL 微调与高级选择启发式方法相结合,可以显著提高竞赛编程的表现。

3.4 IOI 2024 现场比赛

o1-ioi 系统在与人类参赛者相同的条件下参加了 2024 年国际信息学奥林匹克竞赛(IOI)。系统有 10 小时的时间来解决 6 个具有挑战性的算法问题,并允许每个问题最多提交 50 次。我们在 图 4 中展示了结果。 在比赛期间,我们的系统为每个问题生成了 10,000 个候选解决方案,并使用我们的测试时选择策略选择了 50 个提交方案。该策略根据解决方案在 IOI 公开测试用例、模型生成的测试用例以及一个学习得来的评分函数上的表现来优先选择提交方案。模型获得了 213 分,排名比赛的第 49 百分位。

image

相比之下,随机选择 50 次提交的平均得分仅为 156 分,这表明在比赛限制条件下,选择策略贡献了近 60 分的额外得分。

当每个问题的提交限制放宽到 10,000 次时,模型的表现显著提升。在未使用任何测试时选择策略的情况下,模型取得了 362.14 分,超越了金牌门槛,展示了模型的潜力。我们在附录 C 中展示了获得 362.14 分的示例。

4.1CodeForces 基准测试

我们在 CodeForces 基准测试集上评估了 o3 模型的早期检查点,其中每个提示包括问题描述、约束条件以及任何可用的示例测试用例。

image

如图 5 所示,进一步的强化学习训练相比 o1 和完整的 o1-ioi 系统带来了显著的提升。尤其是从 o1-ioi 模型到 o3 的过渡,使评分从 2214(第 98 百分位)提升到 2724(第 99.8 百分位),反映了在竞赛编程性能上的巨大飞跃。这一改进展示了 o3 能够更可靠地解决更广泛的复杂算法问题,将其能力推向 CodeForces 上顶级人类选手的水平。

除了显著提高的问题解决能力外,我们还观察到 o3 展现出更有洞察力且更深思熟虑的思维链条。模型不仅编写并执行代码以验证其解决方案是否通过公开测试用例,还基于这些验证优化其方法。图 6 展示了 o3 发现的一种高级测试时策略:对于验证较为复杂的问题,o3 通常会编写简单的暴力解决方案——以效率换取正确性——然后将输出与其更优化的算法实现进行交叉检查。这种自发的验证机制使 o3 能够捕捉潜在错误并提高解决方案的可靠性。

4.2 IOI 2024 基准测试

虽然我们在 IOI 2024 中使用的是 o1-ioi,但我们事后在相同的 IOI 2024 六个问题上评估了一个 o3 的检查点,以比较在相同条件下的性能。与 o1-ioi 一样,我们严格遵守 IOI 官方规则,每个问题最多允许提交 50 次。

o3 在 IOI 2024 上的结果由一个比 CodeForces 结果中使用的版本更晚的 o3 检查点生成,并包含了更新的训练数据。IOI 2024 发生在该模型的训练截止日期之后,我们还通过搜索确认 IOI 测试问题未被训练集污染。

采样方法 与 o1-ioi 不同,o1-ioi 为每个子任务单独采样解决方案,而在评估 o3 时,我们采用了不同的方法:从包含原始问题的单一提示中进行采样。

image

此外,虽然 o1-ioi 为每个子任务生成了 10,000 个解决方案,但对于 o3,我们仅为每个问题采样了 1,000 个解决方案。

两种模型的选择策略也有所不同。o1-ioi 依赖于复杂且由人类定义的测试时策略(见 3.2)来选择解决方案,而 o3 采用了一种更为简单的方法。具体来说,我们从每个问题的 1,024 个样本中选择测试时计算量最高的前 50 个解决方案。尽管方法更为精简,但 o3 依然能够生成稳健的解决方案,覆盖许多(甚至可能是所有)子任务——无需子任务特定的提示、手动划分或复杂的提交策略。

image

结果 图 7 展示了最终得分。IOI 的评分系统基于子任务,总分为 600 分(2024 年竞赛)。金牌门槛约为 360 分。主要结果包括:

这些结果表明,o3 在不依赖 IOI 特定的手工设计测试时策略的情况下优于 o1-ioi。相反,在 o3 训练过程中涌现出的复杂测试时技术(例如生成暴力解法以验证输出)成为了更为充分的替代方案,并且消除了 o1-ioi 所需的手工设计的聚类和选择流程的需求。

总体而言,IOI 2024 的结果证实,仅凭大规模强化学习训练即可实现最先进的编程和推理性能。通过独立学习生成、评估和优化解决方案,o3 超越了 o1-ioi,无需依赖领域特定的启发式方法或基于聚类的策略。

5 软件工程评估

我们展示了推理能力如何显著提升大型语言模型(LLM)在竞赛编程中的表现,解决复杂的算法挑战需要深度的逻辑思维。然而,我们还希望评估推理能力对实际编码任务的影响。为此,我们在两个数据集上测试了我们的模型:HackerRank Astra 数据集和 SWE-Bench Verified 数据集 [5, 11]。

5.1 HackerRank Astra

HackerRank Astra 数据集由 65 个面向项目的编码挑战组成,每个挑战旨在模拟实际的软件开发任务。这些挑战涵盖了多种框架,包括 React.js、Django 和 Node.js,提供了构建功能和应用程序的实践机会。

该数据集的独特之处在于它聚焦于评估模型在复杂、多文件、长上下文场景中的问题解决能力,这些场景反映了实际的开发环境。与典型的竞赛编程数据集不同,HackerRank Astra 不提供公开测试用例,这使我们无法依赖手工设计的测试时策略。通过该数据集的评估,可以揭示推理能力是否仅在算法问题解决中有效,还是也能扩展到更实际、更贴近行业的编码任务中。

图 8 展示了性能指标,例如 pass@1(首次尝试成功完成任务的概率)和平均得分(通过的测试用例比例的平均值)。结果表明,链式推理显著提升了性能,其中 o1-preview 模型相比 GPT-4o 在 pass@1 上提升了 9.98%,平均得分提升了 6.03 分。通过强化学习的进一步微调,o1 的表现得到增强,达到了 63.92% 的 pass@1 和 75.80% 的平均得分——相比 o1-preview,pass@1 提升了 3.03%。这些指标表明,o1 的推理能力和适应性得到了增强,使其能够有效应对复杂且贴近行业的软件开发任务。

image

5.2 SWE-Bench Verified

SWE-Bench Verified 是 OpenAI 准备团队对 SWE-Bench 的一个经过人工验证的子集,用于更可靠地评估 AI 模型解决实际软件问题的能力。这个经过验证的 500 个任务子集修复了 SWE-Bench 中的一些问题,例如对正确解决方案的错误评分、不明确的问题描述以及过于具体的单元测试。这有助于确保基准测试能够准确地评估模型的能力。

为了展示在此软件任务上的表现,我们展示了 o1 系统卡片 [4] 中的结果,以及一个早期 o3 检查点的结果 [13]。由于 o1-preview 未经过训练以使用代码执行或文件编辑工具,因此在初始实现时使用了当时表现最好的开源框架 Agentless。与 IOI 不同,SWE-Bench Verified 中未使用任何专门的测试时策略。所有模型均有 5 次尝试生成候选修复补丁。如果模型在 5 次尝试后仍未成功完成任务,则视为一次失败的尝试。所有评估均取 3 次试验的平均值。对于系统故障(如容器挂起或评分失败),我们不对模型进行惩罚,并重复这些运行,直到记录下有效尝试。

image

如图 9 所示,o1-preview 在 SWE-bench 上的表现相比 gpt-4o 提升了 8.1%,展现了推理能力的显著进步。通过在训练中应用额外的强化学习计算资源,o1 的性能进一步提升了 8.6%。值得注意的是,o3 使用比 o1 显著更多的计算资源进行训练,其表现相比 o1 提升了惊人的 22.8%。这些结果表明,增强的推理能力不仅限于竞赛编程挑战,还证明了其在软件工程等实际任务中的适用性。

结论

通过 o 系列大型推理模型,我们证明了链式思维推理是一种提升编码任务性能的强大策略,从 CodeForces 和 IOI 等竞赛编程基准测试到 SWE-bench 和 Astra 等复杂的软件工程挑战。我们的研究发现,增加强化学习训练计算量,并结合增强的测试时计算能力,可以持续提升模型性能,接近全球顶尖人类水平。基于这些结果,我们相信 o 系列大型推理模型将在科学、编程、数学以及许多其他领域为 AI 解锁更多新的应用场景。


订阅 技术笔记

RSS 邮件订阅待配置
Share this post on:

Previous Post
AutoGLM 技术探秘:让 AI 学会“点点点”的挑战与策略
Next Post
深入浅出GraphRag[2]检索生成