一個用於代碼生成的基於語法的結構化CNN解碼器

2021-02-26 數據挖掘與開源生態

一個用於代碼生成基於語法的結構CNN解碼器

摘要

代碼生成將程序描述映射到可執行的程式語言原始碼。現有的方法主要依賴於遞歸神經網絡(RNN)作為解碼器。然而,我們發現一個程序比一個自然語言句子包含更多的標識,因此RNN可能不適合捕捉這麼長的序列。在本文中,我們提出了一種基於語法的結構化卷積神經網絡(CNN)用於代碼生成。我們的模型通過預測程式語言的語法規則來生成程序;我們設計了幾個CNN模塊,包括基於樹的卷積和先序卷積,它們的信息通過專門的注意池化層進一步聚合。在HearthStone基準數據集上的實驗結果表明,我們的CNN代碼生成器顯著優於之前最先進的方法5個百分點;在幾個語義解析任務上的額外實驗,證明了我們模型的健壯性。我們還進行了深入的消融測試,以更好地了解我們模型的每個組成部分。

 

1 引言

從自然語言描述中生成代碼,是人工智慧中一項重要但具有挑戰性的任務(Ling et al. 2016;Yin和Neubig 2017;Rabinovich、Stern和Klein 2017;Mei和Zhang 2018),它有助於各種應用。例如,程式設計師想用Python語言「打開文件F1」,但不知道如何用程式語言實現它。希望通過代碼生成得到目標代碼「f = open(『F1』,『r』)」。

隨著深度學習的發展,編碼器-解碼器框架成為序列生成的主流方法。特別地,遞歸神經網絡(RNNs)可以充當典型的編碼器和解碼器;這種架構也被稱為序列到序列(Seq2Seq)模型(Sutskever,Vinyals,and Le 2014)。應用於代碼生成任務時,將程序描述作為輸入序列,生成所需代碼作為輸出序列(Ling et al.2016)。

程序中包含豐富的結構信息,這對於程序建模非常重要(Rabinovich, Stern, and Klein 2017;Yin和Neubig 2017)。然而,傳統的Seq2Seq神經網絡並不顯式地對程序結構建模。圖1展示了一個Python抽象語法樹的示例,其中n3和n6兩個節點作為父-子節點,應該會進行密集的交互,但如果樹被預先順序遍歷為一個序列,那麼它們彼此距離就會變得較遠。這給Seq2Seq模型帶來了困難。

為了解決這個問題,Dong和Lapata(2016)提出了一種沿著程序的抽象語法樹生成代碼的方法,但是它們的生成仍然在標識級。更近期的工作是通過預測語法規則或重寫規則來應用每一步的代碼生成(Xiong等,2018;Yin和Neubig 2017;Rabinovich,Stern,and Klein 2017);因此,生成的程序在語法上是正確的。當神經網絡用於這些方法時,RNN用於捕獲解碼器內預測的自回歸性。

在深度學習領域,研究人員對使用卷積神經網絡(CNN)作為解碼器表現出越來越大的興趣(Gehring et al.2017;Chaturvedi,Pandit和Garain 2018),因為它效率高和訓練較為簡單。我們進一步觀察到,一個程序比一個自然語言句子要大得多,而且即使是帶有長短期記憶單元(Hochreiter和Schmidhuber 1997, LSTM)的RNNs,也同樣存在長期依賴問題(Bengio,Simard和Frasconi 1994)。然而,CNNs可以通過滑動窗口有效地捕捉不同區域的特徵。

為此,我們提出了一種基於語法的結構化CNN用於代碼生成。我們的模型根據AST中構造的語法規則生成代碼,例如,If→exprstmt* stmt*,遵循我們之前工作中的框架(Xiong et al.2018)。由於子節點序列是由一個預測步驟生成的,因此它支持比逐個標識生成更緊湊的預測。換句話說,我們的模型預測了語法規則的順序,這些規則最終形成了一個完整的程序。

在我們的方法中,語法規則的預測主要基於三種類型的信息:指定要生成的程序的原始碼序列、前面預測的語法規則和已經生成的部分AST。這裡,前者是編碼器的輸入;後兩者使解碼器具有自回歸性;並且通常,解碼器也以編碼器為條件。

我們為該結構化CNN設計了幾個不同的組件,以適用於程序生成:(1)我們首先採用基於樹的卷積思想,將滑動窗口應用於AST結構(Mou et al.2016)。然後設計了另一個CNN模塊對部分AST中的節點進行先序遍歷,這兩種CNN不僅在序列中捕獲鄰居信息,而且在樹結構中捕獲鄰居信息。(2)為了增強「自回歸性」,我們將另一個CNN模塊應用到待生成節點的祖先上,這樣神經網絡就知道某一步要在哪裡生成了。(3)我們設計了一種專用的注意力池機制,將CNN的特徵與不同的神經模塊相互作用進行聚合。特別是,我們發現在代碼生成過程中考慮作用域名稱(例如,函數和方法名稱),並使用這些信息作為幾個注意力池層的控制器是很有用的。

