CYCLE:学习自我完善代码生成

目录

  • Intriduction
  • Overview of the Approach

预训练的代码语言模型在代码生成方面取得了可喜的性能,并提高了人类开发人员的编程效率。然而,现有的代码 LM 评估通常忽略了它们的 自我求精能力,这些评估仅关注一次性预测的准确性。对于代码 LM 无法实现正确程序的情况,开发人员实际上发现很难调试和修复错误的预测,因为它不是由开发人员自己编写的。不幸的是,我们的研究表明,代码语言模型也无法有效地自我改进其错误的生成。在本文中,我们提出了 Cycle 框架,学习根据可用的反馈(例如测试套件报告的执行结果)来自我改进错误的生成。我们在三个流行的代码生成基准测试(HumanEval、MBPP 和 APPS)上评估 Cycle。结果表明,Cycle 成功地保持了(有时还提高了)一次性代码生成的质量,同时显着提高了代码 LM 的自我优化能力。我们在 350M、1B、2B 和 3B 上实现了具有不同数量参数的 Cycle 的四种变体,实验表明,Cycle 在基准测试和不同的模型大小上始终如一地提高了代码生成性能高达 63.5%。我们还注意到,Cycle 的性能优于参数多 3 倍的代码自优化LM。

Intriduction

在本文中,我们提出了 Cycle 框架,试图提高代码 LM 在探索模式下的性能。创建 Cycle 的基本原则是认识到,期望代码 LM 在探索模式中表现出色可能要求过高,而在探索模式中,人类的意图往往不明确或没有明确指定。然而,这些模型应该具备根据从其他来源收到的反馈(例如测试套件报告的执行结果)迭代改进代码生成的能力。从本质上讲,Cycle 的目标是使代码语言模型能够根据可用的反馈来调整和增强其输出,从而缩小人类开发人员的探索性编程需求与代码语言模型的能力之间的差距。
探索模式中代码 LM 的局限性。在这项工作中,我们重点关注代码生成的场景,给定问题的自然语言 (NL) 描述(通常包装在文档字符串中),代码 LM 将相应地实现程序。为了方便我们以后的讨论,我们首先具体化我们场景中的加速模式和探索模式。
• 加速模式:给定问题的NL 描述,代码LM 直接相应地预测代码。
• 探索模式:如果加速模式的预测未能通过测试用例并且返回执行反馈,则代码LM 会尝试改进错误代码,而无需进一步的人工指令。

