在自然语言处理领域,常用语言模型(LMs)可以实现为字符(tokens)序列分配概率。

最近,LMs 还在对编程语言编写的源代码进行建模方面表现出强大的性能,擅长从自然语言描述中完成和生成代码。

在基于人工智能的编程支持下,目前最先进的大型语言模型的编写代码能力已经有了巨大改进。

AI 自动写代码的潜力

代码生成 AI 模型的好处是显而易见的,它可以降低开发成本,同时允许编码人员专注于创造性的、重复性较低的任务。也正因如此,越来越多的组织正在探索代码生成人工智能。

Codex 是其中之一。它是 OpenAI 推出的新的深度学习驱动平台,可自动编写能够正常工作的软件代码。该系统以大量公开代码作为语料库进行了训练,是 GitHub Copilot 上的一个功能,可帮助程序员自动改进或更新软件。

DeepMind 出品的 AlphaCode 也是最早与人类程序员竞争的代码生成系统之一。编程竞赛平台 Codeforces 上举办的编程竞赛中,DeepMind 表示,与 5000 多名程序员竞争,AlphaCode 的平均排名在前 54.3% 之内。

目前,OpenAI 和 Alphabet 支持的 DeepMind 等机构已经开发出强大的代码生成 AI,但这些最强大的系统并没有开源。例如,Codex 只允许在收费情况下,通过黑箱 API 调用模型的输出,但不允许访问模型的权重或训练数据。

也就是说,尽管语言模型在编码方面取得了巨大的成功,但由于性能最好的语言模型没有开源,这就限制了资源缺乏的公司在该领域的研究,例如,研究人员无法对模型进行微调在源代码实现之外的任务或领域中使用。而且无法访问模型的内部结构也限制了研究人员研究模型的其他重要特性,例如可解释性、为了实现高效应用的模型蒸馏,以及引入检索等额外功能。

GPTNeo、GPT-J 和 GPT-NeoX 是三种公开可用的预训练语言模型,其规模涵盖中等到大型。通过在新闻文章、互联网论坛和少数(GitHub)软件库等大量数据上进行训练,这些语言模型能够以较快的速度生成源代码。另外还有一些仅在源代码上训练的开源语言模型,例如 CodeParrot 模型是在 180 GB 大小的 Python 代码上训练的。

由于这些模型的大小和训练策略各不相同,而且没有完善的实验比较,还不清楚建模方法和训练策略对语言模型的影响。

例如,我们无法知道 Codex 和其他自用模型训练使用的实际数据集。而且一些开源模型是在大量自然语言和代码上进行训练,而另一些(例如 CodeParrot)则只在一种编程语言的代码上训练。

不过,使用不同编程语言中相似的关键字和特征,使得多语言模型的泛化能力较强,这一点在多语言模型的实际使用中得到证明。也就是说,多语言 LMs 具有跨语言使用、优于单语言模型的优点。

PolyCoder 问世

最近,卡内基梅隆大学(Carnegie Mellon University)的研究人员发表了一篇论文 A SYSTEMATIC EVALUATION OF LARGE LANGUAGE MODELS OF CODE ,对比了现有的跨编程语言的编写代码模型——Codex、GPT-J、GPT-Neo、GPT-NeoX 和 CodeParrot。通过对多个模型的比较和分析,这个团队希望为代码建模设计决策提供更多启发。

他们首次证明了,大型的开源语言模型都不仅仅在几种编程语言的代码上进行训练。

这篇论文中,他们还提出一个基于 OpenAI 的GPT-2语言模型的模型PolyCoder。该模型在包含 249 GB 代码的数据库上进行了 12 个编程语言。

虽然 PolyCoder 在每项任务中都无法与顶级代码生成器的性能相媲美,但研究人员声称,PolyCoder 能够以比所有已知模型更高的准确度用 C 语言编写,包括 Codex 在内。

首先,该团队对 PolyCoder、开源模型和 Codex 的训练和测试设置进行对比研究。

其次,使用 HumanEval 基准研究各种模型大小、训练步骤,以及不同的温度对模型生成代码质量的影响。

最后,由于 HumanEval 只能评估自然语言到 Python 语言的生成结果,所以他们创建了一个 12 种语言的测试数据集,用来评估各种模型的性能。

研究人员发现,尽管 Codex 模型表面上只能处理 Python 语言,但它在其他编程语言中的表现也很不错,超过了在 Pile 上训练的 GPT-J 和 GPT-NeoX 模型。但是在 C 语言中,PolyCoder 模型的性能比其他所有模型(包括 Codex)的都好。

而且在 C、JavaScript、Rust、Scala 和 TypeScript 语言中,PolyCoder 比同样大小的开源模型 GPT-Neo 2.7B 相比性能更好。

但在 C 语言之外的 11 种语言上,其他的开源模型,包括 Polycoder 的表现低于 Codex。这是因为 Polycoder 是在数据不平衡的混合语言上训练的,而且 C++和 C 语言是有相关性、且在训练语料中最普遍的两种语言。所以 C 语言的数据量更大,PolyCoder 模型就认为 C 是“首选”的编程语言。但 C++语言更为复杂,并且 Codex 拥有更大的上下文窗口(4096 vs. PolyCoder 的 2048),或者因为 Codex 是在更多的 C++训练数据上训练出来的,所以导致 Codex 在 C++上的表现优于 PolyCoder。

总而言之,这项研究中研究人员对大量语言模型的编码能力进行了全面实验。一般来说,更大的模型和更多的训练时间有利于提高模型性能。GPT-superior Neo 模型在某些语言中的性能表明,对自然语言文本和代码的训练有助于对代码进行建模。

而 PolyCoder 则是用于编码的大规模开源语言模型,在 12 种不同的编程语言代码上训练而得,它的发布有助于未来在该领域的研究。虽然 PolyCoder 在每项任务中的性能都无法与顶级代码生成器相媲美,但研究人员声称,PolyCoder 能够以比包括 Codex 在内的所有已知模型以更高的准确度用 C 语言编写代码。

论文:
arxiv/pdf/2202.13169.pdf
Github:
github/vhellendoorn/code-lms

关于数据实战派

数据实战派希望用真实数据和行业实战案例,帮助读者提升业务能力,共建有趣的大数据社区。

更多推荐

12种编程语言训练,开源的AI “程序员”来了,CMU出品