代碼也能預訓練,微軟&哈工大最新提出 CodeBERT 模型,支持自然...

2020-12-17 手機鳳凰網

近日,微軟、哈工大在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預訓練模型
    機器之心報導參與:一鳴昨日,機器之心報導了 CMU 全新模型 XLNet 在 20 項任務上碾壓 BERT 的研究,引起了極大的關注。而在中文領域,哈工大訊飛聯合實驗室也於昨日發布了基於全詞覆蓋的中文 BERT 預訓練模型,在多個中文數據集上取得了當前中文預訓練模型的最佳水平,效果甚至超過了原版 BERT、ERINE 等中文預訓練模型。
  • PTMs|2020最新NLP預訓練模型綜述
    提出了一種預訓練模型的分類體系,通過四種分類維度來劃分目前已有的預訓練模型。很自然的想法是將預訓練模型拓展到「sentence-level」或者更高層次,這種方式輸出的向量稱為contextual word embeddings,即:依賴於上下文來表示詞。此時,預訓練好的「Encoder」需要在下遊任務「特定的上下文中」提取詞的表徵向量。
  • 預訓練圖像處理Transformer:華為諾亞、北大等提出IPT模型,刷榜多...
    預訓練模型能否在視覺任務上復刻在自然語言任務中的成功?華為諾亞方舟實驗室聯合北京大學、雪梨大學、鵬城實驗室提出底層視覺 Transformer,使用 ImageNet 預訓練,在多項視覺任務上達到 SOTA。與自然語言任務相比,視覺任務在輸入形式上有很大差別。
  • 微軟AI模型在SuperGLUE基準超越人類位居排行榜第一
    DeBERTa是一種變換(Transformer)神經語言模型,使用自我監督式學習技術,以大量原始文本資料進行預訓練,與其他預訓練語言模型一樣,DeBERTa目的在於學習通用語言表達形式,用來解決各種自然語言理解任務。  由於對話式人工智慧深度學習模型已發展到一定的程度,過去的基準測試被認為不敷使用。
  • 1.6萬億參數的語言模型:谷歌大腦提出Switch Transformer,預訓練...
    此外,他們提出的訓練技術還提高了訓練的穩定性,首次表明大型稀疏模型也可以用低精度(bfloat16)進行訓練。models)預訓練可擴展性在預訓練期間,研究者對 Switch Transformer 的可擴展性進行了研究。
  • 同時掌握96門語言,多項世界突破,百度發布預訓練模型ERNIE-M
    機器之心報導機器之心編輯部2021 年伊始,百度在自然語言處理領域取得最新突破,發布多語言預訓練模型 ERNIE-M。ERNIE-M 通過對 96 門語言的學習,使得一個模型能同時理解 96 種語言,該項技術在 5 類典型跨語言理解任務上刷新世界最好效果。
  • Pytorch-Transformers 1.0 發布,支持六個預訓練框架,含 27 個預...
    雷鋒網 AI 科技評論按:剛剛,在 Github 上發布了開源 Pytorch-Transformers 1.0,該項目支持 BERT, GPT, GPT-2, Transfo-XL, XLNet, XLM 等,並包含 27 個預訓練模型。我們來看。
  • AI在這張「問卷」上首次超越人類,SuperGLUE被微軟谷歌「攻破」
    曉查 發自 凹非寺量子位 報導 | 公眾號 QbitAI自然語言理解(NLU)迎來新的裡程碑。在最新的NLU測試基準SuperGLUE中,人類首次被AI超越了。SuperGLUE相比「前輩」GLUE大大提升了問題的難度,提出一年多以來,人類一直處於第一位。現如今,人類一下子被兩家AI超越。
  • PyTorch-Transformers:最先進的自然語言處理庫(附帶python代碼)
    .」 – Sebastian Ruder想像一下我們有能力構建支持谷歌翻譯的自然語言處理(NLP)模型,並且在Python中僅需幾行代碼來完成,這聽起來是不是讓人非常興奮。而現在我們就可以坐在自己的機器前實現這個了!藉助於被HuggingFace稱為PyTorch-Transformers目前最先進的NLP工具。
  • 國內AI技術再突破,百度NLG模型讓機器人能更好理解和表達
    當然,充滿神秘和挑戰的自然語言處理包括自然語言理解和自然語言生成。而且我們漢字中文還是一個單獨的子領域:中文分詞技術。雖然NLG是把數據換成語言,其實它還包括本文到語言的轉換。而此次百度最新的研發成果——全新的語言生成預訓練模型ERNIE-GEN,正是解決自然語言處理領域「生成」方向的難題。
  • 微軟發布史上最大NLG模型:基於Transformer架構生成
    下圖展示了Turing-NLG 模型和此前的基準系統(類似於CopyNet的 LSTM模型)在事實正確性(Factual Correctness)和語法正確性(Grammatical Correctness)兩項指標上的對比情況:微軟研究者發現,大型的預訓練模型需要更少下遊任務的示例來更好地對其進行學習,而他們僅僅只有最多100,000 個「直接」回答問題的樣本
  • 復旦邱錫鵬超全NLP預訓練模型綜述論文:兩張圖帶你梳理完整脈絡
    機器之心報導機器之心編輯部超全預訓練語言模型概覽,入門學習、搭建知識體系、找文獻資料、找資原始碼,這裡有 NLP 預訓練模型的方方面面。復旦的這篇綜述性論文非常豐富,它以 25 頁的篇幅展示了預訓練語言模型的方方面面,不論是新奇的預訓練任務,還是各種模型針對領域知識的擴展,我們都能快速 Get 到。
  • 一行代碼調用預訓練模型,上海交大開源視頻理解工具箱AlphaVideo
    機器之心發布機器之心編輯部近期,上海交通大學盧策吾團隊在《自然 - 機器智能》上發表視覺序列理解的研究成果,通過模仿人類的認知機制,提出了可應用於高維度信息的半耦合結構模型(SCS)。此外,他們還開源了視頻理解工具箱 AlphaVideo。
  • NLP預訓練利器:小模型也有高精度,單個GPU就能訓練
    這就意味著「小規模,也有大作用」,在單個GPU上訓練只需要4天的時間,精度還要比OpenAI的GPT模型要高。ELECTRA已經作為TensorFlow的開源模型發布,包含了許多易於使用的預訓練語言表示模型。
  • 一文講透預訓練模型的改進訓練算法 ,輕鬆達到State of the Art
    隨著BERT在NLP各種任務上取得驕人的戰績,預訓練模型在不到兩年的時間內得到了很大的發展。BERT和Open-GPT等預訓練語言模型的引入,使整個自然語言研究界發生了革命性的變化。然而,與它們巨大的好處相比,研究人員對它們的理論和經驗性質仍然知之甚少。本文回顧了有關預訓練深度神經網絡的相關文獻及觀點,以及帶有詞嵌入的微調策略。
  • AIOpen 預訓練語言模型專刊徵稿
    2018 年 ELMo、BERT 和 GPT 的成功發布,表明了預訓練語言模型(PLM)的成功,隨後又在自然語言理解和生成方面取得了重大突破。目前,在探索更有效的預訓練架構方面,已經做了很多卓有成效的工作,比如使用跨模態數據、跨語言數據和結構化知識等方法改進預訓練語言模型,或將 PLM 創新地應用於各種與 NLP 相關的任務。
  • 15個產業級算法、35個預訓練模型上線!最強國產開源AI框架再進化
    乾明 發自 凹非寺 量子位 報導 | 公眾號 QbitAI 2項全新能力,4大重磅升級,35個高精度預訓練模型上線,15個產業實踐中廣泛應用的視覺算法加持…… 這就是最強國產開源深度學習框架——飛槳的最新重要升級。
  • 微軟獲自然語言處理模型 GPT-3 獨家授權
    種種光環加持下,自然語言處理模型GPT-3 已然成為一款 AI 神器。進入 9 月,OpenAI 決定開放 GPT-3 商業版 API,定價方案也一併公布。而就在前幾天,OpenAI 和微軟公司共同宣布,微軟獲得 GPT-3 獨家授權。
  • 170 億參數加持,微軟發布史上最大 Transformer 模型 T-NLG!
    基於使用更大自然語言模型可以帶來更好結果的趨勢,微軟推出了Turing自然語言生成(T-NLG)模型,這是有史以來規模最大的模型,其參數有170億,在各種語言模型任務的基準上均優於最新技術,並且在應用於許多實際任務(包括概括和問題解答)時也很出色。這項工作得益於在DeepSpeed庫(與PyTorch兼容)的ZeRO優化器方面的突破。
  • 「明日專家直播」輕鬆玩轉中文預訓練模型的詳細攻略
    今年8月,百度重磅發布語義理解技術與平臺文心(ERNIE),為企業提供了一種革新性的應用範式,集先進的預訓練模型、全面的 NLP 算法集、端到端開發套件和平臺化服務於一體,提供一站式 NLP 開發與服務,讓企業用戶更簡單、高效地定製企業級文本模型。