我們在已建立的基準數據集HearthStone上進行了python代碼生成實驗(Ling et al. 2016)。實驗結果表明,我們的基於CNN的代碼生成器在很大程度上優於以往的RNN方法。我們在兩個語義解析任務上進一步評估了我們的方法,其中的目標程序比HearthStone短;與以往的先進方法相比,我們的方法也取得了更好的效果,表明了我們的方法的魯棒性。我們進行了廣泛的消融測試,表明我們設計的基於語法的結構化CNN比單純地應用CNN更好。

據我們所知,我們是第一個成功應用CNN解碼器進行代碼生成的。

 

2 提出的模型

圖2顯示了我們的網絡的總體結構。我們將首先描述基於語法的代碼生成過程,然後詳細介紹每個模塊。

基於語法的代碼生成

對於程序描述的輸入,我們的任務是生成一段符合描述的可執行代碼。在傳統的Seq2Seq模型中,程序可以表示為一標識序列x1,x2,...,xT,這些標識是按順序生成的。

另外,一個有效的程序可以用圖1中的抽象語法樹表示。葉節點是終止符號,表示為x1,...,xT。非葉節點是非終止符號,表示為n1,...,nN,每個代表程序的一個抽象組件(如IF塊)。子節點n1,...,nk是其父節點p應用語法規則r得到的,記為p→(r)n1···nk。在我們的工作中,通過檢查訓練集,不同用戶定義變量的葉節點被視為單獨的語法規則。表1說明了一些Python規則及其含義。

Dong和Lapata(2016)提出通過遵循AST生成可執行命令,但他們使用RNN一次一個地預測子節點n1···nk。在我們的研究中,我們遵循了更近期的工作(Rabinovich,Stern和Klein 2017;Yin和Neubig 2017;Xiong等人2018),來預測生成程序的規則r1、r2、··· rM。我們按照深度優先對樹進行先序遍歷,對於第一次遇到的非終止符號,我們預測應該使用什麼規則來擴展它。換句話說,程序的生成概率被表示為:

儘管一種典型的程式語言比特定的AST節點包含更多的語法規則,但是基於語法的生成更加緊湊,因為子節點c1,...,ck只需利用規則p→(r)c1…ck進行一次預測就可以就位。同時,還可以確保生成的程序語法正確。

在本節的其餘部分,我們將描述用於預測語法規則的CNN編碼器-解碼器模型。

CNN模型的輸入

我們模型的輸入是一段描述,它說明要生成什麼樣的程序。對於HearthStone數據集中的某個card的代碼生成,輸入是半結構化數據,包含card的名稱、屬性和描述,如圖4a所示。對於其他任務,比如語義解析任務,輸入可以是一個自然語言句子(Zettlemoyer和Collins 2005)。

我們對輸入進行標識化,得到一個標識序列X1(enc),...,XI(enc),其中I是輸入的長度。這些標識被表示為實值向量x1(enc),...,xI(enc),被稱為嵌入向量。

然後應用一組卷積層,提取特徵y1(enc,L),···,yI(enc,L)。特別的是,在激活函數之前,我們採用與線性變換平行的每一層進行快捷連接的方式,如ResNet(He et al.2016)。這有助於深度神經網絡的訓練。

形式上,提取的特徵yi(enc,l)可以計算為:

其中W(enc,l)是編碼器CNN的卷積層的權重,s可以用s=(k-1)/2計算,k是窗口的大小(我們的實驗設置為2),l=1,...,L代表深度CNN的層。特別地,yi(enc,0)是嵌入向量xi(enc)的輸入。對於偶數層,c(enc,l)為1;對於奇數層,c(enc,l)為0。c(enc,l)代表此層是否存在快捷連接。對於第一個和最後幾個單詞,我們執行補零。

CNN用於預測規則

由於生成程序的概率是由語法規則分解的(公式1),我們跟蹤所有之前預測的規則,並建立一個深度神經網絡來提取這些信息。

設r1,...,rn−1為之前預測的規則。我們將它們作為實值向量嵌入,其中嵌入向量被隨機初始化並通過反向傳播學習。

我們對規則嵌入r1,...,rn-1應用一個具有快捷連接的深度CNN模塊,提取特徵y1(rule,L),...,yn-1(rule,L)。計算方法與式2相同,但權值參數不同,這裡就不重複細節了。

預測的語法規則以一種緊湊的方式完全指定生成的(部分)程序,這有利於準確地生成代碼。

