【自然语言处理】【大模型】CodeGen:一个用于多轮程序合成的代码大语言模型

news2024/10/7 14:30:34
CodeGen:一个用于多轮程序合成的代码大语言模型
《Code Gen: An Open Large Language Model For Code with Multi-Turn Program Synthesis》

论文地址:https://arxiv.org/pdf/2203.13474.pdf?trk=public_post_comment-text

相关博客
【自然语言处理】【大模型】CodeGen:一个用于多轮程序合成的代码大语言模型
【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型
【自然语言处理】【大模型】LaMDA:用于对话应用程序的语言模型
【自然语言处理】【大模型】DeepMind的大模型Gopher
【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型
【自然语言处理】【大模型】大语言模型BLOOM推理工具测试
【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型
【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍
【自然语言处理】【大模型】BLOOM:一个176B参数且可开放获取的多语言模型
【自然语言处理】【大模型】PaLM:基于Pathways的大语言模型
【自然语言处理】【chatGPT系列】大语言模型可以自我改进
【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器
【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?

一、简介

在这里插入图片描述

​ 程序合成(program synthesis)的目标是自动化编程过程,从而生成能够满足用户意图的计算机程序。程序合成面临两个关键的挑战:(1) 搜索空间难以处理;(2) 难以确定用户意图。为了解决搜索空间的问题,本文将程序合成任务形式化为语言建模过程,即基于前面的tokens预测下一个token的条件概率分布。

程序合成需要理解用户的意图。用户通常通过逻辑表达式、伪代码、输入-输出示例、或者自然语言表达意图。逻辑表达式伪代码通常需要用户具有相关领域知识,成本比较高。输入-输出示例的代价更低一些,但可能没办法准确传递用户意图。因此,作者认为自然语言表达用户意图的最好形式。

​ 本文提出了多轮程序合成方法,用户通过自然语言来逐步与合成系统进行沟通。采用多轮的方式有两个动机:

  1. 将长且复杂的用户意图分解为多个步骤,简化模型理解,从而增强程序合成。在多轮的方法中,模型可以专注在与子程序相关的意图上,避免费力的跟踪子程序之间复杂的依赖关系。
  2. 通常,代码会存在自然语言与编程语言交错的弱模式。这种模式就是通过程序员为代码添加注释形成的。使用语言建模的目标函数,这种交错模式可以为多轮程序合成提供弱监督信号。这种信号通常是有噪音且比较弱的,因此仅有部分数据有这种模式且注释可能不正确或者信息量不足。扩大模型和数据的规模可能会克服这种弱监督的不足。

​ 本文还提出了一个多轮程序合成基准来衡量模型的多轮程序合成能力。针对该基准中的问题,模型需要多个步骤来合成程序,每个步骤都需要用户使用自然语言来指定意图。上图展示了一个从邮件地址抽取用户名的合成过程。

​ 本文采用语言模型进行程序合成的基础想法。此外,还有4方面的贡献:

  • 研究了自回归模型在scaling law下多轮程序合成的涌现;
  • 利用这个能力引入了多轮程序合成范式;
  • 利用一个新颖的多轮编程基准来定量研究其性质;
  • 开源了模型的checkpoints以及自定义的训练库JAXFORMER

​ 对于程序合成,没有开源的大模型能够与Codex竞争。这阻碍了进步,考虑到训练这些模型需要的昂贵计算资源,仅有少量的机构可以使用。本文的开源贡献允许广大的研究者学习和改进这些模型,这极大的促进了研究的进步。

二、模型训练

​ 模型采用标准的基于transformer的自回归语言模型,仅对模型参数量和训练语料的token数量进行改变动

1. 数据集

​ CodeGen模型族会在三个数据集上顺序训练:THEPILEBIGQUERYBIGPYTHON

THEPILE是一个用于语言建模的825.18GB英文数据集。该数据集是基于22个高质量子集构造的,其中一个是从GitHub上收集的编程语言数据,占整个数据集的7.6%。基于该数据集训练的模型称为自然语言CodeGen模型(CodeGen-NL)。

