來源:量子位
比 Codex 還會寫 C 語言的 AI 代碼生成模型,現在開源了!這段時間,用 AI 寫代碼可以說是大火,其中最著名的要屬 OpenAI 的 Codex 和 DeepMind 的 AlphaCode。然而,這兩個 AI 模型,全都沒有開源:其中 AlphaCode 只給出了一些測試樣例,而 Codex 只開放了 API。
△基于 Codex 的 Copilot
為此,來自 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 代碼生成模型,讓更多人參與研究和使用。
目前代碼已經開源,無論是直接拿來用,還是試著在它的基礎上開發新模型都可以。
感興趣的小伙伴可以上手一試了 ~
作者介紹
一作許方正(Frank Xu),目前在 CMU 讀博,研究方向是 NLP、信息抽取等,發表過多篇頂會論文,包括 ICLR、ACL 和 EMNLP 等。本碩畢業于上海交通大學,師從朱其立教授。
Uri Alon,在 CMU 進行博士后工作,研究方向是編程語言處理(PLP)、NLP 和深度學習。
Graham Neubig,CMU 助理教授,研究方向是 NLP、機器翻譯和基于機器學習的自然語言理解。
Vincent J. Hellendoorn,CMU 計算機助理教授,主要研究方向是軟件工程和機器學習,致力于利用智能方法幫助軟件開發人員減少代碼調試、程序優化等繁瑣工作的時間。
不知道作者們是否已經在用這個 AI 擼代碼了(手動狗頭)