1. 概述
基于預(yù)訓(xùn)練模型的生成技術(shù)在自然語言處理領(lǐng)域獲得了極大的成功。近年來,包括OpenAI GPT-3、華為PanGu-Alpha等在內(nèi)的文本生成模型展示出了驚人的創(chuàng)造力,生成能力遠(yuǎn)超以往的技術(shù),逐漸成為序列生成的一種基本范式,并顯示出了巨大的商業(yè)潛力。在這種范式的引導(dǎo)下,研究人員開始嘗試將語言生成模型引入到軟件工程領(lǐng)域,并在代碼生成與補(bǔ)全等任務(wù)中取得了突破性進(jìn)展。其中,最廣為人知的當(dāng)屬微軟發(fā)布的AI輔助編程工具Copilot。
近日,華為諾亞方舟實驗室語音語義實驗室聯(lián)合華為云PaaS技術(shù)創(chuàng)新實驗室基于PanGu-Alpha研制出了當(dāng)前業(yè)界最新的模型PanGu-Coder [1]。與業(yè)界標(biāo)桿Copilot 背后的Codex[2]以及谷歌的AlphaCode等[3][4]相比,PanGu-Coder在代碼生成的一次通過率(PASS@1)指標(biāo)上不僅大幅超越同等規(guī)模的模型,甚至超越了參數(shù)量規(guī)模更大的模型。在支持的語言上,除英文外,PanGu-Coder在中文上同樣有出色的表現(xiàn),在未來也可以更好地服務(wù)使用中文的開發(fā)者。在內(nèi)測中還發(fā)現(xiàn):PanGu-Coder不但熟悉常見算法,還能熟練地使用各種API,甚至可以求解高等數(shù)學(xué)問題。相信經(jīng)過不斷打磨,PanGu-Coder將逐步成為編程人員的聰明助手。
2. 訓(xùn)練數(shù)據(jù)
PanGu-Coder使用了380GB的原始Python/ target=_blank class=infotextkey>Python文件,通過MD5校驗,限制文件大小、代碼長度以及AST解析等方式對原始文件進(jìn)行了清洗、去重等工作,最終得到了147GB的數(shù)據(jù)用作模型訓(xùn)練階段的輸入。
為了提升函數(shù)級代碼生成的效果,每個Python文件中的代碼語料均按照函數(shù)級的方式進(jìn)行了重新組織。例如:如果某個函數(shù)的定義之后緊接著對于函數(shù)的自然語言注釋,該注釋將被放置到函數(shù)定義之前,形成自然語言到代碼的配對數(shù)據(jù),并用以構(gòu)建訓(xùn)練數(shù)據(jù)集。
3. 訓(xùn)練方法
PanGu-Coder將訓(xùn)練分為了兩個階段:第一階段使用了全量的代碼數(shù)據(jù)進(jìn)行訓(xùn)練;第二階段選擇了更符合目標(biāo)任務(wù)的自然語言和代碼對作為訓(xùn)練數(shù)據(jù)對模型進(jìn)行調(diào)優(yōu)。
3.1 模型架構(gòu)

圖1 PanGu-Coder的模型結(jié)構(gòu)
由于PanGu-Alpha所采用的的自回歸Transformer架構(gòu)所具備強(qiáng)大的文本生成能力,在PanGu-Coder的訓(xùn)練中也沿用了此模型架構(gòu)用于代碼生成任務(wù),其架構(gòu)如圖1所示。同時,PanGu-Coder也沿用了PanGu-Alpha的中英文多語詞表,從而同時具備支持中英文輸入的能力。
3.2 訓(xùn)練方法
受課程學(xué)習(xí)(Currilum Learning)啟發(fā),PanGu-Coder采用了兩階段訓(xùn)練的方式進(jìn)行訓(xùn)練:1)在原始語料上,采用傳統(tǒng)的自回歸語言建模(Causal language modeling,CLM)進(jìn)行訓(xùn)練;2)在經(jīng)過篩選的語料上,僅對<自然語言,代碼>平行句對樣本,采用創(chuàng)新的代碼自回歸語言建模(Code-CLM)進(jìn)行訓(xùn)練。

