...微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

2020-11-22 雷鋒網

近日,微軟、哈工大在arxiv上聯合發表了一篇論文,標題為《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》,再次拓寬了BERT的應用,將BERT應用到了Python、PHP、Java、JavaScript、Go、Ruby等程式語言的代碼搜索和生成任務當中。

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

這篇論文提出了一個被稱為「CodeBERT」的雙模預訓練模型,據作者介紹,這也是目前已知的第一個大型 NL-PL(自然語言-程式語言)預訓練模型。

該預訓練模型能夠處理NL-PL 的普遍問題,例如用自然語言搜索代碼、自動生成代碼等。 所謂自然語言代碼搜索,所要解決的問題是,如何通過自然語言query查找到所需的代碼塊,這和我們常用的搜尋引擎(通過自然語言query來查找所需網頁)類似。

事實上,微軟Bing在2018年便上線了類似的功能,在搜索框中輸入自然語言 「convert case using a function of R」,便會返回一段 R 代碼。 

(雷鋒網)

針對自然語言代碼搜索,在這篇論文裡,作者在 CodeSearchNet語料庫上對CodeBERT進行了預訓練並做微調,這是一個包含了 6 種較為普遍的代碼語言(分別為Ruby、JavaScript、Go、Python、Java、PHP)的語料庫。如下圖所示,他們在自然語言代碼搜索任務中取得了SOTA的結果:

而另一方面,代碼文檔生成任務,是未來能夠極大節省程式設計師工作量的極具前景的一個研究方向。如下圖所示,

針對這個任務,CodeBERT也基本上都取得了SOTA結果,特別是相較於之前的ROBERTa模型,更是有顯著的提高。 值一提的是,CodeBERT有一大亮點,即儘管它只在Ruby、JavaScript、Go、Python、Java、PHP等代碼語言上進行了預訓練,但預訓練的模型卻可以泛化到其他代碼語言任務上,例如C#語言。  

一、背景

BERT作為一種雙向Transformer的編碼器,其對預訓練方法的創新深受業界和學術界的喜愛,雖然其他大規模的預訓練模型例如ELMo、GPT等已經能夠在各種NLP任務中提升SOTA。 

但是上述提到的模型基本上都是面向自然語言處理,例如掩蔽語言建模、從未標記文本學習上下文表示。 相比以往的Bert的應用場景,作者另闢蹊徑,推出雙模態預訓練模型,即兼顧NLP任務和Python、Java等程式語言。 

具體來說,CodeBERT抓住了自然語言和程式語言之間的語義聯繫,能夠支持自然語言代碼搜索等NL-PL理解任務以及一系列像代碼生成這樣的生成任務。 

