發表日期 3/14/2022, 1:36:43 PM
機器之心報道
編輯:杜偉
CMU 對現有開源和未開源的 AI 代碼生成模型進行瞭全麵深入的係統性評估,並分析瞭它們在 C、C++、Python 等 12 中不同編程語言中的代碼自動完成錶現。
最近,語言模型(Language Model, LM)在建模編程語言源代碼方麵展現齣瞭令人印象深刻的性能。這些模型擅長代碼自動生成以及從自然語言描述中生成代碼等下遊任務。當前 SOTA 大規模語言代碼模型(如 Austin et al. (2021))在基於 AI 的編程輔助領域已經取得瞭重大進展。此外,OpenAI 推齣的Codex已經部署在瞭現實世界生産工具 GitHub Copilot 中,用作一個基於用戶上下文自動生成代碼的 in-IDE 開發者助手。
盡管大規模語言代碼模型取得瞭巨大成功,但最強大的模型並不是公開可用的。這阻止瞭這些模型在資源充足公司之外的應用,並限製瞭資源匱乏機構在該領域的研究。以 Codex 為例,它通過黑盒 API 調用提供瞭該模型輸齣的收費訪問,但模型的權重和訓練數據不可用。這阻止瞭研究人員微調模型,無法適應代碼完成之外的領域和任務。無法訪問模型的內部也阻止瞭研究社區研究它們的其他關鍵方麵,例如可解釋性、用於實現更高效部署的模型蒸餾以及融閤檢索等額外組件。
同時,GPTNeo、GPT-J 和 GPT-NeoX 等中等和大規模預訓練語言模型是公開可用的。盡管這些模型是在包括新聞文章在內的多樣化文本、在綫論壇以及少量 GitHub 軟件存儲庫的混閤資源上訓練的,但它們可以用於生成具有閤理性能的源代碼。此外,還有一些僅在源代碼上進行訓練的全新開源語言模型,比如 CodeParrot 是在 180GB 的 Python 代碼上訓練的。
遺憾的是,這些模型的大小和訓練方案的多樣性以及彼此之間都缺乏比較,許多建模和訓練設計決策的影響仍不清楚。
在近日一篇論文中,來自 CMU 計算機科學學院的幾位研究者對跨不同編程語言的現有代碼模型――Codex、GPT-J、GPT-Neo、GPT-NeoX 和 CodeParrot 進行瞭係統評估。他們希望通過比較這些模型來進一步瞭解代碼建模設計決策的前景,並指齣關鍵的缺失一環,即迄今為止,沒有大規模開源語言模型專門針對多編程語言的代碼進行訓練。研究者推齣瞭三個此類模型,參數量從 160M 到 2.7B,並命名為「PolyCoder」。
論文地址:https://arxiv.org/pdf/2202.13169.pdf
項目地址:https://github.com/VHellendoorn/Code-LMs
研究者首先對 PolyCoder、開源模型和 Codex 的訓練語評估設置進行瞭廣泛的比較;其次,在 HumanEval 基準上評估這些模型,並比較瞭不同大小和訓練步的模型如何擴展以及不同的溫度如何影響生成質量;最後,由於 HumanEval 隻評估自然語言和 Python 生成,他們針對 12 種語言中的每一種都創建瞭相應未見過的評估數據集,以評估不同模型的睏惑度。
結果錶明,盡管 Codex 聲稱最擅長 Python 語言,但在其他編程語言中也錶現齣奇得好,甚至優於在 Pile(專為訓練語言模型設計的 825G 數據集)上訓練的 GPT-J 和 GPT-NeoX。不過,在 C 語言中,PolyCoder 模型取得的睏惑度低於包括 Codex 在內的所有其他模型。
下圖 1 展示瞭現有語言代碼模型及它們的大小和可用性,除 Codex 和 Austin'21 之外全部開源。
研究者還討論瞭代碼語言建模中使用的三種流行的預訓練方法,具體如下圖 2 所示。
評估設置
研究者使用外部和內部基準對所有模型展開瞭評估。
外在評估。代碼建模的最流行下遊任務之一是給定自然語言描述的代碼生成。遵循 Chen et al. (2021),他們在 HumanEval 數據集上評估瞭所有模型。該數據集上包含 164 個以代碼注釋和函數定義形式描述的提示,它們包括參數名稱和函數名稱以及用於判斷生成代碼是否正確的測試用例。
內在評估。為瞭評估不同模型的內在性能,他們在一組未見過的 GitHub 存儲庫上計算瞭每種語言的睏惑度。並且,為瞭防止 GPT-Neo 和 GPT-J 等模型在訓練到測試的過程中齣現數據泄露,他們在評估數據集上移除瞭在 Pile 訓練數據集的 GitHub 部分齣現的存儲庫。
模型比較
研究者主要選取瞭自迴歸預訓練語言模型,這類模型最適閤代碼完成任務。具體地,他們評估瞭 Codex,OpenAI 開發的這一模型目前部署在瞭現實世界,並在代碼完成任務中展現齣瞭卓越的性能。Codex 在 179GB(重復數據刪除後)的數據集上進行訓練,該數據集包含瞭 2020 年 5 月從 GitHub 中獲得的 5400 萬個公開 Python 存儲庫。
至於開源模型,研究者比較瞭 GPT 的三種變體模型 ――GPT-Neo(27 億參數)、GPT-J(60 億參數)和 GPT-NeoX(200 億參數)。其中,GPT-NeoX 是目前可用的最大規模的開源預訓練語言模型。這些模型都在 Pile 數據集上進行訓練。
目前,社區並沒有專門針對多編程語言代碼進行訓練的大規模開源語言模型。為瞭彌補這一缺陷,研究者在 GitHub 中涵蓋 12 種不同編程語言的存儲庫集閤上訓練瞭一個 27 億參數的模型――PolyCoder。
PolyCoder 的數據
原始代碼庫集閤。研究者針對 12 種流行編程語言剋隆瞭 2021 年 10 月 GitHub 上 Star 量超 50 的的最流行存儲庫。最開始未過濾的數據集為 631GB 和 3890 萬個文件。
接著進行數據預處理。PolyCoder 與 CodeParrot、Codex 的數據預處理策略的詳細對比如下錶 2 所示。
最後是重復數據刪除和過濾。整體來看,過濾掉非常大和非常小的文件以及刪除重復數據,將文件總量減少瞭 38%,數據集大小減少瞭 61%。下錶 1 展示瞭過濾前後數據集大小的變化。
PolyCoder 的訓練
考慮到預算,研究者選擇將 GPT-2 作為模型架構。為瞭探究模型大小縮放的影響,他們分彆訓練瞭參數量為 1.6 億、4 億和 27 億的 PolyCoder 模型,並使用 27 億參數的模型與 GPT-Neo 進行公平比較。
研究者使用 GPT-NeoX 工具包在單台機器上與 8 塊英偉達 RTX 8000 GPU 並行高效地訓練模型。訓練 27 億參數 PolyCode 模型的時間約為 6 周。在默認設置下,PolyCode 模型應該訓練 32 萬步。但受限於手頭資源,他們將學習率衰減調整至原來的一半,訓練瞭 15 萬步。
1.6 億、4 億和 27 億參數量 PolyCode 模型的訓練和驗證損失麯綫如下圖 3 所示。可以看到,即使訓練 15 萬步之後,驗證損失依然降低。
下錶 3 展示瞭訓練不同代碼模型中的設計決策和超參數比較情況。
實驗結果
外在評估
整體結果如下錶 4 所示。在現有模型中,PolyCoder 弱於類似規模的 GPT-Neo 和規模更小的 Codex 300M。總的來說,該模型不如 Codex 和 GPT-Neo/J,但強於 CodeParrot。
縮放影響。為瞭進一步瞭解模型參數量對 HumanEval 代碼完成性能的影響,研究者在下圖 4 中展示瞭 Pass@1、Pass@10 和 Pass@100 的性能變化。
溫度影響。上述所有結果都是通過采樣不同溫度的語言模型並為每個指標選擇最佳值獲得的。研究者同樣感興趣的是不同的溫度如何影響最終生成質量,結果如下圖 5 所示。
內在評估
不同模型在評估數據集上的睏惑度結果如下圖 6 所示。睏惑度得分最高為 4。可以看到,PolyCoder 在 C 語言中優於 Codex 和其他所有模型。並且,僅與開源模型相比,PolyCoder 在 C、JavaScript、Rust、Scala 和 TypeScript 中的錶現優於類似規模的 GPT-Neo 2.7B。
此外,除 C 語言之外的其他 11 種語言,包括 PolyCoder 在內的所有開源模型的錶現都弱於 Codex。