然而,只給解碼器提供自回歸的預測規則是不合適的,因為由於緊湊性,它們不能提供程序的具體/圖形視圖。為了緩解這個問題,我們使用部分AST增強解碼器,如下所述。

CNN-部分AST

抽象語法樹(AST)是程序的樹形結構表示,其中規則p→(r)n1···nk是p和n1,...,nk的父子邊的擴展。

我們設計了一個深度CNN模塊來捕獲AST的結構信息。它包含基於樹的卷積層,先序遍歷卷積層,以及樹路徑CNN子模塊,用於告知網絡下一個語法規則在哪裡應用。

基於樹的CNN

我們首先將基於樹的CNN應用於部分AST,類似於Mou等人所做的工作(2016;2018)。主要的想法是設計一個固定深度的局部特徵檢測器,滑過樹來提取結構特徵,如圖3a所示。

基於樹的CNN的輸入是已經生成的部分AST,每個節點用一個嵌入向量表示。我們還放置了一個佔位符節點(nPHD如圖3所示),以指示應用下一個語法規則的位置。

假設一個節點ni有一個父節點pi和一個祖父節點gi,它們的向量表示分別為ni,pi和gi。然後基於樹的CNN提取特徵y1(ast),...,yn-1(ast),計算如下:

其中W(ast)是基於樹的卷積核的權值。我們為最上面兩層中沒有父節點或者祖父節點的節點填充一個特殊標記。

請注意,我們基於樹的卷積與Mou等人(2016)略有不同,因為我們有一個更深的窗口,但沒有考慮同胞信息。這是因為我們基於語法的生成通過應用特定規則一次獲得所有的兄弟姐妹,因此,兄弟姐妹沒有祖先重要。遺憾的是,Mou等人(2016)的複雜性隨著深度呈指數增長,且難以控制,而我們基於樹的CNN變體是線性增長的。在卷積計算方面,我們遵循Mou等人(2016)的方法,採用類似感知器的交互形式。ResNet中基於深度樹的卷積和快捷連接可以作為未來的工作進行探索。

先序遍歷CNN

在得到基於樹的CNN提取的一組向量後,我們使用一個以y(ast)為輸入的先序遍歷卷積(如圖3b所示)。也就是說,通過先序遍歷,將AST節點組織成一個序列。

可以看出,一個簡單的先序遍歷對於樹結構是不可逆轉的,即不同的樹結構可以產生相同的序列。為了解決這個問題,我們在進行先序遍歷時,採用跟蹤回溯的方式。例如,圖3中的AST得到序列n1,n2,n3,n6,n6(bt),n3(bt),n4,n4(bt),nPHD,nPHD(bt),n5,n5(bt),n2(bt),n1(bt)。他們的向量表示(包括回溯節點和佔位符節點)是由基於樹的卷積預測的。然後使用公式2中的深度CNN提取特徵y1(tree,L),...,y2S(tree,L),其中L為CNN的層數。T為AST中的節點數,先序回溯遍歷得到2S的輸入單元。

需要注意的是,基於樹的CNN和先序遍歷CNN捕獲的信息是不同的。先序遍歷產生的順序可以在生成過程中處理AST節點的序列鄰居,而基於樹的卷積可以為結構上相鄰的節點實現信息融合。例如,在圖3中,節點n4是n2的一個子節點。然而,在程序的其他部分(即n3和n6)生成之後,節點n2和n4就不再靠近彼此了。基於樹的卷積直接為節點及其祖先構建一個特徵提取器,以實現它們之間的交互。因此,我們認為這兩種CNN是互補的。

樹路徑CNN

假若只考慮上面的CNNs,那麼模型就很難分辨出下一條語法規則的應用位置。例如,如果我們在圖3中展開n4或n5,基於樹的CNN和先序遍歷CNN將產生非常相似的特性,儘管我們為先序CNN引入了佔位符。

從技術上講,如果我們遵循最左端推導,那麼應用下一個規則的地方是明確的。但這樣的線索太過含蓄,應該更明確地建模。

因此,我們從根節點提取到要展開的節點的路徑。例如,如果我們展開n4,那麼路徑應該就是n1,n2,n4。然後一組卷積層提取特徵y1(path,L),...yJ(path,L),同樣由公式2計算出。(其中J是路徑中的節點數,L是CNN卷積層的數量。)我們稱之為基於樹路徑的卷積。

池和注意力機制

CNNs提取一組大小或形狀相同的特徵作為輸入。為了便於代碼生成的softmax預測,我們需要將信息聚合為一個或幾個固定大小的向量,而不管輸入大小如何。

