華為發布「國產Copilot內核」PanGu-Coder,而且真的能用中文哦!
新智元報道
【新智元導讀】最近,華為基于PanGu-Alpha研制出了當前業界最新的模型PanGu-Coder,不但熟悉常見算法,還能熟練地使用各種API,甚至可以求解高等數學問題。作為國產函數級代碼生成模型,PanGu-Coder在中文上表現也十分出色!
基于預訓練模型的生成技術在自然語言處理領域獲得了極大的成功。近年來,包括OpenAI GPT-3、華為PanGu-Alpha等在內的文本生成模型展示出了驚人的創造力,生成能力遠超以往的技術,逐漸成為序列生成的一種基本范式,并顯示出了巨大的商業潛力。
在這種范式的引導下,研究人員開始嘗試將語言生成模型引入到軟件工程領域,并在代碼生成與補全等任務中取得了突破性進展。其中,最廣為人知的當屬微軟發布的AI輔助編程工具Copilot。
近日,華為諾亞方舟實驗室語音語義實驗室聯合華為云PaaS技術創新實驗室一起基于PanGu-Alpha研制出了當前業界最新的模型PanGu-Coder [1]。
與業界標桿Copilot背后的Codex[2]以及谷歌的AlphaCode等[3][4]相比,PanGu-Coder在代碼生成的一次通過率(PASS@1)指標上不僅大幅超越同等規模的模型,甚至超越了參數量規模更大的模型。
在支持的語言上,除英文外,PANGU-Coder在中文上同樣有出色的表現,在未來也可以更好地服務使用中文的開發者。
在內測中還發現:PanGu-Coder不但熟悉常見算法,還能熟練地使用各種API,甚至可以求解高等數學問題。相信經過不斷打磨,PanGu-Coder將逐步成為編程人員的聰明助手。
1. 訓練數據
PanGu-Coder使用了380GB的原始Python文件,通過MD5校驗,限制文件大小、代碼長度以及AST解析等方式對原始文件進行了清洗、去重等工作,最終得到了147GB的數據用作模型訓練階段的輸入。
為了提升函數級代碼生成的效果,每個Python文件中的代碼語料均按照函數級的方式進行了重新組織。例如:如果某個函數的定義之后緊接著對于函數的自然語言注釋,該注釋將被放置到函數定義之前,形成自然語言到代碼的配對數據,并用以構建訓練數據集。
2. 訓練方法
PanGu-Coder將訓練分為了兩個階段:第一階段使用了全量的代碼數據進行訓練;第二階段選擇了更符合目標任務的自然語言和代碼對作為訓練數據對模型進行調優。
2.1 模型架構
圖1 PanGu-Coder的模型結構
由于PanGu-Alpha所采用的的自回歸Transformer架構所具備強大的文本生成能力,在PanGu-Coder的訓練中也沿用了此模型架構用于代碼生成任務,其架構如圖1所示。同時,PanGu-Coder也沿用了PanGu-Alpha的中英文多語詞表,從而同時具備支持中英文輸入的能力。
2.2 訓練方法
受課程學習(Currilum Learning)啟發,PanGu-Coder采用了兩階段訓練的方式進行訓練:
1)在原始語料上,采用傳統的自回歸語言建模(Causal language modeling,CLM)進行訓練;
2)在經過篩選的語料上,僅對<自然語言,代碼>平行句對樣本,采用創新的代碼自回歸語言建模(Code-CLM)進行訓練。
圖2 PanGu-Coder的兩階段樣本構成方式
PanGu-Coder的兩階段樣本示例如圖2所示。圖2(左)為第一階段訓練樣本,圖2(右)為第二階段樣本。
在第一階段的訓練中,PanGu-Coder具備了自然語言和代碼交錯的語言模型的能力,而第二階段樣本則幫助PanGu-Coder在通過自然語言進行代碼生成的任務上得到了更好的適配。
圖3 PanGu- Coder: Code-CLM 損失函數
在第二階段的訓練中,PanGu-Coder采用了專門為代碼生成而設計的Code-CLM作為其損失函數。如圖3所示。在訓練過程中,Code-CLM僅保留代碼部分的Loss計算結果,同時忽略了自然語言部分的Loss。
Code-CLM損失函數的采用,讓PanGu-Coder更專注于學習生成代碼序列的同時減少了自然語言序列帶來的干擾,使得PanGu-Coder的第二階段訓練數據與訓練目標都更接近代碼生成任務的真實場景。
3. 實驗結果
3.1 模型生成的通過率
模型的一次生成通過率(PASS@1)是代碼語言生成模型最重要的能力衡量指標。PanGu-Coder采用了OpenAI發布的HumanEval以及谷歌發布的MBPP兩個函數級代碼生成任務的數據集作為評測目標。
表1給出了HumanEval中一個非常簡單的例子。PanGu-Coder生成的代碼需要通過單元測試(Unit Tests)才被認為生成正確。
表1 HumanEval 示例
在HumanEval數據集上,與業界標桿Codex(OpenAI)以及包括AlphaCode(Google Deep Mind)、CodeGen(Saleforce)、 INCoder(Meta)等模型相比,PanGu-Coder在3億和26億模型上的一次通過率PASS@1均達到最優。
值得一提的是,3億參數的PanGu-Coder模型(PASS@1=17.07%)超越了Codex (PASS@1=16.22%)接近7億參數的模型結果,基本持平了谷歌10億的模型(表2)。在MBPP數據集上, 26億參數的模型超越了META INCoder接近70億參數的模型效果(表3)。另外,在訓練的充分程度上,PanGu-Coder是所有模型中所用數據量以及計算量最小(train tokens)的模型。
這一結果充分說明了PanGu-Coder數據集構建策略和分階段訓練設計的合理性,并展示了采用這種方式能夠在函數級代碼生成這一最重要場景上達到業界最優。
表2 PanGu-Coder在HumanEval上的一次通過率以及十次通過率
表3 PanGu-Coder在MBPP上的一次通過率以及十次通過率
為進一步提升模型函數級代碼生成的能力,PanGu-Coder收集了包括CodeContest、CodeSearchNet、APPS在內的業界已公開的大規模函數級數據集對模型進行微調(Fine-tune),得到了PanGu-Coder-FT。實驗結果表明,微調模型在MBPP以及HumanEval上的表現到了明顯提升(表4)。
表4 PanGu-Coder: 3億模型Fine-tune結果
實際編碼過程中,通常在實現一個函數之前,會預先設計若干測試用例來測試函數實現結果。在HumanEval 164個函數描述中,有130個問題描述中包含了預設的測試用例。
為驗證基于測試用例的代碼生成的有效性,PanGu-Coder在進行多次生成(200次)的情況下使用這些測試用例對生成的代碼進行了過濾,并統計了過濾后代碼的通過率。從最終結果可以看出,利用測試用例對生成的代碼進行過濾可以極大地提升通過率,其中3億的模型可以達到41.52%。
表5 PanGu-Coder: 3億模型測試用例過濾結果
3.2 工具內測
PanGu-Coder模型已集成到了華為云的代碼開發輔助工具中,可以在IDE中使用自然語言描述生成函數級的Python代碼,或者根據上下文進行補全。
如下是內測過程中產生的幾個實際的例子。
Input: 使用冒泡排序的方法對數組進行排序。
OutPut:
2. SQL查詢功能
Input: 使用mysql, 從表「AI research」的所有記錄, 選擇address為「Hong Kong Science Park」的記錄,并顯示結果。
OutPut:
3. 使用機器學習工具創建文本分類器
Input: create a text binary sentiment classifier.
Output:
4. 高等數學題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. 高等數學題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:
4. 展望
PanGu-Coder是基于華為的預訓練語言模型PanGu-Alpha演進而來的代碼生成模型。它在模型訓練的高效性以及函數級生成與補全性能上均達到業界領先的水平。
PanGu-Coder已經集成在華為云的代碼開發輔助工具中,并正在內測。同時PanGu-Coder也在不斷的迭代與演進,以支持更多的編程語言、提供更好、更快的生成能力。
本文來自微信公眾號“新智元”(ID:AI_era),作者:新智元,36氪經授權發布。
