蕭簫 發自 凹非寺,量子位 | 公眾號 QbitAI
比Codex還會寫C語言的AI程式碼生成模型,現在開源了!
這段時間,用AI寫程式碼可以說是大火,其中最著名的要屬OpenAI的Codex和DeepMind的AlphaCode。

△基於Codex的Copilot
然而,這兩個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程式碼生成模型,讓更多人參與研究和使用。
目前程式碼已經開源,無論是直接拿來用,還是試著在它的基礎上開發新模型都可以。
感興趣的小夥伴可以上手一試了~
作者介紹

一作許方正(Frank Xu),目前在CMU讀博,研究方向是NLP、資訊抽取等,發表過多篇頂會論文,包括ICLR、ACL和EMNLP等。本碩畢業於上海交通大學,師從朱其立教授。

Uri Alon,在CMU進行博士後工作,研究方向是程式語言處理(PLP)、NLP和深度學習。

Graham Neubig,CMU助理教授,研究方向是NLP、機器翻譯和基於機器學習的自然語言理解。

Vincent J. Hellendoorn,CMU計算機助理教授,主要研究方向是軟體工程和機器學習,致力於利用智慧方法幫助軟體開發人員減少程式碼調試、程序最佳化等繁瑣工作的時間。
不知道作者們是否已經在用這個AI擼程式碼了(手動狗頭)
項目地址:
https://github.com/VHellendoorn/Code-LMs
論文地址:
https://arxiv.org/abs/2202.13169