导语
- 会议:MAPS 2022
- 链接:arxiv.org/abs/2202.13…
关键词
code language model, evaluation, pretraining, code generation, open-source
1 简介
最近,语言模型被广泛的应用到了AI辅助代码的相关任务上,比如最近OpenAI提出最大的模型的CodeX(GPT-3 Codex模型学习笔记)已经被应用到了Github Copilot工具上。尽管研究者们取得了这些成就,但是像CodeX这类模型并不公开,人们只能使用相关公司提供的付费API来进行调用,模型的内部细节都是一个黑盒,这无疑阻碍了相关研究的发展。
像GPT-Neo、GPT-J、GPT-NEoX等中大型的语言模型是公开的(注:由于GPT-3模型也是不公开的,所以这几个模型都是EleutherAI训练的公开的大型自回归模型),它们的训练数据集(The Pile数据集,有800GB的文本、代码等数据)包含了广泛的文本形式,也能够合理的生成代码。
考虑到这些模型中涉及的模型大小和训练方案的多样性,以及这些模型之间缺乏比较,许多建模和训练设计决策的影响仍不清楚。本文对现有的跨各种编程语言的代码模型——Codex、GPT-J、GPT-Neo、GPT-NeoX和CodeParrot——进行了系统评估并发布了PolyCoder模型,该模型基于 GPT-2 架构并在12种编程语言上进行预训练。
本文首先对PolyCoder、开源模型和Codex之间的训练和评估设置进行了广泛的比较。其次,作者在HumanEval基准上评估模型。最后,由于HumanEval只评估自然语言到Python合成,作者在12种语言中评估不同模型的perplexity。实验结果发现,尽管Codex据称专注于Python,但它在其他编程语言上的表现也令人惊讶地好,甚至比在Pile上训练的GPT-J和GPT-NeoX更好。尽管如此,在C编程语言中,我们的PolyCoder模型实现了比所有这些模型(包括Codex)更低的复杂性。
虽然目前大多数模型的表现不如Codex,但该研究有助于该领域未来的研究设计更高效和有效的模型。更重要的是,通过对不同模型的系统评估,作者鼓励社区研究并发布用于代码的中大型语言模型,以回应Hellendoorn和Sawant[18]所表达的担忧:
[…为了达到最先进的水平,成本呈爆炸式增长,这使得训练和测试这类模型的能力局限于少数几家大型科技公司,而且几乎所有学术实验室的资源都远远不够。
作者相信,本文的努力是迈向大型代码语言模型民主化的重要一步。
2 相关工作
本章节主要介绍预训练语言模型的相关方法和预训练数据集。
2.1 预训练方法
有三种形式的预训练方法(如下图所示):
- Left-to-Right Language Models.该类模型即自回归式方法,典型的模型例如CodeGPT (124M), CodeParrot (1.5B), GPT-Neo (2.7B) , GPT-J (6B), Codex (12B), GPT-NeoX (20B)和Google’s (137B);
- Masked Language Models.该类模型即只使用Transformer的Encoder部分,典型的模型如CodeBERT (125M)和 CuBERT (345M);
- Encoder-decoder Models.该类模型即Encoder-decoder模型,典型的方法如CodeT5(220M)和PLBART(406M)。
2.2 预训练数据集
一些方法只在Github的代码数据上进行训练,如CodeT5或CodeParrot模型,它们的训练数据集要么是Google BigQuery’s GitHub数据集,要么是CodeSearchNet。其他的开源模型如GPT-Neo、GPT-J则是在自然语言和代码的混合文本上进行训练,典型的数据集为The Pile。还有一些不公开的数据集,如CodeX,Google’s 模型使用的数据集。
3 评估设定
分为外在评估(Extrinsic Evaluation)和内在评估(Intrinsic Evaluation)。外在评估指的是在HumanEval这个数据上的Pass@k表现,但由于该数据集只有Python代码的,所以作者又提出了内在评估。
所谓内在评估,则是评估本身语言模型在不同的程序语言文本上的PPL(即perplexity),这种评估方式很简单,但却很有效。
4 比较的模型
4.1 现存的模型
本文主要比较以下模型:
- 不开源的模型:CodeX
- 开源的通用模型:GPT-Neo, GPTJ 和 GPT-NeoX
- 开源的单一语言模型:CodeParrot
4.2 PolyCoder的数据
原始数据收集
我们在2021年10月从GitHub克隆了12种至少有50颗星的流行编程语言的最受欢迎的存储库(每种语言停止在大约25K,以避免对流行编程语言的过度倾斜)。对于每个项目,提取属于该项目的大多数语言的每个文件,生成初始训练集。这个初始的、未经过滤的数据集包含631GB和389M个文件。
数据预处理
数据预处理流程如下表1
去重和过滤
像CodeX和CodeParrot那样,作者也过滤掉了过长和过短的数据,得到的最终数据集如下表所示:
本文收集的数据集包含比Codex或CodeParrot更少的Python代码(只有16G),而是涵盖了许多不同的编程语言。
Tokenizer
在包含所有语言的所有预训练数据的随机5%子集上训练一个GPT-2 Tokenizer(使用BPE)。
4.3 PolyCoder的训练
由于预算有限,作者采用了GPT-2作为自己的模型架构,并设置了130M,400M和2.7B三种不同的size。在单机8 Nvidia RTX 8000 GPU上训练2.7B模型大约耗时6周。
训练时的超参数设置如上表所示,由于训练资源有限,作者无法进行超参搜索,而是基本遵循了GPT-2的参数设定。而且由于训练资源的受限,模型似乎还没有完全收敛。
5 结果
5.1 外在评价
HumanEval测试基准上的实验结果如下表所示:
作者探讨了模型规模和softmax温度(可以参考 温度 )的影响:
Scaling Effect
HumanEval基准测试的性能随着模型中参数数量的大小(对数尺度)线性增加。在PolyCoder和GPT-Neo/J模型上也发现了类似的缩放效应。有趣的是,只在Python上训练的CodeParrot模型似乎随着参数数量的增加而达到了饱和性能,其中专注于Python的训练语料库可能会有一些效果。
在参数数较高(2.7B)的情况下,PolyCoder的性能趋向于GPT-Neo/J。比较在包含文本、Stack Exchange转储和GitHub数据的Pile数据集上训练的GPTNeo/J与仅在流行编程语言的GitHub存储库上训练的PolyCoder,作者认为添加的文本,特别是技术和软件工程领域的文本,可能对更大的模型提高性能至关重要。
Temperature Effect
Pass@1的总体趋势是温度越低越好。对于Pass@100,较高的温度有帮助,而对于Pass@10,中间的温度更适合。
5.2 内在评估
PPL结果如图6所示,PolyCoder在C语言中优于Codex和所有其他模型。仅比较开源模型,PolyCoder在C、JavaScript、Rust、Scala和TypeScript中的性能要优于类似大小的GPT-Neo 2.7B。
在除C语言之外的11种语言中,所有其他开源模型,包括PolyCoder,都明显比Codex更糟糕。这可能是因为PolyCoder是在不同语言的不平衡混合上训练的,C和C++密切相关,并且在整个训练语料库中占主导地位。因此,较大的总容量(因为长文件)使C语言成为PolyCoder最“青睐”的语言。PolyCoder在c++中表现不如Codex的原因可能是由于c++语言的复杂性和Codex的上下文窗口大小明显较长(4096,而PolyCoder的2048),或者因为Codex可能在更多的c++训练数据上进行训练。
使用相同的预训练语料库,从2.7B模型(GPT-Neo)到6B模型(GPT-J)的增益在所有语言上都是显著的。然而,当进一步增加模型大小到20B时,不同语言的改进有所不同。例如,当模型大小增加3倍时,Go、Java、Rust、Scala、TypeScript上的性能并没有显著提高。这表明对于某些编程语言,并且给定数据量,GPT-J的容量是足够的。有趣的是,这些语言似乎与PolyCoder优于在Pile上训练的类似大小模型的语言一致。这可能暗示,对于较大模型不能提供额外增益的语言,仅使用代码训练模型可能足够或比同时使用自然语言和代码训练更有帮助。
我们可以看到,比较不同的模型,Python的困惑度趋势与外部评估的HumanEval基准性能有很好的相关性(第5.1节)。这表明困惑度是评估其他下游指标的有用且低成本的指标。
6 总结
本文对现有的最大的代码语言模型进行了系统的评估,同时发布了PolyCoder,这是一个大型的开源代码语言模型,专门针对12种不同编程语言的代码进行训练。在C语言中,PolyCoder实现了比包括Codex在内的所有模型更低的复杂度。
虽然模型的性能通常受益于更大的模型和更长的训练时间,但小型(300M) Codex在HumanEval上优于所有其他模型的结果表明,模型大小并不是唯一的重要因素,使用其他技术,开源模型仍有很大的改进空间。作者还认为,GPT-Neo在某些语言中优于PolyCoder的结果表明,在自然语言文本和代码上的训练可以使代码建模受益。
为了鼓励未来在该领域的研究,本文在github.com/VHellendoor… 上公开了模型、代码、数据和数据挖掘脚本。