想象你有一位才华横溢但缺乏经验的学徒程序员。这位学徒(即大型语言模型)能够写出外观出色且符合语法规则的代码,但当你实际运行这些代码时,它们往往会崩溃、行为异常,或无法完成你要求的功能。
本文介绍了一种训练这位学徒的新方法,称为强化学习,但有一个特定的转折:他们不再等到项目完全结束时才说“做得好”或“失败”,而是对学徒采取的每一步都提供持续、详细的反馈。
以下是他们系统工作原理的分解,使用简单的类比:
1. 问题:“全有或全无”的评分
传统上,在教人工智能编程时,系统会等到整个程序编写完成。然后,它运行代码。
- 如果代码能运行:人工智能获得一颗金星。
- 如果代码崩溃:人工智能得到一个大大的“不及格”。
问题在于,人工智能不知道它失败的原因。是它在第一行犯了错?还是最后一行?或者整个想法都是错的?这就像一名学生写了一篇 10 页的论文,提交后只收到一个没有评语的“不及格”。他们不知道应该修改哪一段。
2. 解决方案:“密集奖励”教练
作者创建了一个框架,就像一位严格但乐于助人的教练站在学徒身旁,看着他们打字。教练不再在结束时给出一个总分,而是对学徒输入的**每一个单词(token)**都给出评分。
这被称为密集奖励系统。以下是教练在每一步检查的内容:
- 语法检查(语法警察):句子结构是否正确?(例如:你是否忘记了一个冒号或括号?)
- 风格与安全检查(代码检查员):代码是否杂乱?是否存在安全漏洞?(他们使用名为"Ruff"的工具来检查这一点。)
- “如果”检查(模拟器):如果这是一个机器人,这个动作会导致它撞墙吗?系统会模拟代码,看看它在物理上是否可行。
- “不要偏离”检查:教练确保学徒不会过度偏离其原始的训练风格,保持其稳定性。
3. 学习如何发生(循环)
该论文描述了一个反复进行的三步循环:
- ** rollout(练习运行)**:人工智能一次生成一个单词的代码。
- 评估(记分卡):一旦代码完成,系统就会通过上述所有检查来运行它。它会计算整段代码的“分数”,但也会找出哪些具体单词导致了高分或低分。
- 类比:如果代码因为第 5 行的一个拼写错误而失败,系统会知道要重罚第 5 行,而不是第 1 行。
- 优化(课程):人工智能利用这些分数来更新其“大脑”。它学会了:“哦,当我在这个上下文中输入这个特定单词时,会导致崩溃。下次,我会选择不同的单词。”
4. 结果:从“损坏”到“可用”
作者在两种截然不同的任务上测试了这种方法:
- 通用编程(办公室工作):他们要求人工智能编写标准的 Python 程序。
- 结果:人工智能正确完成任务的比例从约 46% 提高到了65%。它学会了编写真正能运行并能处理棘手边缘情况的代码。
- 机器人编程(体力工作):他们要求人工智能编写代码,让机器人移动并执行任务。
- 结果:在训练之前,机器人的代码几乎总是在开始移动之前就崩溃了(失败率高达 96%)。训练后,机器人能够成功执行任务,成功率达到了51%。代码变得“环境感知”,意味着机器人学会了不要尝试穿墙或举起过重的物体。
核心要点
该论文证明,通过在编程过程的每一步给予人工智能持续、详细的反馈,而不仅仅是一个最终评分,你可以教会它编写不仅语法正确,而且安全、功能完备且准备好应对现实世界的代码。
他们不仅让人工智能变得更聪明;他们让它变得更加谨慎,并意识到其行动的后果,无论这些行动是在计算机上运行,还是在移动实体机器人。
技术摘要:面向代码生成的可领域自适应强化学习与稠密奖励
问题陈述
大型语言模型(LLMs)在自动化代码生成方面展现出巨大潜力,但往往缺乏关于正确性、质量、安全性以及遵守特定领域约束的保证。虽然基于可验证奖励的强化学习(RLVR)已成为利用执行反馈优化代码生成的方法,但当前的实现严重依赖稀疏的序列级奖励。在这些标准方法中,最终代码序列中的错误会导致整个序列受到惩罚,无法提供关于哪些具体 token 导致失败的细粒度反馈。此外,现有方法往往难以融入特定领域的约束,例如机器人技术中所需的物理安全和环境感知能力,其中代码不仅需要编译通过,还必须在硬件上安全运行。
方法论
作者提出了一种基于近端策略优化(PPO)的统一微调框架,通过稠密的 token 级奖励归因机制解决奖励稀疏性问题。该框架在一个包含三个阶段的迭代循环中运行:
- ** rollout 阶段**:策略模型(πθ)逐 token 生成代码。在生成过程中,logits 处理器(Syncode)评估每个 token 的语法正确性,提供即时反馈。
- 评估阶段:一旦序列完成,通过聚合多个组件计算综合奖励:
- 语法正确性(Rsync):标记违反语言语法的 token。
- 代码风格与漏洞(Rlint):使用 Ruff linter 检测错误和安全问题。
- 分布正则化(RKL):惩罚与参考模型的偏差,以防止策略发生灾难性漂移。
- 任务特定奖励(Ropti):可定制的信号,包括单元测试通过率、数据流图(DFG)匹配以及模拟器反馈(例如用于机器人技术的 RoboSim)。
- 价值模型(Vϕ)估算预期奖励以计算优势值。
- 优化阶段:利用计算出的优势和复合奖励更新策略模型和价值模型。
关键创新:稠密 Token 级归因
与仅在序列结束(EOS)处分配奖励的标准 PPO 实现(例如 trl)不同,该框架将稀疏的序列级信号转换为稠密的 token 级信号。
- 对于能够进行精确归因的奖励(例如 linter 检查、语法错误),违规情况被映射回具体的负责 token。
- 对于难以进行精确归因的奖励(例如单元测试结果),奖励或惩罚均匀分配给生成的代码 token,而非代码 token 则不接收任何信号。
这在每个时间步创建了一个连续的反馈信号(Rt),实现了细粒度的信用分配。
主要贡献
- 统一 PPO 框架:一种微调架构,将语法约束、静态分析、执行结果和模拟器反馈整合到单一的奖励循环中。
- 稠密 Token 级奖励归因:一种将稀疏序列级反馈转换为局部训练信号的机制,使模型能够学习代码的哪些具体部分导致了成功或失败。
- 领域适应性:展示了该框架在两个不同领域(通用 Python 编程和机器人程序合成)中的有效性,表明紧凑模型在正确性和可执行性方面均能取得显著提升。
实验结果
该框架在通用代码生成的 MBPP/MBPP+ 基准测试和机器人任务的 ROBOEVAL 基准测试上进行了评估,使用的是 Qwen2.5-Coder-1.5B 模型。
- 通用代码生成:
- 在 MBPP 上,RL 优化后的模型达到了 0.653 的 pass@1,相比基线模型(0.460)绝对提升了 +19.3%。
- 在 MBPP+ 上,模型从 0.413 提升至 0.556(+14.3%),表明对边缘案例的鲁棒性增强。
- 机器人程序合成:
- 基线模型在 80 个任务中有 77 个未能生成可执行代码(主要是 Python 级错误),在模拟器中成功执行次数为 0。
- 经过 RL 微调后,Python 级错误降至 11 个,14 个任务被成功解决。
- 这代表了 51% 的执行失败率降低,将输出从大量不可执行的代码转变为具有环境感知能力的可执行程序。
- 值得注意的是,经过微调的 1.5B 模型表现出的相对性能增益显著大于应用于更大 7B 模型的 ROBO-INSTRUCT 方法,缩小了紧凑模型与大型模型之间的差距。
意义与主张
该论文声称,结构化的强化学习,特别是当辅以稠密的、感知执行的奖励时,是一种实用且可扩展的方法,用于将 LLM 与程序正确性及特定领域需求对齐。
作者强调,他们的方法超越了表面的模式匹配,促进了结构连贯且语义一致的程序生成。通过将多层级反馈直接整合到优化循环中,该框架实现了向功能正确性和可执行机器人行为的迭代对齐。结果表明,即使紧凑的语言模型也能在正确性和可执行性方面取得实质性改进,而无需承担基于蒸馏方法的计算开销或稀疏奖励信号的限制。
该研究得出结论,虽然未来研究需要解决奖励中的长度偏差并探索更广泛的基于执行的机制,但所提出的方法有效地弥合了通用代码生成与机器人等特定领域所需的严格安全和物理约束之间的差距。
每周获取最佳 machine learning 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。