推荐语:
近期,代码的大型语言模型 (LM)在完成代码和从自然语言描述合成代码方面显示出巨大的潜力。然而,当前最先进的代码 LM(例如 Codex (Chen et al., 2021))尚未公开,留下了许多关于其模型和数据设计决策的问题。
我们的目标是通过对各种编程语言中最大的现有模型的系统评估来填补其中的一些空白:Codex、GPT-J、GPT-Neo、GPT-NeoX-20B 和 。尽管 Codex 本身不是开源的,但我们发现,针对自然语言建模,现有的开源模型确实在某些编程语言中取得了接近的结果。我们进一步确定了一个重要的缺失部分,即专门在多语言代码语料库上训练的大型开源模型。我们发布了一个新模型 ,它具有基于 GPT-2 架构的 2.7B 参数,该模型在单台机器上使用 12 种编程语言的 249GB 代码进行了训练。在 C 编程语言中, 优于包括 Codex 在内的所有模型。我们训练有素的模型是开源的,可在此 https URL 上公开获得,这使得该领域的未来研究和应用成为可能。
—— 袤博科技资深java开发工程师 零零发
比Codex还会写C语言的AI代码生成模型,现在开源了!
这段时间,用AI写代码可以说是大火,其中最著名的要属的Codex和的。
基于Codex的
然而,这两个AI模型,全都没有开源:其中只给出了一些测试样例,而Codex只开放了API。
为此,来自CMU的几个研究人员,用GPT-2搞出了一个名叫的AI代码生成模型,而且还是开源的。
据研究人员表示,虽然最大只有27亿参数(相比Codex有120亿参数),但它用C语言写出来的代码,比Codex的效果还要好。
这里面究竟有什么秘诀?
用12种编程语言代码集训练
首先来看训练用的数据集,这也是的最大特点之一。
此前,包括Codex、等AI代码生成模型,主要都是基于语言的代码来训练。
例如Codex的评估数据集之一,评估的也是生成代码的效果。
相比之下,采用了多种编程语言代码集来训练,一共有12种:
C、C#、C++、Go、Java、、PHP、、Ruby、Rust、Scala和。
其中,C语言的代码量是最多的,达到了221GB;而代码的数据量比Codex和用得都要少。
这里用的是上的公开代码,主要选取的是各种编程语言中比较受欢迎的库,每个库至少有50 Stars。据研究人员表示,每种编程语言库的Stars总数加起来不超过25k,以避免模型生成的代码效果太过于倾斜最流行的编程语言(通常编程语言越流行,库的Stars就越多)。
通过提取库中的文件、经过简单处理(包括消除重复代码)后,一共筛选出大约254GB的数据用于训练。
然后是预训练的方法。
语言模型的预训练方法通常有三种。第一种是自左向右的语言模型,根据上文预测下文,比较适用于代码生成
等;第二种是掩蔽语言模型,基于上下文预测屏蔽片段,比较适合代码分类等;第三种是编解码器模型,比较适用于
代码注释等任务。
这里主要采用的是第一种预训练方法。
相比于同样采用GPT-2训练的和Codex,在超参数设置上也稍微有一些差异:
一共提供了三种不同的模型,分别有27亿参数、4亿参数和1.6亿参数,研究人员可以根据自身需求和不同的训练能力来选取合适的模型。
那么,最终训练出来的AI模型,代码生成效果如何?
C语言写得尤其好,但不行
研究人员将与已有的AI代码生成模型进行了对比。由于不好比较
(接口没开放)
,所以研究人员主要分析了下面这些模型,包括GPT-Neo、和Codex等。其中蓝色的是开源的,橙色的是没开源的:
从参数量来看,并不是最顶尖的,最大的27亿参数模型也只有Codex的四分之一不到。研究人员先是用语言模型评估常用的困惑度对一系列模型进行了比较。
困惑度(),用于衡量语言模型(LM)的好坏。困惑度越低,语言模型面对代码感到困惑的程度就越低,模型生成效果越好。
从图中来看,在C语言中意外取得了最好的效果(困惑度最低)。
用大量C语言训练的结果说明,即使模型整体原理不变(基于GPT-2),单纯改变训练用的代码集,也能训练出擅长不同语言风格的AI代码生成模型。可惜的是,从其他语言来看,生成的效果就完全没办法和Codex相比了:
例如,在主要用于评估代码的上,的能力远不如Codex好:
据论文分析,这可能是代码数据量、模型参数量不足等原因导致的。
此外,作者们也提到,做出的目的主要还是为了开源一个AI代码生成模型,让更多人参与研究和使用。
目前代码已经开源,无论是直接拿来用,还是试着在它的基础上开发新模型都可以。
感兴趣的小伙伴可以上手一试了~
审核编辑 黄昊宇