coding

【為什麼我們要挑選這篇文章】程式碼有特定的邏輯,因此許多情況下,能夠預測工程師接下來要寫的程式碼,而透過程式碼補全工具,電腦能自動生成程式碼,降低工程師的工作負擔。近日,Facebook 取得遷移學習的新突破,讓程式碼生成的準確度超過 50%。電腦離自動寫程式的日子愈來愈近了。(責任編輯:郭家宏)

本文經 新智元(公眾號 ID:AI_era)授權轉載,轉載請連繫出處
作者:新智元

程式碼補全(code autocompletion)就是在寫程式的時候,IDE 能夠預測出下一段要寫的程式碼,也是寫程式的時候選擇使用 IDE 的重要原因。

最近的相關研究表明,自動補全可以透過深度學習來實現,使軟體語言模型能夠透過對從工程師的 IDE 活動中收集的真實世界數據集進行訓練,來實現顯著的準確性提高。

不過,對於那些沒多少人用的程式語言來說,一個常見問題是,可用的 IDE 數據集可能不足以進行訓練。

對於這個問題,Facebook 的研究人員最近在 arxiv 上公開了自己在程式碼補全上的工作。

透過遷移學習提升程式碼生成性能

他們在文中展示了遷移學習是如何能夠在微調之前完成自動補全任務的,這種訓練不侷限於 ide 和特定語言,能夠針對各種各樣的範例程式碼碼序列進行預訓練。

該方法在非常小的微調數據集上提高了 50% 以上的模型精度,在 50k 個帶標籤樣例的數據集上提高了 10% 以上的精度。

在軟體社區中,所有主要程式語言的大量開源碼提交都可以在 GitHub 上找到。

毫無疑問,這些程式碼的提交和開發人員在 IDE 上的活動有著直接的聯繫,例如 vscode、intellij 等會有不同的補全方式,也會直接體現在程式碼中。

因此,如果能夠在建模程式碼編寫行為時使用這些 commit 中的知識,那對於自動補全任務來說是有益的。

由於在所有程式語言中都存在一些共享概念和結構,例如數據類型、面向對象等思想設計,所以研究人員建議將這些語言知識從使用人數更多的程式語言(如 Python、Java)轉移到標記數據不足的其他小眾語言中。

這項研究中的數據集來自 Facebook 的一些開發者活動,主要關注流行的程式語言 Python 和不太流行的語言 Hack。

該團隊首先訓練了來自 Hack 或 Python 的各種單語模型,以及來自兩種語言的多語模型。為了從開放詞彙表中有效地識別和預測很少被使用的關鍵字和兩種語言之間不同的關鍵字,他們採用了兩種標記方法:位元組對編碼(Byte-pair encoding,BPE)和 Bigram 編碼。

為了測試遷移學習的效果,他們使用了兩個文本生成模型 GPT-2 和 PLBART-,並評估了兩個在線和離線模型的性能。

最後論文中總結了他們的貢獻和實驗結果:

1、對從 git 提交獲得的原程式碼文件預先訓練兩個 transformer 語言模型 GPT-2 和 BART,結果顯示它們在自動補全預測方面的性能,比直接使用實際 IDE 程式碼序列的微調提高了 2.18%。也就是說遷移模型取得了更好的效果。

2、GPT-2 模型是在兩個真實世界的數據集上訓練的:在 IDE 上寫的和程式碼補全選擇期間記錄的程式碼序列。預訓練和特定任務的微調相結合,能夠產生一個更好的模型,比基本模型的性能高出 3.29%。

3、文中展示了使用不同的程式語言進行預訓練,在比較使用 Hack 示例進行預訓練和使用 10k Python 示例進行微調的模型與只使用 Python 示例進行訓練的模型時,可以提高 13.1% 的準確性。

4、透過在線 a/b 測試比較,證明在任務、領域和語言這三個遷移學習維度上的改進,分別使自動完成工具的使用率提高了 3.86% 、6.63% 和 4.64%。

總體而言,研究表明,在不使用 ide 數據和不同語言示例程式碼序列上的預訓練程式碼補全模型,使用遷移學習可以顯著提高模型的準確性,表明遷移學習有可能推進較不流行的程式語言的程式碼自動補全,並改善使用它們的開發人員的編碼經驗。