圖2 PanGu-Coder的兩階段樣本構(gòu)成方式
PanGu-Coder的兩階段樣本示例如圖2所示。圖2(左)為第一階段訓(xùn)練樣本,圖2(右)為第二階段樣本。在第一階段的訓(xùn)練中,PanGu-Coder具備了自然語言和代碼交錯的語言模型的能力,而第二階段樣本則幫助PanGu-Coder在通過自然語言進(jìn)行代碼生成的任務(wù)上得到了更好的適配。

圖3 PanGu- Coder: Code-CLM 損失函數(shù)
在第二階段的訓(xùn)練中,PanGu-Coder采用了專門為代碼生成而設(shè)計的Code-CLM作為其損失函數(shù)。如圖3所示。在訓(xùn)練過程中,Code-CLM僅保留代碼部分的Loss計算結(jié)果,同時忽略了自然語言部分的Loss。Code-CLM損失函數(shù)的采用,讓PanGu-Coder更專注于學(xué)習(xí)生成代碼序列的同時減少了自然語言序列帶來的干擾,使得PanGu-Coder的第二階段訓(xùn)練數(shù)據(jù)與訓(xùn)練目標(biāo)都更接近代碼生成任務(wù)的真實場景。
4. 實驗結(jié)果
4.1 模型生成的通過率
模型的一次生成通過率(PASS@1)是代碼語言生成模型最重要的能力衡量指標(biāo)。PanGu-Coder采用了OpenAI發(fā)布的HumanEval以及谷歌發(fā)布的MBPP兩個函數(shù)級代碼生成任務(wù)的數(shù)據(jù)集作為評測目標(biāo)。表1給出了HumanEval中一個非常簡單的例子。PanGu-Coder生成的代碼需要通過單元測試(Unit Tests)才被認(rèn)為生成正確。

表1 HumanEval 示例
在HumanEval數(shù)據(jù)集上,與業(yè)界標(biāo)桿Codex(OpenAI)以及包括AlphaCode(google Deep Mind)、CodeGen(Saleforce)、 INCoder(Meta)等模型相比,PanGu-Coder在3億和26億模型上的一次通過率PASS@1均達(dá)到最優(yōu)。值得一提的是,3億參數(shù)的PanGu-Coder模型(PASS@1=17.07%)超越了Codex (PASS@1=16.22%)接近7億參數(shù)的模型結(jié)果,基本持平了谷歌10億的模型(表2)。在MBPP數(shù)據(jù)集上, 26億參數(shù)的模型超越了META INCoder 接近70億參數(shù)的模型效果(表3)。另外,在訓(xùn)練的充分程度上,PanGu-Coder是所有模型中所用數(shù)據(jù)量以及計算量最小(train tokens)的模型。這一結(jié)果充分說明了PanGu-Coder數(shù)據(jù)集構(gòu)建策略和分階段訓(xùn)練設(shè)計的合理性,并展示了采用這種方式能夠在函數(shù)級代碼生成這一最重要場景上達(dá)到業(yè)界最優(yōu)。

表2 PanGu-Coder在HumanEval上的一次通過率以及十次通過率

表3 PanGu-Coder在MBPP上的一次通過率以及十次通過率
為進(jìn)一步提升模型函數(shù)級代碼生成的能力,PanGu-Coder收集了包括CodeContest、CodeSearc.NET、AppS在內(nèi)的業(yè)界已公開的大規(guī)模函數(shù)級數(shù)據(jù)集對模型進(jìn)行微調(diào)(Fine-tune),得到了PanGu-Coder-FT。實驗結(jié)果表明,微調(diào)模型在MBPP以及HumanEval上的表現(xiàn)到了明顯提升(表4)。