傳統上,人們對CNNs(Krizhevsky, Sutskever和Hinton 2012)和基於樹的CNNs(Mou et al.2016;Mou and Jin 2018)進行最大池化。但這使得底層的CNN模塊分離,無法在信息聚合時進行通信。

因此,我們採用了類似於Yu等人(2018)的CNN池的注意機制。本質上,注意力機制計算一組候選特徵(由CNN提取)的加權和,其中權值由控制向量計算(例如,另一個CNN模塊的最大池向量)。

形式上,給定一個控制向量c和一個CNN模塊提取的一組候選卷積特徵向量y1,...,yD (D為特徵向量的數量),則attention logit計算如下:

其中W(att)是一個可訓練矩陣,啟發來自於度量學習。那麼節點i的注意力權值αi為:

最後,注意力池得到的向量y(att)可以表示為:

為了將這樣一個注意力池化層應用到我們的底層CNNs中,我們考慮了作為控制向量的幾個關鍵信息。(1)輸入的描述要詳細說明生成程序的功能,我們用它來控制語法規則CNN和樹路徑CNN。特別地,我們使用一個最大池化層來聚合輸入的CNN特徵,作為一個固定大小的控制向量,用於計算樹徑CNN和預測語法規則的CNN的注意力權值。(2)我們注意到,作用域名稱(即函數名或方法名)提供了關於其後代的啟發性信息。AST節點類型不會捕獲這些信息,因此我們將作用域名嵌入為一個向量,並使用它來控制先序遍歷CNN和CNN的輸入。需要注意的是,如果當前程序片段在兩個或多個作用域下(一個函數和一個方法),我們只考慮最近的作用域作為控制向量。如果代碼片段不屬於任何函數或類,則將嵌入的範圍設置為零向量。

除了用於基於樹的卷積的注意力池外,對先序遍歷CNN特徵應用另一個最大池層也是有用的。我們發現,控制範圍的嵌入使得注意力在相應的AST節點達到峰值,而聚集的信息是不夠的。另一個最大池層可以保存更多的信息,而不管控制向量是什麼。

我們還想指出,在具有多個模塊的深度神經網絡中,設計注意力機制及其控制連接有不同的選擇。例如,我們可以使用CNN作為輸入來控制所有其他模塊,遵循編碼器-解碼器框架中的注意力啟發。但是,我們的試點實驗表明,這種設計的性能較差,因此我們採用當前的架構。

訓練和推理

我們連接所有最大池和注意池層,它們被輸入到一個兩層感知器,其中最後一層有一個softmax激活函數,用於預測下一個語法規則,給出

其中hi(MLP)是softmax函數的輸入logit,R是候選語法規則的數量。

我們的模型在真實程序中通過交叉熵損失進行訓練。由於我們的整個模型是可區分的,因此所有的參數都是通過基於梯度的更新來學習的。

對於推理,我們尋求一系列語法規則,使輸入的概率最大化。如果(部分)樹中的每個葉節點都是一個終止符號,那麼規則的遞歸預測也就結束了。我們使用集束搜索來近似全局推理,實驗中集束大小為5。在推理過程中不會考慮針對特定節點類型的無效規則。例如,如果p1≠p2,那麼p2→c1c2不能用於節點p1。

 

3 模型的評估

在本節中,我們將展示基於CNN的代碼生成的實驗結果。我們在兩種類型的任務上評估了該方法:(1)HearthStone遊戲的Python代碼生成,(2)用於語義解析的可執行邏輯表單生成。

實驗Ⅰ:HearthStone代碼生成

數據集---我們的第一個(也是主要的)實驗,基於已建立的基準數據集HearthStone(Ling et al.2016,HS)。該數據集包括HearthStone(即爐石遊戲)的665張不同的卡牌;每個數據點的輸入是一個半結構化的描述欄位,如卡牌名、成本、攻擊、描述等屬性;輸出是實現卡牌功能的Python代碼片段,如圖4所示。我們延續了Ling等人(2016)的train-dev- test分割方法。表2中的HS列列出了數據集的相關統計信息。

指標---我們通過準確性和BLEU評分來評估我們的方法。理想情況下,精確度應該計算功能正確的程序的分數,但這是不可計算的。我們遵循了大多數之前的研究(Ling等人 2016;Yin和Neubig 2017),計算基於字符串匹配的準確性(記為StrAcc)。我們還發現,一些生成的程序使用不同的變量名,但實現了正確的功能,而且有時在函數調用中指定或未指定參數名。雖然與參考程序不同,但經過人工檢查,被確認程序是正確的,我們用Acc+表示人為調整的精度。在這裡,我們沒有對算法的不易察覺的替代實現進行檢查,因此Acc+仍然是函數精度的下界。

生成代碼的質量通過作為輔助度量的BLEU評分進一步評估,它計算生成的代碼在n-grams上與實際代碼的距離。

