导语
- 会议:ICLR 2023在投
- 链接:arxiv.org/abs/2203.13…
1 简介
程序合成(program synthesis)的目标是使编码过程自动化,并生成满足用户指定意图的计算机程序。该任务有两个关键挑战:
- 难以处理的搜索空间;
- 正确指定用户意图的困难。
为了成功地实现程序合成,用户必须采用一些方法将其意图传达给模型,例如逻辑表达式(指定程序输入和输出之间的逻辑关系)、伪代码、输入-输出示例或自然语言的语言化规范。一方面,完整的正式规范具有用户意图的确切规范,但可能需要用户的领域专业知识和努力来将意图转换为这样的形式。另一方面,仅仅基于输入-输出示例的规范成本较低,但可能没有详细说明意图,导致不准确的解决方案。
为了克服这些挑战,本文提出了一种多轮次程序合成方法(如图1),其中用户通过逐步用自然语言提供规范来与合成系统交互,同时以合成子程序的形式接收系统的响应,这样用户和系统一起在多个步骤中完成完整的程序合成。以下两个考虑因素激发了这种方法:
- 将一个潜在的长而复杂的规范分解为多个步骤将简化模型的理解,能够增强模型的程序合成能力;
- 代码表现出自然语言和编程语言交错的弱模式,这可能是可利用的。如果将一个单轮的复杂问题分解为若干多轮的子问题后,用户意图可以在多个轮次中表达,即意图可以部分分解和实现,而每个回合都可以很容易地用自然语言表达。
为此,作者还发布了一个多轮次程序合成数据基准MTPB (Multi-Turn Programming Benchmark)来衡量模型的多轮次程序合成能力。本文的主要贡献如下:
- 研究了不同size自回归模型中在多轮次程序合成任务中的emerging现象(参考);
- 利用这种emerging能力引入多轮次程序合成范式;
- 利用一种新的多轮次程序合成基准来定量研究它的性质;
- 开源了模型checkpoint和自定义训练库:JAXFORMER。
2 模型训练
作者主要在模型规模(四种size:350M, 2.7B, 6.1B, 16.1B)和预训练数据(The PILE, BigQuery,BigPython)方面对多轮次程序合成任务进行了实验探究。
2.1 数据集
作者提出的CodeGen模型主要在以下三个数据集上按顺序进行预训练:
- The Pile:拥有825GiB的英语文本和代码,曾被GPT-Neo、GPT-J等模型预训练采用。在该数据集上训练得到的模型称为CodeGen-NL;
- BigQuery:作者采用了BigQuery数据集中的以下六种编程语言,即C, C++, Go, Java, JavaScript,Python的代码数据继续预训练,得到的模型称为CodeGen-Multi;
- BigPython:该数据集只包含了Python语言的文件(主要是为了下游任务),在该数据集上继续预训练得到的模型称为CodeGen-Mono。
2.2 模型
CodeGen模型采用自回归Transformer的形式,将next-token prediction语言建模作为学习目标。CodeGen有350M、2.7B、6.1B和16.1B参数的size。前三种参数大小配置可以与文本语料库上训练的开源大型语言模型进行直接比较,如GPT-Neo (350M, 2.7B) 和GPT-J (6B)。训练超参设置如下表:
以自然语言描述为条件的程序合成的emergence可能源于模型和数据的大小、训练目标和训练数据本身的性质。emergence指的是大规模的无监督语言模型可以以zero-shot的方式解决未见过的任务。这种现象的出现往往归因于模型和数据的大尺度。
数据由来自GitHub,其中一些数据呈现自然语言和编程语言交错的模式,作者认为由于next token prediction的训练目标,为程序合成能力提供了一个有噪声的监督信号。影响程序综合能力的主要因素有两个:1)模型规模和数据规模大,2)训练数据中有噪声信号。
3 单轮次评估
作者首先在HumanEval上进行了评估,也被称为单轮次评估。
3.1 不同参数和预训练数据规模的模型表现
整体结果如下表所示:
从单轮结果来看,作者使用的按顺序的预训练对最终结果是有帮助的(如Multi模型比NL模型好,Mono模型比Multi模型好)。
3.2 对用户意图更好的理解有助于程序合成
作者认为,程序合成系统的成功在很大程度上取决于它对用户意图的理解程度。为此,作者比较了4种不同size的CodeGen-Mono模型在预测正确和预测不正确的问题上的perplexity,对比结果如下表:
可以看到,模型对这些预测错误的样例的理解差于对预测正确样例的理解(错误样例的ppl更高)。因此,作者推测,类似于这种模式的用户意图规范将更好地被模型理解,从而导致更好的程序合成。受到这种模式的启发,作者提出在多个轮次中指定用户意图,这样模型一次只关注部分问题,这将使模型更容易理解用户意图。
4 多轮次评估
4.1 数据集构建
作者提出并研究了一种多步骤程序合成范式,该范式将程序合成分解为多个步骤,系统在每个步骤中合成一个子程序。为此,作者首先开发了一个多回合编程基准(MTPB)。MTPB由专家编写的115个问题组成,每个问题都包含自然语言(提示)的多步骤描述。为了解决问题,模型需要合成功能正确的子程序(1)遵循当前步骤的描述,(2)考虑前面步骤的描述和合成子程序(例如,对前面步骤中定义的函数和/或变量的正确反向引用)。图1显示了一个说明性示例。
4.2 执行环境
HumanEval的程序段是在一个完整的程序中填入部分函数代码,因此整体框架是比较完整的,易于执行和评估。而在MTPB中,不能保证生成这样的入口点(或返回值)。为了解决这个问题,作者强制对程序的最后一步进行print操作,以此来检验执行结果。
4.3 不同参数和预训练数据规模的模型表现
同样,作者比较了不同预训练数据下的不同参数规模的模型的实验表现,可以看到,CodeGen-Mono在多轮情况下表现非常好。
4.4 使用问题分解来更好的理解用户意图
作者认为,多轮次分解增强了模型对用户意图规范的理解,从而导致更好的程序合成能力。为了验证这个假设,作者将多轮问题拼接成一个prompt文本,比较了多轮次prompt和串联单轮次prompt的PPL。
实验结果如表4所示,对所有模型而言,单轮次比多轮次具有更高的平均PPL。因此,将用户规范分解为多个步骤,并利用大型语言模型的emergence能力,似乎可以让模型更容易地理解,更成功地合成程序。
此外,作者根据问题的平均通过率按难度级别对问题进行分类,分析不同模型在不同难度下的多轮次与单轮次性能差异。如图2所示(纵轴的值指的是多轮次比单轮次性能高的百分点数),在几乎所有模型尺寸和难度级别中,多轮次提示都比单轮次提示有显著改进,大多数改进接近或高于10个百分点。有趣的是,较大的模型(6.1B和16.1B)对于简单问题的多轮次分解后性能是不变的(参见图2中的两个短条,0.19%和- 0.25%)。这意味着当问题可以很容易地被模型理解时(由于问题的简单性和较大模型的高容量的共同作用),对规范进行因式分解是没有必要的。这实际上与作者的动机假设是一致的,即分解复杂的规范可以简化问题的理解并改进程序的综合。
4.5 定性分析
作者也给出了一些16.1B的最大模型在某些情况下不如小模型(2.7B)灵活的例子,如下图:
大模型初始化一个数字总是得到一个整数,尽管提示要求转换为字符串(图3),或者提示中的“return”关键字触发了一个函数定义,而目的是直接生成一个可执行程序(图4)。
然而,一般来说,大型模型克服了由于较小模型提示错误解释而导致的错误,包括同时分配多个变量(图5)或理解任何比较的概念(图6)。
5 相关工作
略
6 总结
本文利用在大量代码数据语料库上训练的大型因果语言模型来研究程序合成。随着模型大小和数据大小的增加,从简单的语言建模中获得理解长上下文和生成一致响应的能力。利用这种能力,并观察到更好的用户意图理解会带来更好的程序合成,作者提出了一种多步骤程序综合方法,其中程序合成是通过多轮次规范和代码生成来实现的。此外,本文发布了多回合编程基准(MTPB)来研究模型在这种多步范式下合成程序的能力。实验表明,多轮次程序合成能力是模型大小和数据大小的函数。在多个步骤中指定的意图规范更容易被模型消化,并帮助模型进行更准确的程序合成。作者开放了训练代码和模型checkpoint,以促进该领域未来的研究和实际应用。