Python, C++和Java代碼互翻,Facebook開發首個自監督神經編譯器

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

將早期的編程語言(例如COBOL)的代碼庫遷移到現在的編程語言(例如Java或C++)是一項艱鉅的任務,它需要源語言和目標語言方面的專業知識。COBOL如今仍在全球大型的系統中廣泛使用,因此公司,政府和其他組織通常必須選擇是手動翻譯其代碼庫還是盡力維護使用這個可追溯到1950年代的程序代碼。

FaceBook公司開發了一個工具TransCoder,這是一個完全自我監督的神經編譯器系統,它可以使代碼遷移變得更加輕鬆和高效。本文的方法是第一個能夠將代碼從一種編程語言轉換爲另一種編程語言而無需並行數據進行訓練的AI系統。本文已經證明TransCoder可以成功地在C++,Java和Python 3之間進行翻譯功能。

TransCoder的性能優於開源的代碼和基於商業規則的翻譯程序。在本文的評估中,該模型正確地將90%以上的Java函數轉換爲C++,將74.8%的C++函數轉換爲Java,並將68.7%的函數從Java轉換爲Python。相比之下,市售工具只能正確地將61.0%的功能從C++轉換爲Java,而開源的翻譯器僅能準確地將38.3%的Java函數轉換爲C++。

自我監督訓練對於在編程語言之間進行翻譯特別重要。傳統的有監督學習方法依賴於大規模的並行數據集進行訓練,但是對於COBOL到C++或C++到Python來說,這些數據根本不存在。TransCoder只依賴於僅用一種編程語言編寫的源代碼,而不需要源代碼和目標語言中的相同代碼示例。它不需要編程語言方面的專業知識,並且可以很容易地將TransCoder的方法推廣到其他編程語言中。本文還創建了專門爲此領域設計的新的評估指標。

TransCoder對於將遺留代碼庫更新爲現代編程語言可能很有用,現代編程語言通常更高效且易於維護。它還展示了一個神經機器翻譯技術應用的新領域。與Facebook AI以前使用神經網絡解決高級數學方程式的工作一樣,本文認爲NMT可以幫助完成通常與翻譯或模式識別任務無關的其他任務。

特意爲編程語言建立序列到序列模型

在自然語言中,即使在越來越依賴自動化機器翻譯系統的專業翻譯人員羣體中,神經機器翻譯的最新結果也被廣泛認可。但是,由於代碼翻譯領域中缺少並行數據,因此它們在該方面的應用受到了限制。程序員仍然依賴於基於規則的代碼轉換工具,這需要專家複查和調試輸出,或者手動翻譯代碼。TransCoder通過利用無監督機器翻譯到編程語言翻譯取得的成功來克服這些挑戰。

image

本文構建了一個帶有注意力機制的序列到序列(seq2seq)模型,該模型由具有轉換結構的編碼器和解碼器組成。TransCoder使用單個共享模型,部分基於Facebook AI以前在XLM上針對所有編程語言所做的工作。本文按照Facebook AI先前的研究中詳細介紹的無監督機器翻譯的三個原則進行了訓練:初始化,語言建模和反向翻譯。

本文首先利用開源GitHub項目中的源代碼使用蒙版語言模型(MLM)對本文的模型進行了預訓練。就像自然語言處理中的上下文一樣,這種預訓練會創建跨語言的嵌入:在相似上下文中使用來自不同編程語言的關鍵字在嵌入空間(例如catch和except)中非常接近。這些嵌入的跨語言性質來自存在於多種語言中的大量通用的標記(錨點)。錨點的示例包括C++,Java和Python通用的關鍵字(例如,for,while,if,try),以及源代碼中出現的數學運算符,數字和英語字符串。

使用MLM進行預訓練使TransCoder可以生成輸入序列的高質量表示。然而,由於從未訓練過解碼器基於源表示對序列進行解碼,因此解碼器缺乏翻譯能力。爲了解決此問題,本文訓練了該模型使用降噪自動編碼(DAE)對序列進行編碼和解碼。 DAE的工作方式類似於有監督的機器翻譯算法,在該算法中,模型被訓練爲在給定序列存在損壞的情況下預測該序列。

