程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

微軟研究院AI頭條發表於2020-09-30

一直以來,微軟秉承為開發者賦能的使命。在2020年 Build 大會上,微軟執行長 Satya Nadella 表示,“GitHub 擁有超過5000萬使用者,Visual Studio Code 是最受開發者歡迎的程式碼編輯器。微軟將為開發者打造最完整的開發工具鏈,結合 GitHub、Visual Studio 和 Azure,幫助開發者實現從想法到程式碼、從程式碼到雲的轉化。”同時,微軟在自然語言理解和深度學習領域有著深厚的積累,不只有大資料、大模型、強算力支撐著模型的訓練,還有豐富的模型部署及最佳化經驗,幫助人工智慧演算法真正落地到產品中。

基準資料(Benchmark Dataset)對一個領域的發展至關重要。例如,ImageNet(史丹佛大學)極大地推動了計算機視覺領域的發展,類似包含多種任務的 GLUE(紐約大學)和 XGLUE(https://microsoft.github.io/XGLUE/,微軟亞洲研究院自然語言計算組)資料集在自然語言處理領域也產生了非常深遠的影響。近年來,統計機器學習演算法,尤其是深度學習演算法在很多程式碼智慧任務(如程式碼檢索、程式碼補全、程式碼糾錯)上都取得了不錯的進展,但是,程式碼智慧領域仍缺少一個能覆蓋多種任務的基準資料,以便從不同角度衡量模型的優劣。

近期,微軟亞洲研究院(自然語言計算組)聯合 Visual Studio 和必應搜尋釋出了程式碼智慧領域首個大規模多工的新基準——CodeXGLUE(https://github.com/microsoft/CodeXGLUE)。該基準可覆蓋 code-code、code-text、text-code、text-text 四個類別,包含10個任務及14個資料集,具體有:程式碼克隆檢測、程式碼缺陷檢測、程式碼完形填空、程式碼補全、程式碼糾錯、程式碼翻譯、程式碼檢索、程式碼生成、程式碼註釋生成、程式碼文件翻譯十項任務。其中,有自建資料集,也有在業界已有影響力的資料集。

十項全能評測集上線
程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

具體來說,CodeXGLUE 中包含如下十項任務:

1. 程式碼克隆檢測(Clone Detection)。該任務是為了檢測程式碼與程式碼之間的語義相似度,包含兩個外部公開資料集,但任務定義稍有不同。在第一個資料集中,給定兩個程式碼作為輸入,要求做0/1二元分類,1表示兩段程式碼語義相同,0表示兩段程式碼語義不同。在第二個資料集中,則給定一段程式碼作為輸入,任務是從給定的程式碼庫中檢索與輸入程式碼語義相同的程式碼。

2. 程式碼缺陷檢測(Defect Detection)。該任務是檢測一段程式碼是否包含可以導致軟體系統受到攻擊的不可靠程式碼,例如資源洩露、UAF 漏洞和 DoS 攻擊等。該任務中使用了外部公開資料集。

3. 程式碼完形填空(Cloze Test)。先給定一段程式碼,但程式碼中的部分內容被掩蓋住,該任務要求預測出被掩蓋的程式碼。研究員們將該任務定義為多項選擇題的形式,並構建了兩個資料集。在第一個資料集中,被掩蓋住的程式碼可以來自於程式碼中的任意字元;在第二個資料集中,則試圖更有針對性地測試系統對程式碼 max、min 函式的理解能力。

4. 程式碼補全(Code Completion),也就是給定已經寫好的部分程式碼。該任務能夠自動預測出後續的程式碼,具體包含兩個設定,分別是詞彙級別(Token-level)和行級別(Line-level)的補全。顧名思義,前者的任務是補全下一個詞彙,而後者的任務是補全一整行程式碼。詞彙級任務使用了兩個被外部廣泛使用的資料。行級別的任務則是在詞彙級別任務的資料上自動構建的資料。

5. 程式碼翻譯(Code Translation)。該任務是把程式碼從一種程式語言翻譯到另一種程式語言。研究員們構建了一個 Java 到 C# 的程式碼翻譯資料集。

6. 程式碼檢索(Code Search)。該任務是為了檢測自然語言與程式碼之間的語義相似度,包含兩個資料集,具體定義稍有不同:在第一個資料集中,給定一個自然語言作為輸入,任務是從給定程式碼庫中檢索與輸入自然語言語義最相近的程式碼,研究人員為該資料新構建了一個測試集,用來更好地測試系統的深層語義理解能力。在第二個資料集中,給定自然語言-程式碼對作為輸入,要求系統做0/1二元分類,1表示語義相似,0表示語義不相似,研究員們同樣為該任務構造了新的測試資料集,測試資料的自然語言來自必應搜尋引擎,可以更好地反應真實使用者的查詢習慣。

7. 程式碼糾錯(Code Refinement)。 給定一段有 bug 或者複雜的程式碼作為輸入,該任務要求生成被最佳化後的程式碼。該任務中使用了一個外部公開的資料集。

8. 程式碼生成(Text-to-code Generation)。給定自然語言註釋作為輸入,該任務要求自動生成函式的原始碼。該任務中使用了外部的公開資料集。

9. 程式碼註釋生成(Code Summarization)。給定一段函式程式碼作為輸入,該任務要求自動生成對應的自然語言註釋。該任務中使用了外部公開資料集。 

10. 文件翻譯(Documentation Translation)。該任務的目的是自動將程式碼文件從一種自然語言翻譯到另一種自然語言,如從英文翻譯到中文。該任務中構建了新的資料集。

CodeXGLUE 釋出在 GitHub 上,參賽者可首先透過 Git Clone 命令下載全部資源。最外層目錄對應了四個任務分類,即 Code-code、 Code-text、Text-code 和 Text-text。研究員們為每個任務和資料集都建立了子資料夾,其中包括資料、程式碼、評測指令碼以及說明文件。對於來自外部的公開資料集,則提供了資料下載的指令碼;同時,對於需要做預處理的部分資料,也提供了預處理的指令碼。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣
三大基線系統模型:CodeBERT、Encoder-Decoder和CodeGPT

為了讓參賽者更容易參與到 CodeXGLUE 中,研究人員為每個任務搭建了目前較為流行的、基於神經網路的基線系統(Baseline)。這些基線系統可以被歸為三類:第一類是基於 CodeBERT 預訓練模型的系統,能夠支援如分類、檢索等程式碼理解任務;第二類是基於 CodeGPT 預訓練模型的系統,能夠支援程式碼補全和程式碼生成任務;第三類是編碼器-解碼器模型(Encoder-Decoder),能夠更好地支撐如程式碼翻譯、程式碼糾錯等生成任務。下圖給出了三類基線系統的總況,接下來將分別對每個基線系統進行介紹。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

基於 CodeBERT 預訓練模型的系統:在自然語言處理領域,BERT 在諸多自然語言理解任務中都展現了非常出色的效能。BERT 的基本思想是把模型的學習過程分為預訓練(Pre-training)和微調(Fine-tuning)兩個步驟。在預訓練階段,BERT 會從海量無標註的文字中透過自監督最佳化目標,如語言模型和掩碼語言模型,學習通用的詞彙上下文語義表示;在微調階段,已經訓練好的模型引數會在下游任務的標註資料上進行微調。受 BERT 的啟發,研究員們為參賽者提供了 CodeBERT 模型,即面向程式語言的預訓練模型。

CodeXGLUE 中的很多工同時涉及到文字和程式碼,因此該系統提供了在 code-text pair 上預訓練的 CodeBERT 模型。該模型在訓練過程中同時會把程式碼和文字作為輸入,這樣的設定可促進模型學習文字和程式碼之間的語義互動(相關論文:CodeBERT: A Pre-Trained Model for Programming and Natural Languages,https://arxiv.org/abs/2002.08155)。由於程式碼嚴格遵循程式語言的語法規範,所以程式碼的內容具有很強的結構性,基於這點考慮,研究人員進一步提出了一種融合程式碼結構的預訓練模型,如下圖所示。具體來說就是利用程式碼的資料流資訊,並圍繞資料流提出了兩種新的預訓練任務。模型的具體細節可參見論文:GraphCodeBERT: Pre-training Code Representations with Data Flow (https://arxiv.org/abs/2009.08366 )。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

基於 CodeGPT 預訓練模型的系統:GPT 模型在自然語言生成任務上取得了非常出色的效果,也有學者發現在程式語言上預訓練 GPT 模型在程式碼生成任務上表現得很不錯。為了幫助參賽者更快地搭建模型,研究員們分別在 Python 和 Java 兩種程式語言上預訓練了 GPT 模型,稱之為 CodeGPT(如下圖所示)。模型的訓練資料來自CodeSearchNet,訓練目標是傳統的語言模型。參賽者只需在下游任務中對 CodeGPT 進行微調,即可在程式碼生成和補全任務上取得當前最好的效能。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

編碼器-解碼器模型系統:為了支援如程式碼翻譯、程式碼糾錯等 Sequence-to-sequence 生成問題,該系統提供了基於 Transformer 的 Encoder-Decoder 框架。下圖展示了一個 C++ 到 Python 的程式碼翻譯樣例,Encoder 端接收了 C++ 的程式碼作為輸入,Decoder 端序列化地輸出了 Python 程式碼。模型的框架也支援在 Encoder 端使用 CodeBERT 初始化模型引數,以更好地表示程式碼的語義。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

研究人員在兩個 P100 GPU 上計算了每個資料集上進行模型訓練和推理的時間,如下表所示。可以看出,模型訓練時長在一小時到三十小時內,推理的過程則更快,最快的資料僅需要幾分鐘,最耗時的需要兩個小時。這樣的資源消耗通常是可以被大部分參賽者所接受的。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣
全新評測指標CodeBLEU,定義模型優劣標準

評測指標的選取至關重要,它定義了區分模型優劣的標準。目前,業界大多使用 BLEU 評價生成程式碼的質量,其基本思想是計算生成程式碼和標準答案程式碼 ngram 的匹配程度。然而,程式碼蘊含著豐富的語法和語義結構,BLEU 無法捕捉程式碼的結構特性。因此,微軟亞洲研究院的研究員們提出了 CodeBLEU 來更好地評價自動生成程式碼的質量。CodeBLEU 的基本思想是不僅使用字元的 ngram 匹配程度,還要同時考慮程式碼的關鍵字資訊、AST 結構化子樹資訊以及程式碼變數之間的資料流資訊。CodeBLEU 的最終結果由各個子部分加權求和獲得。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

為了驗證 CodeBLEU 指標的有效性,研究人員分別在程式碼生成、程式碼翻譯和程式碼糾錯上進行了實驗。不僅為每個任務提供了多個系統的模型輸出,並分別使用 BLEU、CodeBLEU 評測各個系統,此外還請了熟悉程式語言的人工標註人員為每個模型的輸出打分。透過下圖可以看出,CodeBLEU 與標註人員打分的皮爾遜相關係數更高,從而驗證了該指標的有效性。更多細節,請參見論文:CodeBLEU: a Method for Automatic Evaluation of Code Synthesis (https://arxiv.org/abs/2009.10297 )。

程式碼智慧新基準資料集CodeXGLUE來襲,多角度衡量模型優劣

為了方便研究人員使用,微軟亞洲研究院的研究員們還為每個任務和資料集提供了基線系統。歡迎學術界和工業界的同行來了解和使用 CodeXGLUE,也歡迎大家提供寶貴的意見和建議。

CodeXGLUE:

https://github.com/microsoft/CodeXGLUE

相關文章