(雷鋒網(公眾號:雷鋒網)

一個NL-PL對,其中紅線框中的是NL文本,黑色框是PL文本。 為了利用Nl-PL對的雙模實例(bimodal instances)以及大量可用的單模代碼(unimodal codes),作者使用了混合目標函數來訓練CodeBERT,包括標準掩碼語言建模和可替換Token檢測。

在具體的訓練過程,作者用了六種程式語言在多語言BERT的設置中訓練模型。 我們首先來看下CodeBERT的模型框架。


二、框架

 在模型的整體架構上,CodeBERT並未脫離BERT和Roberta的思想。和大多數工作類似,作者使用了多層雙向Transformer。更為具體一點,作者使用的模型架構與Roberta-base完全相同,即都有12層,每層有12個自注意頭,每個頭的大小是64,隱藏尺寸為768,前饋層的內部隱藏尺寸為3072。

模型參數的總數為125M。 在預訓練階段,總共設計了兩部分輸入,一個是自然語言文本,另一個是程式語言的代碼。對於自然語言文本將其視為單詞序列,並拆分為WordPiece。對於編程代碼,將其看做Token序列。 CodeBERT的輸出也包括兩個部分:1、聚合序列表示;2、有標記的上下文向量(contextual vector)。 

數據集統計 訓練CodeBERT所使用的數據集是Husain等人在2019年提供的最新數據集,裡面包括 2.1M雙模數據和6.4M 單碼數據,其中雙模碼數據是指自然語言-代碼對的並行數據,單碼是指「未成對」的數據。 另外一些數據來自開源Nonfork GitHub倉庫。對這些數據的處理是採用了一些約束和規則進行過濾。

 

(雷鋒網)

可替換Token檢測目標圖解 在模型訓練的設計上,其主要包括兩個目標,其一是掩碼語言建模,其二是可替換Token檢測。在第二個目標中,作者進一步使用了大量的單模碼數據。 

目標一:掩碼語言建模。將NL-PL對作為輸入,隨機為NL和PL選擇位置進行掩碼,然後用特殊的掩碼Token進行替換。注意,掩碼語言建模的任務是預測出被掩碼的原始Token。 

目標二:替換Token檢測。在這部分有兩個數據生成器,分別是NL生成器和PL生成器,這兩個生成器都用於隨機掩碼位置集(randomly masked positions)生成合理的備選方案。

另外,還有一個學習生成器用來檢測一個詞是否為原詞,其背後原理是一個二進位分類器,這裡與GAN不同的是,如果生成器碰巧產生正確的Token,則該Token的標籤是「real」而不是「fake」。

學習器的損失函數 經過調整後,損失函數優化如下:

 模型訓練的最後一步是模型微調,具體操作是在NL-PL任務中使用不同的CodeBERT設置。例如在自然語言代碼搜索中,會使用與預訓練階段相同的輸入方式。而在代碼到文本的生成中,使用編碼器-解碼器框架,並使用CodeBERT初始化生成模型的編碼器。

三、實驗

 作者做了四個實驗,分別是:1)將CodeBERT應用到自然語言代碼搜索任務上,並與傳統方法進行對比;2)進行NL-PL Probing實驗,考察CodeBERT在預訓練階段到底學習了什麼知識;3)將CodeBERT應用到生成任務當中;4)考察CodeBERT預訓練模型的泛化能力,發現效果非常之好。 

1、自然語言代碼搜索

給定一段自然語言作為輸入,代碼搜索的目標是從一組代碼中找到語義上最相關的代碼。為了進行比較,作者選擇了Husain 等人在2019年發布的 CodeSearchNet 語料庫進行訓練。這個語料庫框架如下圖所示,共包含6中常見的程式語言(Python、JavaScript、Java、Ruby、PHP、Go)。 

在預訓練階段,作者首先對每種語言的數據集進行了訓練。數據集分割如下: 

在微調階段,設置學習率為1e-5,批量大小為64,最大序列長度為200,最大微調周期為8,並使用Adam來更新參數,並從開發集中選擇出表現最好的模型,並用於測試集上進行評估。 結果如下表所示: 

性能相比於之前的SOTA模型ROBERTa取得了顯著的提高。  

2、NL-PL Probing

 這部分實驗主要研究在不更改參數的的情況下,Code BERT能夠學習哪些類型的知識。目前學界還沒有針對NL-PLProbing的工作,所以在這部分實驗中,作者自行創建了數據集。 給定NL-PL對,NL-PL Probing的目標是測試模型的正確預測能力。模型比較結果如下圖所示: 

上表顯示了正確預測實例的數量與全部實例數量的比例。可以看出,在各個變成語言的預測上,CodeBERT基本都取得了最高的分數。但由於不同程式語言的數據集非常不平衡,因此用累計的數據進行比較更為恰當,在PL和NL的probing中,CodeBERT的結果都要比RoBERTa高10~20個百分點。 也可以用一個具體的案例來對比下。下圖案例中分別掩蓋了NL和PL中的「min」:

上圖為RoBERTa和CodeBert的預測概率 從結果來看,CodeBERT在NL上的正確預測率為60.6%,而在PL上直接高達99.999%。 

