Reinforcement Learning for Code Optimization
本文介绍了 DMC-Optim,这是一个通过校准执行环境、组合正确性与速度奖励以及适配训练算法来克服将强化学习应用于代码优化时存在的不稳定性,从而在保持正确性的同时显著提高生成更快速代码能力的三个阶段框架。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一个这样的世界:计算机就像一群才华横溢但有点笨手笨脚的厨师。它们可以遵循食谱做出完美的菜肴(编写出可以运行的代码),但它们经常绕远路,用一千个微小的步骤去完成原本一个大跨步就能解决的任务。这就是人工智能与代码生成的世界。科学家们通过给予反馈来教这些 AI 厨师烹饪:“如果菜品味道对了,你就得到一颗金星。”这种方法被称为强化学习,它让 AI 非常擅长编写“能跑通”的代码。但问题在于:这些代码运行起来通常很慢,就像一位宁愿亲手切洋葱也不愿使用食物加工机的厨师。现在的核心问题是:我们能否教会 AI 不仅仅是做出这道菜,还要做得“快”?挑战在于,“快”是一个难以捉捕的概念;精确测量一段代码运行到底需要多久是非常具有噪声的,就像在秒表抖动时试图为一场比赛计时一样。如果 AI 对时间的判断出错,它可能会学会为了快而乱做一通,或者因为被噪声干扰而停止学习。
这篇题为《强化学习用于代码优化》的论文讲述了一个故事:一个研究团队如何教会一位 AI 厨师不再亲手切洋葱,而是开始使用食物加工机,且不会烧掉厨房。他们发现,仅仅告诉 AI“要更快”是行不通的,因为时间测量太混乱了。相反,他们构建了一个特殊的、超精确的厨房(一个“校准沙盒”)和一套全新的规则来发放金星。他们发现,通过精心设计测试方式——使用规模更大、更难的问题,从而真正体现出慢速方案与快速方案之间的差异——他们可以教会 AI 编写既正确又显著更快的代码。结果如何?在某些严格的类别中,AI 学会了将复杂问题的解决速度提升了高达 125%,同时仍保证答案正确。这有点像教学生不仅要解出数学题,还要用最少的步骤解题,即使老师手中的秒表有些抖动。
问题所在:“快而不对”的陷阱
想象你正在训练一个机器人参加赛跑。如果你只说“尽可能快地跑”,机器人可能会为了抄近路而破坏赛道,或者因为冲得太猛而绊倒自己。在代码的世界里,当研究人员试图教 AI 变快时,发生的情况正是如此。他们尝试将“速度”加入奖励系统:“如果你的代码能运行且在 1 秒内完成,你会得到高额奖励;如果运行了 10 秒,你会得到较低的奖励。”
但这个简单的想法失败了。为什么?因为测量时间是有噪声的。有时代码运行快仅仅是因为计算机那天状态很好,而不是因为代码写得聪明。有时代码运行慢是因为计算机正在处理其他事情。这种“噪声”让 AI 感到困惑。它开始认为“快”并不重要,或者更糟的是,它学会了编写极其快速但完全错误的程序(就像一个跑错了终点方向的机器人)。论文表明,如果你只是在没有修复测量工具的情况下直接加入时间权重,AI 几乎不会变快,甚至有时会变得连正确性都无法保证。
解决方案:建造一个更好的厨房
研究人员意识到,在 AI 开始学习之前,他们需要先修复三件事:测试、奖励以及训练方法。
1. 测试:从短跑到马拉松
最初给 AI 的测试就像短跑——非常短暂且迅速。在短跑中,微小的延迟(比如一个喷嚏)都会造成巨大的时间差异,导致无法判断跑者是否真的更快。研究人员构建了一套新的测试集,称为 DMC-Optim。这些测试就像马拉松。它们使用巨大的输入量和复杂的题目,运行时间可能长达数秒甚至数分钟。在马拉松中,一个喷嚏无关紧要;你可以清晰地看出谁跑得更快。他们创建了 2,723 个经过清理的问题,并增加了 352,740 个专门设计的“优化测试”,这些测试旨在让过程变慢,以便 AI 能够真正感受到优秀方案与平庸方案之间的区别。
2. 奖励:三阶段闸门
研究人员没有简单地说“越快越好”,而是设计了一个精巧的奖励系统,它就像一个三阶段闸门:
- 第一关(正确性): 代码必须能运行。如果不符合,会受到严厉惩罚(没有金星)。
- 第二关(优化): 如果代码能运行,它是否通过了“速度测试”?AI 会与人类专家排行榜进行对比。如果 AI 进入了人类前 30%,它就会获得奖励。
- 第三关(信号): 奖励不仅仅是一个数字,它是一个清晰的信号。他们使用了“二进制”奖励(就像电灯开关:开或关),而不是调光开关。这可以防止 AI 被微小且带有噪声的时间差异所迷惑。如果代码正确且足够快,灯就会亮起;否则,灯保持熄灭。这种简单的“开/关”信号出奇地有效。
3. 训练:一个稳定的教练
使用带有噪声计时数据的 AI 进行训练,就像用一只抖动的手去训练一只狗。研究人员不得不调整他们的训练算法(称为 GRPO)以使其更加稳定。他们增加了 AI 针对每个问题尝试的次数(比如让狗跑 16 次而不是 1 次),以抵消噪声的影响。他们还通过调整“得分”的计算方式,确保 AI 在失败时不会感到气馁。这使得即使在计时测量有些抖动的情况下,训练依然能保持稳定。
结果:提速而不崩溃
当他们把所有这些部分组合在一起时,结果令人印象深刻。他们在不同的 AI 模型上测试了这种新方法,包括 Qwen 2.5(70 亿和 320 亿参数模型)以及 CWM 32B。
- 巨大的飞跃: 在最难的测试中(即代码必须处于人类速度前 30% 的情况下),CWM 32B 模型的表现从 13.7% 跳升至 30.9%。这是 125% 的相对提升!
- 保持正确: 至关重要的是,AI 并没有为了速度而牺牲准确性。代码“正确”(即便运行较慢)的次数保持不变,甚至略有提高。AI 学会了既快又对。
- 击败基准: 与标准训练方法相比,经过优化训练的模型在 LiveCodeBench 这个不同的基准测试中,进行面对面速度对比时,胜率达到了 83%。
AI 究竟学到了什么?
研究人员不仅看了分数,还观察了代码本身,以查看 AI 学到了哪些技巧。他们使用另一个 AI(作为“裁判”)将新代码与旧代码及人类解决方案进行对比。
- “I/O”技巧: 最常见的改进是 输入/输出优化。AI 学会了更高效地读写数据,就像一位不再浪费时间反复开关冰箱门的厨师。这占据了胜场中的 47%。
- “数学”捷径: 在 6% 的案例中,AI 找到了数学上的捷径,意识到它不需要进行所有的计算。
- “算法”变更: 在 13% 的案例中,AI 实际上改变了解决问题的基本方式(例如从缓慢的暴力破解法切换到智能的高效方法)。这是优化的“圣杯”。
- 击败人类: 虽然人类通常能找到更复杂的改进(在复杂度提升方面,人类赢了 16%,而 AI 仅为 7%),但 AI 确实在 7% 的复杂度提升案例中击败了人类的最佳解决方案。
局限性与未来
论文谨慎地指出,这并非万能灵药。AI 在处理最难的问题时仍然感到吃力,且人类在寻找最复杂的算法变更方面仍然更胜一筹(人类在复杂度提升方面赢了 22%,而 AI 为 13%)。此外,AI 有时会为了追求速度而删减必要的代码部分,这在现实世界的软件开发中可能并不安全。
然而,论文表明这是一个重大的进步。通过构建一个更好的“厨房”(测试和沙盒)并给出更清晰的指令(奖励系统),他们证明了 AI 可以学习编写高效的代码,而不只是编写正确的代码。这为未来奠定了基础:未来的 AI 不仅能编写软件,还能编写运行速度如同人类专家设计般高效的软件。研究人员建议,下一步是向 AI 提供关于“为什么”某个方案很快的更具体的反馈,从而帮助它发现更多复杂的算法技巧。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。