預測源代碼,聽著就是一件非常炫酷的事情。最近,谷歌大腦的研究人員就對此高難度任務發(fā)起了挑戰(zhàn),在構建源代碼生成模型上實現(xiàn)了新突破!
編程神技來了!
根據(jù)已經(jīng)編輯好的代碼預測源代碼的AI,對程序員來說是一個非常寶貴的工具。
最近,谷歌大腦團隊就對這項難度頗高的任務發(fā)起了挑戰(zhàn)。
論文地址:
https://arxiv.org/pdf/1904.02818.pdf
改代碼是程序員經(jīng)常要做的事,需求一變,甚至可能要重頭再來。然而,編輯模式(edit pattern)是無法僅僅根據(jù)要插入/刪除的內容或者寫好內容后的代碼狀態(tài)來被理解。
它需要根據(jù)變化與其所處狀態(tài)的關系來理解,準確地對代碼序列進行建模需要學習舊代碼的表示方法,這就允許模型可以概括一種模式且對未來要編寫的代碼內容進行預測。
舉個例子:
有兩個歷史記錄A和B,這兩段代碼序列在經(jīng)過2次編輯后,得到了相同狀態(tài),即“狀態(tài)2”。但是在這個過程當中,歷史記錄A是在向foo函數(shù)添加參數(shù),而歷史記錄B是在從foo函數(shù)中刪除參數(shù)。
這項工作,就是希望根據(jù)“狀態(tài)0”和“編輯 1&2 ”,可以預測接下來“編輯3”的操作內容。
為了達到這個目的,他們首先開發(fā)了兩種表示方法來捕獲意圖信息,這些信息將隨著代碼序列的長度“優(yōu)雅地”擴展:
顯式表示方法:在序列中“實例化”代碼內容;
隱式表示方法:用于實例化后續(xù)要編寫的代碼。
然后它們構建了一個機器學習模型,這個模型可以捕獲原始代碼和預測代碼之間的上下文關系。
構建源代碼生成模型新突破
近年來,構建源代碼的生成模型成為十分受重視的核心任務。
然而,以前的生成模型總是根據(jù)生成代碼的靜態(tài)快照(static snapshot)來構建的。而在這項工作中,研究人員將源代碼視為一個動態(tài)對象(dynamic object),并處理軟件開發(fā)人員對源代碼文件進行編輯的建模問題。
對編輯序列建模的主要挑戰(zhàn)是如何開發(fā)良好的表示,既能捕獲有關意圖的所需信息,又能優(yōu)雅地對序列的長度進行擴展。
正如上述,這項工作主要考慮編輯的兩種表示方法,一是顯式表示方法,二是隱式表示方法。
在顯式表示方法中,將分層循環(huán)指針網(wǎng)絡模型視為強大但計算成本較高的基線。在隱式表示方法中,考慮一個vanilla序列到序列模型,以及一個基于注意力的雙頭模型。這些模型展示了由不同問題公式產(chǎn)生的權衡,并為未來的編輯序列模型提供設計決策。
在精心設計的合成數(shù)據(jù)和對Python源代碼進行細粒度編輯的大型數(shù)據(jù)集上,研究人員評估了模型的可伸縮性和準確性,以及模型觀察以往編輯序列并預測未來編輯內容的能力。
實驗表明,雙頭注意力模型特別適合實現(xiàn)對真實數(shù)據(jù)的高精度、校準良好的置信度和良好的可擴展性。
總之,這項工作形式化了從編輯序列中學習和預測編輯序列的問題,提供了對模型空間的初步探索,并演示了從開發(fā)人員對源代碼進行的編輯中學習的實際問題的適用性。
問題定義:如何表示編輯序列數(shù)據(jù)
隱式和顯式數(shù)據(jù)表示
第一個問題是如何表示編輯序列數(shù)據(jù)。我們定義了兩種具有不同權衡的數(shù)據(jù)格式。
顯式格式 (圖 2 (a)) 將編輯序列表示為 2D 網(wǎng)格中 tokens 序列的序列。內部序列對文件中的 tokens 建立索引,外部序列對時間建立索引。任務是消耗前 t 行并預測在時間 t 進行的編輯的位置和內容。
隱式格式 (圖 2 (b)) 將初始狀態(tài)表示為 tokens 序列,將編輯表示為 (position, content) 對的序列。
圖 2:將 “BACA” 轉換為 “BABBCACC” 的編輯序列的顯式表示 (a) 和隱式表示 (b)。
問題描述
顯式問題的目標是學習一個模型,該模型使給定的的可能性最大化;隱式問題是學習一個模型,該模型使給定所有 t 的的
基線模型
基線顯式模型 (Baseline Explicit Model)
基線顯式模型是一個兩級長短時記憶 (LSTM) 神經(jīng)網(wǎng)絡,類似于 Serban 等人 (2016) 的分層 RNN 模型。
基線隱式模型 (Baseline Implicit Model)
sequence-to-sequence 框架的自然應用是使用編碼器的初始狀態(tài) s (0),并在解碼器中生成 (p (t) i, c (t)) 對的序列。編碼器是一個標準的 LSTM。解碼器不太標準,因為每個動作都是成對的。為了將對作為輸入處理,我們將 p (t) i 的嵌入與 c (t) 的嵌入連接起來。為了產(chǎn)生成對的輸出,我們先預測位置,然后給出給定位置的內容。
隱式注意力模型
我們開發(fā)了一個模型,它對隱式表示進行操作,但是能夠更好地捕獲編輯內容與編輯上下文之間關系的序列。
該模型深受 Vaswani 等人 (2017) 的啟發(fā)。在訓練時,編輯的完整序列在單個前向傳遞中被預測。
有一個編碼器計算初始狀態(tài)和所有編輯的隱藏表示,然后有兩個 decoder heads:第一個解碼每個編輯的位置,第二個解碼給定位置的每個編輯的內容。
圖 3 (b, c) 對模型的整體結構進行了概述。
圖 3:(a) 基線顯式模型;(b, c) 隱式注意力模型
實驗和結果:模型可以解決幾乎所有任務
實驗的目的是了解上述模型的能力和局限性,并在實際數(shù)據(jù)上進行評估。
實驗有兩個主要因素,一是模型如何準確地學習識別編輯序列中的模式,二是模型如何擴展到大數(shù)據(jù)。
在第一組實驗中,我們在一個簡單的環(huán)境中研究了這些問題;在第二組實驗中,我們根據(jù)真實數(shù)據(jù)進行了評估。
本節(jié)中,我們評估了三種方法:顯式模型縮寫為 E,隱式 RNN 模型縮寫為 IR,隱式注意力模型縮寫為 IA。
表 1:在合成數(shù)據(jù)集上的準確性
表 1 報告了產(chǎn)生最佳開發(fā)性能的超參數(shù)設置和步驟的測試性能。結果表明,顯式模型和改進的隱式模型可以解決幾乎所有的任務,甚至包括那些涉及元字符和相對較長的替換序列的任務。
圖 4:(a)-(c) 在訓練期間處理序列所需的時間,跨越不同插入數(shù) (10,50,100) 的 n-gram 問題。(d) 當將預測限制在模型最有信心的上下文中時,實際數(shù)據(jù)集的 token 級精度。
如圖 4 (d) 所示,顯式模型始終比隱式模型成本更高,并且隨著數(shù)據(jù)大小的增加,這種差距也會增大。長度為 100 的插入序列比實際數(shù)據(jù)集中的序列小十倍,但在運行時已經(jīng)存在一個數(shù)量級的差異。注意力模型通常占隱式 RNN 模型的 50% ~ 75% 的時間。
結論和未來研究
在這項工作中,我們提出了從過去的編輯中學習,以預測未來編輯的問題,開發(fā)了具有很強泛化能力的編輯序列模型,并證明了該方案對大規(guī)模源代碼編輯數(shù)據(jù)的適用性。
我們做了一個不切實際的假設,即快照之間的編輯是按從左到右的順序執(zhí)行的。另一種值得探索的方案是,將其視為從弱監(jiān)督中學習。可以想象這樣一個公式,其中快照之間的編輯順序是一個潛在變量,必須在學習過程中推斷出來。
該研究有多種可能的應用。在開發(fā)人員工具的背景中,我們特別感興趣的是調整過去的編輯以做出其他類型的預測。例如,我們還可以設置光標位置的條件,并研究如何使用編輯歷史來改進忽略編輯歷史的傳統(tǒng)自動完成系統(tǒng)。另一個例子是,根據(jù)開發(fā)人員最近的編輯,預測他們接下來會發(fā)出哪些代碼搜索查詢。一般來說,我們希望預測開發(fā)人員接下來要做的事情。我們認為,編輯歷史包含了重要的有用信息,在這項工作中提出的公式和模型是學習使用這些信息的良好起點。
-
編碼器
+關注
關注
45文章
3601瀏覽量
134203 -
谷歌
+關注
關注
27文章
6142瀏覽量
105115 -
源代碼
+關注
關注
96文章
2944瀏覽量
66673
原文標題:程序員再也不怕需求改來改去!谷歌大腦新突破:AI預測源代碼
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論