​ 多语言数据集BIGQUERY是Google公开数据集BigQuery的子集,其是由多种编程语言构成的。选择6种编程语言C、C++、Go、Java、JavaScript和Python进行多语言训练。称在BIGQUERY上训练的模型为多语言CodeGen模型(CodeGen-Multi)。

​ 单语言数据集BIGPYTHON包含了大量python的数据。该数据集中包含了至2021年10月的公开、可获取且非个人的python代码。称在BIGPYTHON上训练的模型为单语言CodeGen模型(CodeGen-Mono)。

​ 数据预处理:(1) 过滤;(2) 去重;(3) tokenization;(4) shuffling;(5) 拼接。

2. 模型

​ CodeGen使用自回归形式的transformer在自然语言和编程语言数据集上进行训练。模型尺寸包括:350M、2.7B、6.1B和16.1B。前3种尺寸允许直接与开源的大语言模型进行比较,GPT-NEO(350M,2.7B)和GPT-J(6B)。

​ CodeGen在数据集上按顺序训练。CodeGen-NL在THEPILE上第一个训练;CodeGen-Multi使用CodeGen-NL进行初始化,并在BIGQUERY上训练;CodeGen-Mono使用CodeGen-Multi进行初始化,并在BIGPYTHON上训练。

​ 基于自然语言描述为条件的程序合成能力涌现,可能来源于模型和数据的尺寸、训练目标函数和训练数据本身。之所以称为"涌现",是因为没有在"注释-代码对"数据上进行训练。在自然语言任务上也观察到类似的现象,大规模无监督语言模型可以通过zero-shot的方式来解决未见过的任务。

三、单轮评估

​ 现有程序合成基准 HumanEval包含164个手写Python编程问题。每个问题都会提供一段自然语言的prompt以及函数的签名和示例测试用例。模型需要根据prompt来补全函数,且该函数需要通过所有的测试用例。因为用户的意图被指定在单个prompt内并一次性提供给模型,将HumanEval看作是单论评估,以区别于后续的多轮评估。

1. HumanEval的效果是模型尺寸和数据尺寸的函数

在这里插入图片描述

​ 比较在HumanEval上的SOTA方案。此外,还比较了开源大语言模型GPT-NEO、GPT-J。这些大模型都是在THEPILE上训练的,因此类似于CodeGen-NL模型。

​ 结果如上表1所示。CodeGen-NL模型优于或者相当于GPT-NEO和GPT-J模型。GodeGen-Multi大幅度超越了GPT-NEO、GPT-J和CodeGen-NL。在纯Python数据集上的微调模型CodeGen-Mono,程序合成能力显著改善。

2. 更好的用户意图理解可以产生更好的合成程序

在这里插入图片描述

​ 成功的程序合成系统高度的依赖于其是否很好的理解了用户意图。因为系统是基于语言模型的,prompt的困惑度可以作为系统对用户意图理解的一种代理。一个用户意图在模型下具有低困惑度,则用户描述的意图与模型预训练数据学习到的知识相兼容。

​ 具体来说,将所有的问题划分为passnon-pass。pass问题表示,200个样本中至少有一个样本通过了所有的测试用例;non-pass则是200个样本中没有样本能通过所有的测试用例。基于CodeGen-Mono模型,计算所有pass问题的平均困惑度,以及no-pass问题的困惑度。如上表2所示,pass问题要比non-pass问题具有更低的困惑度。这意味着,当用户的意图被模型更好的理解后,程序合成的效果会更好。

四、多轮评估

​ 本小节提出并研究了多轮程序合成范式。程序合成被分解为多个步骤,合成系统在每个步骤中完成子程序的合成。为了测试这种范式,开发了新基准Multi-Turn Programming Benchmark(MTPB)。MTPB包含115个问题,每个问题包含多步骤自然语言描述。

1. 基准构造

