新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

杜佳豪發表於2020-02-22

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

在這篇名為《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》的論文中,來自哈工大、中山大學和微軟的研究人員詳細介紹了這一新預訓練模型,該模型可處理雙模態資料:程式語言(PL)和自然語言(NL)。

CodeBERT 學習能夠支援下游 NL-PL 應用的通用表示,比如自然語言程式碼搜尋、程式碼文件生成,經實驗 CodeBERT 模型在兩項任務均取得 SOTA 效果,同時研究者構建了 NL-PL 探測資料集,CodeBERT 在 zero-shot 設定中的效能表現也持續優於 RoBERTa。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品


論文連結:https://arxiv.org/abs/2002.08155

CodeBERT 模型使用基於 Transformer 的神經架構構建而成,訓練所用的混合目標函式包括了替換 token 檢測(replaced token detection,RTD)預訓練任務。RTD 使用從生成器取樣的合理替代 token 來替換部分輸入 token 從而破壞輸入,然後訓練一個判別器來預測受損輸入中的每個 token 是否被生成器樣本替換。

這就使得 CodeBERT 模型可利用雙模態資料 NL-PL 對和單模態資料,前者為模型訓練提供輸入 token,後者有助於學得更好的生成器,研究者透過模型調參的方式評估了 CodeBERT 在兩個 NL-PL 應用中的效能。

CodeBERT

CodeBERT 既能處理自然語言又能處理程式語言,比如 Python、Java、JavaScript 等。它可以捕捉自然語言和程式語言之間的語義連線,並輸出可廣泛支援 NL-PL 理解任務(如自然語言程式碼搜尋)和生成任務(如程式碼文件生成)的通用表示。CodeBERT 模型基於多層 Transformer 構建而成,Transformer 如今已被廣泛應用於大型預訓練模型中。

為了利用雙模態資料例項 NL-PL 對和大量可用單模態程式碼,研究者使用混合目標函式來訓練 CodeBERT,函式包括標準遮蔽語言建模(MLM)和替換 token 檢測(RTD),替換 token 檢測利用單模態程式碼學得更好的生成器,從而輸出更好的替換 token。

研究使用了 6 種程式語言訓練 CodeBERT,其中雙模態資料點是具備函式級自然語言文件的程式碼。CodeBERT 模型的訓練設定與多語言 BERT (Pires et al., 2019) 類似,即針對 6 種程式語言學習一個預訓練模型,且不使用顯式標記來標註輸入程式語言。

研究者在兩項 NL-PL 任務(自然語言程式碼搜尋和程式碼文件生成)上評估了 CodeBERT 的效能。實驗結果表明調參後的 CodeBERT 模型可在這兩項任務上達到當前最優效能。為了進一步瞭解 CodeBERT 學得的知識型別,研究者構建了 NL-PL 探測資料集,並在 zero-shot 設定中測試 CodeBERT,即不對 CodeBERT 調參。測試結果表明,CodeBERT 的效能持續優於僅基於自然語言的預訓練模型 RoBERTa。

以下內容將詳細介紹 CodeBERT,包括模型架構、輸入和輸出表示、目標函式、訓練資料,以及將 CodeBERT 應用於下游任務時應如何調參。

模型架構

研究者遵循 BERT (Devlin et al., 2018) 和 RoBERTa (Liu et al., 2019),並使用了多層雙向 Transformer 作為 CodeBERT 的模型架構。

具體而言,CodeBERT 的模型架構與 RoBERTa-base 基本一致,包括 12 個層,每一層有 12 個自注意力頭,每個自注意力頭的大小為 64。隱藏維度為 768,前饋層的內部隱藏層大小為 3072。模型引數總量為 1.25 億。

輸入/輸出表示

在預訓練階段,研究者將輸入設定為兩個片段和一個特殊分隔符的組合,即 [CLS], w1, w2, ..wn, [SEP], c1, c2, ..., cm, [EOS]。其中一個片段是自然語言文字,另一個則是以某種程式語言寫成的程式碼。

CodeBERT 的輸出包括:1)每個 token 的語境向量表示(適用於自然語言和程式碼);2)[CLS] 的表示,作為聚合序列表示(aggregated sequence representation)。

預訓練資料

研究者使用雙模態資料訓練 CodeBERT,即自然語言-程式碼對平行資料。此外,還使用單模態資料,即不具備平行自然語言文字的程式碼和不具備對應程式碼的自然語言。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