作爲輸入給解碼器的第一個符號是指示輸出編程語言的特殊標記。在測試時,該模型可以對Python序列進行編碼,並使用C++起始符號對其進行解碼以生成C++翻譯器。C++翻譯的質量將取決於模型的“跨語言”:如果編碼器將Python函數和有效的C++翻譯映射到相同的潛在表示,則解碼器將成功翻譯成C++。

僅預訓練的跨語言模型和自動降噪就足以進行翻譯。但是,這些翻譯的質量往往很低,因爲從未訓練過該模型在測試時應該完成什麼樣的工作,即從一種語言翻譯爲另一種語言的功能。爲了解決此問題,本文使用反向翻譯,這是在弱監督的情況下利用單語數據的最有效方法之一。

對於每種目標語言,本文使用一個模型和一個不同的開始標記。它經過訓練可以從源到目標以及從目標到源並行轉換。目標到源版本用於將目標序列翻譯成源語言,從而產生與標記目標(GT)序列相對應的嘈雜源序列。然後以弱監督的方式訓練模型,讓模型可以從嘈雜的源序列中重建目標序列,並學習從源到目標的轉換。直到收斂爲止。

爲了評估該模型,以前對源代碼翻譯的大多數研究都依賴於自然語言中使用的度量標準,例如BLEU分數或其他基於標記之間相對重疊的方法。但是,這些類型的指標不太適合編程語言。語法差異小的兩個程序在執行代碼時可能會獲得很高的BLEU分數,但會產生非常不同的結果。相反,具有不同實現方式的語義等效程序將具有較低的BLEU分數。另一種度量標準是參考匹配,或與GT完全匹配的翻譯百分比,但這通常會低估翻譯的質量,因爲它無法識別語義上等效的代碼。

爲了更好地衡量TransCoder和其他代碼翻譯技術的性能,本文創建了一個稱爲計算精度的新指標,該指標可評估假設函數在給定相同輸入時是否生成與參考相同的輸出。我們還將發佈測試集以及用於計算該指標的腳本和單元測試。

下面的示例顯示了TransCoder如何將示例代碼從Python轉換爲C++。我們使用以上的代碼作爲模型輸入:

image

TransCoder成功將Python輸入函數SumOfKsubArray轉換爲C++。它還可以推斷參數的類型,返回類型和函數的參數。該模型將Python dequeue()容器附加到C++實現dequeue <>。下面是該模型在C++中的輸出:

image

最新研究並在實際應用中提供的幫助

自動代碼翻譯有可能使在公司或開源項目中工作的程序員更加高效,因爲他們可以更輕鬆地集成公司內其他團隊或其他開源項目的各種代碼,還可以大大減少更新用早期語言編寫的代碼庫的工作量和成本。

反編譯的進步可能會促使公司和其他機構更新到最新的語言並促進未來的創新,這可能讓使用服務的人們以及機構本身受益。編程語言機器翻譯的進步也可以幫助那些沒有時間學習多種語言編程的人。

更廣泛地說,人工智能有潛力幫助其他編程任務。例如,Facebook AI以前共享了神經代碼搜索,這是一種在查詢代碼中使用自然語言的方法。以及Getafix,該工具可學習自動爲編碼錯誤提供建議修復。雖然TransCoder並非旨在幫助調試或提高代碼質量,但它可以幫助工程師遷移舊代碼庫或使用以其他語言編寫的外部代碼。

爲了促進使用深度學習進行代碼翻譯的研究,本文還發布了一個測試集,該測試集使其他研究人員可以使用計算精度而不是語義盲模型來評估代碼翻譯模型。我們期待看到其他人如何在我們與TransCoder的合作基礎上繼續前進,併爲新的翻譯任務推進自我監督學習。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/live

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-07-28
本文作者:CSDN
本文來自:“ AI科技大本營”,瞭解相關信息可以關注“ AI科技大本營

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章