​ 本文的4位作者定义了115个问题。这些问题需要各种编程知识,包括:数学、数组操作、字符串操作、算法、数据科学等,这样每个类图的问题大致平衡。每个问题都构建一个三元组,包含:多轮的prompt P P P、测试用例的输入 I I I、测试用例的输出 O O O。设计多轮prompt P P P需要遵循两个约束:(1) 问题被分解为至少3轮;(2) 单轮无法解决这个问题。每个问题的作者都需要准备5个测试用例的输入 I I I和输出 O O O

​ HumanEval要求补全部分定义的函数,而MTPB仅通过prompts,因此模型必须从头生成解决方案。这种自由形式的生成允许更有潜力的解决方案,但是需要模型能够生成测试用例输入的入口。例如,prompt:“Define a string named ‘s’ with value {var}”,测试用例输入var = 'Hello'将被形式化为"Define a string named ‘s’ with the value ‘Hello’"。

2. 多步编程能力随模型大小和数据大小而改变

在这里插入图片描述

4. 通过多轮分解更好的理解用户意图

在这里插入图片描述

​ 本文假设多轮分解能够增强模型理解用户意图的能力,并带来更好的程序合成能力。为了测试这个假设,我们通过拼接的方式将多轮指令形式化为单轮的形式。仍然使用prompt困惑度作为用户意图理解的代理。因此,比较了4个CodeGen-Mono模型在单轮和多轮prompt的困惑度。

​ 上表4展示了单轮prompt和多轮prompt的困惑度(左)和通过率(右)。所有单轮的困惑度都比多轮的高,意味着多轮的方式能够更好的理解用户的意图。多轮方式的通过率比单轮高平均百分之十个点

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇

​ 历史文章(文章累计460) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》…

Exams/2012 q1g

module top_module (input [4:1] x,output f ); assign f ~x[2]&~x[4] | ~x[1]&x[3] | x[2] & x[3] & x[4]; endmodule

4-Tr0ll-1百个靶机渗透(精写-思路为主)

文章目录 目录 文章目录 前言 一、信息收集 二、提权 1.提权方法1 2.提权方法2 3.提权方法3 4.提权方法4 5.root免密登录的方法 总结 前言 思路清晰: 1.信息收集,寻找内网靶机,得到可以利用的ftp、ssh和web站点的常规端口。 2.因为这个靶机…

Visual Studio 2019离线安装包获取和安装教程

