王 堃,李 征,劉 勇
(北京化工大學 信息科學與技術學院,北京 100029)
函數自動命名是根據現有源代碼自動生成可讀性強的自然語言來描述函數的功能.在軟件維護過程中,開發(fā)者往往需要花費大量的時間去理解一段代碼所對應的功能.其中,一種重要的方式便是通過閱讀函數名來快速的了解代碼的功能,從而節(jié)約開發(fā)者的時間.盡管開發(fā)者可以通過函數名理解函數的功能,但是在實際開發(fā)過程中往往這些函數名并不是完整的或具有時效性的.這類問題可能會誤導開發(fā)者,導致開發(fā)者花費大量的時間來理解程序,影響開發(fā)效率.現有工作表明:“函數名大多是常規(guī)編程語言中聚集函數行為的最小命名單位,因此函數名是函數抽象的基石.”[1].因此,在軟件開發(fā)過程中,給定一段代碼,如何自動生成一個正確并且相關聯(lián)的函數名變得尤為重要.
隨著深度學習技術的快速發(fā)展,許多研究人員嘗試使用深度學習模型來解決這個問題,例如sequenceto-sequence 模型[2-5].Allamanis 等[6]將代碼解析成token 序列,然后利用卷積神經網絡(CNN)對token 序列進行建模,通過卷積操作提取代碼特征,并引入注意力機制學習代碼序列與函數名之間的關鍵信息.但是,使用token 序列僅僅是代碼的展開,模型很難去學習到代碼中的結構信息,同時token 序列過長導致模型很難學習到其中的語義信息.為了解決這個問題,Alon 等[7,8]通過將代碼轉化為抽象語法樹(AST),并根據每一個葉節(jié)點(變量名、方法名等) 從AST中提取相關路徑(AST Path)來作為代碼的特征表示,該特征向量包含了一定的結構信息以及語義信息.之后Alon 等[9]提出了code2seq 模型,對先前模型進行了再一次改進,利用BiLSTM 網絡對AST 路徑進行模型構建,然后通過引入注意力機制來學習所生成的單詞與各條AST 路徑的相關性.該方法在函數名預測任務中達到了目前最好效果.然而,該方法依舊存在弱化了AST 樹形結構信息的缺陷,從而導致其很難學習到AST 路徑之間節(jié)點的信息.Fernandes 等[10]提出一種結合sequenceto-sequence 模型和圖神經網絡(GNN)模型的方法來表示代碼,Sequence-GNNs.該方法使用BiLSTM對代碼序列進行編碼,然后引入圖神經網絡對編碼后的代碼序列進行建模,最后得到的向量便是代碼的特征表示.但是BiLSTM 等循環(huán)神經網絡模型存在長程依賴問題,該模型很難捕捉到長距離文本之間的關系,會導致一些關鍵信息丟失.
可以看出,目前在函數命名任務中面臨兩大挑戰(zhàn):(1)代碼的表示方法.對代碼進行特征提取時,不僅要提取其語義信息,而且更要提取其結構信息.在目前code2seq 模型中,該方法將代碼表示為AST 路徑的集合,引入注意力機制來提取代碼的結構以及語義信息.但是該方法對路徑建模的同時一定程度上破壞了AST的結構,而且只能提取路徑內部節(jié)點之間的信息,并不能有效提取路徑間節(jié)點之間的信息,尤其是數據流和控制流信息.(2)長程依賴問題[11].當前的代碼片段可能依賴于離它很遠的代碼段.例如,一個程序中第90 行的語句“a=a+2;”依賴于第10 行語句“int a=10;”的變量定義.隨著代碼長度的增加,BiLSTM 等循環(huán)神經網絡很難捕捉到長距離文本之間的信息.
本文提出一種新穎的神經網絡模型TrGCN,采用了近期提出的Transformer[12]模型,該模型可以有效緩解長程依賴問題.然而原生的的Transformer 模型主要用于自然語言翻譯中,并不能應用在結構性很強的代碼中.所以我們在每個Transformer encoder block中添加了兩層圖卷積層[13],將節(jié)點以及其相關節(jié)點進行卷積操作,從而豐富代碼的結構信息.在函數命名任務中,我們使用了Java-small、Java-med和Java-large[6,9]數據集,在7 個基準模型來評估TrGCN.實驗結果表明我們的模型明顯優(yōu)于其他基準模型,相比于模型code2seq[9]和Sequence-GNNs[10],TrGCN 在F1 指標上分別提高了平均5.2%、2.1%;在ROUGE-2和ROUGE-L 指標上,比Sequence-GNNs 分別提高了0.7%、3.6%.
隨著開源代碼庫的不斷增加,數據規(guī)模的不斷增大,越來越多的研究者開始使用機器學習對程序源代碼進行建模,學習其中的信息,幫助開發(fā)者更好的理解程序.起初研究人員把源代碼作為一種符號序列,將源代碼轉化為token 序列,并通過RNN 或LSTM 等序列模型(Seq2Seq)對其進行建模和學習序列中的信息.Allamanis 等[14]利用Logbilinear 模型,通過對變量、函數名以及類名的上下文信息進行預測.之后Allamanis等[6]提出了ConvAttention 模型,將源代碼看做一組token 序列,并使用神經網絡對其建模,通過CNN 以及注意力機制來學習代碼和函數名之間的關鍵信息.Lyer等[15]和Hu 等[16]在代碼注釋生成任務中利用RNN對源代碼建模,然后根據其建模結果使用RNN 進行解碼,同時引入了注意力機制來學習注釋文本中各個單詞與函數體之間的關系.程序語言與自然語言最大不同之處在于程序語言是一種高度結構化的語言,而基于token的程序表示方法僅僅將代碼線性展開,丟失了程序語言的結構信息,導致代碼特征向量信息的不完整.
為了對程序的結構信息進行建模,研究人員使用AST 來對源代碼進行建模.Li 等[17]和Liu 等[18]在代碼補全任務中,將程序源代碼解析為AST,然后遍歷AST 得到一組節(jié)點序列,通過對其建模,實現代碼補全.Sun 等[19,20]在代碼生成任務中利用樹卷積的方式,將AST中的節(jié)點、雙親節(jié)點和祖先節(jié)點結合起來,通過預測語法規(guī)則實現代碼生成.Alon 等[8,9]通過從AST中提取AST 路徑來表示程序的結構信息以及語法信息,然后對AST 路徑建模,并且引入注意力機制,通過學習函數名和AST 路徑之間的關系來進行函數名預測.雖然基于AST的程序表示方法有效的提取了程序的結構信息,但是并不完整,缺少對數據流以及控制流信息的提取.
隨著圖神經網絡(GNN)的興起,研究人員嘗試將程序源代碼轉化為圖的形式并對其進行建模.其轉化方式為通過給AST 增加更多的邊,使得模型可以更好的理解節(jié)點之間的關系.Allamanis 等[21]提出了一種基于門控圖神經網絡(GGNN)[22]模型,利用圖的形式來表示程序源代碼.該方法通過將源代碼的AST 擴展為圖的形式,其中圖中的節(jié)點表示AST 序列中的token,圖中的邊表示節(jié)點與節(jié)點之間的相互關系.Fernandes 等[10]在代碼注釋任務中提出一種將GNN與Seq2Seq 結合的模型,首先使用BiLSTM對程序進行編碼,得到其特征向量表示,然后利用GNN對其進行建模,最后得到特征向量作為程序的特征表示.但是先前的研究所使用的模型都是RNN、LSTM 等循環(huán)神經網絡模型,存在長程依賴問題,導致對代碼特征信息的提取不夠完整.本文利用了Transformer中多頭自注意力機制的特性來緩解這個問題.
為了將結構信息的提取與緩解長程依賴問題相結合,本文提出了一種基于Transformer 模型的圖卷積神經網絡(GCN)模型TrGCN,使用圖卷積提取代碼的結構信息,并且利用Transformer 模型來緩解長程依賴問題.
圖1顯示了TrGCN 模型的結構圖,主要包括兩個部分:AST 編碼器和解碼器.
圖1 TrGCN 模型結構
TrGCN 使用了Transformer 模型,是一種標準的Encoder-Decoder 結構,其中Encoder 編碼器將輸入的token 序列 (x1,···,xn)轉化為一組連續(xù)的特征向量z=(z1,···,zn).得到特征向量z后,Decoder 解碼器根據z輸出一組token 序列(y1,···,ym),因此模型化之后的條件概率為:p(y1,···,ym|x1,···,xn).在解碼階段,預測出的token 取決于先前token的信息,該概率模型為:
一段代碼可以解析為一顆抽象語法樹,其葉節(jié)點被稱為終結符,一般是用戶所定義的變量以及方法名等;非葉節(jié)點被稱為非終結符,代表代碼中的一些結構,例如循環(huán)、表達式以及變量聲明.圖2表示AST的一部分,其中變量名(如num)代表終結符,而條件語句(IfStmt)和表達式語句(ExpressionStmt)這些語法結構代表非終結符.由于非終結符擁有豐富的結構信息,終結符擁有豐富的語義信息,所以AST 編碼器的目標就是盡可能的提取AST的結構信息和語義信息來幫助模型更好的理解代碼.首先將代碼解析成一棵AST,利用前序遍歷的方式將AST 展開成一組token 序列.假設AST為T,則token 序列為T={n1,···,nL},其中L為序列的長度.每個token 可以被分割為一組字符序列其中m表示單詞最大長度,如果長度小于m,則會被填充字符填充至m.所有的token 序列以及字符序列通過table-look-up embedding的方式來表示成具有真值的初始特征向量
圖2 抽象語法樹(部分)
Character Embedding.無論是在自然語言中還是在代碼中,都會出現一些相似的單詞并且擁有相近的語義,例如name,names.為了利用這個特性,本文使用character embedding的方式來表示每個token,公式如下:
其中,Wconv表示一層卷積權重,通過卷積操作來提取字符之間的特征;M為字符序列的最大長度,如果長度小于M,則會被填充字符填充至M.在卷積層之后會附加一層歸一化層(layer normalization[23])來對特征向量進行歸一化.最終使用加和的方式來結合word和character的特征向量:
其中,character的特征向量nci會保留到下文的characterword 注意力層,利用注意力機制來更好的融合character和word 特征向量.
AST 編碼器是由一組encoder 組成(總共有N個encoder).其中每個encoder中都包含3 個不同的子層,分別為多頭自注意力層,character-word 注意力層以及圖卷積層,通過這3 個子層來提取輸入代碼中的特征信息.本文將會在下面的小結中詳細介紹這些子層.其中每個子層之間添加了殘差連接(residual connection[24])以及歸一化層,其中殘差連接可以有效緩解網絡退化問題和梯度彌散問題.
多頭自注意力層:AST 編碼器中的self-attention子層與原生Transformer 相同,使用了多頭自注意力機制來捕捉長程依賴信息.
假設有一組輸入的token 序列n1,···,nL,從上文可知,通過look-up table embedding 方式可以得到一組初始化的特征向量{n1,···,nL}.由于輸入序列是有序的,為了讓模型學習到序列中的位置關系,需要在特征向量中加入位置信息,并使用position embedding 來對位置信息進行編碼:
其中,PE是二維矩陣,行表示節(jié)點,列表示節(jié)點的詞向量;pos表示節(jié)點在輸入序列中的位置,dmodel表示詞向量的維度,i表示詞向量的位置.
每個Transformer中的encoder和decoder 都會通過多頭自注意力機制來學習數據中的非線性特征,它的主要思想是將一個序列文本的上下文詞匯通過矩陣乘法的方式,使每個詞匯都擁有其上下文詞匯的特征信息.而傳統(tǒng)的注意力機制只是關注了源文本和目標文本之間關系.多頭自注意力機制是將多個擁有不同參數的自注意力機制進行融合,使模型增強了關注序列文本不同位置的能力;同時豐富了序列文本詞匯的特征信息.多頭自注意力機制擁有更多線性變換,變換之后會通過激活函數進行非線性轉換,從而提高了模型非線性的學習能力.其公式如下:
其中,H表示頭的數量,Wh表示權重.同時在每個頭中都會添加一層self-attention 層,如下:
其中,dk=d/H表示每個特征向量的長度.Q,K,V的計算如下:
其中,WQ,WK,WV是模型的參數,xi是AST encoder的輸入.對于第一個encoder的輸入來說,它是將word、character以及position的特征向量進行加和,例如ni+nci+PEi.而其他encoder的輸入來自上一個encoder的輸出.
Character-word 注意力層[19]:經過self-attention層計算得到的特征向量,本層將會把該向量與保留下來的character embedding 向量進行結合.對于每一個單詞,將對進行兩個不同線性轉化,得到控制向量qi和權重向量,對進行一個線性轉化得到權重向量,最后經過Softmax 計算得到:
得到的兩個注意力分數是用來衡量Transformer中self-attention 層的輸出和character embeddingnci,然后分別進行線性轉化得到vyi和vci:
最后character-word 注意力層的輸出為Ycwa=[h1,···,hL].
圖卷積層:考慮到模型很難學習節(jié)點的雙親節(jié)點、祖先節(jié)點等相關節(jié)點之間的關系,例如:節(jié)點a和節(jié)點b在文本中距離很遠,但是在AST 結構中距離卻很近,因此,對于傳統(tǒng)的Transformer 模型來說很難提取這樣的結構信息.
為了更好的提取程序的結構信息,將AST 通過增加邊的方式擴展為圖的形式,其中使用了7 種邊的類型[21]:
(1)Child edge:當前節(jié)點與孩子之間的邊.
(2)Parent edge:當前節(jié)點與雙親節(jié)點之間的邊.
(3)Grandparent edge:當前節(jié)點與祖先節(jié)點之間的邊.
(4)Next edge:當前節(jié)點與其先驅節(jié)點(語義)之間的邊.
(5)LastUse edge:當前節(jié)點與在詞法上最近節(jié)點之間的邊.
(6)Next sibling edge:當前節(jié)點與兄弟節(jié)點之間的邊.
(7)Subtoken edge:subtokens 之間的邊.
TrGCN 將AST 視為圖的形式,同時使用鄰接矩陣來表示AST 擴展之后的圖.根據上文信息,可以得到鄰接矩陣M1,···,M7.給定一個鄰接矩陣M1,如果節(jié)點αi是節(jié)點 αj的雙親節(jié)點,則M1,ij=1.假設節(jié)點的特征向量被表示為fi,則通過鄰接矩陣M1可以得到節(jié)點i雙親節(jié)點的特征向量,計算如下:
同理可以得到節(jié)點i的其他相關節(jié)點的特征表示,計算如下:
其中,fik表示節(jié)點i的第k種類型相關節(jié)點的特征向量.對根節(jié)點來說,其雙親節(jié)點就是其本身,對于其他非AST節(jié)點(填充節(jié)點)來說,其任何相關節(jié)點的特征向量都是它本身.
為了將節(jié)點與其相關節(jié)點的特征向量結合起來,本文使用了圖卷積神經網絡,公式如下:
其中,Wgconv,l是圖卷積層的權重參數,卷積核大小k=3,l表示圖卷積層的層數.特別的是,表示當前節(jié)點的特征向量,表示character-word 注意力機制的輸出,f是激活函數ReLU,被應用于這些圖卷積層中.
綜上所述,AST 編碼器有N個encoder,其中每個encoder 包含3 個子層,最后AST 編碼器的輸出為
模型最后的模塊是解碼器,其作用是通過對AST解碼器的結果進行解碼,從而來預測函數名.解碼器與AST 編碼器的結構很類似,由一組N個decoder 組成,其中包含多頭自注意力層,encoder-decoder 注意力層以及全連接層3 個子層.在每個子層都會增加殘差連接和歸一化層,幫助模型訓練.其中在訓練階段,decoder的輸入為函數名,在預測階段,輸入為空序列(僅由填充字符組成).
TrGCN 利用上文提到的兩個注意力子層將AST編碼器的輸出與decoder的輸入進行結合.首先利用多頭自注意力機制來提取目標語句的特征向量,···,,其中d-self 表示解碼器中的多頭自注意力子層,P表示目標語句的最大長度.然后利用Encoder-Decoder注意力機制來學習目標語句和源語句之間的關系.其中Encoder-Decoder 注意力層與多頭自注意力層結構相同,輸入不同,只要將,···,當做Q向量,將當做K,V向量即可.
最后使用兩層全連接層,其中第一層全連接層使用激活函數ReLU,第二層全連接層用來提取特征,幫助模型預測結果.
預測函數名的下一個單詞是通過使用激活函數Softmax對解碼器最后一層的輸出進行計算,從而得到所有候選單詞的概率,選擇概率最大的單詞作為結果.
為了提高語義提取效果,TrGCN 使用了指針網絡[25],該網絡可以直接從函數體中復制單詞來作為預測函數名時的候選單詞.如圖3所示,指針網絡可以在預測函數名getName 時,從語句return name 或者形參String name中復制單詞name,進行預測.
圖3 函數樣例
指針網絡通過學習一個概率來指導模型對函數體中的單詞進行復制或者是生成新的單詞.公式如下:
其中,w表示單詞,P(w)表示預測單詞w的概率,Pvocab(w)表示在詞表中單詞w的概率,pgen表示生成新的單詞的概率,它是根據解碼器最后一層的特征向量進行線性轉化,然后通過Sigmoid 函數計算得出;Pc表示單詞w對源語句單詞的注意力分布.從公式中可以看出,當詞表中沒有單詞w時,即Pvocab(w)=0,該網絡可以從函數體中進行單詞的復制,這樣可以有效緩解Out of Vocabulary[25]問題,避免未知單詞的出現.
在指針網絡進行單詞復制時,因為在AST中終結符包含程序的語義信息,非終結符包含程序的結構信息,根據非終結符不會在函數體中出現,僅需要從AST中的終結符復制的特點,TrGCN 使用了Children 注意力機制來計算Pc,公式如下:
其中,hdec表示decoder 最后一層的特征向量,yast是AST 編碼器最后一層的特征向量,Mask是掩碼矩陣,將 βt中的非終結符置為-INF,僅計算終結符與目標語句之間的注意力分數.最后利用Softmax 來計算每個目標語句中單詞的概率.
本文在Java 函數命名任務中評估TrGCN,通過給定Java 方法的函數體,來預測函數名.先前的研究表明,這是一個很好的基準任務.因為其數據集選自Github開源的Java 項目,其中的函數可以被認為是準確的、相關的,函數體總體上都是完整的邏輯單元.同時我們會對函數名進行處理,將其轉化為一組子token 序列,例如getMaxNumber 可以被預測為序列get max number.其中目標序列的平均長度為3.
如表1所示,本文使用3 個不同規(guī)模的Java 數據集來評估模型,Java-small,Java-med,Java-large[6,9].
表1 數據集統(tǒng)計
Java-small 包含12 個大型的Java 項目,其中9 個項目作為訓練集,1 個項目作為驗證集,1 個項目作為測試集.該數據集包含約770 k 條樣例.
Java-med 包含1000 個來自Github的星標Java 項目.其中799 個項目作為訓練集,100 個項目作為驗證集,96 個項目作為測試集.該數據集大約有4 M 條樣例.
Java-large 包含9555 個來自Github的星標Java項目.其中8998 個項目作為訓練集,250 個項目作為驗證集,307 個項目作為測試集.該數據集大約有14 M條樣例.
本文采取的評估標準是Allamanis[6]以及Alon[9]等先前工作使用的評估標準,對預測結果產生的subtokens 計算Precision、Recall和F1 值,其中目標語句大小寫不敏感.這個指標的主要思想是一個預測出的函數名的質量依賴于其組成的子單詞.例如,對于一個函數名countNumbers,如果預測出的結果為numbersCount,也認為它是精確的匹配;如果預測結果為count,那么它的Precision為100%,但是Recall值卻很低;如果預測結果為countRandomNumbers,那么它的Recall值為100%,但是Precision值很低.本文希望使Precision和Recall都盡可能的大,但是這顯然有些困難,所以使用F1 值來衡量這兩個標準.公式如下:
其中,TP為預測正確單詞的數量,FP為預測錯誤單詞的數量,FN為沒有預測出正確單詞的數量.
本文還使用了ROUGE[26]評估標準.該標準主要用于摘要的自動評價,通過比較機器自動生成的摘要與人工生成的摘要中重疊單元的數量,來評價機器自動生成摘要的效果.本文主要使用了ROUGE-2,ROUGEL.公式如下:
其中,分母統(tǒng)計目標語句中N-gram的個數,而分子統(tǒng)計目標語句與預測出的語句共有N-gram的個數,本文將N設置為2 或L,其中L代表預測出的語句和目標語句的最長公共子序列.
在TrGCN 模型中,AST 編碼器中encoder的數量為N=6,解碼器中decoder的數量為N=6.詞向量的維度和模型維度dvector=dmodel=128.隱藏層的維度dhid=512.在模型輸入中,本文嘗試使用參數學習的加權方式來融合character和word特征向量,其公式為其中vT為權值參數,b為偏差值.其中實驗得到的F1 值分別為53.46%、53.34%,沒有顯著差異(差異可能由于實驗的隨機性導致).推測原因為TrGCN 所使用的character-word 注意力機制的本質也是將word和character 特征向量通過加權的方式融合,而且在AST 編碼器中N(N=6) 個encoder 都會使用character-word 注意力機制,所以多一次加權融合對模型學習能力沒有明顯的影響.為了減少參數量,加快實驗運行速度,所以本文在模型輸入階段選擇了直接加和的方式對character和word 特征向量進行融合.在多頭自注意力機制中,原文將頭的數量設置為H=8,為了探究頭的數量對模型的影響,分別設置H=2,4,8進 行實驗.當H=2時,F1 值為51.25%;當H=4 時,F1 值為53.46%;當H=8時,F1為52.45%.可以看出F1 值隨著H的增大而提高.但是當H=8時,F1 值有一定幅度的下降,此時模型出現了過擬合現象.隨著H數量的增加模型的非線性學習能力逐漸變強,但是數量增加到一定值后非線性學習能力太強導致出現過擬合的現象,所以本文將頭的數量設置為4.
TrGCN 在每一層后使用了dropout,來防止過擬合現象(其中包括注意力層,卷積層以及全連接層),其中dropout=0.3.實驗中每次選取的樣本數量為batch_size=256,迭代次數epoch=100,為了防止過擬合,使用了早停法,只要連續(xù)10 次迭代后F1 值沒有比當前最大F1值高,就停止訓練,early_stopping=10.為了防止模型出現梯度爆炸,TrGCN 把最終所有候選詞的概率截斷在[1e-10,1.0]之間.對于模型優(yōu)化,使用了Adam 優(yōu)化器[27],參數為默認值.
所有實驗都運行在Linux(系統(tǒng)版本3.10.0-957.c17.x86-64,CPU Inter(R) Gold 6240@260 GHz 18 cores,兩塊顯存為12 GB的(NVIDIA)TITAN Xp 顯卡)系統(tǒng)下.
在實驗中本文使用了6 個基準模型:
(1)Allamanis 等提出ConvAttention 模型[6],該模型使用了帶有注意力機制的卷積神經網絡來預測函數名;(2) Alon 等提出Path+CRFs[7]模型,將句法路徑與條件隨機場相結合;(3) Alon 等提出的code2vec[8]模型;(4) Alon 等提出的code2seq[9]模型;(5) Tai 等提出的TreeLSTM 模型;(6) Vaswani 提出的Transformer[12]模型.
表2顯示了函數命名任務在Java 數據集中的結果.從表中可以看出,TrGCN 在評估標準Precision、Recall和F1 以及3 個數據集中,幾乎都優(yōu)于所有基準模型.與ConvAttention對比,TrGCN 在F1 值提升約20.41%至21.8%,其原因可能為TrGCN 有效的提取了程序的結構信息.同樣在和TreeLSTM對比中發(fā)現,TrGCN在F1 提升約6.12%至23.49%.雖然TreeLSTM[28]也提取了程序的結構信息,但是我們認為基于圖的神經網絡模型可以豐富結構信息,具有更強的建模能力.在與當前使用廣泛模型code2seq[9]比較中發(fā)現,我們的模型在F1 值有著明顯提高,在數據集Java-small 提升了10.44%,在數據集Java-med 提升了4.7%.
表2 在Precision,Recall,F1 以及Java-small,Java-med,Java-large 三個數據集與基準模型比較結果
其原因可能不僅是圖卷積神經網絡提取到更加豐富的結構信息,而且character-word 注意力機制以及指針網絡可以有效的提升語義提取的效果.但是我們發(fā)現隨著數據規(guī)模的增大,我們模型提升效果逐漸減小;尤其在數據集Java-large中,Precision略低于code2seq模型,F1 僅提高了0.56%.可能的原因有:(1)隨著數據規(guī)模的增大,但是模型復雜度不變,模型很難進一步從龐大的數據中學習;(2)基于圖的神經網絡模型雖然有很強的建模能力,但是也具有模型復雜、較難訓練的特點,其中在3 個數據集訓練過程中,迭代一次分別需要40 分鐘、2 小時和4 小時;(3)實驗資源短缺,實驗室僅有兩塊12 G 顯存的(NVIDIA)TITAN Xp 顯卡,隨著數據量的增大,內存以及顯存無法滿足訓練要求,所以只能通過減小batch_size 來克服資源問題,但是batch_size的大小一定程度會影響實驗結果.
同時,我們選擇了一個基于圖神經網絡的基準模型,Fernandes 等[10]提出的Sequence-GNNs 模型,該模型使用圖神經網絡來對程序進行編碼.表3說明我們的模型在評估標準F1,ROUGE-2 以及ROUGE-L 都優(yōu)于模型Sequence-GNNs.在code2seq 文章中提到,Sequence-GNNs 在數據集Java-large 上的F1 值低于code2seq,所以我們只使用了數據集Java-small 進行比較.
表3 與Sequence-GNNs 在數據集Java-small的比較
從表3中可以看出TrGCN 在F1 值比Sequence-GNNs 提升了2.1%,說明TrGCN 在不考慮預測結果單詞順序的情況下有較強的預測能力;在ROUGE-2和ROUGE-L 分別提高了0.7%、3.6%,可以看出TrGCN在考慮預測結果單詞順序的情況下同樣優(yōu)于Sequence-GNNs.所以TrGCN 模型在融合Transformer、圖卷積以及character-word 注意力機制后的預測能力的提高是有效的.
本文提出了一個TrGCN 模型來解決函數自動化命名任務.TrGCN 利用Transformer中的注意力機制來緩解模型訓練時遇到的長程依賴問題;利用圖卷積神經網絡提取更為豐富的結構信息,使得程序的特征向量信息更加完整;利用character-word 注意力機制以及指針網絡來豐富程序的語義信息.實驗結果表明,TrGCN的函數命名效果優(yōu)于其他基準模型.在后續(xù)的研究中,作者將使用不同的編程語言數據集,以及不同的代碼摘要任務來驗證方法的有效性.