举荐语:
近期,代码的大型语言模型 (LM)在实现代码和从自然语言形容合成代码方面显示出微小的后劲。然而,以后最先进的代码 LM(例如 Codex (Chen et al., 2021))尚未公开,留下了许多对于其模型和数据设计决策的问题。
援用
咱们的指标是通过对各种编程语言中最大的现有模型的零碎评估来填补其中的一些空白:Codex、GPT-J、GPT-Neo、GPT-NeoX-20B 和 CodeParrot。只管 Codex 自身不是开源的,但咱们发现,针对自然语言建模,现有的开源模型的确在某些编程语言中获得了靠近的后果。咱们进一步确定了一个重要的缺失局部,即专门在多语言代码语料库上训练的大型开源模型。咱们公布了一个新模型 PolyCoder,它具备基于 GPT-2 架构的 2.7B 参数,该模型在单台机器上应用 12 种编程语言的 249GB 代码进行了训练。在 C 编程语言中,PolyCoder 优于包含 Codex 在内的所有模型。咱们训练有素的模型是开源的,可在此 https URL 上公开取得,这使得该畛域的将来钻研和利用成为可能。
援用
—— MobTech 袤博科技资深 java 开发工程师 零零发 MobTech 袤博
比 Codex 还会写 C 语言的 AI 代码生成模型,当初开源了!
这段时间,用 AI 写代码能够说是大火,其中最驰名的要属 OpenAI 的 Codex 和 DeepMind 的 AlphaCode。
然而,这两个 AI 模型,全都没有开源:
其中 AlphaCode 只给出了一些测试样例,而 Codex 只凋谢了 API。
为此,来自 CMU 的几个钻研人员,用 GPT- 2 搞出了一个名叫 PolyCoder 的 AI 代码生成模型,而且还是开源的。
据钻研人员示意,尽管 PolyCoder 最大只有 27 亿参数(相比 Codex 有 120 亿参数),但它用 C 语言写进去的代码,比 Codex 的成果还要好。
这外面到底有什么秘诀?
用 12 种编程语言代码集训练
首先来看训练用的数据集,这也是 PolyCoder 的最大特点之一。
此前,包含 Codex、CodeParrot 等 AI 代码生成模型,次要都是基于 Python 语言的代码来训练。
例如 Codex 的评估数据集之一 HumanEval,评估的也是生成 Python 代码的成果。相比之下,PolyCoder 采纳了多种编程语言代码集来训练,一共有 12 种:
C、C#、C++、Go、Java、JavaScript、PHP、Python、Ruby、Rust、Scala 和 TypeScript。
其中,C 语言的代码量是最多的,达到了 221GB;而 Python 代码的数据量比 Codex 和 CodeParrot 用得都要少。
这里 PolyCoder 用的是 GitHub 上的公开代码,次要选取的是各种编程语言中比拟受欢迎的库,每个库至多有 50 Stars。
据钻研人员示意,每种编程语言库的 Stars 总数加起来不超过 25k,以防止模型生成的代码成果太过于歪斜最风行的编程语言(通常编程语言越风行,库的 Stars 就越多)。
通过提取库中的文件、通过简略解决(包含打消反复代码)后,一共筛选出大概 254GB 的数据用于训练。
而后是 预训练 的办法。
语言模型的预训练方法通常有三种。
第一种是自左向右的语言模型,依据上文预测下文,比拟实用于 代码生成 等;第二种是掩蔽语言模型,基于上下文预测屏蔽片段,比拟适宜 代码分类 等;第三种是编解码器模型,比拟实用于 代码正文 等工作。
这里 PolyCoder 次要采纳的是第一种预训练方法。
相比于同样采纳 GPT- 2 训练的 CodeParrot 和 Codex,PolyCoder 在超参数设置上也略微有一些差别:
PolyCoder 一共提供了三种不同的模型,别离有 27 亿参数、4 亿参数和 1.6 亿参数,钻研人员能够依据本身需要和不同的训练能力来选取适合的模型。
那么,最终训练进去的 AI 模型,代码生成成果如何?
C 语言写得尤其好,但 Python 不行
钻研人员将 PolyCoder 与已有的 AI 代码生成模型进行了比照。
因为 AlphaCode 不好比拟(接口没凋谢),所以钻研人员次要剖析了上面这些模型,包含 GPT-Neo、CodeParrot 和 Codex 等。
其中蓝色的是开源的,橙色的是没开源的:
从参数量来看,PolyCoder 并不是最顶尖的,最大的 27 亿参数模型也只有 Codex 的四分之一不到。
钻研人员先是用语言模型评估罕用的 困惑度 对一系列模型进行了比拟。
困惑度(Perplexity),用于掂量语言模型(LM)的好坏。困惑度越低,语言模型面对代码感到困惑的水平就越低,模型生成成果越好。
从图中来看,PolyCoder 在 C 语言中意外获得了最好的成果(困惑度最低)。
用大量 C 语言训练 PolyCoder 的后果阐明,即便模型整体原理不变(基于 GPT-2),单纯扭转训练用的代码集,也能训练出善于不同语言格调的 AI 代码生成模型。
惋惜的是,从其余语言来看,生成的成果就齐全没方法和 Codex 相比了:
例如,在次要用于评估 Python 代码的 HumanEval 上,PolyCoder 的能力远不如 Codex 好:
据论文剖析,这可能是 Python 代码数据量、模型参数量有余等起因导致的。
此外,作者们也提到,做出 PolyCoder 的目标次要还是为了开源一个 AI 代码生成模型,让更多人参加钻研和应用。
目前代码曾经开源,无论是间接拿来用,还是试着在它的根底上开发新模型都能够。
感兴趣的小伙伴能够上手一试了~