許柏炎,蔡瑞初,梁智豪
(廣東工業(yè)大學(xué)計(jì)算機(jī)學(xué)院,廣州 510006)
目前,代碼托管平臺(tái)Github 的提交量已達(dá)10 億,涉及337 種編程語言,但是其中大量代碼缺乏可讀的自然語言注釋[1]。代碼注釋是軟件開發(fā)的重要環(huán)節(jié),可大幅提高代碼的可讀性,但是其過程十分耗時(shí)[2]。隨著深度學(xué)習(xí)技術(shù)的應(yīng)用,自然語言生成任務(wù)得到快速發(fā)展,其中典型代表有機(jī)器翻譯[3-4]和文本摘要生成[5-7]等任務(wù)。代碼自動(dòng)注釋是自然語言生成中最具挑戰(zhàn)性的任務(wù)之一,目標(biāo)是基于輸入代碼生成相應(yīng)的可理解的自然語言注釋或描述。
早期的研究人員將代碼注釋生成建模為源代碼序列到自然語言注釋序列的翻譯任務(wù),但是不足之處在于其僅提取源代碼中的文本信息而忽略了結(jié)構(gòu)信息。近年來,學(xué)者們考慮引入源代碼的結(jié)構(gòu)化輸入,如抽象語法樹(Abstract Syntax Tree,AST),并采用機(jī)器學(xué)習(xí)的方法或模型來提取源代碼中結(jié)構(gòu)信息的語義表達(dá)。然而,這些研究工作未充分考慮如何從結(jié)構(gòu)化數(shù)據(jù)輸入中復(fù)制提取關(guān)鍵信息。代碼注釋生成的目標(biāo)注釋中通常會(huì)出現(xiàn)目標(biāo)詞典中不存在的單詞(Out Of Vocabulary,OOV),如數(shù)值型、字符型等變量單詞,從而導(dǎo)致生成的自然語言注釋輸出不完整。為解決該問題,研究人員在代碼注釋生成模型中引入指針網(wǎng)絡(luò)[8],指針網(wǎng)絡(luò)通過在單位時(shí)間步輸出指向輸入序列的某一個(gè)單詞,從而形成一種復(fù)制機(jī)制。但是,經(jīng)典的指針網(wǎng)絡(luò)只支持代碼的序列化輸入,不支持代碼的結(jié)構(gòu)化輸入,從而難以利用源代碼的結(jié)構(gòu)化信息。同時(shí),源代碼的抽象語法樹存在復(fù)雜多變的語法結(jié)構(gòu),使得指針網(wǎng)絡(luò)需花費(fèi)大量的學(xué)習(xí)成本來學(xué)習(xí)復(fù)雜語法結(jié)構(gòu),導(dǎo)致難以準(zhǔn)確地提取核心信息。此外,引入復(fù)制機(jī)制的代碼注釋生成模型傾向于頻繁復(fù)制核心詞,使得生成的自然語言注釋較易出現(xiàn)冗余信息。
本文提出一種用于代碼注釋自動(dòng)生成的語法輔助復(fù)制機(jī)制。將編碼器-解碼器作為基本框架,編碼器為樹型長短期記憶網(wǎng)絡(luò)(Tree-LSTM)[9],解碼器為長短期記憶網(wǎng)絡(luò)(LSTM)[10]。由于經(jīng)典的指針網(wǎng)絡(luò)僅支持序列結(jié)構(gòu)網(wǎng)絡(luò),無法直接應(yīng)用于上述框架,因此本文通過改進(jìn)指針網(wǎng)絡(luò)結(jié)構(gòu)使其支持源代碼的抽象語法樹輸入。具體地,在編碼階段,編碼器網(wǎng)絡(luò)通過對源代碼的抽象語法樹進(jìn)行編碼得到結(jié)構(gòu)化的語義信息并存儲(chǔ)于節(jié)點(diǎn)的隱狀態(tài)中。在解碼階段,解碼器網(wǎng)絡(luò)在每個(gè)時(shí)間步通過當(dāng)前隱狀態(tài)和輸入所有節(jié)點(diǎn)的隱狀態(tài)來計(jì)算注意力向量,并輸入到二元分類器中以選擇復(fù)制機(jī)制或生成機(jī)制。本文所提語法輔助復(fù)制機(jī)制包含基于語法信息的節(jié)點(diǎn)篩選策略和基于時(shí)間窗口的去冗余生成策略,前者根據(jù)語法節(jié)點(diǎn)類型使用掩碼向量過濾無關(guān)的語法節(jié)點(diǎn),后者在時(shí)間窗口內(nèi)對被復(fù)制過的節(jié)點(diǎn)進(jìn)行概率懲罰,從而抑制重復(fù)復(fù)制該節(jié)點(diǎn)的現(xiàn)象。
多數(shù)代碼注釋生成任務(wù)主要關(guān)注源代碼的文本信息。具體地,文獻(xiàn)[11]通過主題模型和n-gram 技術(shù)來生成代碼注釋,文獻(xiàn)[12]提出一種基于長短時(shí)記憶網(wǎng)絡(luò)與注意力機(jī)制的語言模型Code-NN,從而生成C#和SQL 注釋,文獻(xiàn)[13]利用卷積神經(jīng)網(wǎng)絡(luò)與注意力機(jī)制來預(yù)測生成代碼注釋。
近年來,研究人員除考慮源代碼的文本信息外,還探究如何提取其抽象語法樹中的結(jié)構(gòu)信息。文獻(xiàn)[14]提出結(jié)合語法結(jié)構(gòu)信息和文本信息的語義表達(dá)方法。文獻(xiàn)[15]通過遍歷Java 的語義解析樹節(jié)點(diǎn)獲得序列形式,將其作為輸入以捕獲語義特征和語法信息。文獻(xiàn)[16]提出的Graph2Seq 將結(jié)構(gòu)化查詢語言(SQL)序列看作有向圖,利用圖網(wǎng)絡(luò)學(xué)習(xí)全局結(jié)構(gòu)信息。本文同樣采用樹型結(jié)構(gòu)編碼器,輸入源代碼的語義解析樹以提取結(jié)構(gòu)化信息。
目前,研究人員普遍采用經(jīng)典的復(fù)制機(jī)制解決自然語言注釋生成的OOV 問題,如文獻(xiàn)[17]提出結(jié)合復(fù)制機(jī)制的混合生成網(wǎng)絡(luò)以進(jìn)行文本摘要生成,文獻(xiàn)[18]利用復(fù)制機(jī)制復(fù)制子句,文獻(xiàn)[19]利用復(fù)制機(jī)制進(jìn)行代碼生成。與上述工作不同,本文建立一種支持樹型結(jié)構(gòu)化數(shù)據(jù)輸入的指針網(wǎng)絡(luò)變體,并基于源代碼的語法結(jié)構(gòu)和特性,提出包含節(jié)點(diǎn)篩選策略和去冗余生成策略的語法輔助復(fù)制機(jī)制,以從源代碼的語義解析樹中提取關(guān)鍵內(nèi)容信息。
代碼自動(dòng)注釋模型的輸入一般是源代碼對應(yīng)的抽象語法樹表示,而非源代碼本身[20]。抽象語法樹省略編程語法上的部分無用細(xì)節(jié),只保留語法結(jié)構(gòu)以及與代碼內(nèi)容相關(guān)的部分,作為源代碼語法結(jié)構(gòu)的抽象化表示。以SQL 查詢語句為例,其對應(yīng)的抽象語法樹表示如圖1 所示。
圖1 SQL 查詢語句對應(yīng)的抽象語法樹表示Fig.1 Abstract syntax tree representation of SQL query statement
本文對代碼自動(dòng)注釋任務(wù)進(jìn)行定義:給定一個(gè)源代碼的抽象語法樹X={x1,x2,…,x|X|},目標(biāo)的自然語言注釋為Y={y1,y2,…,y|Y|},其中,xi代表抽象語法樹的第i個(gè)節(jié)點(diǎn),yj是自然語言注釋序列的第j個(gè)單詞。本文建立的代碼自動(dòng)注釋模型是基于編碼器-解碼器框架設(shè)計(jì)的,結(jié)合編碼器(樹型長短期記憶網(wǎng)絡(luò)[9])、解碼器(長短期記憶網(wǎng)絡(luò)[10])和注意力機(jī)制[21]。在編碼階段,樹型長短期記憶網(wǎng)絡(luò)自下而上遞歸式地遍歷抽象語法樹,最終以根節(jié)點(diǎn)的隱含層表示作為抽象語法樹的語義表達(dá)向量;在解碼階段,長短期記憶網(wǎng)絡(luò)接收編碼器的語義表達(dá)并解碼出目標(biāo)序列,在每個(gè)時(shí)間步基于當(dāng)前的隱狀態(tài)與編碼階段得到的抽象語法樹上節(jié)點(diǎn)的隱狀態(tài),通過注意力機(jī)制[21]計(jì)算注意力向量以復(fù)制或生成目標(biāo)單詞。本文模型在給定代碼抽象語法樹X下,生成對應(yīng)的自然語言注釋序列Y。其中,每個(gè)時(shí)間步t的預(yù)測輸出為yt,條件概率為p。本文采用極大似然估計(jì)(Maximum Likelihood Estimation,MLE)優(yōu)化如下的目標(biāo)函數(shù):
為了解決OOV 問題,本文將復(fù)制機(jī)制引入到代碼注釋生成模型中。復(fù)制機(jī)制使得生成模型除了從目標(biāo)詞典中選擇單詞外,還可從源代碼輸入中提取信息。具備復(fù)制機(jī)制的代碼注釋生成模型的目標(biāo)函數(shù)可基于式(1)展開為:
其中,at表示第t個(gè)時(shí)間步執(zhí)行的解碼動(dòng)作,可為輸入復(fù)制或詞典生成,即at∈{gen,copy},p(at|y<t,X)表示一個(gè)伯努利分布,且p(at|y<t,X)∈{0,1}。
為了從源代碼的復(fù)雜語法結(jié)構(gòu)中提取信息,本文提出一種語法輔助復(fù)制機(jī)制,該機(jī)制包含基于語法信息的節(jié)點(diǎn)篩選策略與基于時(shí)間窗口的去冗余生成策略。如圖2 所示,編碼器(Encoder)對源代碼的抽象語法樹進(jìn)行編碼,將編碼后的語義表達(dá)(enc.embed)傳遞到解碼器(Decoder)進(jìn)行解碼。解碼器使用LSTM 在每個(gè)時(shí)間步進(jìn)行從源輸入復(fù)制(CP)或從詞典生成(GEN)操作。解碼器若選擇CP 操作,將執(zhí)行基于語法信息的節(jié)點(diǎn)篩選策略(①)和基于時(shí)間窗口的去冗余生成策略(②);否則,解碼器選擇GEN操作,直接從詞典中選擇單詞。長虛線區(qū)域內(nèi)的節(jié)點(diǎn)為經(jīng)過節(jié)點(diǎn)篩選策略篩選后的候選語法節(jié)點(diǎn),短虛線框?yàn)樵跁r(shí)間步t時(shí)“China”節(jié)點(diǎn)的被復(fù)制概率的衰減過程,γ表示衰減持有率,λt-1表示上一個(gè)時(shí)間步的衰減率,p為每個(gè)節(jié)點(diǎn)具體的復(fù)制概率。節(jié)點(diǎn)篩選策略過濾抽象語法樹的無關(guān)節(jié)點(diǎn),保留字符型變量節(jié)點(diǎn);去冗余生成策略對已被復(fù)制的節(jié)點(diǎn)“China(string)”進(jìn)行懲罰,防止該節(jié)點(diǎn)被錯(cuò)誤地重復(fù)復(fù)制。
圖2 代碼自動(dòng)注釋模型整體架構(gòu)Fig.2 Overall architecture of automatic code comment model
編碼階段的目標(biāo)是得到抽象語法樹的語義編碼表達(dá),本節(jié)將介紹公式化編碼過程。編碼階段分為語法節(jié)點(diǎn)向量化和抽象語法樹向量化2 個(gè)過程。
抽象語法樹X由多個(gè)節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)xi可能包含一個(gè)或者多個(gè)單詞,即。初始化詞典詞嵌入矩陣為We∈Rle×d,其中,le為輸入詞典的大小,d為詞向量維度大小。對節(jié)點(diǎn)i中的第j個(gè)單詞ωij構(gòu)建詞典的獨(dú)熱(one-hot)索引變量id(ωij)∈Rle,可以得到ωij的詞嵌入向量如下:
通過式(3)可以得到節(jié)點(diǎn)中每個(gè)單詞的詞嵌入向量,為了得到節(jié)點(diǎn)的向量化表示,需要獲得節(jié)點(diǎn)中的單詞序列表達(dá)。本文采用LSTM[10]作為序列學(xué)習(xí)網(wǎng)絡(luò),在每個(gè)時(shí)間步循環(huán)地輸入序列中每個(gè)單詞ωij的詞嵌入向量,并存儲(chǔ)更新隱含層信息,如下:
通過3.1 節(jié)獲得抽象語法樹的節(jié)點(diǎn)向量化,編碼器需進(jìn)一步將節(jié)點(diǎn)的表達(dá)通過抽象語法樹的結(jié)構(gòu)聚合成抽象語法樹的整體表達(dá)。為了捕捉抽象語法樹的語法結(jié)構(gòu),將Tree-LSTM[9]作為編碼器,進(jìn)一步對抽象語法樹進(jìn)行編碼。Tree-LSTM 自下而上遞歸式和結(jié)構(gòu)化地輸入抽象語法樹數(shù)據(jù),將信息更新至節(jié)點(diǎn)隱狀態(tài)。與經(jīng)典的LSTM 網(wǎng)絡(luò)相同,Tree-LSTM 同樣包含輸入門、遺忘門和輸出門,每個(gè)門都是基于節(jié)點(diǎn)的向量表示及其孩子節(jié)點(diǎn)的隱狀態(tài)。當(dāng)抽象語法樹是N-ary 樹時(shí),語法樹的非葉子節(jié)點(diǎn)最多存在N個(gè)孩子節(jié)點(diǎn)。對于任意節(jié)點(diǎn)j,其第k個(gè)孩子的隱狀態(tài)和單元狀態(tài)(Cell State)分別為sjk和cjk,則對節(jié)點(diǎn)j隱狀態(tài)的更新過程如下:
其中,ij、fjk、uj、oj∈Rd分別代表輸入門、遺忘門、輸出門和被用來更新細(xì)胞狀態(tài)cj∈Rd的狀態(tài)向量,W(?)∈Rd×d和U(?)∈Rd×d代表可學(xué)習(xí)的參數(shù)矩陣,b(?)∈Rd代表偏置向量,vj∈Rd代表節(jié)點(diǎn)j的向量化表示。
Tree-LSTM編碼器遞歸式地計(jì)算抽象語法樹以更新各節(jié)點(diǎn)的隱含層信息,根節(jié)點(diǎn)的隱含層狀態(tài)含有其他所有節(jié)點(diǎn)的語義結(jié)構(gòu)信息,因此,本文將根節(jié)點(diǎn)的隱含層狀態(tài)作為抽象語法樹的語義結(jié)構(gòu)表達(dá),用于解碼器更新。
模型的解碼器負(fù)責(zé)將從編碼器得到的抽象語法樹結(jié)構(gòu)語義表達(dá)迭代式地生成自然語言注釋。本文解碼器采用LSTM[10],以結(jié)構(gòu)語義表達(dá)作為初始化隱狀態(tài),按單位時(shí)間步更新輸出新的隱狀態(tài),且解碼器輸出的隱狀態(tài)用于構(gòu)造注意力向量。具體地,對于任意時(shí)間步t,解碼器LSTM 輸出的隱狀態(tài)為ot∈Rd,注意力向量qt∈Rd的計(jì)算過程如下:
從上述公式可知,在解碼器階段,根據(jù)當(dāng)前時(shí)間步t的隱狀態(tài)ot與編碼器得到的抽象語法樹各節(jié)點(diǎn)的隱狀態(tài)分別計(jì)算得分rtj;接著,通過softmax 函數(shù)進(jìn)行歸一化得到權(quán)重向量αt∈R|X|;然后,對各節(jié)點(diǎn)隱狀態(tài)進(jìn)行加權(quán)求和得到當(dāng)前時(shí)間步的內(nèi)容向量zt∈Rd;最終,利用可學(xué)習(xí)參數(shù)矩陣Wattn∈Rd×2d和tanh 激活函數(shù)融合內(nèi)容向量zt和當(dāng)前解碼隱狀態(tài)ot,得到注意力向量qt∈Rd。通過上述注意力機(jī)制過程,解碼器生成自然語言注釋時(shí)可以更關(guān)注抽象語法樹的相關(guān)節(jié)點(diǎn),使得生成模型輸出的自然語言注釋具備更高的語義準(zhǔn)確性。
為了解決自然語言生成的OOV 問題,本文模型引入復(fù)制機(jī)制,使其具備從源輸入中提取關(guān)鍵信息的能力。本文模型存在2 種生成來源,分別是從目標(biāo)詞典中預(yù)測和從源輸入中復(fù)制提取。因此,該模型需要一種機(jī)制來選擇生成來源,本文構(gòu)造基于注意力向量輸入的分類器,以選擇生成來源。構(gòu)造參數(shù)為Wgc∈R2×d的全連接神經(jīng)網(wǎng)絡(luò),輸入注意力向量產(chǎn)生at∈{gen,copy}二元概率分布,如下:
當(dāng)預(yù)測概率大于復(fù)制概率時(shí),解碼器選擇從目標(biāo)詞典中生成。具體地,構(gòu)造參數(shù)為Wgen∈Rld×d的全連接神經(jīng)網(wǎng)絡(luò),輸入注意力向量產(chǎn)生目標(biāo)詞典的概率分布,如下:
4.1節(jié)介紹了解碼器生成來源為目標(biāo)詞典下的解碼過程,本節(jié)將重點(diǎn)闡述當(dāng)生成來源為源輸入信息時(shí)的解碼過程,并通過語法輔助來提高復(fù)制提取的準(zhǔn)確率。
當(dāng)生成來源分類器輸出的復(fù)制概率大于預(yù)測概率時(shí),解碼器將從輸入信息中進(jìn)行復(fù)制提取。具體地,對時(shí)間步t的注意力向量qt,計(jì)算其與編碼器中抽象語法樹各節(jié)點(diǎn)隱狀態(tài)的得分向量gt∈R|X|,歸一化后選擇概率最大的節(jié)點(diǎn)并復(fù)制其中的文本信息,過程如下:
從上述過程可以看出,復(fù)制機(jī)制與注意力機(jī)制實(shí)現(xiàn)過程相似,但是復(fù)制機(jī)制依賴于注意力機(jī)制的注意力向量并進(jìn)行二次計(jì)算。
4.2.1 基于語法信息的節(jié)點(diǎn)篩選策略
代碼自動(dòng)注釋任務(wù)的輸入是程序代碼的抽象語法樹,其具有復(fù)雜多變的結(jié)構(gòu)信息?,F(xiàn)有的復(fù)制機(jī)制多為非結(jié)構(gòu)化輸入數(shù)據(jù)而設(shè)計(jì),模型需要花費(fèi)大量的時(shí)間學(xué)習(xí)如何從復(fù)雜結(jié)構(gòu)中提取有用的信息,且提取效果通常不佳。本文利用語法輔助復(fù)制機(jī)制從抽象語法樹中提取關(guān)鍵信息。對于代碼自動(dòng)注釋任務(wù)而言,關(guān)鍵信息一般為抽象語法樹上的數(shù)值型節(jié)點(diǎn)和字符型節(jié)點(diǎn)。因此,本文將復(fù)制過程的搜索范圍從語法樹所有類型的節(jié)點(diǎn)壓縮至這兩類節(jié)點(diǎn),該過程可以降低搜索空間,也能夠減少抽象語法樹結(jié)構(gòu)變化所帶來的干擾以及神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)成本。
本文通過引入掩蓋變量來過濾無效候選節(jié)點(diǎn)。假設(shè)時(shí)間步t的節(jié)點(diǎn)掩蓋向量為dt∈R|X|,長度為節(jié)點(diǎn)數(shù),取值為0 或-∞,0 代表對應(yīng)語法節(jié)點(diǎn)有效,-∞代表節(jié)點(diǎn)無效,將其從候選節(jié)點(diǎn)集中剔除。在復(fù)制過程中,剔除無效節(jié)點(diǎn)后余下候選節(jié)點(diǎn)的概率計(jì)算公式如下:
由上述過程可得到復(fù)制機(jī)制下當(dāng)前時(shí)間步對應(yīng)的損失函數(shù)為:
一方面,通過掩蓋向量可以剔除無效節(jié)點(diǎn),使得無效節(jié)點(diǎn)集概率恒等于0,正確節(jié)點(diǎn)掩蓋后的概率大于等于原始概率,當(dāng)前時(shí)間步的損失下降,神經(jīng)網(wǎng)絡(luò)的整體成本函數(shù)也會(huì)下降;另一方面,從候選節(jié)點(diǎn)集合中過濾無效候選節(jié)點(diǎn),可以使得當(dāng)前時(shí)間步搜索空間得到一定的壓縮。因此,節(jié)點(diǎn)篩選策略在一定程度上可以加速神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。
4.2.2 基于時(shí)間窗口的去冗余生成策略
現(xiàn)有代碼自動(dòng)注釋方法生成的自然語言注釋存在主要關(guān)鍵詞冗余與部分關(guān)鍵詞缺失的現(xiàn)象,造成該現(xiàn)象的原因是復(fù)制機(jī)制與注意力機(jī)制原理相近,導(dǎo)致指針網(wǎng)絡(luò)傾向于重復(fù)指向最具注意力的少數(shù)節(jié)點(diǎn),而忽略了其他有用節(jié)點(diǎn)。為解決上述問題,本文提出一種基于時(shí)間窗口的去冗余生成策略,通過在時(shí)間窗口內(nèi)對已被復(fù)制的語法節(jié)點(diǎn)的復(fù)制概率進(jìn)行衰減,從而提高候選集合中其他有用且未被復(fù)制的節(jié)點(diǎn)被初次復(fù)制的概率。具體地,對于一個(gè)已被復(fù)制的語法節(jié)點(diǎn)xi,設(shè)置基于時(shí)間窗口變化的衰減率λit,用超參數(shù)γ∈(0,1) 表示衰減持有率,用于控制每次衰減率的減少量。λit表示如下:
在時(shí)間步t下,抽象語法樹候選節(jié)點(diǎn)集合有一一對應(yīng)的衰減變量集合。結(jié)合基于語法信息的節(jié)點(diǎn)篩選策略和基于時(shí)間窗口的去冗余生成策略,最終抽象語法樹復(fù)制候選節(jié)點(diǎn)的概率分布如下:
本文采用結(jié)構(gòu)化查詢語言(SQL)和邏輯表達(dá)式(Lambda)2 種不同編程語言的源代碼數(shù)據(jù)進(jìn)行測試,源代碼數(shù)據(jù)分別來自WikiSQL[22]和ATIS[23]數(shù)據(jù)集。WikiSQL 數(shù)據(jù)集數(shù)據(jù)來源于維基百科,含有24 241 個(gè)小規(guī)模數(shù)據(jù)表格,基于以上數(shù)據(jù)表格產(chǎn)生80 654 個(gè)結(jié)構(gòu)化查詢語句-自然語言對。ATIS 數(shù)據(jù)集數(shù)據(jù)來源于現(xiàn)實(shí)航空業(yè)務(wù)數(shù)據(jù)庫,含有25 個(gè)真實(shí)數(shù)據(jù)表,基于以上數(shù)據(jù)表格產(chǎn)生5 373 個(gè)邏輯表達(dá)-自然語言對。為了驗(yàn)證各方法的有效性,將WikiSQL 數(shù)據(jù)集進(jìn)一步劃分為分別含有56 355 個(gè)樣本的訓(xùn)練集、8 421 個(gè)樣本的驗(yàn)證集和15 878 個(gè)樣本的測試集。同樣地,將ATIS 數(shù)據(jù)集劃分為分別含4 434 個(gè)樣本的訓(xùn)練集、491 個(gè)樣本的驗(yàn)證集和448個(gè)樣本的測試集。上述數(shù)據(jù)集涉及的2種編程語言均可通過抽象語法描述語言(Abstract Syntax Description Language,ASDL)來獲得對應(yīng)的抽象語法樹。其中,SQL 結(jié)構(gòu)化查詢語言和Lambda 邏輯表達(dá)式的ASDL 語法分別在文獻(xiàn)[24]和文獻(xiàn)[25]中有所定義。
本文將具有代表性的兩類結(jié)構(gòu)性方法作為實(shí)驗(yàn)的基準(zhǔn)方法,其中包括樹至序列(Tree to Sequence,Tree2Seq)模型[26]和圖至序列(Graph to Sequence,Graph2Seq)模型[16],以上基準(zhǔn)方法均采用注意力機(jī)制。需要注意的是,Tree2Seq 模型輸入結(jié)構(gòu)為源代碼的抽象語法樹,而Graph2Seq 模型的原文輸入結(jié)構(gòu)是專為SQL 查詢語句設(shè)計(jì)的圖結(jié)構(gòu),其無法支持Lambda 邏輯表達(dá)式,而且原文沒有提供為SQL 查詢語句轉(zhuǎn)換的預(yù)處理代碼。因此,本文將統(tǒng)一采用抽象語法樹作為Graph2Seq 模型的輸入結(jié)構(gòu)。編程語言的抽象語法樹表示具有普遍性,可應(yīng)用于大部分編程語言。具體地,本文將源代碼的抽象語法樹看作一個(gè)無向圖,父、子節(jié)點(diǎn)之間的連接看作圖節(jié)點(diǎn)的邊。此外,為了更好地驗(yàn)證語法輔助復(fù)制機(jī)制的性能,本文在Tree2Seq 模型中引入一種傳統(tǒng)的復(fù)制機(jī)制。
本文采用BLEU[27]和ROUGE[28]作為自然語言注釋生成的評價(jià)指標(biāo)。BLEU 是自然語言處理任務(wù)常用的評價(jià)指標(biāo),其通常從字符或單詞級別來評價(jià)2 個(gè)文本或2 個(gè)文本集合的相似度。ROUGE 指標(biāo)評價(jià)所生成文本句子的充分性和忠實(shí)性,為了提高所生成文本的連貫性,本文使用考慮文本上下文的ROUGE 指標(biāo),分別為ROUGE-2 和ROUGE-L。
實(shí)驗(yàn)參數(shù)設(shè)置如下:詞向量、編碼器和解碼器的隱狀態(tài)維度大小均為128 維,批量大小均設(shè)置為32 個(gè),梯度優(yōu)化器選擇Adam 優(yōu)化器[29],學(xué)習(xí)率設(shè)置為0.001。此外,為了降低詞典大小,源詞典和目標(biāo)詞典只記錄詞頻不低于4 的單詞。實(shí)驗(yàn)沒有采用由其他語料庫預(yù)訓(xùn)練的詞向量,如Word2Vec[30]和Glove[31]等,而是使用xavier 初始化器[32]隨機(jī)初始化詞向量。本文所提復(fù)制機(jī)制中基于時(shí)間窗口的去冗余生成策略的衰減持有率,在WikiSQL 和ATIS 數(shù)據(jù)集中分別設(shè)置為80%和90%時(shí)系統(tǒng)性能達(dá)到最優(yōu),5.5.3 節(jié)將對該參數(shù)進(jìn)行詳細(xì)的敏感性分析。
5.5.1 模型性能分析實(shí)驗(yàn)
表1 和表2 所示分別為本文模型和基線模型在WikiSQL 和ATIS 2 個(gè)數(shù)據(jù)集上進(jìn)行代碼自動(dòng)生成的實(shí)驗(yàn)結(jié)果,其中最優(yōu)結(jié)果加粗表示。從中可以看出,本文模型在WikiSQL 數(shù)據(jù)集中的性能表現(xiàn)明顯優(yōu)于2 個(gè)基線模型,與最佳基線模型Tree2Seq+copy 相比,本文模型的BLEU 提升14.5%,ROUGE-2 和ROUGE-L 分別提升10.3%和5.5%。在ATIS 數(shù)據(jù)集上,與最佳基線模型Tree2Seq+copy 相比,本文模型的BLEU 提升2.8%,ROUGE-2 和ROUG-L 分別提升6.6%和2.5%。上述結(jié)果表明,本文模型相比現(xiàn)有代碼注釋生成方法有顯著的性能提升,其能生成更加準(zhǔn)確的代碼自然語言注釋。
表1 3 種模型在WikiSQL 數(shù)據(jù)集上的性能對比結(jié)果Tabel 1 Performance comparison results of three models on WikiSQL dataset
表2 3 種模型在ATIS 數(shù)據(jù)集上的性能對比結(jié)果Tabel 2 Performance comparison results of three models on ATIS dataset
5.5.2 節(jié)點(diǎn)篩選策略的有效性實(shí)驗(yàn)
為了量化節(jié)點(diǎn)篩選策略在壓縮搜索空間方面的性能,本文統(tǒng)計(jì)WikiSQL 和ATIS 數(shù)據(jù)集單位時(shí)間步內(nèi)的平均候選節(jié)點(diǎn)個(gè)數(shù),結(jié)果如表3 所示。從表3 可以看出,通過節(jié)點(diǎn)篩選策略過濾無效的語法節(jié)點(diǎn),在WikiSQL 數(shù)據(jù)集中候選節(jié)點(diǎn)空間的壓縮比例超過60%,在ATIS 數(shù)據(jù)集中壓縮比例超過50%,即節(jié)點(diǎn)篩選策略能大幅降低代碼注釋生成的搜索空間。
表3 2 種數(shù)據(jù)集在單位時(shí)間步內(nèi)的平均候選節(jié)點(diǎn)數(shù)Table 3 The average number of candidate nodes per unit time step of two datasets
為了驗(yàn)證節(jié)點(diǎn)篩選策略在收斂速度方面的性能,本文在WikiSQL 的驗(yàn)證集下測試BLEU 指標(biāo)的收斂趨勢。為了公平有效地對比,在本文模型中去除去冗余生成策略,僅保留節(jié)點(diǎn)篩選策略,并與結(jié)合復(fù)制機(jī)制的Tree2Seq 模型進(jìn)行對比,結(jié)果如圖3 所示。從圖3 可以看出,相比基線模型,僅保留節(jié)點(diǎn)篩選策略的本文模型收斂速度有所提升,即節(jié)點(diǎn)篩選策略能在一定程度上加速神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。
圖3 2 種模型在WikiSQL 驗(yàn)證集上的收斂速度對比Fig.3 Convergence rate comparison of two models on WikiSQL verification set
5.5.3 衰減持有率的敏感性實(shí)驗(yàn)
為了驗(yàn)證去冗余生成策略中的衰減持有率對模型影響的敏感程度,本文在WikiSQL 和ATIS 數(shù)據(jù)集上設(shè)計(jì)針對衰減持有率的敏感性實(shí)驗(yàn),結(jié)果如圖4和圖5 所示。從圖4 可以看出,在WikiSQL 數(shù)據(jù)集上,當(dāng)衰減持有率為80%時(shí),模型達(dá)到該數(shù)據(jù)集上的最高BLEU 值。從圖5 可以看出,在ATIS 數(shù)據(jù)集上,當(dāng)衰減持有率為90%時(shí),模型達(dá)到該數(shù)據(jù)集上的最高BLEU 值。衰減持有率能夠直觀反映自然語言注釋中一個(gè)字或詞重復(fù)出現(xiàn)的間距,圖4 和圖5 的實(shí)驗(yàn)結(jié)果表明,在2 個(gè)數(shù)據(jù)集上重復(fù)字詞出現(xiàn)的間距均較大。
圖4 WikiSQL 測試集上的衰減持有率敏感性實(shí)驗(yàn)結(jié)果Fig.4 Sensitivity experimental results of decay keeping probability on WikiSQL test set
圖5 ATIS 測試集上的衰減持有率敏感性實(shí)驗(yàn)結(jié)果Fig.5 Sensitivity experimental results of decay keeping probability on ATIS test set
5.5.4 分離實(shí)驗(yàn)
為了更好地體現(xiàn)基于語法信息的節(jié)點(diǎn)篩選策略和基于時(shí)間窗口的去冗余生成策略在模型中的重要性,本文設(shè)計(jì)分離實(shí)驗(yàn)以驗(yàn)證去除其中一種策略后的模型性能,測量不同的變種模型在WikiSQL 和ATIS 驗(yàn)證集上的BLEU 值變化。本文定義如下的變種模型:
1)Ours-SA:只去除基于語法信息的節(jié)點(diǎn)篩選策略的模型,其他保持不變。
2)Ours-CD:只去除基于時(shí)間窗口的去冗余生成策略的模型,其他保持不變。
分離實(shí)驗(yàn)結(jié)果如表4 所示,從表4 可以看出,與原始模型相比,Ours-SA 和Ours-CD 的BLEU 值在2 個(gè)數(shù)據(jù)集上均出現(xiàn)明顯下降,驗(yàn)證了本文所提2 種策略的有效性。此外,基于時(shí)間窗口的去冗余生成策略對WikiSQL 影響較大,去除該策略后模型的BLEU 值降低超過10%,而2 種策略對ATIS 數(shù)據(jù)集的影響相差不大。
表4 2 種數(shù)據(jù)集上的分離實(shí)驗(yàn)結(jié)果Table 4 Results of separation experiments on two datasets
本文提出一種用于代碼注釋自動(dòng)生成的語法輔助復(fù)制機(jī)制,其中主要包括節(jié)點(diǎn)篩選策略和去冗余生成策略2 個(gè)部分。實(shí)驗(yàn)結(jié)果表明,與Tree2Seq+copy 和Graph2Seq 模型相比,該機(jī)制的BLEU 和ROUGE 指標(biāo)值均較高。下一步將在代碼注釋生成模型框架中引入語法信息,以提升模型對復(fù)雜語法的學(xué)習(xí)效果。