天天看點

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

基于預訓練模型的生成技術在自然語言處理領域獲得了極大的成功。近年來,包括OpenAI GPT-3、華為PanGu-Alpha等在内的文本生成模型展示出了驚人的創造力,生成能力遠超以往的技術,逐漸成為序列生成的一種基本範式,并顯示出了巨大的商業潛力。

在這種範式的引導下,研究人員開始嘗試将語言生成模型引入到軟體工程領域,并在代碼生成與補全等任務中取得了突破性進展。其中,最廣為人知的當屬微軟釋出的AI輔助程式設計工具Copilot。

近日,華為諾亞方舟實驗室語音語義實驗室聯合華為雲PaaS技術創新實驗室一起基于PanGu-Alpha研制出了目前業界最新的模型PanGu-Coder [1]。

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

論文位址:https://arxiv.org/abs/2207.11280

與業界标杆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 模型架構

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

圖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)進行訓練。

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

圖2 PanGu-Coder的兩階段樣本構成方式

PanGu-Coder的兩階段樣本示例如圖2所示。圖2(左)為第一階段訓練樣本,圖2(右)為第二階段樣本。

在第一階段的訓練中,PanGu-Coder具備了自然語言和代碼交錯的語言模型的能力,而第二階段樣本則幫助PanGu-Coder在通過自然語言進行代碼生成的任務上得到了更好的适配。

【NLP】華為釋出「國産Copilot核心」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)才被認為生成正确。

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

表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資料集建構政策和分階段訓練設計的合理性,并展示了采用這種方式能夠在函數級代碼生成這一最重要場景上達到業界最優。

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

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

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

表3  PanGu-Coder在MBPP上的一次通過率以及十次通過率

為進一步提升模型函數級代碼生成的能力,PanGu-Coder收集了包括CodeContest、CodeSearchNet、APPS在内的業界已公開的大規模函數級資料集對模型進行微調(Fine-tune),得到了PanGu-Coder-FT。實驗結果表明,微調模型在MBPP以及HumanEval上的表現到了明顯提升(表4)。

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

表4  PanGu-Coder: 3億模型Fine-tune結果

實際編碼過程中,通常在實作一個函數之前,會預先設計若幹測試用例來測試函數實作結果。在HumanEval 164個函數描述中,有130個問題描述中包含了預設的測試用例。

為驗證基于測試用例的代碼生成的有效性,PanGu-Coder在進行多次生成(200次)的情況下使用這些測試用例對生成的代碼進行了過濾,并統計了過濾後代碼的通過率。從最終結果可以看出,利用測試用例對生成的代碼進行過濾可以極大地提升通過率,其中3億的模型可以達到41.52%。

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

表5  PanGu-Coder: 3億模型測試用例過濾結果

3.2 工具内測

PanGu-Coder模型已內建到了華為雲的代碼開發輔助工具中,可以在IDE中使用自然語言描述生成函數級的Python代碼,或者根據上下文進行補全。

如下是内測過程中産生的幾個實際的例子。

1. 常見的資料結構算法

Input: 使用冒泡排序的方法對數組進行排序。

OutPut:

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

2. SQL查詢功能

Input: 使用mysql, 從表「AI research」的所有記錄, 選擇address為「Hong Kong Science Park」的記錄,并顯示結果。

OutPut:

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

3. 使用機器學習工具建立文本分類器

Input: create a text binary sentiment classifier.

Output:

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

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:

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

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:

【NLP】華為釋出「國産Copilot核心」PanGu-Coder,而且真的能用中文哦!

4

『展望』

PanGu-Coder是基于華為的預訓練語言模型PanGu-Alpha演進而來的代碼生成模型。它在模型訓練的高效性以及函數級生成與補全性能上均達到業界領先的水準。

PanGu-Coder已經內建在華為雲的代碼開發輔助工具中,并正在内測。同時PanGu-Coder也在不斷的疊代與演進,以支援更多的程式設計語言、提供更好、更快的生成能力。

參考資料:

[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).

繼續閱讀