設置---對於輸入描述,我們用空格替換所有標點符號;所有字母都是小寫形式。對於神經網絡,我們將CNN層的數量L設置為21層,其中底層沒有跳轉連接。我們還發現,為不同的AST節點類型(即非終止節點、變量節點和函數名節點)構建單獨的網絡(即相同的體系結構,但具有不同的權重參數)很有幫助,這使我們能夠在生成過程中更好地了解節點類型。在預測變量節點時,我們為每個槽,引入一個新的softmax目標,它可以複製槽值。不同CNN模塊的層被設置為相同的維數,每個預測器網絡通過驗證從128,192,256個中選擇。我們應用dropout(drop rate=0.5)和l2懲罰來規範完全連接的層。網絡由Adam optimizer(Kingma和Ba 2015)使用默認的超參數進行訓練。

總體結果---表3展示了我們基於CNN的代碼生成結果,並與之前的前沿模型進行了比較:(1)潛在預測網絡(Ling et al.2016,LPN),一種具有多個標識級預測因子的強化的序列-序列模型;(2)SEQ2TREE(Dong and Lapata 2016),基於AST的序列-序列模型;(3)句法神經模型(Yin和Neubig 2017,SNM),一種基於AST結構的LSTM解碼器;(4)抽象語法網絡(Rabinovich,Stern和Klein 2017,ASN),另一個基於AST的序列-序列模型,分別在水平方向和垂直方向構建兩個LSTMs預測規則。ASN模型有一個變體(ASN+SUPATT),其中注意力以監督的方式訓練。

如表所示,我們的模型在精度和BLEU得分方面都優於之前的所有結果。特別是,我們的精度比之前最先進的結果顯著提高了5個百分點。對於手動調整的精度(即Acc+),Yin和Neubig(2017)稱他們的工作,提高了約2個百分點。在我們的場景中也觀察到了類似的現象,我們的Acc+得分為30.3%,這有力地證明了我們方法的有效性。

我們發現一個有趣的事實,之前的幾個方法可以達到與我們的方法相似的BLEU分數,但準確度要低得多。例如,ASN模型的BLEU得分為79.2,與我們的模型給出的79.6相當。然而,ASN只達到22.7%的字符串精度,而我們的是27.3%。這是因為BLEU度量只度量程序的表面n-gram相似性。以前的方法(如ASN)能夠生成看似合理的代碼,但實際上在細節上是不夠正確的。因此,我們考慮將BLEU分數(在之前的工作中採用)作為次要指標,而準確度是主要的度量標準,表明我們的方法比以前的模型生成的程序要更準確。

消融測試---我們進行了廣泛的消融測試來分析每個部件的作用。雖然我們的網絡的發展是從一個簡單的基線開始的,並且我們逐漸地增加了有用的組件,但是切除測試是以相反的方式進行的:它從完整的模型開始,我們要麼刪除模型的單個組件,要麼用一些合理的替代品代替它。我們在表4中展示了消融測試的結果。

我們首先用基於LSTM的RNN(1 & 2行)替代一個CNN組件,分析CNN的效果。因為主要信息在部分AST(平均151個節點,如表2所示)上,對於語法規則的預測,在這個控制實驗中,我們只用先序遍歷CNN取代一個LSTM。這樣的設置使得BLEU得分降低了1分,但準確率降低了9%。結果與文獻中之前的模型一致(如表3所示),其中,RNN是實現較低精度的主要構件。

如果我們考慮簡單地刪除先序遍歷CNN的設置(表4中的第四行),就可以更好地理解這個場景。兩者都在基於樹的CNN層之上,LSTM組件的準確率比不使用LSTM的情況低4%。這意味著RNNs不適合這個任務,這可能是因為一個程序包含了太多的標識和AST節點。將RNN應用於如此長的序列會非常難訓練(Pascanu,Mikolov和Bengio 2013),模型的性能會明顯變差。

我們也分析了模型的其他組件,包括CNN預測規則,基於樹的卷積層,樹路徑卷積,注意力池機制,和範圍控制器池(見表4的3-8行)。我們看到,上述每個組件以自己的方式為整個模型做貢獻,提高了3-6百分比的準確性。這些結果表明,我們設計了合理的神經網絡結構組件,適合於代碼生成任務。

實驗Ⅱ:語義解析

數據集和設置---語義解析是為了生成給定自然語言描述的邏輯形式。可以把它看作是特定領域語言的代碼生成,因為邏輯形式是一種可執行的、明確的形式語言。然而,語義解析的風格與python代碼生成風格有很大不同。由於我們的模型主要是在HS數據集上開發的,因此本實驗是對我們的模型通用性的補充評估。

