SheepNav
新上线今天0 投票

RLPF:用性能反馈强化代码生成,让AI不仅写对更要写快

在代码生成领域,大多数训练信号只关注正确性,而忽略了性能。两个程序可能通过相同的测试,但运行时间却天差地别。对于系统级代码,效率至关重要。然而,将运行时间作为奖励信号面临挑战:它只在程序正确时才有意义,且因任务而异,当大多数样本无法编译或运行时,它几乎无法提供指导。

针对这一问题,研究者提出了RLPF(Reinforcement Learning from Performance Feedback),一种从性能反馈中进行强化学习的方法。RLPF 将执行结果转化为分阶段奖励:对于失败的程序,按其执行进度排序;对于正确的程序,则根据其相对于基线和专家参考的改进程度进行排名。这样,在程序正确之前就能提供有用的反馈,在正确之后则提供性能敏感的反馈。

通过在 PerfCodeBench 上使用 RLPF 对 Qwen3-32B 进行微调,正确且可运行的解决方案从 11.1% 提升到 54.6%,相对效率从 8.1% 提升到 38.6%。训练后的模型与更强的开源模型相比具有竞争力,其优化行为也能适度迁移到 EffiBench-X。

进一步的研究表明,模型生成的参考提供了有用但较弱的监督,而完整的复合奖励比仅正确性或仅运行时间的基线更可靠。这些结果表明,代码智能体不仅可以被训练通过测试,还可以优化它们编写的程序。

背景与挑战

当前代码模型的训练通常只关注生成代码的正确性,即能否通过测试用例。然而,在系统编程中,性能往往与正确性同等重要。例如,一个排序算法可能正确但效率极低,而另一个则高效。传统方法忽略了这一点,导致生成的代码虽然正确但运行缓慢。

直接使用运行时间作为奖励信号存在几个问题:

  • 脆弱性:运行时间只有在程序正确时才有意义,对于错误的程序,运行时间可能毫无价值。
  • 任务差异性:不同任务的运行时间基准不同,难以统一比较。
  • 稀疏性:当大部分样本无法编译或运行时,运行时间奖励无法提供有效的梯度。

RLPF 的核心机制

RLPF 通过将执行结果分解为分阶段奖励来解决上述问题:

  1. 对于失败的程序:根据执行进度排序,例如,编译失败的样本比运行时崩溃的样本得分更低,运行时崩溃的样本又比输出错误的样本得分更低。这样,即使在程序不正确的情况下,也能提供有意义的反馈,引导模型逐步接近正确。

  2. 对于正确的程序:根据其相对于基线(如模型初始生成的平均性能)和专家参考(如人工编写的高效实现)的改进程度进行排名。这鼓励模型不仅生成正确的代码,还要生成更高效的代码。

实验结果

在 PerfCodeBench 基准上,使用 RLPF 微调 Qwen3-32B 模型,取得了显著效果:

  • 正确且可运行的解决方案从 11.1% 提升至 54.6%,提升近 5 倍。
  • 相对效率从 8.1% 提升至 38.6%,表明生成的代码在性能上也有大幅改善。

训练后的模型与更强的开源模型(如 Qwen3-72B)相比具有竞争力,同时其优化行为也能迁移到其他基准(EffiBench-X),显示出一定的泛化能力。

分析与展望

该研究的意义在于,它打破了代码生成训练中“只求正确”的局限,将性能优化纳入训练目标。通过分阶段奖励,RLPF 既能处理早期探索阶段的稀疏反馈,又能在后期精细化性能。

然而,研究也指出,模型生成的参考虽然有用,但监督强度不如专家参考。此外,复合奖励比单一正确性或运行时间奖励更可靠,说明两者需要结合。

未来,这一方法有望应用于更广泛的代码优化场景,如编译器优化、算法设计等,让 AI 不仅能够编写正确的代码,还能编写高效的代码。

延伸阅读

  1. 递归Transformer在半导体热机械可靠性预测中的硬件感知评估
  2. 多模态持续学习中的模态贡献漂移正则化
  3. DoTime:面向干预与反事实时间序列的合成基准生成器
查看原文