如图1所示,我们提示GPT-3.5[Ouyang et al. 2022] 以及来自 HumanEval 编程基准的问题描述 [Chen 等人。 2021]。 GPT-3.5无法实现加速模式下的功能,其生成的代码未能通过该问题的测试套件。从GPT-3.5的生成过程中我们可以看出,虽然程序很短,只有14行,但对于人类来说并不容易理解。复杂性主要来自于嵌套的 for 循环,使得手动识别和纠正错误变得更加困难。因此,在陈等人的推动下。 [2023],我们尝试将测试套件报告的错误生成和执行反馈作为附加参考与问题描述连接起来,并期望模型在探索模式下自行完善生成的代码。不幸的是,GPT-3.5 无法有效理解执行反馈的指导,只是简单地复制粘贴错误代码作为新的预测。这种探索模式自我完善的弱点在开源代码语言模型中更为严重。我们使用 CodeGen(27 亿个参数)进行类似的实验 [Nijkamp 等人。 2023b] 和 StarCoder(30 亿个参数)[Li 等人。 2023] 关于整个 HumanEval 基准测试,包含 164 个编程问题。我们观察到现有的代码语言模型在探索模式下表现不佳,无法根据执行反馈自我完善错误的代。 CodeGen 在 42.2% 的情况下生成错误代码的精确副本作为其精确预测,而 StarCoder 在 64.8% 的情况下进行复制。探索模式中如此弱的自我完善能力令人担忧,因为它给人类开发人员带来了修复模型生成代码带来的错误的进一步负担。
在这里插入图片描述
我们的方法:在这项工作中,我们认为应该通过利用执行结果的可用反馈,在探索模式中增强代码 LM 的自我优化能力。事实上,使用这种执行反馈训练的模型即使在加速模式下也有可能表现得更好。为此,我们设计了 Cycle,一个框架,通过共同关注三个信息源来教会代码 LM 自我完善(通过继续训练预训练模型):(i)自然语言的高级问题描述,( ii) 模型在之前的尝试中可能生成的错误代码,以及 (iii) 执行反馈。我们开发了一个输入模板,整合了这三个信息源,并利用它们来训练代码 LM。虽然传统的代码语言模型的训练主要依赖于第一个信息源,但包含先前的错误代码有助于模型更全面地掌握自身的错误。执行反馈反过来又指导代码 LM 生成与问题描述精确一致的程序。尽管如此,当我们天真地将之前生成的错误代码包含在输入中时,代码LM通常会采取捷径,本质上是在生成新代码时从错误的输入中进行复制。为了阻止代码 LM 采用此类快捷方式,我们采用了一种掩码技术,称为过去一代掩码 (PGM)。这种策略稍微混淆了过去几代的错误,激励模型探索更广泛的代码优化解决方案。此外,为了在加速和探索模式下代码生成的熟练程度之间取得平衡,我们采用了一种数据混合策略来操纵自我细化功能和通用代码完成功能的比率。为了使用上述策略有效地训练 Code LM,我们必须整理模拟探索模式开发的数据。因此,我们进一步设计了一个训练数据自动生成阶段作为现有的预训练代码数据集 [Kocetkov 等人。 2022 年;尼坎普等人。 2023b;徐等人。 2022]定​​制自我提升训练具有挑战性。我们的数据收集阶段自动提示预训练的代码LM揭示其在代码生成中的优势和劣势,通过执行测试用例进行验证,并构建数据样本以增强其优势,同时完善其劣势。
最后,我们实现了 Cycle 来实现自动化的自我完善工作流程,模仿人类开发人员的迭代编程实践。工作流程首先提示代码语言模型根据高级问题描述初始化实现,然后通过执行不断验证预测的正确性,并汇总综合信息以进一步细化。
我们做出了以下新颖的贡献:
• 我们的工作揭示了代码语言模型在自我改进方面的弱点,揭示了这些模型在理解执行反馈并相应地纠正自己的错误方面并不能有效。
• 为了发挥代码语言模型自我改进的潜力,我们提出了 Cycle,这是一个通过学习改进自己生成的代码来增强代码语言模型生成性能的框架。我们首先提出了一种基于知识蒸馏的数据收集方法来自动构建样本来教导代码语言模型进行自我改进。然后,我们提出了专门为学习自我完善而设计的培训策略。最后,我们实现了一个迭代式自我完善工作流程,可以自动执行探索模式下生成代码的过程。
• 我们对三种流行的代码生成基准测试进行了广泛的实验,其中包括 350M 至 3B 模型参数的四种 Cycle 变体,结果表明 Cycle 持续将代码生成性能提高了 63.5%。 Cycle 还可以匹配甚至超越具有 3 倍参数的基线代码 LM。
• 我们进行深入分析,从多个角度讨论Cycle的设计和性能。最后,我们提出了见解和要点,以激励进一步研究提高代码 LM 的自我改进能力,这有望帮助人类开发人员进行迭代编程,并普遍提高代码 LM 在探索模式下的性能。我们匿名发布我们的代码、数据和模型检查点。代码可以从 https://github.com/ARiSE-Lab/CYCLE_OOPSLA_24 获取。

Overview of the Approach

在本节中,我们简要介绍 Cycle,解释高层设计及其背后的直觉。我们在图 2 中展示了 Cycle 的概述。从高层次来看,Cycle 包含三个阶段。
第一阶段:自我优化的数据准备。训练代码 LM 的细化能力的数据需要精心设计的功能,例如带有代码片段迭代修正的开发日志及其错误暴露反馈循环。这些特征并不自然地与大规模预训练数据集一起出现[Kocetkov 等人。 2022 年;尼坎普等人。 2023b;徐等人。 2022年]。大规模与训练数据集通常会优先考虑数据量,而不提供定制接口。因此,我们提出了一种自动化方法,从预先训练的代码 LM 中提取这些特征,并在它们之上构建数据集。总体思路是向预先训练的代码语言模型提示编程问题,要求它们生成代码来实现所请求的功能。这些问题应该得到明确的定义,并附有测试套件和规范的解决方案,以便可以有效地验证模型的生成。当代码 LM 出错时,我们会收集其错误生成以及测试套件报告的相应执行反馈。然后我们相应地构建数据样本,这些样本可以用来教导代码语言模型通过参考执行反馈和伴随编程挑战的规范解决方案来纠正自己的错误。
在这里插入图片描述