代碼預測工具,提升工程師 coding 效率

Kite 是一個著名的程式碼補全工具。

Kite 基於 AI 的程式碼補全功能現在支持 Python、JavaScript、TypeScript、 Java、 HTML、 CSS、 Go、 C、 C # 、C + + 、 Objective C、 Kotlin 和 Scala。

Kite 於 2016 年 4 月首次亮相,在 17 年 3 月又公開發佈了一個基於雲端運算的版本。該公司在 19 年 1 月籌集了 1700 萬美元,放棄了雲端運算,轉而在本地運行免費服務。

在編寫過程中,Kite 可以極大減少敲鍵盤的次數。在 Kite 的幫助下,活躍開發者甚至每天只需編寫由大約  175 個單字組成的程式碼。

各種開發人員也是對 Kite 十分讚賞,甚至還包括了 Python 之父 Guido van Rossum。

Kite 的 Python 機器學習模型是在 2500 萬個開源程式碼文件上訓練的,它的 JavaScript 機器模型是在 3000 萬個文件上訓練的。

除了越來越多的程式語言,Kite 也可在更多的開發環境中工作,目前已支持在 16 個編輯器上使用,包括 Android Studio、 Atom、 JupyterLab、 Spyder、 Sublime Text、 VS Code 和 Vim 等。

此外 Kite 還與 IntelliJ 家族合作,支持 IntelliJ、 PyCharm、 WebStorm、 Goland、 CLion、 PHPStorm、 Rider、 RubyMine 和 AppCode。

由此可見,公司的願景是允許儘可能多的開發人員利用 Kite,而不管他們的語言或 IDE 是什麼,最終實現各個場景下,程式碼補全的「大一統」。

Kite 公司的執行長史密斯之前還創立了 Xobni,這是一個於 07 年 9 月推出的電子郵件服務,雅虎在 13 年 7 月將其收購。

史密斯在接受訪問時說到,當我們建構對 JavaScript 的支持時,我們致力於建立一種可伸縮的方式來添加更多的程式語言,從那時起,我們一直在疊代我們的 JavaScript 模型和排序演算法。這種學習使我們能夠相對容易地發佈每一種新語言,具有與 JavaScript 相同的準確性和智能性。

19 年,正值 GPT-2 火熱時,一名滑鐵盧大學大四學生 Jacob Jackson 也開發了一款自動補全工具 tabnine,支持 23 種程式語言和 5 種程式碼編輯器,幾乎不需要配置安裝即可使用。

Deep TabNine 會根據你以前的編碼習慣自動補全,還會在後面給出幾個選項的機率。如果之前專案出現過類似程式碼,還能在補全候選框中直接給出地址,方便用戶點擊進去查閲!

VSCode 下,直接打開插件市場搜尋 TabNine,點擊安裝即可。Sublime Text 下調出 Install Package Control 安裝即可。Atom 也可以直接安裝。EMACS 和 Vim 稍微複雜一些。

Deep TabNine 透過對 GitHub 大約 200 萬個文件進行訓練。訓練期間,模型學習了例如動態類型語言中的類型推斷等複雜行為,用這樣的訓練方式預測 token。

TabNine 可以使用傳統工具難以獲取的瑣碎的線索。當線索不夠的時候,TabNine 可能會胡言亂語,然而一旦擁有足夠的線索,就能準確預測出程式碼,甚至還可以給出匹配的機率。

如今深度學習浪潮來了,工程師連自己也不放過,也要取代自己的工作,生於憂患!

參考資料:《Reddit

(本文經 新智元 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈自动写代码指日可待!Facebook迁移学习新突破,代码补全准确率超50%!〉;首圖來源:Pxhere CC Licensed。)

延伸閱讀

【最受歡迎的程式語言】Rust 提出版本更新計劃,預計 10 月上線!
PyTorch 官方推出程式課程!從建模到部署,8 堂課帶你快速上手
Google 推出新程式語言 Logica,要簡化超長的 SQL 程式碼!