导语

  • 会议: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的文本、代码等数据)包含了广泛的文本方式,也能够合理的生成代码。

论文笔记:A Systematic Evaluation of Large Language Models of Code

考虑到这些模型中触及的模型巨细和练习计划的多样性,以及这些模型之间缺少比较,许多建模和练习规划决策的影响仍不清楚。本文对现有的跨各种编程言语的代码模型——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)。

论文笔记:A Systematic Evaluation of Large Language Models of Code

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

论文笔记:A Systematic Evaluation of Large Language Models of Code

去重和过滤

像CodeX和CodeParrot那样,作者也过滤掉了过长和过短的数据,得到的终究数据集如下表所示:

论文笔记:A Systematic Evaluation of Large Language Models of Code

本文搜集的数据集包含比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周。

论文笔记:A Systematic Evaluation of Large Language Models of Code

练习时的超参数设置如上表所示,因为练习资源有限,作者无法进行超参查找,而是根本遵循了GPT-2的参数设定。而且因为练习资源的受限,模型好像还没有完全收敛。

论文笔记:A Systematic Evaluation of Large Language Models of Code

5 成果

5.1 外在点评

HumanEval测验基准上的试验成果如下表所示:

论文笔记:A Systematic Evaluation of Large Language Models of Code

作者探讨了模型规划和softmax温度(能够参阅 温度 )的影响:

Scaling Effect

HumanEval基准测验的功能跟着模型中参数数量的巨细(对数尺度)线性添加。在PolyCoder和GPT-Neo/J模型上也发现了类似的缩放效应。风趣的是,只在Python上练习的CodeParrot模型好像跟着参数数量的添加而到达了饱满功能,其中专心于Python的练习语料库或许会有一些作用。

论文笔记:A Systematic Evaluation of Large Language Models of Code

在参数数较高(2.7B)的情况下,PolyCoder的功能趋向于GPT-Neo/J。比较在包含文本、Stack Exchange转储和GitHub数据的Pile数据集上练习的GPTNeo/J与仅在盛行编程言语的GitHub存储库上练习的PolyCoder,作者以为添加的文本,特别是技术和软件工程范畴的文本,或许对更大的模型进步功能至关重要。

Temperature Effect

Pass@1的总体趋势是温度越低越好。关于Pass@100,较高的温度有协助,而关于Pass@10,中间的温度更适合。

论文笔记:A Systematic Evaluation of Large Language Models of Code

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++练习数据上进行练习。

论文笔记:A Systematic Evaluation of Large Language Models of Code

运用相同的预练习语料库,从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… 上揭露了模型、代码、数据和数据发掘脚本。