使用正确的代码微调代码 LM:代码 LM 使用多达数万亿个代码标记进行预训练,但预训练数据中继承的噪声可能会触发意外的预测 [Li 等人,2017]。 2022] 甚至是易受攻击的代码 [He and Vechev 2023]。我们在构建自我优化样本时应该避免这些恶意行为。意外的预测可能会揭示随机错误,并且在执行后无法获得有意义的反馈。并且,当易受攻击的代码生成时,可能会给执行系统带来安全威胁。因此,我们建议首先在正确的代码上微调预训练的代码语言模型,以最大限度地减少模型的恶意行为。具体来说,我们收集了大量的编程挑战,并附有规范的解决方案,并且我们对预先训练的代码 LM 进行微调,以根据问题描述来预测这些保证正确的程序。

提示codeLM 提炼出弱点 :通过对规范解决方案的微调,我们期望模型做出与正确代码相差不远的错误预测。我们通过问题描述提示微调模型,然后使用随附的测试套件执行其预测。带有错误消息的执行结果暴露了模型在代码生成方面的优点和缺点,这些结果被收集并保存为资源以构建训练样本以学习细化。

第二阶段:学习优化错误生成:利用第一阶段准备的数据,我们构建了训练样本,以基于三种类型的信息来进行代码优化学习。具体来说,我们使用我们提出的模板聚合问题描述、代码 LM 生成的错误代码以及相应的执行结果,以制定模型输入,使模型能够同时共同处理综合信息。然后我们使用随附的规范解作为模型预测的目标。与第一阶段的微调不同,第一阶段的微调仅教会模型实现自然语言描述的功能,此阶段的代码优化训练将提供模型自身的错误和执行反馈以及问题描述,这迫使模型既要推理其过去的生成与问题描述之间的不一致,又要学会理解执行结果中的隐含指导。我们精心设计了我们的训练策略,以有效且高效地学习代码优化。

第三阶段:作为迭代编程的自我完善:在了解了第二阶段的代码优化之后,我们部署模型根据问题描述自动生成代码,并类似于人类开发人员的迭代编程实践,迭代优化代码以实现所需的功能。当问题描述被输入到模型中时,模型将首先生成最佳的代码,并且生成将自动与测试套件一起执行。如果检测到失败的测试用例,我们的框架将使用第二阶段提出的模板自动聚合描述、错误代码和执行反馈。最后,聚合的信息将再次输入到模型中进行自我完善。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/314029.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手拉手安装Kafka2.13发送和消费消息

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft,两种方式只能选择其中一种启动,不能同时使用。 Kafka下载https://downloads.apache.org/kafka/3.7.0/kafka_2.…

Java——抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式。都需要重点掌握。同时又要认清两者的区别(重要!!! 常见面试题)。 核心区别:抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写),而接口中不能包含普通方法…

了解时间复杂度和空间复杂度

在学习数据结构前,我们需要了解时间复杂度和空间复杂度的概念,这能够帮助我们了解数据结构。 算法效率分为时间效率和空间效率 时间复杂度 一个算法的复杂度与其执行的次数成正比。算法中执行基础操作的次数,为算法的时间复杂度。 我们采…

C语言--基础面试真题

1、局部变量和静态变量的区别 普通局部变量和静态局部变量区别 存储位置: 普通局部变量存储在栈上 静态局部变量存储在静态存储区 生命周期: 当函数执行完毕时,普通局部变量会被销毁 静态局部变量的生命周期则是整个程序运行期间&#…

Linux查看僵尸进程

1、查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程。 2、定位僵尸进程 使用命令ps -A -ostat,ppid,pid,cmd |grep -e ‘^[Zz]’定位僵尸进程以及该僵尸进程的父进程。 3、杀死僵尸进程 使用Kill -…