3、代碼文檔生成

 這部分研究代碼到文檔的生成問題,並在六種程式語言中研究了生成任務在Code Search Net Corpus上的結果。 另外,為了證明CodeBERT在代碼到NL生成任務中的有效性,作者採用了各種預訓練的模型作為編碼器,並保持了超參數的一致性。  實驗結果如下:

在程式語言上進行預訓練的模型的性能優於ROBERTa 

4、泛化能力

那麼,在Python、JavaScript、Java、Ruby、PHP、Go這些語言上做的預訓練模型能夠應用到別的程式語言上嗎? 作者拿著前面預訓練出的CodeBERT模型在C#語言上做了測試。 作者選擇了Codenn數據集,這是一個包含Stack Overflow自動收集的66015對問題和答案的數據集,其規模相比 CodeSearchNet語料庫要小几個數量級。為了可靠地評估模型,作者通過人工方式,為測試集中的代碼片段提供兩個附加 titles 來擴展測試集。 模型評估標準採用平滑的BLEU-4分數,評估結果如下圖: 

 

從這個結果可以看出,相較於RoBERTa,CodeBERT能夠更好地推廣到其他程式語言。不過值得注意的是,模型的效果略低於code2seq,作者認為原因可能是code2seq使用其抽象語法樹AST中的組合路徑,而CodeBERT僅將原始代碼作為輸入。


雖然作者也按照一定的順序通過遍歷AST的樹結構來訓練CodeBert,但並不會帶來生成任務的改進。這種結果意味著結合AST來改進codebert是潛在方向。

四、總結

 如前面提到,微軟的 Bing 在2018年便已經上線了代碼搜索功能,可以預期,基於預訓練的代碼功能也將很快落實到 Bing 的產品當中,從而提供能加優質的服務。同時我們也可以期待,該項工作能夠在近期開源,以讓更多研究人員快速跟進這一工作。


我們用幾句話來總結這項工作的意義: 

1、據作者表示,CodeBERT也是目前已知的首個大型的NL-PL(自然語言-程式語言)預訓練模型;

2、本文提出了一個混合學習目標,能夠支持使用雙模數據NL-PL,且能夠很容易地應用到單模數據中(例如沒有自然語言文本的編程代碼);

