分享自:

使用综合语义推理训练代码语言模型:SemCoder

期刊:38th Conference on Neural Information Processing Systems (NeurIPS 2024)

论文题目:SemCoder: Training Code Language Models with Comprehensive Semantics Reasoning 作者: Yangruibo Ding, Jinjun Peng, Marcus J. Min, Gail Kaiser, Junfeng Yang, Baishakhi Ray 机构: 哥伦比亚大学 发表信息: 第38届神经信息处理系统会议(NeurIPS 2024)

摘要 代码大语言模型(Code LLMs)在代码补全等任务上表现出色,但常常无法理解代码的深层语义,如执行效果和动态状态。本文旨在弥合代码大语言模型依赖静态文本数据与复杂任务(如调试和程序修复)需要语义理解之间的鸿沟。我们引入了一种名为 独白式推理(Monologue Reasoning) 的新策略,来训练代码大语言模型推理综合的语义,包括高层功能描述、单个语句的局部执行效果以及整体输入/输出行为,从而将静态代码文本与动态执行状态联系起来。我们首先收集了 PyX,这是一个干净的可执行Python代码样本集合,包含功能描述和测试用例。我们不仅训练模型写代码,还通过让其用自然语言推理关键属性、约束和执行行为来理解代码语义,模仿人类的口头调试(即“橡皮鸭调试”)。这一方法催生了 SemCoder 的开发,这是一个仅拥有 6.7B 参数的代码大语言模型,在代码生成和执行推理任务上展现出与 GPT-3.5-Turbo 相当的竞争力。SemCoder 在 HumanEval 上达到 79.3%(GPT-3.5-Turbo: 76.8%),在 CruxEval-I 上达到 63.6%(GPT-3.5-Turbo: 50.3%),在 CruxEval-O 上达到 63.9%(GPT-3.5-Turbo: 59.0%)。我们还研究了 SemCoder 的独白式执行推理相比具体的草稿纸推理(Scratchpad Reasoning)的有效性,表明我们的方法能更平滑地整合多维度语义。最后,我们展示了将学习到的语义应用于提升代码大语言模型的调试和自我优化能力的潜力。我们的数据、代码和模型已开源。


研究背景与动机

本研究属于人工智能领域,具体为编程语言与软件工程(Program Synthesis and Software Engineering)与自然语言处理(Natural Language Processing)的交叉方向,聚焦于提升代码大语言模型的语义理解能力。近年来,基于海量代码文本训练的代码大语言模型在代码生成任务上取得了革命性进展。然而,这些模型主要依赖静态文本数据,缺乏对程序实际执行行为的深层理解,即程序语义(Program Semantics)。这种缺陷导致模型在需要推理代码动态行为的任务上表现不佳,例如调试、错误修复和复杂逻辑理解。现有模型即使暴露了执行轨迹(Execution Traces),也难以有效利用这些动态信息进行调试。五十年前,Terry Winograd 曾设想未来的 AI 程序员应“理解自己在做什么”。本研究正是致力于构建这样一个由语言模型支持、不仅能写程序也能理解程序语义的编程系统。核心洞见在于,代码大语言模型应模仿务实的开发者工作流程:从总体规范开始,分解为具有预期属性和约束的子任务,逐行实现代码的同时推理每行效果,并通过检查执行效果来验证整体正确性。为实现此目标,本研究引入了一种训练代码大语言模型进行综合程序语义推理的新策略。

研究流程与方法

本研究主要包含三个关键且相互关联的环节:构建语义感知数据集 PyX设计并实现独白式推理训练方法训练并评估 SemCoder 模型

1. 构建高质量语义感知数据集:PyX 为了全面捕获程序语义,研究需要包含可执行代码、功能描述、测试用例及执行轨迹的数据。由于现实世界数据集存在配置多样、缺乏单元测试和文档有限等问题,研究采用合成数据的方法。 * 合成可执行代码: 受 OSS-Instruct 等方法启发,研究利用强大的大语言模型(如 GPT-3.5-Turbo)来合成自然语言到代码的配对。为确保数据质量,研究进行了关键改进: * 种子可解析化: 从现有程序中解析出抽象语法树(AST),并采样子树作为可解析的种子代码片段,而非随机采样代码行,提高了生成代码的结构合理性。 * 执行验证与重试: 对模型生成的代码执行实际运行,仅保留成功执行的样本。利用生成模型自身的调试能力,在代码运行出错时进行重试,直至成功。 * 通过 Python 解释器的低成本监督,最终构建了一个包含 32,489 个自然语言-代码对的高质量指令调优数据集,所有样本均可执行。 * 扩展数据集以包含操作语义: 从 PyX 中筛选出一部分程序(排除与外部资源交互和具有随机性的程序),通过类型感知突变和大语言模型生成相结合的方式,为每个程序生成多样化的输入集,从而暴露不同的执行轨迹,为操作语义学习提供数据。 * 构建调试数据集:PyX-R: 为进一步训练模型的调试和自我优化能力,研究构建了 PyX-R 数据集。具体方法是从 PyX 中的问题出发,采样大语言模型生成有错误的代码解决方案(至少无法通过一个测试),然后通过大语言模型进行拒绝采样,收集针对错误代码的“橡皮鸭调试”原理说明(Rationale)以及能够生成正确补丁的修复计划。所有调试原理均通过差分测试进行验证,确保能导向正确的修复。PyX-R 包含 18,473 个调试样本。

