Facebook AI 用深度學(xué)習(xí)實(shí)現(xiàn)編程語(yǔ)言轉(zhuǎn)換,代碼庫(kù)遷移不再困難!
從舊式編程語(yǔ)言(例如COBOL)到現(xiàn)代語(yǔ)言(例如Java或C ++)的代碼庫(kù)遷移是一項(xiàng)艱巨的任務(wù),需要源語(yǔ)言和目標(biāo)語(yǔ)言方面的專業(yè)知識(shí)。
例如,COBOL至今仍在全球大型機(jī)系統(tǒng)中廣泛使用,因此公司,政府和其他組織通常必須選擇,是手動(dòng)翻譯其代碼庫(kù),還是致力于維護(hù)使用可追溯到1950年代的語(yǔ)言編寫(xiě)的代碼。
Facebook AI開(kāi)發(fā)了Transcoder,可以使代碼遷移變得更加輕松和高效。Facebook AI的方法能夠?qū)⒋a從一種編程語(yǔ)言轉(zhuǎn)換為另一種編程語(yǔ)言,而無(wú)需數(shù)據(jù)進(jìn)行訓(xùn)練的AI系統(tǒng)。
Facebook AI已經(jīng)證明TransCoder可以成功地在C ++,Java和Python之間完成語(yǔ)言轉(zhuǎn)換。TransCoder的性能優(yōu)于開(kāi)放源代碼的且基于商業(yè)規(guī)則的翻譯程序。在Facebook AI的評(píng)估中,該模型正確地將90%以上的Java函數(shù)轉(zhuǎn)換為C ++,將74.8%的C ++函數(shù)轉(zhuǎn)換為Java,并將68.7%的函數(shù)從Java轉(zhuǎn)換為Python。
相比之下,市售工具只能正確地將61.0%的功能從C ++轉(zhuǎn)換為Java,而開(kāi)源翻譯器僅準(zhǔn)確地轉(zhuǎn)換了38.3%的Java函數(shù)轉(zhuǎn)換為C ++。
自我監(jiān)督的培訓(xùn)對(duì)于在編程語(yǔ)言轉(zhuǎn)換中特別重要。傳統(tǒng)的監(jiān)督學(xué)習(xí)方法依賴于大規(guī)模并行數(shù)據(jù)集的訓(xùn)練,但是對(duì)于從COBOL到C ++或從C ++到Python來(lái)說(shuō),并不適用。
TransCoder完全依賴僅用一種編程語(yǔ)言編寫(xiě)的源代碼。它不需要編程語(yǔ)言方面的專業(yè)知識(shí),并且很容易推廣到其他編程語(yǔ)言。
TransCoder對(duì)于將遺留代碼庫(kù)更新為現(xiàn)代編程語(yǔ)言很有用,現(xiàn)代編程語(yǔ)言通常更高效且易于維護(hù)。它還顯示了如何將神經(jīng)機(jī)器翻譯技術(shù)應(yīng)用于新領(lǐng)域。
seq2seq模型發(fā)揮了大作用
在自然語(yǔ)言中,即使在越來(lái)越依賴自動(dòng)化機(jī)器翻譯系統(tǒng)的專業(yè)翻譯人員中,神經(jīng)機(jī)器翻譯的最新進(jìn)展也被廣泛接受。但是,由于該領(lǐng)域中并行數(shù)據(jù)的稀缺性,它們?cè)诖a轉(zhuǎn)換中的應(yīng)用受到了限制。程序員仍然依賴基于規(guī)則的代碼轉(zhuǎn)換器,這需要專家審查和調(diào)試輸出,或者他們只是手動(dòng)翻譯代碼。TransCoder通過(guò)利用無(wú)監(jiān)督機(jī)器翻譯到編程語(yǔ)言方面的最新進(jìn)展來(lái)克服這些挑戰(zhàn)。
Facebook AI特別注意構(gòu)建了一個(gè)seq2seq模型,該模型由具有變壓器架構(gòu)的編碼器和解碼器組成。TransCoder使用單個(gè)共享模型,部分基于Facebook AI在XLM上的先前工作,適用于所有編程語(yǔ)言。Facebook AI按照無(wú)監(jiān)督機(jī)器翻譯的三個(gè)原則:初始化,語(yǔ)言建模和反向翻譯。
此圖顯示了TransCoder如何利用無(wú)監(jiān)督機(jī)器翻譯的三個(gè)原理
Facebook AI首先利用開(kāi)源GitHub項(xiàng)目中的源代碼,使用MLM目標(biāo)對(duì)Facebook AI的模型進(jìn)行了預(yù)訓(xùn)練。就像在自然語(yǔ)言處理的上下文中一樣,這種預(yù)訓(xùn)練會(huì)創(chuàng)建跨語(yǔ)言的嵌入:在相似上下文中使用的來(lái)自不同編程語(yǔ)言的關(guān)鍵字在嵌入空間中非常接近(例如catch和except)。
這些嵌入的跨語(yǔ)言性質(zhì)來(lái)自存在于多種語(yǔ)言中的大量通用令牌。令牌的示例包括C ++,Java和Python通用的關(guān)鍵字(例如,for,while,if,try),以及源代碼中出現(xiàn)的數(shù)學(xué)運(yùn)算符,數(shù)字和英文字符串。
使用MLM進(jìn)行預(yù)訓(xùn)練使TransCoder可以生成輸入序列的高質(zhì)量表示。然而,解碼器缺乏翻譯能力,因?yàn)閺奈从?xùn)練過(guò)解碼器,基于源表示對(duì)序列進(jìn)行解碼。為了解決此問(wèn)題,F(xiàn)acebook AI訓(xùn)練了該模型以使用降噪自動(dòng)編碼(DAE)目標(biāo)對(duì)序列進(jìn)行編碼和解碼。
DAE的工作方式類(lèi)似于監(jiān)督機(jī)器翻譯算法,其中訓(xùn)練模型以在給定序列的損壞版本的情況下預(yù)測(cè)令牌序列。在測(cè)試時(shí),該模型可以對(duì)Python序列進(jìn)行編碼,并使用C ++起始符號(hào)對(duì)其進(jìn)行解碼以生成C ++轉(zhuǎn)換。
視頻顯示了具有相似功能的關(guān)鍵字如何組合在一起。
僅跨語(yǔ)言模型預(yù)訓(xùn)練和自動(dòng)降噪就足以生成翻譯。但是,這些翻譯的質(zhì)量往往很低,因?yàn)閺奈从?xùn)練過(guò)該模型以使其在測(cè)試時(shí)可以完成預(yù)期的工作,即將功能從一種語(yǔ)言翻譯為另一種語(yǔ)言。
為了解決此問(wèn)題,F(xiàn)acebook AI使用反向翻譯,這是在弱監(jiān)督的情況下利用單語(yǔ)數(shù)據(jù)的最有效方法之一。對(duì)于每種目標(biāo)語(yǔ)言,F(xiàn)acebook AI使用一個(gè)模型和一個(gè)不同的開(kāi)始標(biāo)記。它經(jīng)過(guò)訓(xùn)練可以從源到目標(biāo)以及從目標(biāo)到源并行轉(zhuǎn)換。
然后可以以弱監(jiān)督的方式訓(xùn)練模型,以從嘈雜的源序列中重建目標(biāo)序列,并學(xué)習(xí)從源到目標(biāo)的轉(zhuǎn)換。并行訓(xùn)練目標(biāo)到源版本和源到目標(biāo)版本,直到收斂為止。
為了評(píng)估他們的模型,以前的大多數(shù)源代碼翻譯研究都依賴于自然語(yǔ)言中使用的度量標(biāo)準(zhǔn),例如BLEU分?jǐn)?shù)或其他基于標(biāo)記之間相對(duì)重疊的方法。但是,這些類(lèi)型的指標(biāo)不太適合編程語(yǔ)言。語(yǔ)法差異小的兩個(gè)程序在執(zhí)行代碼時(shí)可能會(huì)獲得很高的BLEU分?jǐn)?shù),同時(shí)仍然產(chǎn)生非常不同的結(jié)果。相反,具有不同實(shí)現(xiàn)方式的語(yǔ)義等效程序,將具有較低的BLEU分?jǐn)?shù)。
另一種度量標(biāo)準(zhǔn)是參考匹配,或與實(shí)地參考完全匹配的翻譯百分比,但這通常會(huì)低估翻譯質(zhì)量,因?yàn)樗鼰o(wú)法識(shí)別語(yǔ)義上等效的代碼。
為了更好地衡量TransCoder和其他代碼轉(zhuǎn)換技術(shù)的性能,F(xiàn)acebook AI創(chuàng)建了一個(gè)稱為計(jì)算精度的新指標(biāo),該指標(biāo)評(píng)估假設(shè)函數(shù)在給定相同輸入時(shí)是否生成與參考相同的輸出。Facebook AI還將發(fā)布測(cè)試集以及用于計(jì)算該指標(biāo)的腳本和單元測(cè)試。
下面的示例顯示了TransCoder如何將示例代碼從Python轉(zhuǎn)換為C ++。Facebook AI使用以下代碼作為模型輸入:
TransCoder成功將Python輸入函數(shù)SumOfKsubArray轉(zhuǎn)換為C ++。它還可以推斷參數(shù)的類(lèi)型,返回類(lèi)型和函數(shù)的參數(shù)。該模型將Python dequeue()容器附加到C ++實(shí)現(xiàn)dequeue <>。這是C ++中模型的輸出:
編程語(yǔ)言轉(zhuǎn)換讓實(shí)際應(yīng)用受益
自動(dòng)代碼翻譯有可能使程序員在公司或開(kāi)源項(xiàng)目中工作的程序員更加高效,因?yàn)樗麄兛梢愿p松地集成公司內(nèi)其他團(tuán)隊(duì)或其他開(kāi)源項(xiàng)目的各種代碼。它還可以大大減少更新用古老語(yǔ)言編寫(xiě)的舊代碼庫(kù)的工作量和開(kāi)銷(xiāo)。
反編譯的進(jìn)步可能會(huì)促使公司和其他機(jī)構(gòu)更新到最新的語(yǔ)言并促進(jìn)未來(lái)的創(chuàng)新,這可能讓使用服務(wù)的人們以及機(jī)構(gòu)本身受益。編程語(yǔ)言機(jī)器翻譯的進(jìn)步也可以幫助那些沒(méi)有時(shí)間或負(fù)擔(dān)不起學(xué)習(xí)多種語(yǔ)言編程的人。
更廣泛地說(shuō),人工智能有潛力幫助其他編程任務(wù)。例如,F(xiàn)acebook AI以前共享了神經(jīng)代碼搜索的工具,這些工具可學(xué)習(xí)自動(dòng)為編碼錯(cuò)誤提供建議修復(fù)。雖然TransCoder并非旨在幫助調(diào)試或提高代碼質(zhì)量,但它有潛力幫助工程師遷移舊代碼庫(kù)或使用以其他語(yǔ)言編寫(xiě)的外部代碼。
為了促進(jìn)有關(guān)使用深度學(xué)習(xí)進(jìn)行代碼翻譯的未來(lái)研究,F(xiàn)acebook AI還發(fā)布了一個(gè)測(cè)試集,該測(cè)試集使其他研究人員可以使用計(jì)算精度而不是語(yǔ)義盲模型來(lái)評(píng)估代碼翻譯模型。
Facebook AI期待看到其他人在和TransCoder的合作基礎(chǔ)上繼續(xù)前進(jìn),并為新的翻譯任務(wù)推進(jìn)自我監(jiān)督學(xué)習(xí)。