3、CodeBERT在自然語言代碼搜索和代碼文檔生成兩個任務中都達到了SOTA性能,此外作者在實驗中還建立了一個數據集來研究NL-PL預訓練模型的探測能力,方便了以後跟進的研究人員。

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 超越BERT、GPT,微軟提出通用預訓練模型MASS
    藉助於BERT和GPT等預訓練模型,人類在多個自然語言理解任務中取得了重大突破。然而,在序列到序列的自然語言生成任務中,目前主流預訓練模型並沒有取得顯著效果。為此,微軟亞洲研究院的研究員在ICML 2019上提出了一個全新的通用預訓練方法MASS,在序列到序列的自然語言生成任務中全面超越BERT和GPT。
  • 哈工大教授車萬翔:對話系統——「自然語言處理皇冠上的明珠」
    如果說自然語言處理可被譽為「人工智慧皇冠上的明珠」,那麼對話系統就是「自然語言處理皇冠上的明珠」。其中以蘋果SIRI、Google Assistant為代表的任務型對話系統尤為學術界和產業界所關注。然而,構建一個任務型對話系統依賴於大規模的標註數據,這為系統如何快速遷移到新的領域、新的語言和新的任務都帶來了極大的挑戰。
  • 中國的自然語言處理領域的人工智慧公司
    原來,它應用了最新的人工智慧自然語言處理技術。什麼是自然語言處理?自然語言處理是工業界與學術界都關注的人工智慧領域,這一領域的突破性發展與深度學習算法的成熟有直接的關係。加拿大多倫多大學的辛頓是深度學習的先驅,他和學生於2006年發表在《科學》上的文章提出了降維與逐層預訓練的方法,這使得深度學習成為可能。
  • 微軟未來將使用 Rust 作為 C、C++ 以及其他程式語言的替代方案
    微軟近日提出,未來將使用 Rust 作為 C、C++ 以及其他程式語言的替代方案,以改善應用程式的安全性的計劃。 近日,微軟安全響應中心(MSRC)團隊在官網更新文章,就近日提出的最新計劃,即未來將使用 Rust 作為 C、C++ 以及其他程式語言的替代方案以改善應用程式的安全性的計劃,從空間內存安全、時間內存安全、數據競爭等方面進行了進一步的深入補充。
  • 中文最佳,哈工大訊飛聯合發布全詞覆蓋中文BERT預訓練模型
    基於 Transformers 的雙向編碼表示(BERT)在多個自然語言處理任務中取得了廣泛的性能提升。在預訓練語言模型時,需要對語料進行 mask 操作,使模型在看不見 token 的情況下對 mask 的詞語進行預測。然而,基於單個 token 的 mask 方法訓練中文語料,可能忽略了中文分詞的作用。
  • 微軟亞研院提出通用預訓練模型MASS
    5月10日消息,微軟亞洲研究院的研究員在ICML 2019上提出了一個全新的通用預訓練方法MASS(Masked Sequence to Sequence Pre-training),在序列到序列的自然語言生成任務中全面超越BERT和GPT。在微軟參加的WMT19機器翻譯比賽中,MASS幫助中-英、英-立陶宛兩個語言對取得了第一名的成績。
  • 微軟發分布式圖處理引擎GraphEngine1.0
    【IT168 資訊】5月21日消息,由微軟亞洲研究院開發的Graph Engine 1.0預覽版正式發布。Graph Engine是一個基於內存的分布式大規模圖數據處理引擎。在此之前,它在學術界更廣為人之的名稱是Trinity。  大規模圖處理在很多領域扮演著重要的角色。
  • 微軟推出機器學習系統Brainwave,超低延遲、堪稱實時AI
    目前,Brainwave支持使用微軟CNTK框架和谷歌TensorFlow框架的訓練模型。該公司展示的這個名為Brainwave的新系統,允許開發人員將機器學習模型部署到可編程晶片上,並獲得超出CPU或GPU的高性能。研究人員在加利福尼亞州庫比蒂諾熱舉辦的Hot Chips大會上演示了門控重複單元模型,在沒有批量操作的情況下,該模型運行在英特爾最新的Stratix 10現場可編程門陣列(FPGA)晶片上的速度可達到39.5萬億次浮點運算。
  • 2020開年解讀:NLP新範式凸顯跨任務、跨語言能力,語音處理落地開花
    今天,我們將探索自然語言處理(Natural Language Processing,NLP)範式的新發展,以及微軟亞洲研究院在語音識別與合成領域的創新成果。 其次,用於預訓練模型的數據越來越大,從 BERT 中用到的 16G 文本數據,到 RoBERTa 裡用到的 160G 文本數據,再到 T5 裡面用到了 750G 的文本數據。 再次,預訓練模型從最開始的主要面向自然語言理解任務,發展到支持自然語言生成任務,以及到最新的一個模型同時支持自然語言理解和自然語言生成任務,如 UniLM、T5 和 BART 等。
  • 微軟RobustFill:無需程式語言,讓神經網絡自動生成程序
    選自Microsoft Research blog作者:Rishabh Singh等參與:李澤南長久以來,擺脫程式語言的束縛,讓計算機自我生成程序一直是開發者們的夢想,最近微軟研究者推出的RobustFill讓夢想更近了一步,他們的研究成果即將在 ICLR 2017 大會上出現。
  • 微軟揭曉Brainwave人工智慧系統,可實現超低延遲
    本文引用地址:http://www.eepw.com.cn/article/201708/363482.htm  微軟的研究人員現場展示了 Brainwave 的威力:在使用英特爾最新的 Stratix 10 FPGA(現場可編程門陣列)晶片的情況下,Brainwave 運行 Gated Recurrent Unit(LSTM的變種)的浮點運算速度可高達 39.5 TFLOPS,並且不需要任何批量處理
  • 英語聽力:微軟展示即時語音翻譯系統最新成果
    新東方網>英語>英語學習>英語聽力>聽力視頻>演講視頻>正文英語聽力:微軟展示即時語音翻譯系統最新成果 2012-11-13 15:12 來源:Tech2IPO、中國科技網 作者:口譯網綜合
  • 微軟語音 AI 技術與微軟聽聽文檔小程序實踐|AI ProCon 2019
    2018年,微軟首度提出一個任務,把機器跟人在中英新聞翻譯上做比較,讓專業翻譯人員和機器翻譯同樣的句子,翻譯後請懂雙語的老師和學生去對翻譯結果用0-100分進行打分。可以看到微軟的Human Parity機器翻譯系統已經超過或者接近專業人員的翻譯水平。它的突破用到了新技術比如對偶學習,用大量無標註數據提高現有的翻譯系統。
  • 微軟發布史上最大AI模型:170億參數,將用於Office套件
    170億參數量,是此前最大的語言模型英偉達「威震天」(Megatron)的兩倍,是OpenAI模型GPT-2的10多倍。「隨著更大的自然語言模型導致更好結果的趨勢,微軟引入了Turing-NLG,」微軟在研究博客中寫道。
  • Python文檔字符串生成器:基於CodeBERT,支持Google、Numpy等多種...
    這個工具的本質,就是一個自然語言識別的AI,它能夠識別你所寫代碼的內容,然後輸出對應的字符串。具體是如何識別的,該AI的作者是這麼介紹的:參數類型是通過PEP 484類型、默認值和var標籤進行識別的。
  • 170 億參數加持,微軟發布史上最大 Transformer 模型 T-NLG!
    作者 | Corby Rosset譯者 | 劉暢 責編 | JustBERT和GPT-2之類的深度學習語言模型(language model, LM)有數十億的參數,網際網路上幾乎所有的文本都已經參與了該模型的訓練,它們提升了幾乎所有自然語言處理(NLP)任務的技術水平
  • 北大、微軟亞洲研究院:高效的大規模圖神經網絡計算
    新智元報導 來源:arXiv編輯:肖琴【新智元導讀】第一個支持圖神經網絡的並行處理框架出現了!北京大學、微軟亞洲研究院的研究人員近日發表論文,提出NGra,這是第一個支持大規模GNN的系統。GNN(圖神經網絡)代表了一種新興的計算模型,這自然地產生了對在大型graph上應用神經網絡模型的需求。但是,由於GNN固有的複雜性,這些模型超出了現有深度學習框架的設計範圍。此外,這些模型不容易在並行硬體(如GPU)上有效地加速。
  • 自然語言處理 NLP 發展簡史
    但 IBM 旗下的 Fortran 表處理語言卻未能支持符號運算的遞歸、條件表達式、動態存儲分配及隱式回收等功能。於是麥卡錫帶領由 MIT 學生組成的團隊開發了一門全新的表處理語言 LISP,賦予了程式語言更強的數學計算能力。LISP 語言後來也被稱為人工智慧的「母語」,成為早期人工智慧研究人員的程式語言。
  • 微軟「中譯英」機器翻譯水平媲美人類
    微軟亞洲研究院宣布,微軟研究團隊研發的機器翻譯系統在通用新聞報導測試集 newstest2017 中 – 英測試集達到了可以與人工翻譯媲美的水平。微軟亞洲研究院表示,機器翻譯是自然語言處理領域最具挑戰性的研究任務之一,這一系統模型包括由微軟亞洲研究院研發的對偶學習、推敲網絡、聯合訓練和一致性規範技術。
  • 2019自然語言處理前沿論壇:聚焦機器「讀、寫、說、譯」,探尋NLP...
    自然語言處理技術不僅僅需要算法、算力和數據,同時也需要不斷地凝練知識,需要語言處理跟我們認識世界、改造世界的過程相結合,所以仍然有很多創新突破的空間。」他希望通過本次論壇,青年學者們能夠增進交流,碰撞新的火花,一起推動自然語言處理的發展及產業化的進程,在人工智慧時代幫助我們的生活變得更加美好。