譚丁武,張坤芳,劉 燕,鄭一基,魯鳴鳴
中南大學 信息科學與工程學院,長沙410083
隨著開源代碼倉庫的涌現(xiàn)和機器學習技術的發(fā)展,源代碼數(shù)據(jù)挖掘受到了廣泛的關注[1]。在源代碼挖掘領域,如何學習代碼中的語義嵌入表達尤為重要。通過機器學習得到的代碼嵌入表達不僅能輔助人工理解代碼[2],還能促進計算機自動編碼的研究[3]。
早期的源代碼數(shù)據(jù)挖掘工作受到自然語言處理(NLP)的啟發(fā),研究者們傾向于將源代碼看作文本序列,進而將自然語言處理系列模型應用到源代碼各種相關任務上[4-8]。然而,源代碼和自然語言不同。一方面,自然語言天然地擁有數(shù)目相對固定的詞庫,而在源代碼中,類名、變量名和函數(shù)名都沒有限制;另一方面,自然語言對于語法結構要求松散,而源代碼往往具有較為嚴格的語法規(guī)范。
為了解決上述問題,部分工作[9-13]提出采用抽象語法樹(Abstract Syntax Tree,AST)刻畫源代碼的語法結構信息。AST是在程序設計語言語法規(guī)則的指導下,對源代碼進行文法解析而產(chǎn)生的中間表達形式。AST 用于描述源代碼中各種語法成分組成,其通常將相應程序設計語言解析成樹狀結構的抽象語法樹。
雖然基于抽象語法樹的技術充分利用了源代碼中靜態(tài)語法結構信息,但這些方法卻忽略了動態(tài)運行時數(shù)據(jù)信息(語義信息),例如數(shù)據(jù)流信息、控制流信息等。因此,本文提出一種用于構建包含動態(tài)數(shù)據(jù)信息和靜態(tài)語法結構信息的程序代碼表示圖(EAST)的方法。并且結合EAST圖的數(shù)據(jù)特點,本文進而提出基于注意力機制的門控圖神經(jīng)網(wǎng)絡(Gated Graph Attention Neural Network,GGANN)用于學習EAST圖的嵌入表達,以完成程序分類任務。GGANN 模型考慮到節(jié)點在圖中拓撲結構性質的差異性,從而摒棄了原始模型中對鄰域信息的簡單累加操作。GGANN中,注意力機制構建的注意力層實現(xiàn)了帶權重的鄰域信息匯集。而且,以注意力機制為注意力層的方法,有效地解決了領域節(jié)點數(shù)目動態(tài)變化的問題。
早期的源代碼挖掘領域,大部分存在的工作都依賴于自然語言相關技術,從而傾向于將源代碼解析成關鍵字序列[4-5,14-15]或者API序列[6-7]。這些工作涉及的任務主要分為以下幾種:序列預測、代碼與自然語言互譯、代碼補全以及變量名預測。文獻[5]驗證了源代碼具備與自然語言一樣具有統(tǒng)計特性,因此,他們使用N 元統(tǒng)計模型(N-Gram)為源代碼建模,之后又證明了他們的模型能夠提高Eclipse 自動補全代碼的能力。Bhoopchand等[16]使用端到端的指針網(wǎng)絡(Pointer Network)實現(xiàn)自動IDE代碼補全。Gu等[6]則采用編碼器-解碼器模型學習API使用序列和自然語言描述之間的映射關系。
為了刻畫源代碼中的靜態(tài)語法結構信息,Mou等[11-13]設計出一種基于樹的卷積神經(jīng)網(wǎng)絡模型(Tree Based Convolution Neural Network,TBCNN)。TBCNN 模型直接在AST 上做卷積處理,從而將AST 映射成蘊含語法結構信息的嵌入向量。文獻[9]則進一步利用TBCNN模型實現(xiàn)了Java程序語言和C++程序語言之間的代碼轉換。
與自然語言不盡相同,程序語言有一個很突出的特點就是可運行性。因此,僅僅考慮靜態(tài)的語法信息遠遠不夠,而如何融入“運行”時的程序語義信息顯得尤其重要和棘手。Allamanis 等[17]提出直接將“運行”時信息融入抽象語法樹,但是擴展后的抽象語法樹不再是嚴格意義上的樹形結構。這時的抽象語法樹不再是完全地自頂向下的結構,甚至可能產(chǎn)生環(huán)。顯然,原有的基于樹的卷積神經(jīng)網(wǎng)絡模型已經(jīng)不能處理這樣的抽象語法樹。隨著圖神經(jīng)網(wǎng)絡(GNN)[18-19]在不同領域展現(xiàn)出的強大學習能力,源代碼領域研究者們深受啟發(fā)。他們認為樹是弱化的圖,因此使用圖神經(jīng)網(wǎng)絡學習當前擴展后的抽象語法樹恰恰解決了之前模型不適用的問題。Li等[20]的核心思想就是利用GNN 模型為源代碼建模,以此獲得源代碼分布式向量表達。
基于上述相關研究,本文提出一種基于門控圖神經(jīng)網(wǎng)絡與注意力機制的程序分類方法。該方法針對在線判題(OJ)系統(tǒng)收集的C++源代碼建立深度學習模型,以提取程序代碼的分布式代碼表征,進而完成程序分類。
本文提出的基于門控圖神經(jīng)網(wǎng)絡與注意力機制的代碼表征學習方法主要包括三個步驟,如圖1所示。
(1)分別構建程序算法的抽象語法樹(AST)、數(shù)據(jù)流圖(DFG)以及函數(shù)調用圖(FCG)。
(2)融合程序算法圖EAST(Extended Abstract Syntax Tree)。
(3)將GGANN 模型應用于學習EAST 圖的拓撲結構,以得到節(jié)點向量表達和EAST 圖向量表達,最后使用上述向量表達分別完成節(jié)點分類任務和程序分類任務。
圖1 模型架構
如圖1 所示,構建程序算法圖EAST 實際上包括兩個主要的步驟:(1)分別構建抽象語法樹AST(Abstract Syntax Tree)、函數(shù)調用圖FCG(Function Call Graph)和數(shù)據(jù)流圖DFG(Data Flow Graph);(2)融合AST、DFG、FCG 得到程序算法圖EAST(Extended Abstract Syntax Tree)。
抽象語法樹:AST[21]是對源代碼進行語法分析和語義分析的中間表示形式,它是通過代碼使用無關上下文規(guī)則(https://en.wikipedia.org/wiki/Context-free_grammar)解析后得到的用于描述代碼語法規(guī)則和執(zhí)行順序的樹形結構數(shù)據(jù)。在AST 中,葉子節(jié)點代表源代碼中的標志符,而非葉子節(jié)點則代表語法結構體。作為源代碼的解析樹,AST基本上覆蓋了以下語法結構體:(1)選擇結構體。例如,IF、SWITCH等。(2)循環(huán)結構體。例如,WHILE、FOR 等。(3)序列結構體。例如,表達式、賦值語句等。因此,AST 作為源代碼的中間表示形式,能夠有效地保留與程序語言相關的語法上下文信息。
函數(shù)調用圖:FCG[22]用于刻畫源代碼中與控制流相關的信息。函數(shù)調用圖中的每個節(jié)點代表一個函數(shù),而其中的邊表示函數(shù)之間的調用關系。如圖2 是示例代碼,圖3(a)是圖2 代碼的函數(shù)調用圖,其中每個節(jié)點表示一個函數(shù)。
圖2 示例代碼
數(shù)據(jù)流圖:DFG[23]顯式地蘊含了源代碼中數(shù)據(jù)轉移和數(shù)據(jù)處理兩個方面的數(shù)據(jù)邏輯。DFG 中的節(jié)點表示實體,例如,變量聲明、操作數(shù)、操作符、結構體等等,而其中的邊代表這些實體之間存在的數(shù)據(jù)關系。DFG 能夠描述源代碼的數(shù)據(jù)邏輯和程序功能,被用于分析程序動態(tài)的運行時數(shù)據(jù)流信息。如圖3(b)所示,是圖2(a)所示的代碼片段的數(shù)據(jù)流圖。在數(shù)據(jù)流圖中,參考動態(tài)分析程序相關方法,挖掘出5 種常見的數(shù)據(jù)流關系,并且使用不同顏色的邊在圖3(b)中標注出來:(1)(藍色)同一個變量在不同時刻的數(shù)據(jù)轉移關系。(2)(紫色)不同變量的數(shù)據(jù)傳遞關系。(3)(橙色)形參/實參數(shù)據(jù)傳遞關系。(4)(紅色)函數(shù)聲明/函數(shù)體返回值的賦值關系。(5)(綠色)操作符號/操作數(shù)之間的雙向運算關系。
程序算法圖EAST:通過比較AST、FCG 和DFG 的特性,很顯然每種不同形式的中間表達形式都僅僅從某一個角度上刻畫程序源代碼。AST 僅蘊含語法結構相關的靜態(tài)信息,而后二者分別用于描述與控制流與數(shù)據(jù)流相關的運行時動態(tài)信息。特別地,后兩者參考的角度不相同。FCG 從函數(shù)粗顆粒度的角度出發(fā),而DFG 從細顆粒度的變量、運算符、運算數(shù)等標志符出發(fā)。源代碼作為可運行的特殊文本,靜態(tài)語法信息和動態(tài)運行信息都很重要。因此,將AST、FCG和DFG中攜帶的代碼信息進行融合有助于減少由源代碼向中間表達轉化產(chǎn)生的信息損失。
如圖3(c)所示是圖2(a)所示代碼的EAST,EAST以AST為骨架,保持AST原有的節(jié)點不變,僅僅通過增加額外的邊以融入數(shù)據(jù)流信息和函數(shù)調用信息。
圖3 EAST示例
本文用到的圖模型涉及有向圖G=(V,E),其中V代表大小為|V|的節(jié)點集,E 代表大小為|E|的有向邊集合。V 中的節(jié)點使用節(jié)點編號i 表示,E 中的有向邊使用eij表示,eij代表由節(jié)點i 指向節(jié)點j 的邊。對于圖中不同類型的邊,使用邊類型集合表示。圖G 中節(jié)點之間的連接關系使用連接矩陣A 表示。A 的維度有兩種設計方案:(1)。圖中有向邊eij看成是兩條不同類型的出入邊。一條是節(jié)點i 的出邊,另一條是節(jié)點j 的入邊。(2)。方案二僅將有向邊eij看作節(jié)點j 的入邊。而本文中的連接矩陣示例參照第二種方案。
A 中第i 行第j 列的元素Aij是一個d×d 的矩陣(d 代表節(jié)點狀態(tài)向量維度)。Aij又稱為邊eij上的傳播矩陣,表示節(jié)點i 到節(jié)點j 的信息傳播規(guī)則。例如,圖4(c)顯示了圖3(b)所示的數(shù)據(jù)流圖所對應的連接矩陣,其中兩個紅色矩形框出的矩陣分別是e3y和eyz所對應的傳播矩陣。
圖4 連接矩陣和傳播矩陣示例
在圖2(a)所示的賦值語句中,關心的是數(shù)字3是否能夠傳遞到變量z,如圖4(b)所示。為此,可將節(jié)點3和z 分別看成源節(jié)點和目標節(jié)點,并分別初始化其特征向量為和(兩維向量第一維為1,表示3 可達該節(jié)點),而節(jié)點y 的特征向量表示初始化為
傳播矩陣Aij決定了節(jié)點i 的各個維度信息如何傳播給節(jié)點j 的各個維度,“0”代表不傳播,“1”代表完全傳播。例如,圖4(c)的A3y表示節(jié)點3 只將其第一維度的信息傳遞給節(jié)點y 的第一維度,這樣,向量h3與A3y相乘的結果仍然為hy=[1,0],表示數(shù)據(jù)仍然未能傳遞到目標節(jié)點z。然而,圖4(c)中的Ayz表示節(jié)點y 的第一維的信息要傳遞給節(jié)點z 的第一維,因此,向量hy與Ayz相乘的結果為hz=[1,0],表示數(shù)據(jù)可達目標節(jié)點z。
在圖神經(jīng)網(wǎng)絡(GNN)[24]中,節(jié)點在不同類型邊上的信息傳播通過不同的多層感知機實現(xiàn),而邊上的傳播矩陣則表現(xiàn)為可訓練的多層感知機權重We∈Rd×d。需要注意的是,圖4(c)中所示連接矩陣僅表示,在可達性任務上,圖模型收斂后的多層感知機權重。
GNN 模型有個迭代T 輪的節(jié)點狀態(tài)信息傳播過程:節(jié)點i 的狀態(tài)信息初始化為向量,在第t 輪迭代時,每個中心節(jié)點i 聚集所有鄰居節(jié)點信息得到節(jié)點交互上下文,如公式(1)所示(其中Ni表示i的鄰居節(jié)點集合)。針對當前交互上下文,節(jié)點i 更新自身在第t 輪后的狀態(tài)信息,如公式(2)所示??坍嬃斯?jié)點i 在圖中的拓撲結構,當GNN 模型達到收斂,狀態(tài)信息將達到不動點。此時的將作為節(jié)點i 最終的向量表達。
從本質上來講,門控神經(jīng)網(wǎng)絡(GGNN)就是在GNN的基礎上使用了GRU 單元,即將公式(2)替換成公式(3)。GRU單元考慮在不同更新輪次,節(jié)點狀態(tài)信息之間的聯(lián)系。即節(jié)點i 在更新輪次t 時,節(jié)點隱藏層向量表達與前一輪次的狀態(tài)信息的時序關系。
基于注意力機制的啟發(fā),通過給每個鄰居節(jié)點分配不同的權重來刻畫其對中心節(jié)點的重要性αij。αij通過神經(jīng)網(wǎng)絡實現(xiàn)函數(shù)映射a:Rd×Rd→R,a 計算中心節(jié)點i 與其鄰居節(jié)點j 的相關性系數(shù),并使用soft max函數(shù)對所有鄰居節(jié)點的相關性系數(shù)進行歸一化,如公式(4)所示:
神經(jīng)網(wǎng)絡a 的權重參數(shù)只與信息傳播輪次相關。同一信息傳播輪次,a 對于所有節(jié)點共享。不同傳播輪次,a 具有不同的參數(shù)。節(jié)點i 的鄰居節(jié)點j 數(shù)目不定導致aij數(shù)目可變,不能直接調用Tensorflow 框架提供的soft max 函數(shù)。本文對soft max 進行實現(xiàn),以適應變化的鄰居節(jié)點數(shù)目(公式(5)和(6))。
因為程序分類是根據(jù)程序算法圖EAST 的嵌入表達對程序代碼進行分類,所以在得到最終的圖節(jié)點嵌入向量表達后,需要計算整個EAST 圖的嵌入向量表示hG。本工作中提出節(jié)點向量概率融合方法,由節(jié)點嵌入向量生成圖嵌入向量。如公式(8)所示。是全連接神經(jīng)網(wǎng)絡,它根據(jù)節(jié)點屬性和拓撲結構信息學習節(jié)點i 被融合的概率。f 中的激活函數(shù)使
總的來說,EAST 圖的以下特點決定了GGANN 模型的適用性:(1)圖中的邊有多種類型。(2)圖中節(jié)點與節(jié)點可能存在多條不同類型的邊。(3)圖中既存在有向邊,又存在無向邊。另外,GGANN 的注意力機制摒棄了累加求和這種人為指定的交互上下文計算方式,而改用模型自主學習中心節(jié)點對鄰居節(jié)點的連接關系。這種注意力機制具備以下三個特點:
(1)中心節(jié)點和其鄰居節(jié)點計算重要性αij可以并行,計算高效。
(2)注意力機制實現(xiàn)了模型自動學習交互上下文的計算方式,而不必考慮變化的鄰居節(jié)點數(shù)目。如果使用神經(jīng)網(wǎng)絡學習計算交互上下文,必然需要面臨圖中各節(jié)點鄰居節(jié)點數(shù)目不一致而導致的神經(jīng)網(wǎng)絡權重維度無法統(tǒng)一的問題。
(3)注意力機制考慮鄰域全局結構以及鄰居節(jié)點拓撲結構性質的差異。用sigmoid,其最終輸出是一個[0,1]的數(shù)值。g 同樣也使用全連接層神經(jīng)網(wǎng)絡實現(xiàn),它使用tanh 函數(shù)激活輸出。hG的計算方式和公式(7)類似,都基于注意力機制的思想。最終,程序類別lG由經(jīng)過函數(shù)softmax 得來。
為了驗證本文提出的模型在程序分類上的有效性,不僅從程序分類準確率的角度對模型做出指標評估,還從EAST 圖節(jié)點嵌入表達的角度分析了模型學習拓撲結構的能力。為了直觀地理解模型的學習效果,部分實驗結果采用可視化方法呈現(xiàn)出來。
本文的實驗數(shù)據(jù)是從在線判題(OJ)系統(tǒng)中收集的。在該系統(tǒng)上,管理員發(fā)布了很多程序設計問題,而學生以源文件的形式提交了關于每個問題解決方案的代碼。對于代碼的正確性,OJ 系統(tǒng)一般先檢查代碼能夠正確編譯,然后將執(zhí)行程序后的輸出與測試樣例進行對比,從而自動判定學生提交的代碼是否正確。因此,該數(shù)據(jù)集主要由兩部分組成:編程問題(由問題題號表示)和相應的學生提交的源代碼。
為了排除編程語言的問題,只選C++編寫的源代碼。同時為了確保與每個問題相關的各種源代碼足夠豐富,對數(shù)據(jù)集進行了過濾,以便只處理最常見的問題。過濾的規(guī)則很簡單,僅僅保留解決方案代碼超過350份的問題,以此組成30個程序設計問題的標準數(shù)據(jù)集。在標準數(shù)據(jù)集中,存在一些相似度很高的問題,比如A+B,A+B(I),A+B(II)等問題。這些問題的關系為:A+B(I)問題是在A+B 問題上演化而來,而A+B(II)問題是由A+B 問題演化而來。這些問題不僅在問題描述還在代碼實現(xiàn)上都保持著極高的相似性,因此對這些問題上將進行程序分類任務,問題混淆性更強。本文工作也充分利用具備這種性質的問題集合(相似子數(shù)據(jù)集)用于驗證模型的分類魯棒性和有效性。
使用開源的clang(http://clang.llvm.org)依賴庫解析C++程序設計源代碼,從而得到程序AST數(shù)據(jù)集。進一步為每個程序設計問題的AST樹添加代表數(shù)據(jù)流信息的邊和代表函數(shù)調用圖的邊,最后得到最終的EAST數(shù)據(jù)集。在實驗中,EAST 數(shù)據(jù)集按照3∶1∶1 的比例劃分訓練集、驗證集、測試集。
模型訓練采用的優(yōu)化算法是ADAM優(yōu)化器的隨機梯度下降算法SGD[25]。損失函數(shù)采用的是交叉熵。模型中的權重參數(shù)初始化使用Glorot[26]初始化方法。在訓練中,為了提高模型的泛化能力,主要采取了如下措施:(1)為了防止過擬合,本文使用初始值λ=0.000 5 的L2正則項。(2)為了解決梯度爆炸問題,實驗中采用舍棄概率p=0.6 的dropout[27]。(3)為了快速得到一個較優(yōu)解,使用線性學習率衰減對學習率L進行調整。L從初始學習率L0=0.000 1 下降到最終學習率L×F,其中衰減系數(shù)F ∈[0.01,1]。(4)實驗根據(jù)模型在驗證集上的預測準確率來估算模型早停(early stopping)的時機,以此減少模型過擬合。
實驗中信息傳播層(信息迭代輪次)被設置為4層,而每個傳播層神經(jīng)元個數(shù),即傳播矩陣向量維度d,是一個超參數(shù)。該超參數(shù)的選擇主要考慮以下兩個因素:(1)模型收斂的速度;(2)模型的損失值。為此,使用實驗來確定超參數(shù)d,實驗結果如圖5(a)和(b)所示。圖5(a)展示了每秒鐘,模型計算EAST圖的數(shù)目隨著d 值的增加而改變的情況。而圖5(b)則展示了模型在訓練集/測試集上隨著d 值增加,收斂后的最終損失值變化情況。從圖5(a)和(b)中可以看出,當隱層向量維度d為270 時,模型的收斂損失值相對較小,同時模型訓練速度也相對較快。因此,將隱層向量維度d 設為270,從而完成后續(xù)實驗。
圖5 模型參數(shù)選擇指標
本節(jié)主要通過實驗結果評估GGANN模型在EAST圖上程序分類準確度,以及分析模型得到的節(jié)點嵌入表達。
4.3.1 程序分類
程序分類問題用于驗證本文模型是否成功地從源代碼中學習到語法結構與語義信息,即針對相同問題的不同學生實現(xiàn)的代碼是否可以被劃分為相同的類別,而針對不同問題的具有相似語法結構的代碼能夠有效地被辨別。
在實驗中,構建程序二分類任務,這個任務主要內(nèi)容是判斷給出的一份源代碼是否屬于某一個程序類別(問題題號)。這是一個監(jiān)督性學習問題,每個程序設計代碼使用相應的問題題號作為標簽。本實驗選擇的基準對比實驗是基于樹的卷積神經(jīng)網(wǎng)絡(TBCNN),據(jù)大家所知,TBCNN 是迄今為止源代碼分類任務上性能表現(xiàn)最好的工作。此外,因為GGANN模型是針對GGNN模型的改進,也將兩個模型在EAST 圖上進行對比實驗。由于TBCNN 的模型特性,導致TBCNN 模型不能運用于有環(huán)的EAST 圖,對比實驗中不考慮TBCNN 模型與EAST圖的組合實驗。
表1和表2展示了GGANN、GGNN、TBCNN這3種模型在程序標準數(shù)據(jù)集/相似問題數(shù)據(jù)集上的分類精確度。實驗表明,TBCNN 模型在代碼分類精確度明顯低于GGANN和GGNN模型,而GGANN較GGNN模型也有明顯的改進。這一方面說明TBCNN過多的依賴程序代碼中間表達形式AST,導致TBCNN 不容易辨別語法結構相似但是運行時信息有差別的問題,另一方面說明GGANN 采用模型自主學習的交互上下文計算方式有效地提升了GGNN的性能。
表1 模型與中間表達形式組合對比實驗
表2 模型在相似問題上的分類準確度%
為了評估是否數(shù)據(jù)流邊和函數(shù)調用圖邊是否有用,分別移除7 種邊中的1 種,并且使用GGANN 模型對刪除某種邊后EAST圖進行分類,以此觀察每種邊對程序分類精度的影響。
實驗結果如圖6 所示,上劃線(----Ast)表示去掉給定類型邊(Ast)后的EAST圖。實驗結果表明大部分程序任務,刪除某一種類型的邊對程序分類精度影響不大。7種類型的邊可能存在信息冗余,因此任意某種類型的邊刪除都不會對程序分類精度產(chǎn)生顯著影響。但對于某些程序,刪除這些類型的邊可以顯著降低或提高程序分類精度(如表3 所示)。結果表明,EAST 圖中的數(shù)據(jù)信息邊能夠彌補AST中語義信息的缺失。
圖6 不同類型邊的貢獻比較
表3 受邊類型影響的程序分類任務
分別比較了GGANN、GGNN、TBCNN 在EAST、AST中間表達形式上損失值的收斂趨勢。如圖7所示,圖模型不僅最終收斂損失值較小,收斂速度也比TBCNN 快。圖網(wǎng)絡模型收斂速度較快的原因,是圖模型對AST 節(jié)點的約束比TBCNN 強。更具體地說,在TBCNN 模型中,卷積操作強制信息從子節(jié)點到父節(jié)點的單向傳播,而圖模型對于每個節(jié)點,都涉及所有相鄰節(jié)點之間的雙向信息傳播。這種信息傳播能夠逐漸擴散到整個圖結構。
圖7 4個模型的損失值隨迭代次數(shù)的變化
4.3.2 節(jié)點聚類
基于GGANN 模型的特點-節(jié)點的特征表達都是通過學習節(jié)點及其鄰居節(jié)點構成的子結構而來的,因此擁有相似子結構(相似語法結構)的節(jié)點具備相似的表達。為了評估模型是否學出這樣的特性,使用無監(jiān)督性聚類方法K-means 對節(jié)點的嵌入向量表達做聚類。部分節(jié)點聚類結果如表4 所示。為了分析聚類中的節(jié)點是否具有相似的語義信息,對各個聚類的節(jié)點所對應的語義信息進行了對比。
表4 節(jié)點聚類(K=5)
從表4可以看出,模型有效地將節(jié)點的語義特征嵌入到向量表達。比如,F(xiàn)orStmt、ContinueStmt、GotoStmt、BreakStmt等與控制流相關的節(jié)點因為具有相似的語義特征(嵌入空間比較接近),因此被聚類到簇3。類似地,一元運算符UnaryOperator 和二元運算符BinaryOperator,字符型定義StringLiteral 和整數(shù)定義IntegerLiteral聚類到了簇1,因此這些運算符都與數(shù)據(jù)運算/指向相關;CompoundAssignOperator,?=,+=,-=聚類到了簇2,因此都是與復合運算相關的。對于上述分析,TBCNN[11-12]的實驗中也挖掘出類似的節(jié)點嵌入向量性質。
4.3.3 節(jié)點融合概率分析
GGANN 對于EAST 圖的輸出,本文定義了一個圖向量表達的計算函數(shù),如公式(8)所示。其中每個節(jié)點v ∈V 都存在一個基于注意力機制算出的節(jié)點融合概率,這個概率反映了當前節(jié)點與EAST 圖嵌入表達(當前任務)的相關程度。為了深度挖掘融合概率是否有意義,將其中一個EAST圖中所有節(jié)點的融合概率通過熱力圖的形式進行展示。如圖8 中有104 個矩形條,每個矩形條對應EAST圖的一個節(jié)點。圖中顏色越亮的點融合概率越高。圖8 中融合較高的節(jié)點有BinaryOperator節(jié)點(0.71)、CallExpr 節(jié)點(0.74)、ImplicitCastExpr 節(jié)點(0.75)、IfStmt 節(jié)點(0.75)、DeclStmt 節(jié)點(0.72)和CompoundStmt節(jié)點(0.74)。這些節(jié)點基本位于原始的AST較高層次的位置(較高層次一般是代碼語法結構的抽象,其包含了更多的拓普信息),且能體現(xiàn)出程序算法的結構骨架。對于這樣的節(jié)點,圖嵌入表達賦予了其更大的融合概率,即更強的“關注”。未來的工作中將運用深度學習模型可解釋性相關技術驗證其一般性和適用性。
圖8 EAST節(jié)點融合概率
為了解決在線編程服務用戶之間有限的社會互動問題,提出了使用源代碼挖掘技術促進互動。作為實現(xiàn)這一目標的第一次嘗試,本文提出了一種基于圖的程序分類模型,通過理解程序的結構和語義信息,可以對給定的程序進行高精度的算法分類。更具體地說,在這項工作中,EAST 圖被提議將一個程序的源代碼轉換成一個中間表示,并將其輸入到圖網(wǎng)絡模型中,并且為程序分類應用提出了一個圖網(wǎng)絡模型GGANN。
據(jù)了解,這是第一個將圖網(wǎng)絡模型應用于程序分類應用程序的工作。實驗評價表明,本文研究成功地學習了各種編程任務的語法結構和語義信息,與目前最先進的程序分類工作TBCNN 相比,模型的分類精度提到提升。在未來,希望集成編譯技術,進一步挖掘源代碼。另外,GGANN 模型計算量偏大,模型訓練時間過長,因此,希望借助鄰域采樣和池化技術加速模型的訓練速度,并將GGANN模型擴展到其他編程語言和其他任務。