表 1:CodeBERT 訓練資料集的資料統計資訊。

下圖 1 展示了資料示例:

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

圖 1:NL-PL 對示例,其中 NL 是函式文件(黑色虛線框)中的第一段(紅色框)。

預訓練 CodeBERT

本節將介紹訓練 CodeBERT 使用的兩個目標函式。

第一個目標函式是遮蔽語言建模(masked language modeling,MLM),MLM 在多項研究中被證明是有效的方法。研究者在雙模態資料 NL-PL 對上應用遮蔽語言建模。

第二個目標函式是替換 token 檢測(RTD),它使用大量單模態資料,如不具備對應自然語言文字的程式碼。

MLM 目標旨在預測被遮蔽的原始 token,其公式如下所示:

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

RTD 的損失函式如下所示,θ 表示判別器,δ(i) 表示指示函式,p^D2 表示預測第 i 個單詞真實機率的判別器。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

值得注意的是,RTD 目標應用於輸入的每個位置,它與 GAN 的不同之處在於:如果生成器輸出了正確的 token,該 token 的標籤是「real」而非「fake」。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

圖 2:RTD 目標圖示。NL 生成器和程式碼生成器都是語言模型,它們基於上下文語境為遮蔽位置生成合理的 token。NL-Code 判別器是目標預訓練模型,其訓練方式是檢測取樣自 NL 和 PL 生成器的合理替換 token。NL-Code 判別器用於在調參階段輸出通用表示,而 NL 生成器和程式碼生成器均不出現在調參階段。

實驗

這一部分內容將介紹 CodeBERT 的實驗結果。首先使用 CodeBERT 進行自然語言程式碼搜尋(對 CodeBERT 執行調參),然後在 NL-PL 探測任務中以 zero-shot 設定評估 CodeBERT 的效能(不對 CodeBERT 進行調參)。最後,研究者在生成問題(即程式碼文件生成任務)上評估 CodeBERT,並進一步使用訓練階段未見過的程式語言來評估 CodeBERT 的效能。

自然語言程式碼搜尋

給定自然語言作為輸入,程式碼搜尋的目標是從一堆程式碼中找出語義最相關的程式碼。研究者在 CodeSearchNet 語料庫上進行實驗。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

表 3:CodeSearchNet 語料庫的資料統計資訊。

下表 2 展示了不同方法在 CodeSearchNet 語料庫上的效能結果。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

表 2:不同方法在自然語言程式碼檢索任務中的結果。基線包括四種 NL 和 PL 聯合嵌入(第一組),RoBERTa 使用遮蔽語言建模在程式碼上執行訓練(第二組),PT 表示預訓練。研究者使用不同設定訓練 CodeBERT(第三組),包括不同的初始化和不同的學習目標。

NL-PL 探測

給出一個 NL-PL 對 (c, w),NL-PL 探測的目標是測試模型在多個干擾詞中準確預測/恢復感興趣的遮蔽 token(程式碼 token c_i 或單詞 token w_j)的能力。

下表 4 展示了不同方法的準確率,即對於每種程式語言,模型準確預測的例項與全部例項數量的比例。表 4 前兩行列舉了資料統計資訊。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

表 4:NL-PL 探測任務的資料統計資訊,以及不同預訓練模型的效能。此表報告了模型的準確率(%),每一組中的最佳結果以加粗形式顯示。

研究者進一步對 PL-NL 探測任務進行了案例研究。圖 4 展示了 Python 程式碼示例。該示例分別遮蔽了 NL token 和 PL token,然後報告 RoBERTa 和 CodeBERT 的預測機率。

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

圖 4:PL-NL 探測任務案例研究(以 Python 語言程式碼為例)。該示例分別遮蔽 NL token(藍色)和 PL token(黃色),並報告了 RoBERTa 和 CodeBERT 的預測機率。


程式碼文件生成

本節涉及 code-to-NL 生成任務,報告了在 CodeSearchNet 語料庫上六種程式語言的文件生成任務結果。

下表 5 展示了不同模型的程式碼-文件生成任務結果:

新預訓練模型CodeBERT出世,程式語言和自然語言都不在話下,哈工大、中山大學、MSRA出品

表 5:程式碼-文件生成任務結果,該實驗在 CodeSearchNet 語料庫上展開,得到的結果為平滑 BLEU-4 分數。

相關文章