| 選自arXiv 機器之心編譯參與:魔王、蛋醬 對于自然語言處理從業(yè)者來說,BERT 這個概念一定不陌生,自從誕生以來,它在諸多任務(wù)檢測中都有著非常優(yōu)秀的表現(xiàn)。近日,來自哈爾濱工業(yè)大學、中山大學和微軟亞洲研究院的研究者合作提出了一個可處理雙模態(tài)數(shù)據(jù)的新預(yù)訓練模型 CodeBERT,除了自然語言(NL),編程語言(PL)如今也可以進行預(yù)訓練了。 在這篇名為《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》的論文中,來自哈工大、中山大學和微軟的研究人員詳細介紹了這一新預(yù)訓練模型,該模型可處理雙模態(tài)數(shù)據(jù):編程語言(PL)和自然語言(NL)。 CodeBERT 學習能夠支持下游 NL-PL 應(yīng)用的通用表示,比如自然語言代碼搜索、代碼文檔生成,經(jīng)實驗 CodeBERT 模型在兩項任務(wù)均取得 SOTA 效果,同時研究者構(gòu)建了 NL-PL 探測數(shù)據(jù)集,CodeBERT 在 zero-shot 設(shè)置中的性能表現(xiàn)也持續(xù)優(yōu)于 RoBERTa。 論文鏈接:https:///abs/2002.08155 CodeBERT 模型使用基于 Transformer 的神經(jīng)架構(gòu)構(gòu)建而成,訓練所用的混合目標函數(shù)包括了替換 token 檢測(replaced token detection,RTD)預(yù)訓練任務(wù)。RTD 使用從生成器采樣的合理替代 token 來替換部分輸入 token 從而破壞輸入,然后訓練一個判別器來預(yù)測受損輸入中的每個 token 是否被生成器樣本替換。 這就使得 CodeBERT 模型可利用雙模態(tài)數(shù)據(jù) NL-PL 對和單模態(tài)數(shù)據(jù),前者為模型訓練提供輸入 token,后者有助于學得更好的生成器,研究者通過模型調(diào)參的方式評估了 CodeBERT 在兩個 NL-PL 應(yīng)用中的性能。 CodeBERT CodeBERT 既能處理自然語言又能處理編程語言,比如 Python、Java、JavaScript 等。它可以捕捉自然語言和編程語言之間的語義連接,并輸出可廣泛支持 NL-PL 理解任務(wù)(如自然語言代碼搜索)和生成任務(wù)(如代碼文檔生成)的通用表示。CodeBERT 模型基于多層 Transformer 構(gòu)建而成,Transformer 如今已被廣泛應(yīng)用于大型預(yù)訓練模型中。 為了利用雙模態(tài)數(shù)據(jù)實例 NL-PL 對和大量可用單模態(tài)代碼,研究者使用混合目標函數(shù)來訓練 CodeBERT,函數(shù)包括標準遮蔽語言建模(MLM)和替換 token 檢測(RTD),替換 token 檢測利用單模態(tài)代碼學得更好的生成器,從而輸出更好的替換 token。 研究使用了 6 種編程語言訓練 CodeBERT,其中雙模態(tài)數(shù)據(jù)點是具備函數(shù)級自然語言文檔的代碼。CodeBERT 模型的訓練設(shè)置與多語言 BERT (Pires et al., 2019) 類似,即針對 6 種編程語言學習一個預(yù)訓練模型,且不使用顯式標記來標注輸入編程語言。 研究者在兩項 NL-PL 任務(wù)(自然語言代碼搜索和代碼文檔生成)上評估了 CodeBERT 的性能。實驗結(jié)果表明調(diào)參后的 CodeBERT 模型可在這兩項任務(wù)上達到當前最優(yōu)性能。為了進一步了解 CodeBERT 學得的知識類型,研究者構(gòu)建了 NL-PL 探測數(shù)據(jù)集,并在 zero-shot 設(shè)置中測試 CodeBERT,即不對 CodeBERT 調(diào)參。測試結(jié)果表明,CodeBERT 的性能持續(xù)優(yōu)于僅基于自然語言的預(yù)訓練模型 RoBERTa。 以下內(nèi)容將詳細介紹 CodeBERT,包括模型架構(gòu)、輸入和輸出表示、目標函數(shù)、訓練數(shù)據(jù),以及將 CodeBERT 應(yīng)用于下游任務(wù)時應(yīng)如何調(diào)參。 模型架構(gòu) 研究者遵循 BERT (Devlin et al., 2018) 和 RoBERTa (Liu et al., 2019),并使用了多層雙向 Transformer 作為 CodeBERT 的模型架構(gòu)。 具體而言,CodeBERT 的模型架構(gòu)與 RoBERTa-base 基本一致,包括 12 個層,每一層有 12 個自注意力頭,每個自注意力頭的大小為 64。隱藏維度為 768,前饋層的內(nèi)部隱藏層大小為 3072。模型參數(shù)總量為 1.25 億。 輸入/輸出表示 在預(yù)訓練階段,研究者將輸入設(shè)置為兩個片段和一個特殊分隔符的組合,即 [CLS], w1, w2, ..wn, [SEP], c1, c2, ..., cm, [EOS]。其中一個片段是自然語言文本,另一個則是以某種編程語言寫成的代碼。 CodeBERT 的輸出包括:1)每個 token 的語境向量表示(適用于自然語言和代碼);2)[CLS] 的表示,作為聚合序列表示(aggregated sequence representation)。 預(yù)訓練數(shù)據(jù) 研究者使用雙模態(tài)數(shù)據(jù)訓練 CodeBERT,即自然語言-代碼對平行數(shù)據(jù)。此外,還使用單模態(tài)數(shù)據(jù),即不具備平行自然語言文本的代碼和不具備對應(yīng)代碼的自然語言。 下圖 1 展示了數(shù)據(jù)示例: 預(yù)訓練 CodeBERT 本節(jié)將介紹訓練 CodeBERT 使用的兩個目標函數(shù)。 第一個目標函數(shù)是遮蔽語言建模(masked language modeling,MLM),MLM 在多項研究中被證明是有效的方法。研究者在雙模態(tài)數(shù)據(jù) NL-PL 對上應(yīng)用遮蔽語言建模。 第二個目標函數(shù)是替換 token 檢測(RTD),它使用大量單模態(tài)數(shù)據(jù),如不具備對應(yīng)自然語言文本的代碼。 MLM 目標旨在預(yù)測被遮蔽的原始 token,其公式如下所示: RTD 的損失函數(shù)如下所示,θ 表示判別器,δ(i) 表示指示函數(shù),p^D2 表示預(yù)測第 i 個單詞真實概率的判別器。 值得注意的是,RTD 目標應(yīng)用于輸入的每個位置,它與 GAN 的不同之處在于:如果生成器輸出了正確的 token,該 token 的標簽是「real」而非「fake」。 實驗 這一部分內(nèi)容將介紹 CodeBERT 的實驗結(jié)果。首先使用 CodeBERT 進行自然語言代碼搜索(對 CodeBERT 執(zhí)行調(diào)參),然后在 NL-PL 探測任務(wù)中以 zero-shot 設(shè)置評估 CodeBERT 的性能(不對 CodeBERT 進行調(diào)參)。最后,研究者在生成問題(即代碼文檔生成任務(wù))上評估 CodeBERT,并進一步使用訓練階段未見過的編程語言來評估 CodeBERT 的性能。 自然語言代碼搜索 給定自然語言作為輸入,代碼搜索的目標是從一堆代碼中找出語義最相關(guān)的代碼。研究者在 CodeSearchNet 語料庫上進行實驗。 下表 2 展示了不同方法在 CodeSearchNet 語料庫上的性能結(jié)果。 NL-PL 探測 給出一個 NL-PL 對 (c, w),NL-PL 探測的目標是測試模型在多個干擾詞中準確預(yù)測/恢復感興趣的遮蔽 token(代碼 token c_i 或單詞 token w_j)的能力。 下表 4 展示了不同方法的準確率,即對于每種編程語言,模型準確預(yù)測的實例與全部實例數(shù)量的比例。表 4 前兩行列舉了數(shù)據(jù)統(tǒng)計信息。 研究者進一步對 PL-NL 探測任務(wù)進行了案例研究。圖 4 展示了 Python 代碼示例。該示例分別遮蔽了 NL token 和 PL token,然后報告 RoBERTa 和 CodeBERT 的預(yù)測概率。 
 代碼文檔生成 本節(jié)涉及 code-to-NL 生成任務(wù),報告了在 CodeSearchNet 語料庫上六種編程語言的文檔生成任務(wù)結(jié)果。 下表 5 展示了不同模型的代碼-文檔生成任務(wù)結(jié)果: 
 | 
|  |