一個用於代碼生成的基於語法的結構化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的方法更好的性能。另外兩個語義解析任務的實驗證明了我們方法的魯棒性。我們還進行了深入的切除測試,以驗證模型中各部件的有效性。