我們在Dong和Lapata(2016)使用的兩個語義解析數據集(ATIS和JOBS)上評估了我們的模型,其中輸入為自然語言句子。ATIS的輸出是λ-微積分形式(如圖6所示),而JOBS的輸出是Prolog風格的。Zettlemoyer和Collins(2005)的數據集採用了標準的train-dev-test劃分。從表2中的統計數據可以看出,語義解析的邏輯形式包含的節點和標記比HS Python代碼要少得多。

在HearthStone實驗的語義解析任務中,我們使用的網絡基本相同。本實驗中層數L為7。我們沒有為不同的節點類型建立單獨的網絡,因為我們的網絡很容易對這樣小的數據集進行過擬合。此外,由於數據集的特性,我們引入了指針網絡(Liu和Manning 2017),來複製變量名(如圖6中的ci0),這也是之前工作的實踐(Rabinovich,Stern和Klein 2017)。

結果---我們延續Dong和Lapata(2016)的方法,通過準確性來評估我們的方法。就像之前所有的工作一樣,我們除了調整了連接子句和析取子句的順序,以避免錯誤之外,也計算了精確匹配的分數。我們沒有度量BLEU分數,因為它在現有的研究中沒有被使用。

表5顯示了我們模型的性能。可以看到,神經網絡模型通常比WKZ14系統弱些(Wang,Kwiatkowski和Zettlemoyer 2014),因為WKZ14使用大量的規則和模板,但它比其他傳統的語義解析系統要強,包括ZH15(Zhao和Huang 2015),ZC07(Zettlemoyer和Collins 2007),PEK03(Popescu,Etzioni和Kautz 2003),和LJK13(Liang,Jordan和Klein 2013)。

我們發現,我們基於語法的結構化CNN解碼器取得了與最先進的神經模型相似的結果(Dong和Lapata 2016;Rabinovich,Stern和Klein 2017)。還應該指出的是,在語義解析任務中,我們並沒有像HearthStone(HS)代碼生成那樣獲得巨大的性能提升。這可能是因為用於語義解析的邏輯形式通常很短,只包含HS中的標記的1/4-1/3。因此,RNN和CNN都適合生成邏輯形式。儘管如此,這個實驗還是為我們的CNN代碼生成的通用性和靈活性提供了額外的證據,因為我們的模型基本上是為長程序(如HS)設計的,但也可以很好地處理語義解析任務。

 

4 相關工作

早期對代碼生成的研究主要集中在特定領域的語言上(Zettlemoyer和Collins 2005;Kushman和Barzilay 2013年;Wang,Kwiatkowski和Zettlemoyer,2014)。它們主要基於規則和人類定義的特性,因此受到高度限制。

最近,研究人員引入了神經網絡來生成通用程式語言的代碼。Ling等人(2016)採用了序列-序列模型,但使用多個預測因子對其進行了強化。還有一些研究沿著抽象語法樹生成程序圖(Dong和Lapata 2016;Rabinovich、Stern和Klein 2017;Yin和Neubig 2017)。但是,它們的解碼器都是基於RNNs的,實驗表明RNNs不適合代碼的生成。

CNNs最初用於分類任務(Lecun和Bengio 1995;Krizhevsky, Sutskever和Hinton 2012)。Mou等人(2016)提出了一種基於樹的CNN來捕捉結構信息。這種想法可以擴展到一般的圖,例如分子分析(Duvenaud et al.2015)。最近,研究人員開發了用於解碼器的深度CNNs(Gehring等人.2017;Chaturvedi、Pandit和Garain 2018)。在本文中,我們結合了結構敏感型CNN和CNN生成的思想,設計了一個基於語法的結構化CNN用於代碼生成。

 

5 結論

在本文中,我們提出了一種基於語法的結構化CNN用於代碼生成。我們的模型利用了程序的抽象語法樹(AST),並通過預測語法規則來生成代碼。我們解決了傳統基於RNN的方法可能不適合於程序生成的問題,這可能是由於程序中有大量標識或節點。因此,我們設計了一個基於AST結構的CNN編碼器-解碼器模型。

我們在HearthStone數據集上的主要實驗表明,我們取得了比以往基於RNN的方法更好的性能。另外兩個語義解析任務的實驗證明了我們方法的魯棒性。我們還進行了深入的切除測試,以驗證模型中各部件的有效性。

 

 

 

 

 

 

 

 

 

