当前位置: 首页 > 科技观察

CMU打造开源AI代码生成模型,C语言跑赢Codex

时间:2023-03-11 23:16:27 科技观察

近日,语言模型(LM)在编程语言源代码建模方面表现不俗。这些模型擅长代码生成和下游任务,例如从自然语言描述生成代码。当前的SOTA大规模语言代码模型如Austin等人。(2021)在基于人工智能的编程辅助领域取得了重大进展。此外,来自OpenAI的Codex已部署在GitHubCopilot中,这是一个真实世界的生产工具,作为IDE内的开发人员助手,可根据用户上下文自动生成代码。尽管大规模语言代码模型取得了巨大成功,但最强大的模型尚未公开。这阻止了这些模型在资源充足的公司之外的应用,并限制了资源不足的机构在该领域的研究。例如,Codex通过黑盒API调用提供对模型输出的付费访问,但模型的权重和训练数据不可用。这可以防止研究人员在代码完成之外对域和任务的模型进行微调。失去对模型内部结构的访问权限也会阻止研究社区调查模型的其他关键方面,例如可解释性、模型蒸馏以更有效地部署,以及融合检索等其他组件。同时,GPTNeo、GPT-J、GPT-NeoX等中大规模预训练语言模型已经公开。尽管这些模型是在包括新闻文章、在线论坛和少数GitHub软件存储库在内的各种文本的混合体上进行训练的,但它们可用于生成具有合理性能的源代码。此外,还有一些新的开源语言模型仅在源代码上进行训练,例如在180GB的Python代码上进行训练的CodeParrot。不幸的是,这些模型的训练制度的规模和多样性相互比较不足,许多建模和训练设计决策的影响仍不清楚。在最近的一篇论文中,CMU计算机科学学院的几位研究人员对不同编程语言的现有代码模型(Codex、GPT-J、GPT-Neo、GPT-NeoX和CodeParrot)进行了系统评估。通过比较这些模型,他们希望进一步阐明代码建模设计决策的前景,并指出关键的缺失环节,即迄今为止,还没有专门针对多编程代码训练的大规模开源语言模型语言。研究人员推出了三个这样的模型,参数从160M到2.7B不等,并将它们命名为“PolyCoder”。论文地址:https://arxiv.org/pdf/2202.13169.pdf项目地址:https://github.com/VHellendoorn/Code-LMs研究人员首先在PolyCoder、开源模型和Codex上进行了广泛的训练语言评估设置其次,在HumanEval基准上评估这些模型,并比较不同大小和训练步骤的模型如何扩展以及不同温度如何影响生成质量;最后,由于HumanEval只评估自然语言和Python生成,他们针对12种语言中的每一种创建了相应的未见评估数据集,以评估不同模型的困惑度。结果表明,虽然Codex号称在Python语言方面表现最好,但它在其他编程语言中的表现也出奇的好,甚至超过了在Pile(为训练语言模型而设计的825G数据集)上训练的GPT-J和GPT-NeoX。然而,在C中,PolyCoder模型比包括Codex在内的所有其他模型实现了更低的困惑度。下面的图1显示了现有的语言代码模型及其大小和可用性,除了Codex和Austin'21之外都是开源的。研究人员还讨论了代码语言建模中使用的三种流行的预训练方法,如下图2所示。评估设置研究人员使用外部和内部基准评估了所有模型。外部评估。代码建模最流行的下游任务之一是给定自然语言描述的代码生成。继陈等人之后。(2021),他们评估了HumanEval数据集上的所有模型。该数据集包含164个以代码注释和函数定义形式描述的提示,包括参数名称和函数名称,以及用于判断生成的代码是否正确的测试用例。内心的评价。为了评估不同模型的内在性能,他们在一组看不见的GitHub存储库上计算了每种语言的困惑度。而且,为了防止GPT-Neo和GPT-J等模型从训练到测试的数据泄漏,他们删除了评估数据集上Pile训练数据集的GitHub部分中出现的存储库。模型比较研究人员主要选择了最适合代码补全任务的自回归预训练语言模型。具体来说,他们评估了Codex,这是一种由OpenAI开发的模型,目前已部署在现实世界中,并在代码完成任务上展示了卓越的性能。Codex在179GB(去重后)数据集上进行了训练,该数据集由2020年5月从GitHub获得的5400万个公共Python存储库组成。至于开源模型,研究人员比较了GPT的三个变体——GPT-Neo(27亿个参数),GPT-J(60亿个参数)和GPT-NeoX(200亿个参数)。其中,GPT-NeoX是目前最大的开源预训练语言模型。这些模型都是在Pile数据集上训练的。目前,社区还没有专门针对多编程语言代码训练的大规模开源语言模型。为了弥补这一缺点,研究人员在GitHub中涵盖12种不同编程语言的存储库集合上训练了一个27亿参数的模型——PolyCoder。PolyCoder的数据原始代码库集合。研究人员于2021年10月在GitHub上克隆了12种流行编程语言的最受欢迎的存储库,这些存储库的星数超过50。未经过滤的原始数据集为631GB和3890万个文件。接下来,进行数据预处理。PolyCoder、CodeParrot和Codex的数据预处理策略的详细比较如下表2所示。最后是去重和过滤。总体而言,过滤掉非常大和非常小的文件以及重复数据删除将文件总数减少了38%,数据集大小减少了61%。下面的表1显示了过滤前后数据集大小的变化。PolyCoder的训练考虑了预算,研究人员选择GPT-2作为模型架构。为了探索模型大小缩放的影响,他们用1.6亿、4亿和27亿参数训练了PolyCoder模型,并使用27亿参数模型与GPT-Neo进行了公平比较。研究人员使用GPT-NeoX工具包在一台机器上使用八个NVIDIARTX8000GPU并行高效地训练模型。训练一个27亿参数的PolyCode模型的时间约为6周。使用默认设置,PolyCode模型应训练320k步。然而,受限于手头的资源,他们将学习率衰减调整为原来的一半,并训练了150,000步。1.6亿、4亿和27亿参数的PolyCode模型的训练和验证损失曲线如下图3所示。可以看出,即使经过150,000步的训练,验证损失仍然减少。下面的表3显示了不同代码在训练模型中设计决策和超参数的比较。实验结果的外部评价的总体结果如下表4所示。在现有模型中,PolyCoder的性能弱于类似尺寸的GPT-Neo和较小的Codex300M。总体而言,该模型不如Codex和GPT-Neo/J,但强于CodeParrot。规模效应。为了进一步了解模型参数量对HumanEval代码补全性能的影响,研究人员在下图4中展示了Pass@1、Pass@10和Pass@100的性能变化。温度效应。以上所有结果都是通过在不同温度下对语言模型进行采样并为每个指标选择最佳值而获得的。研究人员还对不同温度如何影响最终构建质量感兴趣,结果如下图5所示。IntrinsicEvaluation不同模型在评估数据集上的perplexity结果如下图6所示。最大困惑分数为4。如您所见,PolyCoder优于Codex和C中的所有其他模型。而且,仅与开源模型相比,PolyCoder在C、JavaScript、Rust、Scala中优于类似大小的GPT-Neo2.7B和打字稿。此外,包括PolyCoder在内的所有开源模型在除C之外的其他11种语言中的表现都比Codex差。