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

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能學(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

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

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

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

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

(雷鋒網(wǎng))

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

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

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

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

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

一、背景

BERT作為一種雙向Transformer的編碼器,其對(duì)預(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)用場(chǎng)景,作者另辟蹊徑,推出雙模態(tài)預(yù)訓(xùn)練模型,即兼顧NLP任務(wù)和Python、Java等編程語言。 

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

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

(雷鋒網(wǎng))

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

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


二、框架

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

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

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

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

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

(雷鋒網(wǎng))

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

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

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

另外,還有一個(gè)學(xué)習(xí)生成器用來檢測(cè)一個(gè)詞是否為原詞,其背后原理是一個(gè)二進(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è)置。例如在自然語言代碼搜索中,會(huì)使用與預(yù)訓(xùn)練階段相同的輸入方式。而在代碼到文本的生成中,使用編碼器-解碼器框架,并使用CodeBERT初始化生成模型的編碼器。

三、實(shí)驗(yàn)

 作者做了四個(gè)實(shí)驗(yàn),分別是:1)將CodeBERT應(yīng)用到自然語言代碼搜索任務(wù)上,并與傳統(tǒng)方法進(jìn)行對(duì)比;2)進(jìn)行NL-PL Probing實(shí)驗(yàn),考察CodeBERT在預(yù)訓(xùn)練階段到底學(xué)習(xí)了什么知識(shí);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)練。這個(gè)語料庫框架如下圖所示,共包含6中常見的編程語言(Python、JavaScript、Java、Ruby、PHP、Go)。 
代碼也能預(yù)訓(xùn)練,微軟&哈工大最新提出 CodeBERT 模型,支持自然-編程雙語處理

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

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

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

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

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

2、NL-PL Probing

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

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

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

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

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

3、代碼文檔生成

 這部分研究代碼到文檔的生成問題,并在六種編程語言中研究了生成任務(wù)在Code Search Net Corpus上的結(jié)果。 另外,為了證明CodeBERT在代碼到NL生成任務(wù)中的有效性,作者采用了各種預(yù)訓(xùn)練的模型作為編碼器,并保持了超參數(shù)的一致性。  實(shí)驗(yàn)結(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#語言上做了測(cè)試。 作者選擇了Codenn數(shù)據(jù)集,這是一個(gè)包含Stack Overflow自動(dòng)收集的66015對(duì)問題和答案的數(shù)據(jù)集,其規(guī)模相比 CodeSearchNet語料庫要小幾個(gè)數(shù)量級(jí)。為了可靠地評(píng)估模型,作者通過人工方式,為測(cè)試集中的代碼片段提供兩個(gè)附加 titles 來擴(kuò)展測(cè)試集。 模型評(píng)估標(biāo)準(zhǔn)采用平滑的BLEU-4分?jǐn)?shù),評(píng)估結(jié)果如下圖: 

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

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


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

四、總結(jié)

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


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

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

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

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

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

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

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