表4 PanGu-Coder: 3億模型Fine-tune結(jié)果
實際編碼過程中,通常在實現(xiàn)一個函數(shù)之前,會預(yù)先設(shè)計若干測試用例來測試函數(shù)實現(xiàn)結(jié)果。在HumanEval 164個函數(shù)描述中,有130個問題描述中包含了預(yù)設(shè)的測試用例。為驗證基于測試用例的代碼生成的有效性,PanGu-Coder在進(jìn)行多次生成(200次)的情況下使用這些測試用例對生成的代碼進(jìn)行了過濾,并統(tǒng)計了過濾后代碼的通過率。從最終結(jié)果可以看出,利用測試用例對生成的代碼進(jìn)行過濾可以極大地提升通過率,其中3億的模型可以達(dá)到41.52%。

表5 PanGu-Coder: 3億模型測試用例過濾結(jié)果
4.2 工具內(nèi)測
PanGu-Coder模型已集成到了華為云的代碼開發(fā)輔助工具中,可以在IDE中使用自然語言描述生成函數(shù)級的Python代碼,或者根據(jù)上下文進(jìn)行補(bǔ)全。
如下是內(nèi)測過程中產(chǎn)生的幾個實際的例子。
(1)常見的數(shù)據(jù)結(jié)構(gòu)算法
Input: 使用冒泡排序的方法對數(shù)組進(jìn)行排序。
OutPut:

(2)SQL查詢功能
Input: 使用MySQL, 從表 “AI research” 的所有記錄, 選擇address為"Hong Kong Science Park" 的記錄,并顯示結(jié)果.
OutPut:

(3)使用機(jī)器學(xué)習(xí)工具創(chuàng)建文本分類器
Input: create a text binary sentiment classifier .
Output:

(4)高等數(shù)學(xué)題1: 求微分
Input: Using sympy find the derivative of the function using the definition of the derivative.f(x)= (x**2-1)/(2*x-3).
Output:

(5)高等數(shù)學(xué)題2,求概率分布
Input: One generates a number x from a uniform distribution on the interval [0, θ].One decides to test H0 : θ = 2 against HA : θ = 2 by rejecting H0 if x ≤ 0.1 or x ≥ 1.9.Using simulations, compute the probability of a type I error.
Output:

5. 展望
PanGu-Coder是基于華為的預(yù)訓(xùn)練語言模型PanGu-Alpha演進(jìn)而來的代碼生成模型,在模型訓(xùn)練的高效性以及函數(shù)級生成與補(bǔ)全性能上均達(dá)到業(yè)界領(lǐng)先的水平。目前PanGu-Coder已經(jīng)集成在華為云的代碼開發(fā)輔助工具中進(jìn)行內(nèi)測。同時PanGu-Coder也在不斷的迭代與演進(jìn),以支持更多的編程語言、提供更好、更快的生成能力。
文章來自 PaaS技術(shù)創(chuàng)新Lab,PaaS技術(shù)創(chuàng)新Lab隸屬于華為云,致力于綜合利用軟件分析、數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)等技術(shù),為軟件研發(fā)人員提供下一代智能研發(fā)工具服務(wù)的核心引擎和智慧大腦。我們將聚焦軟件工程領(lǐng)域硬核能力,不斷構(gòu)筑研發(fā)利器,持續(xù)交付高價值商業(yè)特性!加入我們,一起開創(chuàng)研發(fā)新“境界”!
PaaS技術(shù)創(chuàng)新Lab主頁鏈接:https://www.huaweicloud.com/lab/paas/home.html
參考文獻(xiàn):
[1] Christopoulou, Fenia, et al. "PanGu-Coder: Program Synthesis with Function-Level Language Modeling." arXiv preprint arXiv:2207.11280 (2022).
[2] Chen, Mark, et al. "Evaluating large language models trained on code." arXiv preprint arXiv:2107.03374 (2021).
[3] Li, Yujia, et al. "Competition-level code generation with AlphaCode." arXiv preprint arXiv:2203.07814 (2022).
[4] Nijkamp, Erik, et al. "A conversational paradigm for program synthesis." arXiv preprint arXiv:2203.13474 (2022).