2. 设计并实现“独白式推理”训练范式 这是本研究的核心创新。为了让模型全面理解代码语义,研究提出了 “独白式推理” 。其核心思想是让模型模仿开发者“自言自语”地解释代码,从而在内部建立从高层抽象到低层细节、从静态视角到动态视角的综合理解。给定源代码和可执行的输入/输出(不提供原始问题描述),模型需要按顺序生成以下内容: * 高层功能总结: 理解程序的近似语义(Approximate Semantics)。 * 抽象语义解释: 阐述对任何输入都成立的关键属性与约束,即抽象语义(Abstract Semantics)。 * 操作语义描述: 针对给定的具体输入/输出,详细阐述执行过程中的状态变化,即操作语义(Operational Semantics)。这部分又细分为两个方向: * 前向独白: 给定源代码和输入,模型以自然语言逐步模拟执行过程,解释每行代码的影响、被执行的行、变量变化,并最终预测输出。 * 后向独白: 给定源代码和最终输出,模型抽象地推理出可能的前置状态和输入。这对于处理排序、聚合等无法唯一确定前状态的复杂操作至关重要。 独白式推理的优势在于:1) 用自然语言平滑描述状态转移,聚焦于与问题相关的关键属性而非冗余的具体值;2) 更易于模型学习和理解;3) 提供人类可读的解释。 * 独白数据标注: 利用大语言模型(GPT-4o-mini)通过拒绝采样自动生成独白内容。对于前向独白,执行生成的代码,仅当模型预测的输出与实际输出一致时才接受该独白;后向独白采用类似策略。通过少量示例和系统指令引导模型遵循预定的推理步骤。最终,研究为 PyX 样本生成了 29,945 个前向独白和 31,022 个后向独白。

3. 训练与评估 SemCoder 模型 * 模型训练: 以 DeepSeekCoder 6.7B 模型为初始检查点,使用 PyX 中的自然语言-代码样本、前向独白和后向独白数据进行联合训练,采用标准的下一个词元预测目标。训练强调学习程序语义,损失仅累积在代码和独白词元上。输入中包含任务特定前缀,以告知模型当前样本需要捕获和预测哪种类型的语义。研究训练了两个版本: * SemCoder-base: 完全使用 PyX 数据集训练。 * SemCoder-S: 使用扩展数据集训练,包括 PyX、Evol-Instruct 和部分 CodeContest 数据,以增加编码问题的多样性。 * 实验设计与评估: * 评估任务与基准: * 代码生成: 使用 HumanEval 和 MBPP 的 EvalPlus 版本,以及 LiveCodeBench-Lite。 * 执行推理: 使用 CruxEval(输入预测 I 和输出预测 O)和 LiveCodeBench 的代码执行任务。 * 调试与自我优化: 模拟自我优化设置,让模型生成代码、测试、通过独白调试错误原因,并基于分析结果迭代优化代码(最多 5 轮),在 EvalPlus 上进行评估。 * 对比模型: 包括多个开源模型(CodeLlama, StarCoder2, DeepSeekCoder, Magicoder 的 6.7B/7B/13B/15B 变体)和闭源模型 GPT-3.5-Turbo。 * 消融研究: 为了验证独白式推理的有效性,研究将其与几种基线推理格式进行对比,包括 Scratchpad、NExT 的追踪格式以及简化的追踪模板,通过在相同 PyX 样本上构造不同格式的推理数据对基础模型进行微调,并比较在 CruxEval 上的表现。

主要研究结果

1. 整体性能表现卓越 尽管参数仅 6.7B,SemCoder 在多项任务上超越了更大的开源模型,甚至与 GPT-3.5-Turbo 相比也表现出色或相当。 * 代码生成: SemCoder-S 在 HumanEval(基础版)上达到 79.3% 的 Pass@1,超越 GPT-3.5-Turbo 的 76.8%;在 MBPP(基础版)上达到 79.9%,领先所有开源基线。 * 执行推理: 这是 SemCoder 优势最显著的领域。在 CruxEval-I(输入预测)、CruxEval-O(输出预测)和 LiveCodeBench 代码执行任务上,SemCoder 变体分别达到 63.6%、63.9%、61.2%,均显著超过 GPT-3.5-Turbo 和所有开源基线模型。例如,相比于其初始检查点 DeepSeekCoder-6.7B,SemCoder 在输入预测上带来了 23.0% 的绝对提升,在输出预测任务上也有超过 20% 的绝对提升。 * 结果逻辑关系: 这些结果强有力地支持了研究的核心假设——通过训练模型全面理解程序语义,可以产生更可靠、更准确的编程助手。卓越的执行推理能力是其出色代码生成和后续调试能力的基础。