【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套…

修复vite中使用react提示Fast refresh only works when a file only exports components.

前言 我通过 vite 构建了一个 react 应用并使用 react.lazy 来懒加载组件,但是在使用过程中 一直提示 Fast refresh only works when a file only exports components. Move your component(s) to a separate file.eslint(react-refresh/only-export-components)。…

【Redis】Redis 非关系型数据库 安装、配置、使用(全集)

目录 Redis 第一章 1、什么是redis 2、安装redis 1-7 8 3、redis使用 第二章 1、redis的使用 1、使用方式 2、使用Java代码使用redis 3、优化连接redis 2、五种数据类型 常用命令 string hash list set zset 不同数据类型存、取、遍历的方法 3、redis在项目…

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

【C++杂货铺】多态

目录 🌈前言🌈 📁多态的概念 📁 多态的定义及实现 📂 多态的构成条件 📂 虚函数 📂 虚函数重写 📂 C11 override 和 final 📂 重载,覆盖(重写…

java-springmvc 01

springmvc也是在spring framework中的,不是一个单独的项目 MVC就是和Tomcat有关。 01.MVC启动的第一步,启动Tomcat(这个和springboot的run方法启动Tomcat有关) 02.SpringMVC中,最为核心的就是DispatcherServlet&…

Git基本操作命令

1、新建代码库 # 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url] 2、配置 # 显示当前的Git配置$ git config --list# 编辑Git配置文件$ git config -e […

2023 年全国网络安全行业职业技能大赛电子数据取证分析师总决赛wp

第一部分:电子数据提取与固定 任务 1:检材 1.rar 上的任务 检材是一个手机备份,请通过技术手段提取以下信息。 1.提取名称为“陈伦国”的联系人的手机号码,以此作为flag 提交。(答案格式如:13012345678) (2 分) 13800620796 …

【MATLAB源码-第199期】基于MATLAB的深度学习(CNN)数字、模拟调制识别仿真,输出识别率。

操作环境: MATLAB 2022a 1、算法描述 基于深度学习的调制识别系统利用复杂的数学模型和算法来识别和分类从不同来源接收到的无线信号的调制类型。这种技术的应用广泛,特别是在无线通信、电子战、频谱监测和认知无线电等领域中具有重要价值。调制识别系…

python基础——正则表达式

📝前言: 这篇文章主要想讲解一下python中的正则表达式: 1,什么是正则表达式 2,re模块三匹配 3,元字符匹配 4,具体示例 🎬个人简介:努力学习ing 📋个人专栏&am…

02.Scala简单演示

Scala创建对象的方法与Java有所不同 class可以直接传入形参; 形式为 变量名称:变量类型 逗号隔开 ** ** 方法定义也比较特殊 ** ** def方法名():返回值 { } 其中返回值Unit 等价于Java中的void

【Golang】Gin教学-获取请求信息并返回

安装Gin初始化Gin处理所有HTTP请求获取请求的URL和Method获取请求参数根据Content-Type判断请求数据类型处理JSON数据处理表单数据处理文件返回JSON响应启动服务完整代码测试 Gin是一个用Go(又称Golang)编写的HTTP Web框架,它具有高性能和简洁…

可视化+多人协同技术原理和案例分享

前言 hi,大家好,我是徐小夕,之前和大家分享了很多可视化低代码的技术实践,最近也做了一款非常有意思的文档搭建引擎——Nocode/Doc: 也做了一些分享: Nocode/Doc,可视化 零代码打造下一代文件编…

Web3钱包开发获取测试币-Polygon Mumbai(一)

Web3钱包开发获取测试币-Polygon Mumbai(一) 由于主网区块链上的智能合约需要真正的代币,而部署和使用需要花费真金白银,因此测试网络为 Web3 开发人员提供了一个测试环境,用于部署和测试他们的智能合约,以识别和修复在将智能合约…

大数据第七天

文章目录 吐槽一下这个是怎么需要真的这么大吗? 内核错误内核软死锁(soft lockup)我这个cpu很高吗?大模型都说了不超过80就行了 FinBi安装FinBI下载链接安装时间比较长 吐槽一下 dbeaver 查询hive 数据信息是真的慢,没有一点快的方式&…