相關焦點

  • 7.5億美元做代碼轉換?一個Facebook TransCoder AI就夠了!
    但是,Facebook最近開發的神經轉換編譯器TransCoder讓代碼轉換出現了新的轉機。該系統可以將代碼從一個高級語言轉換成另一個,比如 c + + 、 Java 和 Python。這個系統是弱監督的,可以在沒有標籤的數據集中尋找以前未檢測到的模式,只需要少量的人工監督。研究人員稱,這比基於規則數據集的模型要高效得多。
  • CMU2018春季課程:神經網絡自然語言處理課程(附PPT和代碼)
    每一節課將介紹自然語言中的一個特定的問題或現象,描述其難以建模的原因,並展示若干用於解決這個問題的模型。 在學習的過程中,課程將涵蓋不同的用於創建神經網絡模型的技術,包括處理可變大小和結構化句子、大數據的高效處理、半監督和無監督學習、結構化預測和多語言建模。
  • CNN與RNN中文文本分類-基於TensorFlow 實現
    相比早起的底層代碼,如今的實現更加簡潔和優雅。本文是基於TensorFlow在中文數據集上的簡化實現,使用了字符級CNN和RNN對中文文本進行分類,達到了較好的效果。本文採用了清華NLP組提供的THUCNews新聞文本分類數據集的一個子集(原始的數據集大約74萬篇文檔,訓練起來需要花較長的時間)。
  • 生成Python函數一半沒問題,當前最「正統」的代碼生成是什麼樣?
    如下是北大新研究根據注釋生成的兩段代碼,其中 dcsp 表示 tab 鍵、dcnl 表示換行符,它們控制 Python 代碼的縮進結構。值得注意的是,在 Python 語言上,根據注釋這種自然語言,生成有效的代碼已經達到了 51.9% 的準確率。也就是說,生成的一半代碼能通過詞法分析、語法分析,並生成正確的抽象語法樹。
  • 基於Transformer增強架構的中文語法糾錯
    論文名稱:基於Transformer增強架構的中文語法糾錯論文作者:王辰成,楊麟兒,王瑩瑩,杜永萍,楊爾弘發表於:第十八屆中國計算語言學大會(CCL 2019)語法糾錯(Grammatical Error Correction, GEC)任務,旨在利用自然語言處理技術,自動識別並糾正非中文母語學習者書寫的文本中所包含的語法錯誤,拼寫錯誤,語序錯誤
  • 基於抽象語法樹的相似代碼識別方法
    目前對於相似缺陷的分析大多是基於C++或Java兩種語言,本文主要探究基於抽象語法樹的相似代碼識別方法在python語言代碼中的實驗效果。 Abstract:For similar bugs, developers can use a similar approach to solve it.
  • 15 款代碼語法高亮工具,美化你的代碼
    這個功能有助於編寫結構化的語言,比如程式語言,標記語言,這些語言的語法錯誤顯示是有區別的。語法高亮並不會影響文本自身的意義,而且能很好的符合人們的閱讀習慣。語法高亮同時也能幫助開發者很快的找到他們程序中的錯誤。例如,大部分編輯器會用不同的顏色突出字符串常量。所以,非常容易發現是否遺漏了分隔符,因為相對於其他文本顏色不同。
  • 優步Ludwig是一種面向低代碼機器學習的開源框架!
    從概念上講,Ludwig是基於一系列原則設計的:無需編程:Ludwig無需任何機器學習專業知識即可訓練模型。通用性:Ludwig可用於許多不同的機器學習場景。靈活性:Ludwig足夠靈活,可以供經驗豐富的機器學習從業人員和毫無經驗的開發人員使用。可擴展性:Ludwig設計時就考慮到可擴展性。每個新版本都包含新功能,無需更改核心模型。
  • 計算機視覺系列案例 | 基於注意力機制的編碼器-解碼器結構的圖像描述生成
    圖像描述技術,是指生成連貫流暢的語句描述圖像內容。對網際網路中圖像信息的檢索、兒童的早期教育、視障人士的生活輔助等方面都有重要的意義。因此,圖像描述領域受到越來越多的關注。本案例將採用帶有注意力機制的編碼器-解碼器網絡結構,生成語句來描述圖像內容。
  • 基於 CNN 的驗證碼破解實戰
    ,效果也都不錯,今天本文的主要內容就是基於卷積神經網絡CNN模型來構建驗證碼圖片識別模型。上述是之前一個實際完成的項目流程示意圖,本文主要是實踐基於CNN來構建識別模型,對於數據採集和預處理部分不作為講解的內容,感興趣可以親身實踐一下,都是圖像處理領域內的比較基礎的內容。經過處理後我們將原始的驗證碼圖片均進行了基本的去噪、二值化以及歸一化等處理得到了可用於模型直接訓練使用的特徵向量數據,原始的驗證碼圖像數據如下所示:
  • Facebook "TransCoder AI"可在 Java、Python 和 C++ 之間轉換代碼
    而從理論上講,轉編譯器可以則幫助消除從頭重寫代碼所需的費用。但是,由於源語言和目標語言都具有不同的語法、變量類型、標準庫函數和平臺API,因此這個在實踐中其實很難構建。據介紹,Facebook 的 TransCoder AI 則採用了一種無監督的學習方法來應對這些挑戰。
  • 基於VHDL語言的卷積碼編解碼器的設計
    大數邏輯解碼器是代數解碼最主要的解碼方法,他既可用於糾正隨機錯誤,又可用於糾正突發錯誤,但要求卷積碼是自正交碼或可正交碼。 本文所選(2,1,6)系統自正交卷積碼的大數邏輯解碼器如圖2所示。 在對一個設計實體定義了外部埠後,一旦內部開發完成,其他的設計就可以直接調用這個實體。 本設計所用VHDL設計平臺是Altera的MAX+PlusⅡ EDA軟體。
  • 賽爾原創 | EMNLP 2019融合行、列和時間維度信息的層次化編碼模型進行面向結構化數據的文本生成
    ,其目標是由計算機根據給定的結構化數據自動生成相關的描述性文本。如圖1所示,輸入的結構化數據包括某場體育賽事中球員和球隊的相關統計數據,輸出的是有關的賽事報導。圖1 ROTOWIRE數據集中的一個例子。左側為輸入的球隊/球員的統計數據,右上為基線模型生成的結果,右下為參考文本。2.背景和動機近幾年,ROTOWIRE數據集受到了研究者的關注。
  • 港中文提出EfficientFCN:語義分割中的整體引導解碼器,巧妙捕獲上下文信息 | ECCV 2020
    例如,對於一個512×512的輸入圖像,以ResNet101為骨幹編碼器,當採用空洞卷積,步長2和4進入最後兩個階段的卷積塊時,編碼器的計算複雜度從44.6 GFlops增加到223.6 GFlops。圖1:用於語義分割的不同架構。(a)輸出步幅(OS)= 32的原始FCN。
  • CVPR 2020|看圖說話之隨心所欲:細粒度可控的圖像描述自動生成
    為了基於指定ASG生成圖像描述,我們提出了ASG2Caption模型,和普通用於圖像描述生成的編碼器-解碼器框架相比,能夠解決ASG控制圖像描述生成中的三個主要挑戰。第一,因ASG僅包含抽象的場景框架,無任何語義標籤,所以進行編碼時既要考慮圖中所表達的用戶意圖,又要識別圖中節點的語義。
  • 約翰霍普金斯:一種用於上下文形態推斷的結構化變分自動編碼器
    這是讀芯術解讀的第121篇論文ACL 2018 Long Papers一種用於上下文形態推斷的結構化變分自動編碼器然後為了對潛在變量進行後驗推斷,提出了一種有效的基於wake-sleep算法的變量推斷過程。引言自然語言中,一個詞彙可能有很多種變形,比如英語中talk有talks,talked,talking,對於母語使用者可以根據上下文無誤推斷詞彙的形態,那麼計算機是否可以得到一個模型,可以根據上下文推斷詞彙的形態呢?
  • 圖像描述開原始碼整理
    這種做法非常依賴於1)圖像特徵的提取2)生成句子時所需要的規則。隨著深度學習技術的發展和COCO等圖像標註數據集的出現,圖像描述相關的技術得到了快速的發展。目前圖像描述的方法主要是在編碼器-解碼器框架上進行改進與不斷嘗試。
  • Python, C++和Java代碼互翻,Facebook開發首個自監督神經編譯器
    但是,由於代碼翻譯領域中缺少並行數據,因此它們在該方面的應用受到了限制。程式設計師仍然依賴於基於規則的代碼轉換工具,這需要專家複查和調試輸出,或者手動翻譯代碼。TransCoder通過利用無監督機器翻譯到程式語言翻譯取得的成功來克服這些挑戰。本文構建了一個帶有注意力機制的序列到序列(seq2seq)模型,該模型由具有轉換結構的編碼器和解碼器組成。
  • 前端開發者的福音:根據UI設計圖自動生成GUI骨架代碼
    某些工具聲稱可以在給定 UI 設計圖的情況下自動生成 GUI 骨架代碼,但這些工具由於是基於人工設計的視覺理解規則實現的,因此功能十分有限,不能處理真實複雜的 UI 設計(如圖 1)。考慮到上述任務特徵,研究者們設計了一個神經網絡翻譯器,它由一個卷積神經網絡(CNN)、一個遞歸神經網絡(RNN)編碼器和一個 RNN 解碼器組成,如圖 2 所示。
  • Matlab編程之——卷積神經網絡CNN代碼解析
    該模型使用了mnist的數字mnist_uint8.mat作為訓練樣本,作為cnn的一個使用樣例,每個樣本特徵為一個28*28=的向量。網絡結構為:五、cnnapplygrads.m.六、cnntest.m.