丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能學(xué)術(shù) 正文
發(fā)私信給蔣寶尚
發(fā)送

0

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

本文作者: 蔣寶尚 2020-02-21 19:52
導(dǎo)語:支持自然-編程雙語處理

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

論文鏈接:https://arxiv.org/pdf/2002.08155.pdf

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

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

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

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

(雷鋒網(wǎng))

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

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

而另一方面,代碼文檔生成任務(wù),是未來能夠極大節(jié)省程序員工作量的極具前景的一個研究方向。如下圖所示,

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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

一、背景

BERT作為一種雙向Transformer的編碼器,其對預(yù)訓(xùn)練方法的創(chuàng)新深受業(yè)界和學(xué)術(shù)界的喜愛,雖然其他大規(guī)模的預(yù)訓(xùn)練模型例如ELMo、GPT等已經(jīng)能夠在各種NLP任務(wù)中提升SOTA。 

但是上述提到的模型基本上都是面向自然語言處理,例如掩蔽語言建模、從未標(biāo)記文本學(xué)習(xí)上下文表示。 相比以往的Bert的應(yīng)用場景,作者另辟蹊徑,推出雙模態(tài)預(yù)訓(xùn)練模型,即兼顧NLP任務(wù)和Python、Java等編程語言。 

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

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

(雷鋒網(wǎng))

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

在具體的訓(xùn)練過程,作者用了六種編程語言在多語言BERT的設(shè)置中訓(xùn)練模型。 我們首先來看下CodeBERT的模型框架。


二、框架

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

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

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

數(shù)據(jù)集統(tǒng)計 訓(xùn)練CodeBERT所使用的數(shù)據(jù)集是Husain等人在2019年提供的最新數(shù)據(jù)集,里面包括 2.1M雙模數(shù)據(jù)和6.4M 單碼數(shù)據(jù),其中雙模碼數(shù)據(jù)是指自然語言-代碼對的并行數(shù)據(jù),單碼是指“未成對”的數(shù)據(jù)。 另外一些數(shù)據(jù)來自開源Nonfork GitHub倉庫。對這些數(shù)據(jù)的處理是采用了一些約束和規(guī)則進(jìn)行過濾。

 代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

(雷鋒網(wǎng))

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

目標(biāo)一:掩碼語言建模。將NL-PL對作為輸入,隨機為NL和PL選擇位置進(jìn)行掩碼,然后用特殊的掩碼Token進(jìn)行替換。注意,掩碼語言建模的任務(wù)是預(yù)測出被掩碼的原始Token。 

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

另外,還有一個學(xué)習(xí)生成器用來檢測一個詞是否為原詞,其背后原理是一個二進(jìn)制分類器,這里與GAN不同的是,如果生成器碰巧產(chǎn)生正確的Token,則該Token的標(biāo)簽是“real”而不是“fake”。
代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

學(xué)習(xí)器的損失函數(shù) 經(jīng)過調(diào)整后,損失函數(shù)優(yōu)化如下:
代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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

三、實驗

 作者做了四個實驗,分別是:1)將CodeBERT應(yīng)用到自然語言代碼搜索任務(wù)上,并與傳統(tǒng)方法進(jìn)行對比;2)進(jìn)行NL-PL Probing實驗,考察CodeBERT在預(yù)訓(xùn)練階段到底學(xué)習(xí)了什么知識;3)將CodeBERT應(yīng)用到生成任務(wù)當(dāng)中;4)考察CodeBERT預(yù)訓(xùn)練模型的泛化能力,發(fā)現(xiàn)效果非常之好。 

1、自然語言代碼搜索

給定一段自然語言作為輸入,代碼搜索的目標(biāo)是從一組代碼中找到語義上最相關(guān)的代碼。為了進(jìn)行比較,作者選擇了Husain 等人在2019年發(fā)布的 CodeSearchNet 語料庫進(jìn)行訓(xùn)練。這個語料庫框架如下圖所示,共包含6中常見的編程語言(Python、JavaScript、Java、Ruby、PHP、Go)。 
代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

在預(yù)訓(xùn)練階段,作者首先對每種語言的數(shù)據(jù)集進(jìn)行了訓(xùn)練。數(shù)據(jù)集分割如下: 

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

在微調(diào)階段,設(shè)置學(xué)習(xí)率為1e-5,批量大小為64,最大序列長度為200,最大微調(diào)周期為8,并使用Adam來更新參數(shù),并從開發(fā)集中選擇出表現(xiàn)最好的模型,并用于測試集上進(jìn)行評估。 結(jié)果如下表所示: 

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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

2、NL-PL Probing

 這部分實驗主要研究在不更改參數(shù)的的情況下,Code BERT能夠?qū)W習(xí)哪些類型的知識。目前學(xué)界還沒有針對NL-PLProbing的工作,所以在這部分實驗中,作者自行創(chuàng)建了數(shù)據(jù)集。 給定NL-PL對,NL-PL Probing的目標(biāo)是測試模型的正確預(yù)測能力。模型比較結(jié)果如下圖所示: 

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

上表顯示了正確預(yù)測實例的數(shù)量與全部實例數(shù)量的比例??梢钥闯?,在各個變成語言的預(yù)測上,CodeBERT基本都取得了最高的分?jǐn)?shù)。但由于不同編程語言的數(shù)據(jù)集非常不平衡,因此用累計的數(shù)據(jù)進(jìn)行比較更為恰當(dāng),在PL和NL的probing中,CodeBERT的結(jié)果都要比RoBERTa高10~20個百分點。 也可以用一個具體的案例來對比下。下圖案例中分別掩蓋了NL和PL中的“min”:

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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

3、代碼文檔生成

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

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

在編程語言上進(jìn)行預(yù)訓(xùn)練的模型的性能優(yōu)于ROBERTa 

4、泛化能力

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

 代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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


雖然作者也按照一定的順序通過遍歷AST的樹結(jié)構(gòu)來訓(xùn)練CodeBert,但并不會帶來生成任務(wù)的改進(jìn)。這種結(jié)果意味著結(jié)合AST來改進(jìn)codebert是潛在方向。

四、總結(jié)

 如前面提到,微軟的 Bing 在2018年便已經(jīng)上線了代碼搜索功能,可以預(yù)期,基于預(yù)訓(xùn)練的代碼功能也將很快落實到 Bing 的產(chǎn)品當(dāng)中,從而提供能加優(yōu)質(zhì)的服務(wù)。同時我們也可以期待,該項工作能夠在近期開源,以讓更多研究人員快速跟進(jìn)這一工作。


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

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

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

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

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

分享:
相關(guān)文章
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說