摘要 介绍Visual Studio 2019离线安装方法和配置及注意事项 关键词 VS2019 离线安装 Visual Studio 2019版本与以往的2015、2013、2012版本不同,采用了新的模块化安装方法。微软官方也并未提供ISO镜像,根据官方提供的离线下载方案(docs.mic…

「AI 孙燕姿」翻唱华语乐坛歌曲爆红全网,AI 翻唱将带来哪些影响?是否会有版权等问题?

在某视频平台上,“AI孙燕姿”成了新网红,它翻唱过周杰伦的《发如雪》、翻唱过郭顶的《水星记》、翻唱过赵雷的《我记得》,受到了网友的追捧,甚至有网友宣布“这是2023年最火的声音”。 网上除了AI孙燕姿,还有AI周杰伦…

AOP、spring事务管理

目录 AOP简介 AOP入门案例 AOP配置管理 AOP通知类型 业务层接口执行效率 AOP通知获取数据 百度网盘密码数据兼容处理 AOP事务管理 AOP简介 什么是AOP? AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结…

HTML <area> 标签

实例 带有可点击区域的图像映射: <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" /><map name="planetmap" id="planetmap"><area shape="circle" coords=&q…

AHUT周赛2

1.A - Mahmoud and Ehab and the MEX Problem - A - Codeforces 核心在于x之前的数肯定是有的&#xff0c;x是没有的 所以从0开始一直到x&#xff0c;如果哪个数没有就加上哪个数(操作数1)&#xff0c;如果有x就删去x(操作数1) AC代码&#xff1a; #include<iostream>…

【UML】

文章目录 1.uml图2.类图3.类合类之间关系&#xff1a;泛化关系4.类合类之间关系&#xff1a;实现关系5.类合类之间关系&#xff1a;关联关系6. 聚合关系 组合关系 依赖关系6.1聚合关系6.2 组合关系6.3 依赖关系 7.用例图8.时序图9.状态图10.活动图 1.uml图 2.类图 新建类图 新…

【超全解决方法】关于anaconda navigator启动时一直卡在 loading applications 的问题

问题描述 点开 anaconda navigator 一直处于以下页面&#xff0c;且过了很长时间都加载不出来。 &#xff08;至于为什么会出现这样的问题&#xff0c;原因是我更新了anaconda navigator 之后就出现一大堆问题&#xff0c;最终点开anaconda navigator却一直开在下面的页面&am…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【类和对象(中)】六大默认成员函数

文章目录 前言一、&#x1f33a;构造函数&#xff08;重点&#x1f33a;&#xff09;1.构造函数的特性 二、&#x1f33a;析构函数&#xff08;重点&#x1f33a;&#xff09;1.析构函数的特性 三、&#x1f33a;拷贝构造函数 &#xff08;重点&#x1f33a;&#xff09;1.拷贝…

Powerlink协议在嵌入式linux上的移植和测试(电脑和linux板通信实验)

使用最新的openPOWERLINK 2.7.2源码&#xff0c;业余时间搞定了Powerlink协议在嵌入式linux上的移植和测试&#xff0c;并进行了下电脑和linux开发板之间的通信实验。添加了一个节点配置&#xff0c;跑通了源码中提供的主站和从站的两个demo。这里总结下移植过程分享给有需要的…

4。计算机组成原理(4)CPU

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 CPU&#xff08;中央处理器&#xff09;是计算机的核心部件&#xff0c;它主要负责执行计算机指令&#xff0c…

万字超详细的Java图书管理系统

&#x1f495;”生命中的每个人都是一个故事&#xff0c;而每个故事都值得被讲述“&#x1f495; &#x1f386;作者&#xff1a;不能再留遗憾了&#x1f386; &#x1f43c;专栏&#xff1a;Java学习&#x1f43c; &#x1f697;该文章主要内容&#xff1a;用Java实现简单的图…

三、PEMFC基础之组件间热传导

三、PEMFC基础之组件间热传导 一、理论基础二、编程实践 一、理论基础 热传导主要基于傅里叶热传导定律。在燃料电池中&#xff0c;除了各组件内部的热传导外&#xff0c;还有冷却流体与双极板的对流换热。公式略。 燃料电池内部稳态导热&#xff1a; d 2 T d x 2 q i n t k…

iMazing2软件最新版本功能技术参数详细介绍

这里有iMazing 的产品概述、功能特性、技术参数等详细介绍&#xff0c; 可以帮助您快速入门&#xff0c;了解iMazing的功能。不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要使用 USB 电缆将设备连接到计算机&#xff0c;就可以处理不同类型的数据。 自动备份 iMazi…

【Linux】基础IO——文件描述符

目录 什么是文件描述符标准输入、输出、错误的返回值类型FILE*的理解进程中文件描述符的分配规则重定向的原理重定向的实际使用方法dup2 如何理解缓冲区 什么是文件描述符 在基础IO的上一篇博客里有提到过&#xff0c;系统调用open与close的返回值问题&#xff1a; 成功返回文…

PyQGIS中一次性加载多个shp文件

目录 遍历添加多个图层 打印图层列表清单 打开QGIS Desktop 3.22.16&#xff0c;点击菜单栏 【设置】——>【Python控制台】 在Python控制台中点击【显示编辑器】按钮&#xff0c;打开Python编辑器 点击Python编辑器的第一个按钮 【打开脚本文件】&#xff0c;选择加载遍历…

2023年继续使用WordPress的6个最重要原因

为什么要使用 WordPress&#xff1f;我的网站不够好吗&#xff1f;为什么我需要从另一个平台切换到 WordPress&#xff1f; 在本文中&#xff0c;我们将分享您应该使用 WordPress 的最重要原因。我们还将涵盖您可以使用 WordPress 创建的所有不同类型的网站&#xff0c;并展示…