2. 独白式推理的有效性验证 消融实验结果(表2)清晰表明,独白式推理在输入/输出预测任务上优于所有其他基线推理格式。 * 对比学习具体程序状态: 使用 Scratchpad、NExT 格式或简化的追踪模板进行微调的模型,其性能提升有限。而独白式推理带来了最显著的性能飞跃。分析认为,独白式推理以自然语言平滑描述状态转移,同时只追踪关键属性和值,这种格式更易于代码大语言模型学习和理解。相比之下,基线方法仅提供带有冗余信息和值的具体状态,且不解释这些状态转移之间的因果关系,导致模型难以捕获其间的关联。 * 一个有趣的发现是: 尽管在人工检查中发现独白中的中间推理逻辑偶尔存在缺陷(例如,对代码属性做出了错误假设但仍得出了正确结果),而基线方法(真实的执行轨迹)保证中间步骤完全正确,但模型从独白中学习的效果反而更好。这凸显了在联合训练代码大语言模型学习不同语义时,强调关键属性正确性和模型友好的数据格式具有潜在优势。

3. 调试与自我优化能力突出 * 零样本性能: 在零样本提示下,SemCoder-S 在 HumanEval 和 MBPP 的自我优化任务中均超过了所有基线模型,表明其通过独白式推理获得的语义理解能力有效地增强了通用指令调优。 * 微调提升: 在 PyX-R 数据集上进行微调后,大多数基线模型的迭代编程能力得到了显著提升。SemCoder 变体提升有限,研究者推测这可能是由于其本身已具备高质量的推理能力,而 PyX-R 中偶尔存在的错误调试原理反而限制了进一步提升。 * 独白推理 vs. 真实执行轨迹: 额外实验表明,在调试理由中用真实执行轨迹替换独白推理部分,其最终效果与使用独白推理相当。这证明了独白式静态推理的有效性。同时,独白推理具有设计上的独特优势:纯静态、无需动态追踪;通过聚焦于与错误相关的关键属性来压缩推理内容;提供人类可读的解释。

结论与意义

本研究成功开发了 SemCoder,一个语义感知的代码大语言模型,旨在增强对程序语义的理解和推理。核心贡献在于提出了 “独白式推理” 这一创新的代码推理方法,通过详细的语言描述将静态源代码与其运行时行为联系起来。为了在不同层次上暴露全面的程序语义,研究精心构建了 PyX,一个包含功能描述和执行轨迹的可执行代码样本集合。

SemCoder 在代码生成和执行推理任务上均表现出卓越性能,超越了参数量更大的开源模型。更重要的是,它通过利用语义感知训练中获得的知识,在调试和自我优化任务上也表现出色。这项工作凸显了将深度语义理解整合到代码大语言模型中,以提升其在复杂编程任务中有效性的巨大潜力。

研究亮点与创新

  1. 核心方法创新——独白式推理: 这是本研究的首要亮点。它创造性地将人类开发者的“橡皮鸭调试”思维过程形式化,并用于训练代码大语言模型,使模型能够以一种连贯、自然的方式整合高层意图、抽象约束和低层执行细节的推理。
  2. 高质量数据集构建——PyX 与 PyX-R: 研究不仅构建了一个全可执行的高质量代码生成数据集,还进一步扩展出包含操作语义和专门用于调试的数据集。数据构建过程中的“执行验证与重试”机制和“拒绝采样”确保了数据的高可靠性和对齐性。
  3. “小模型,大性能”: SemCoder 仅凭 6.7B 参数,就在多项基准测试中达到了与 175B 参数的 GPT-3.5-Turbo 相当甚至更优的水平,尤其是在执行推理这一需要深层理解的 task 上表现突出,证明了语义导向训练的高效性。
  4. 系统性的评估与消融分析: 研究不仅进行了全面的性能对比,还通过严谨的消融实验深入分析了独白式推理相比其他方法(如 Scratchpad, NExT)为何更有效,为未来研究提供了宝贵的 insights。
  5. 打通生成、推理与调试: 研究展示了通过统一的语义理解训练,可以同时提升模型在代码生成、执行预测、调试和自我优化等多个任务上的能力,为实现更全面、更智能的编程助手迈出了重要一步。

其他有价值内容

论文在附录中详细讨论了局限性及未来工作,例如:当前独白中的中间推理步骤可能存在过程监督不足的问题;标注依赖更强大的大语言模型;未来可以探索让模型利用自身的执行推理能力(如生成前向独白自验证)来直接辅助代码生成等。这些讨论为后续研究指明了方向。

资源开放: 作者承诺开源所有数据、代码和模型,这对推动社区在该方向的研究具有重要意义。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com