刁旭煬,吳 凱,陳 都,周俊峰,高 璞
(上海機(jī)電工程研究所,上海 201109)
軟件穩(wěn)定性是衡量軟件質(zhì)量的重要標(biāo)準(zhǔn),成千上萬行復(fù)雜代碼往往存在會(huì)導(dǎo)致軟件失效的風(fēng)險(xiǎn)。為了幫助開發(fā)和測(cè)試人員更加高效地定位潛在缺陷,軟件缺陷預(yù)測(cè)技術(shù)正廣泛運(yùn)用在軟件的代碼審查階段,是軟件工程[1]研究領(lǐng)域中的重要研究方向之一。
軟件缺陷預(yù)測(cè)技術(shù)[2-3]利用軟件代碼庫中的歷史項(xiàng)目進(jìn)行缺陷度量元的設(shè)計(jì)與提取,并將基于靜態(tài)度量元的特征放入缺陷預(yù)測(cè)分類器中進(jìn)行模型訓(xùn)練,最終得到的缺陷預(yù)測(cè)模型能夠有效識(shí)別存在缺陷的代碼模塊。軟件開發(fā)與測(cè)試人員可根據(jù)預(yù)測(cè)結(jié)果對(duì)相關(guān)模塊進(jìn)行復(fù)核校驗(yàn),從而節(jié)省了查找定位缺陷的時(shí)間,提升了軟件質(zhì)量維護(hù)與保證的效率。軟件缺陷預(yù)測(cè)主要分為同項(xiàng)目軟件缺陷預(yù)測(cè)[4]與跨項(xiàng)目軟件缺陷預(yù)測(cè)[5-6]兩個(gè)研究方向。此外,依據(jù)提取的程序特征顆粒度,可將軟件缺陷預(yù)測(cè)技術(shù)分為基于文件級(jí)、函數(shù)級(jí)、變更級(jí)的缺陷預(yù)測(cè)。
傳統(tǒng)的缺陷預(yù)測(cè)方法通常是基于人工設(shè)計(jì)的靜態(tài)度量元特征來構(gòu)建軟件缺陷預(yù)測(cè)模型。相關(guān)研究人員已經(jīng)設(shè)計(jì)出了相關(guān)有辨別度的特征可以有效區(qū)分有缺陷和無缺陷的程序模塊,主要包括基于運(yùn)算符和操作數(shù)的Halstead[7]特征、基于依賴的McCabe[8]特征、基于面向?qū)ο蟪绦蛘Z言的CK[9]特征以及基于多態(tài)、耦合的MOOD[10]特征。
然而,由于靜態(tài)度量元特征值是基于專家經(jīng)驗(yàn)設(shè)計(jì)的統(tǒng)計(jì)值,存在有缺陷代碼模塊和無缺陷代碼模塊出現(xiàn)相同值導(dǎo)致無法區(qū)分的情況。ASTs[11]是一種基于源代碼的特征樹表示方式,蘊(yùn)含著豐富的程序上下文信息。通過運(yùn)用深度學(xué)習(xí)技術(shù)挖掘基于ASTs的語法語義特征,可以得到比靜態(tài)度量元更具代表性的缺陷特征,從而構(gòu)建出性能更好的缺陷預(yù)測(cè)模型。
為了充分運(yùn)用程序上下文中潛在的語法語義信息,論文提出了一種基于混合注意力機(jī)制的軟件缺陷預(yù)測(cè)方法。首先,使用詞嵌入方法將特征序列表示為可被學(xué)習(xí)的多維向量,然后使用基于正余弦函數(shù)進(jìn)行位置編碼,接著運(yùn)用多頭注意力機(jī)制自學(xué)習(xí)每個(gè)位置在上下文中的語法語義信息,最后使用全局注意力機(jī)制提取整個(gè)程序模塊的關(guān)鍵特征,從而構(gòu)建出更加具有鑒別力的缺陷預(yù)測(cè)模型。論文選取了7個(gè)Apache開源項(xiàng)目作為數(shù)據(jù)集,與5種典型的基于靜態(tài)度量元和程序語法語義學(xué)習(xí)的方法進(jìn)行比較,實(shí)驗(yàn)結(jié)果表明論文提出的DP-MHA方法在F1上平均提升了17.86%。
在基于靜態(tài)度量元的方法中,Chen[12]等人使用多目標(biāo)決策優(yōu)化算法對(duì)軟件缺陷預(yù)測(cè)特征進(jìn)行篩選;Huda[13]等人采用包裹和過濾式特征選擇方法識(shí)別重要的缺陷特征;Okutan[14]等人使用貝葉斯網(wǎng)絡(luò)來分配靜態(tài)度量元與缺陷傾向性之間的影響概率;此外,Xu[15]等人提出了一種基于圖的半監(jiān)督缺陷預(yù)測(cè)方法來解決有標(biāo)簽數(shù)據(jù)不足和噪聲問題。在基于程序語法語義學(xué)習(xí)的方法中,Wang[16]等人使用深度置信網(wǎng)絡(luò)生產(chǎn)隱式的語法語義特征進(jìn)行缺陷預(yù)測(cè);Dam[17]等人建立了一種基于深度學(xué)習(xí)樹的缺陷預(yù)測(cè)模型來盡可能多地保留ASTs的初始結(jié)構(gòu)特征信息;Li[18]等人建立了嵌入靜態(tài)度量元的卷積神經(jīng)網(wǎng)絡(luò)缺陷預(yù)測(cè)模型;此外,Phan[19]等人基于圖神經(jīng)網(wǎng)絡(luò)從控制流圖中挖掘軟件的語法語義特征信息用來構(gòu)建缺陷預(yù)測(cè)模型。
但是由于存在長期記憶依賴問題,基于RNN和CNN生產(chǎn)的語法語義信息可能存在信息的丟失。為了充分挖掘特征序列中每一位置的上下文信息,DP-MHA采用多頭注意力機(jī)制進(jìn)行上下文自學(xué)習(xí)編碼,然后將生產(chǎn)的隱式語法語義特征放入全局注意力機(jī)制網(wǎng)絡(luò)中提取關(guān)鍵特征信息,用于缺陷預(yù)測(cè)模型的訓(xùn)練與預(yù)測(cè)。
本節(jié)對(duì)基于混合注意力機(jī)制的軟件缺陷預(yù)測(cè)方法DP-MHA的總體架構(gòu)進(jìn)行了詳細(xì)闡述,詳見圖1。
首先,DP-MHA將項(xiàng)目中的每個(gè)程序文件提取為ASTs樹結(jié)構(gòu),然后從中選取關(guān)鍵節(jié)點(diǎn)并運(yùn)用深度遍歷方法獲得序列向量,接著通過字典映射和詞嵌入技術(shù)擴(kuò)展為可學(xué)習(xí)的多維向量,其次運(yùn)用正余弦函數(shù)進(jìn)行位置編碼,將編碼后的向量放入多頭注意力機(jī)制層,進(jìn)一步挖掘每個(gè)位置的上下文語義,最后運(yùn)用全局注意力機(jī)制提取程序文件中關(guān)鍵的語法語義特征,放入預(yù)測(cè)輸出模型進(jìn)行訓(xùn)練與預(yù)測(cè)。
圖1 DP-MHA總體架構(gòu)
為了將程序文件中的源代碼用向量形式進(jìn)行表征,需要選擇合適顆粒度,如字符、單詞或ASTs等形式對(duì)源程序進(jìn)行特征提取。ASTs是源代碼語法結(jié)構(gòu)的一種抽象表示,它以樹狀的形式表現(xiàn)編程語言的語法結(jié)構(gòu),樹上的每個(gè)節(jié)點(diǎn)都表示源代碼中的上下文語義信息。基于ASTs的表示形式能映射出源程序中的語法結(jié)構(gòu)和語義信息,具有多維度的特征信息可供缺陷預(yù)測(cè)模型進(jìn)行學(xué)習(xí),因此論文采用該形式對(duì)源代碼程序進(jìn)行抽象表征。
根據(jù)先前的研究,論文只提取3種類型節(jié)點(diǎn)作為ASTs樹特征值。第一類為方法和類實(shí)例的創(chuàng)建節(jié)點(diǎn),此類提取方法名稱和類名稱;第二類為聲明節(jié)點(diǎn),包括方法、類型、枚舉等聲明,此類提取它們的具體值;第三類為控制流節(jié)點(diǎn),包括分支、循環(huán)、異常拋出等控制流節(jié)點(diǎn)用它們的類型值記錄。所有被選擇的AST節(jié)點(diǎn)值如圖2所示。
圖2 選取的AST節(jié)點(diǎn)類型
在本次實(shí)驗(yàn)中,論文采用基于Python的開源數(shù)據(jù)分析包javalang對(duì)Java源代碼進(jìn)行分析提取為AST抽象語法樹,然后采用深度遍歷的方法將提取的節(jié)點(diǎn)值轉(zhuǎn)化為一個(gè)序列向量,詳細(xì)描述見算法1。
算法1:將源程序文件提取為ASTs字符向量
輸入:
F:源程序文件{f1,f2,…,fn}
R:選取的節(jié)點(diǎn)類型{r1,r2,…,rn}
輸出:
S:字符向量{s1,s2,…,sn}
1. For i = 1→n do
2. 構(gòu)建源程序fi的AST抽象語法樹ASTi;
3. For node in DFT(ASTi) then
4. If node in R then
5. Add node into ;
6. End
7. End
8. Addsiinto S;
9. End
10.Return S;
ASTs序列向量存儲(chǔ)著大量程序模塊的語法語義信息,兩段代碼模塊可能具有相同的靜態(tài)度量元特征值,但它們的ASTs結(jié)構(gòu)存在差異,這使得基于ASTs序列可學(xué)習(xí)生成更具有辨別力的特征。為了讓提取的ASTs序列向量具備可學(xué)習(xí)性,采用字典映射技術(shù)將序列中的節(jié)點(diǎn)映射為一個(gè)整型數(shù)字,假設(shè)節(jié)點(diǎn)的數(shù)量為m,每個(gè)節(jié)點(diǎn)用一個(gè)整型數(shù)字表示,那么映射范圍就是從1到m。算法2為ASTs序列編碼的詳細(xì)描述,首先統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)出現(xiàn)的頻率,并按照頻率從高到底排序,然后將ASTs字符向量映射成數(shù)字向量,接著需要將長短不一的數(shù)字向量統(tǒng)一為固定長度,少于固定長度的向量通過填充0來補(bǔ)齊長度,超出固定長度的向量將頻率低的節(jié)點(diǎn)依次剔除直至長度與固定值一致,最終為了使得映射的數(shù)字向量具備可學(xué)習(xí)性,構(gòu)建可被訓(xùn)練的高維詞字典,采用詞嵌入技術(shù)將每一個(gè)數(shù)字節(jié)點(diǎn)轉(zhuǎn)化為一個(gè)多維向量。
算法2:ASTs序列編碼
輸入:
S:ASTs字符向量{s1,s2,…,sn}
M:字符向量的長度
StrFreq:字符頻率字典
StrtoInt:字符轉(zhuǎn)整型字典
StrFreqList:字符頻率列表
輸出:
V:編碼后的整型向量{v1,v2,…,vn}
1. 初始化V、StrFreq、StrtoInt和StrFreqList
2. For i = 1→n do
3. For j=1→len(si) do
4. if sijnot in StrFreq.keys then
5. StrFreq[sij]=0;
6. End
7. StrFreq[sij]+=1;
8. End
9. End
10. For key in StrFre.keys then
11. StrFreqList.add((key, StrFreq[key]));
12. SortbyStrFreq(StrFreqList) ;//按頻率降序排列
13. For i=1→len(SortbyStrFreq) do
14. Str= SortbyStrFreq[i][0];
15. StrtoInt[Str]=i;
16. End
17. For i = 1→n do
18. For j=1→len() do
19.vij=StrtoInt[sij];//將字符映射為整型,頻率高的字符靠前
20. End
21. If len(vi) 22. Add M-len(vi) 0 s intovi; 23. End 24. Else if len(vi) >Mthen 25. For k=1→len(vi)-m do 26. z=vi.index(max(vi));//找到頻率最低的字符所對(duì)應(yīng)的序號(hào) 27. Delviz//刪除該字符 28. End 29. End 30. Addviinto V; 31. End 32. Return V; 軟件倉庫中的缺陷數(shù)據(jù)通常是類不平衡的,其中有缺陷的程序文件往往只占據(jù)很小的一部分。直接采用原始數(shù)據(jù)集訓(xùn)練的到模型存在偏向于大多數(shù)(無缺陷)類的偏差。為了解決該問題,通常采用過采樣或欠采樣技術(shù)對(duì)數(shù)據(jù)集進(jìn)行平衡處理。過采樣通過復(fù)制少數(shù)類的實(shí)例來實(shí)現(xiàn)類間平衡,而欠采樣則是將多數(shù)類中的實(shí)例進(jìn)行剔除??紤]到欠采樣或?qū)е聰?shù)據(jù)信息的丟失,從而導(dǎo)致欠擬合的情況,因此論文采用過采樣技術(shù)將少數(shù)(有缺陷)類的實(shí)例進(jìn)行復(fù)制,從而構(gòu)造出兩類平衡的數(shù)據(jù)集。 DP-MHA神經(jīng)網(wǎng)絡(luò)架構(gòu)如圖3所示,主要包含節(jié)點(diǎn)嵌入層、位置編碼層、多頭注意力層、全局注意力層和預(yù)測(cè)輸出層。 圖3 DP-MHA神經(jīng)網(wǎng)絡(luò)架構(gòu) 2.3.1 節(jié)點(diǎn)嵌入層 一維數(shù)字符號(hào)無法充分描述一個(gè)AST節(jié)點(diǎn)的上下文信息,論文采用詞嵌入技術(shù)將每一個(gè)一維數(shù)字向量映射為一個(gè)高維向量,詳細(xì)公式見式(1)所示。 F:M→Rn (1) 其中:M代表一個(gè)一維AST節(jié)點(diǎn)向量,Rn代表一個(gè)n維實(shí)數(shù)向量空間,F(xiàn)代表一個(gè)參數(shù)化函數(shù),能將M中的每個(gè)數(shù)字符號(hào)映射為一個(gè)n維向量。映射得到n維向量緊接著被放入位置編碼層學(xué)習(xí)節(jié)點(diǎn)的位置信息。 運(yùn)用詞嵌入技術(shù)不僅可以將節(jié)點(diǎn)的語法語義表示形式限制在有限維度的空間內(nèi),節(jié)省網(wǎng)絡(luò)訓(xùn)練的成本,避開維數(shù)災(zāi)難,而且節(jié)點(diǎn)之間的語法語義特征相似度也可以通過余弦距離公式來進(jìn)行度量,極大地提升了網(wǎng)絡(luò)學(xué)習(xí)語法語義特征的效率。 2.3.2 位置編碼層 在DP-MHA模型中沒有涉及到循環(huán)和卷積的神經(jīng)網(wǎng)絡(luò),為了充分利用AST向量的序列特性,DP-MHA將節(jié)點(diǎn)嵌入層輸出的向量放入位置編碼層進(jìn)行相對(duì)位置關(guān)系的學(xué)習(xí),位置編碼后的向量維度與節(jié)點(diǎn)嵌入后的向量維度相同,以便兩者相加得到最終包含相對(duì)位置關(guān)系的高維節(jié)點(diǎn)向量,作為多頭注意力層的輸入。 根據(jù)先前的研究,論文采用基于正弦和余弦函數(shù)進(jìn)行位置編碼,其計(jì)算公式如式(2)、式(3)所示: PE(pos,2i)=sin(pos/10 0002i/dmodel) (2) PE(pos,2i+1)=cos(pos/10 0002i/dmodel) (3) 其中:pos代表第pos個(gè)向量,i代表第pos個(gè)向量中的第i個(gè)維度,dmodel為節(jié)點(diǎn)嵌入的維度。即每個(gè)偶數(shù)位置的位置編碼對(duì)應(yīng)正弦函數(shù),每個(gè)奇數(shù)位置的位置編碼對(duì)應(yīng)余弦函數(shù),函數(shù)波長為2π到10 000*2π的幾何級(jí)數(shù)。對(duì)于任意固定偏移量k,PEpos+k能用PEpos的線性函數(shù)所表示,因此采用正余弦函數(shù)能較好的表示節(jié)點(diǎn)之間的相對(duì)位置關(guān)系。 2.3.3 多頭注意力層 多頭注意力層由6(num_blocks)個(gè)相同的神經(jīng)網(wǎng)絡(luò)層組成。每層由一個(gè)多頭注意力機(jī)制和位置轉(zhuǎn)化前向反饋網(wǎng)絡(luò)組成,每個(gè)子層計(jì)算得到的輸出與原始輸入進(jìn)行殘差連接與正則化處理,其公式表達(dá)如式(4)所示: LayerNormalization(x+SubLayerFun(x)) (4) 其中:SubLayerFun為多頭注意力機(jī)制和位置轉(zhuǎn)換前向反饋網(wǎng)絡(luò)兩個(gè)子層的函數(shù),將SubLayerFun(x)與原始輸入x相加得到殘差連接并進(jìn)行正則化處理,所有子層的輸入輸出向量維度與初始節(jié)點(diǎn)嵌入的維度相同。 多頭注意力機(jī)制由h個(gè)基于點(diǎn)積的注意力函數(shù)組成,首先將節(jié)點(diǎn)嵌入的維度縮小dmodel/h倍,使得神經(jīng)網(wǎng)絡(luò)的計(jì)算代價(jià)與帶有整個(gè)節(jié)點(diǎn)維度的單個(gè)頭注意力機(jī)制的計(jì)算代價(jià)相同,然后并行應(yīng)用h個(gè)注意力函數(shù),得到的輸出進(jìn)行全連接得到最終的上下文語法語義特征,具體機(jī)制架構(gòu)詳見圖4所示。 圖4 單個(gè)多頭注意力層 每個(gè)點(diǎn)積注意力函數(shù)的輸入為矩陣Q,K,V組成,計(jì)算公式如式(5)所示: (5) 圖5 多頭注意力機(jī)制的函數(shù)架構(gòu) 在運(yùn)用多頭注意力機(jī)制后,DP-MHA采用一個(gè)全連接的前向反饋神經(jīng)網(wǎng)絡(luò)進(jìn)行位置轉(zhuǎn)換,該網(wǎng)絡(luò)層由兩個(gè)線性函數(shù)和一個(gè)ReLU激活函數(shù)組成,其計(jì)算公式如式(6)所示: FFN(x)=max(0,xW1+b1)W2+b2 (6) 2.3.4 全局注意力層 從多頭注意力層中可以得到一個(gè)序列所有位置節(jié)點(diǎn)的上下文語法語義信息,這些位置節(jié)點(diǎn)對(duì)整個(gè)序列的語法語義貢獻(xiàn)是不同的。為了提取其中關(guān)鍵的語法語義特征,DP-MHA采用了全局注意力函數(shù),每個(gè)節(jié)點(diǎn)都會(huì)分配相應(yīng)權(quán)重,進(jìn)行加權(quán)和即可得到關(guān)鍵特征,其具體計(jì)算公式如式(7)~(9)所示: uit=tanh(Wnhit+bn) (7) (8) si=∑tαithit (9) 其中,全局注意力機(jī)制首先將節(jié)點(diǎn)hit放入一個(gè)多層感知器(MLP)來生成uit作為節(jié)點(diǎn)的隱式特征表示,然后設(shè)定一個(gè)全局上下文向量un,作為在每一個(gè)序列中搜尋關(guān)鍵節(jié)點(diǎn)信息的高階表示向量,接著計(jì)算uit與un的點(diǎn)積相似度并通過softmax函數(shù)進(jìn)行歸一化處理。最終計(jì)算所有節(jié)點(diǎn)的加權(quán)和作為學(xué)習(xí)得到的全局關(guān)鍵語法語義特征向量si。 2.3.5 預(yù)測(cè)輸出層 預(yù)測(cè)輸出層由一層帶有sigmoid激活函數(shù)的多層感知器組成,損失函數(shù)采用基于softmax的交叉信息熵,具體計(jì)算公式如式(10)、式(11)所示: Yi=sigmoid(siWo+bo) (10) (11) 本文選取了6個(gè)公開Java項(xiàng)目作為實(shí)驗(yàn)數(shù)據(jù)集,所有數(shù)據(jù)集均可在Github Apache 項(xiàng)目集中獲得。每個(gè)項(xiàng)目選取兩個(gè)版本,其中前置版本作為模型的訓(xùn)練集,后置版本作為衡量模型的測(cè)試集。在軟件缺陷預(yù)測(cè)研究數(shù)據(jù)集中,靜態(tài)度量元數(shù)據(jù)是一種公認(rèn)的特征集,針對(duì)Java面向?qū)ο蟪绦蛘Z言的特點(diǎn),Jureczko[20]等專家已進(jìn)行相關(guān)研究并提取出了20個(gè)典型的靜態(tài)度量元,其中包含了軟件規(guī)模、代碼復(fù)雜度以及與面向?qū)ο蟪绦蛘Z言特性相關(guān)的特征。詳細(xì)見表1所示。此外,程序的語法語義特征則由深度學(xué)習(xí)模型自動(dòng)學(xué)習(xí)生成。 表1 選取的20個(gè)靜態(tài)度量元特征值 表2列舉出了實(shí)驗(yàn)中項(xiàng)目數(shù)據(jù)集的相關(guān)信息,主要包括了項(xiàng)目名稱、版本號(hào)、程序模塊數(shù)量(以代碼文件為單位)以及總體缺陷率。 表2 Java項(xiàng)目數(shù)據(jù)集信息 3.2.1 實(shí)驗(yàn)環(huán)境 本次實(shí)驗(yàn)的硬件配置為一臺(tái)帶有Intel i7酷睿處理器、8G內(nèi)存和GTX1060顯卡的臺(tái)式機(jī),操作系統(tǒng)為Windows10,使用到的開發(fā)語言為Python及其相關(guān)機(jī)器學(xué)習(xí)與深度學(xué)習(xí)模塊Scikit-learn和Tensorflow,開發(fā)工具為pycharm。 DP-MHA網(wǎng)絡(luò)架構(gòu)的輸入向量長度(vector_len)為1 500,節(jié)點(diǎn)嵌入維度(dmodel)為32;多頭注意力機(jī)制query、key與value向量的維度為32,h為2,num_blocks為6;全局注意力層的輸出維度dglobal_attention為32,其余參數(shù)詳見表3。 表3 DP-MHA網(wǎng)絡(luò)參數(shù)配置信息 3.2.2 評(píng)價(jià)指標(biāo) 本文從F1值角度對(duì)DP-MHA方法的軟件缺陷預(yù)測(cè)性能進(jìn)行衡量。通常情況下,當(dāng)查全率(R)上升的同時(shí),會(huì)降低查準(zhǔn)率(P),F(xiàn)1值綜合了查準(zhǔn)率(P)和查全率(R),對(duì)預(yù)測(cè)框架的綜合性能進(jìn)行了考量,越高代表著缺陷預(yù)測(cè)模型的穩(wěn)定性越好,F(xiàn)1值的范圍為[0,1],其計(jì)算公式如下: (12) (13) (14) 其中:c為無缺陷程序文件,d為有缺陷程序文件。Nd→d表示預(yù)測(cè)和真實(shí)值都為有缺陷的數(shù)量;Nd→d+Nc→d為所有預(yù)測(cè)結(jié)果為有缺陷的數(shù)量;Nd→d+Nd→c為所有真實(shí)值為有缺陷的數(shù)量。 在實(shí)證研究階段,論文選取了5個(gè)經(jīng)典方法與DP-MHA方法進(jìn)行比較,分別為基于靜態(tài)度量元的RF,基于無監(jiān)督學(xué)習(xí)方法的RBM+RF和DBN+RF以及基于深度學(xué)習(xí)的CNN和RNN,詳見表4所示。 表4 選取的5個(gè)經(jīng)典缺陷預(yù)測(cè)方法 方法名稱說明RF基于20個(gè)靜態(tài)度量元的隨機(jī)森林方法RBM+RF基于RBM提取程序語法語義特征的RF方法DBN+RF基于DBN提取程序語法語義特征的RF方法 CNN基于textCNN提取程序語法語義特征的方法RNN基于Bi-LSTM提取程序語法語義特征的方法 如表5所示,DP-MHA方法相較于其他5種方法在F1值上平均提升了17.86%。由此可見,基于混合注意力機(jī)制學(xué)習(xí)得到的上下文語法語義特征提升了缺陷預(yù)測(cè)模型的穩(wěn)定性和準(zhǔn)確度。 表5 DP-MHA相較于5種經(jīng)典方法的F1值提升比率 為了說明DP-MHA方法相較于基于靜態(tài)度量元方法的優(yōu)越性,本文選取了基于20個(gè)靜態(tài)度量元特征的RF方法進(jìn)行對(duì)比分析。表6列出了DP-MHA與基于靜態(tài)度量元特征方法RF之間的F1對(duì)比結(jié)果。相較于基于靜態(tài)度量元的RF方法,DP-MHA在F1的W/T/L上全部占優(yōu),在F1的平均值上提升了16.6%。綜合上述比較結(jié)果,可判得DP-MHA方法的軟件缺陷預(yù)測(cè)模型穩(wěn)定性能要優(yōu)于基于靜態(tài)度量元特征的缺陷預(yù)測(cè)方法。 表6 DP-MHA與基于靜態(tài)度量元方法之間的F1值比較 為了說明DP-MHA方法相較于基于無監(jiān)督學(xué)習(xí)方法的優(yōu)越性,本文選取了具有典型代表的兩種無監(jiān)督學(xué)習(xí)方法RBM和DBN來提取程序的語法語義特征,然后將兩者學(xué)習(xí)到的特征分別放入RF分類器訓(xùn)練得到最終的缺陷預(yù)測(cè)模型。表7列出了DP-MHA與基于無監(jiān)督學(xué)習(xí)方法RBM+RF和DBN+RF之間的F1值對(duì)比結(jié)果。DP-MHA比RBM+RF在F1值的W/T/L上贏了6次;相較于DBN+RF,也全部占優(yōu)。此外從F1值的平均值來看,DP-MHA相較于RBM+RF和DBN+RF方法分別提升了34.3%、26.4%。綜合以上比較結(jié)果,可判得在缺陷預(yù)測(cè)模型穩(wěn)定性方面,DP-MHA都要比基于無監(jiān)督學(xué)習(xí)方法提取程序語法語義特征的方法來得更優(yōu)。 表7 DP-MHA與基于無監(jiān)督學(xué)習(xí)方法之間的F1值比較 為了說明DP-MHA方法相較于基于其他深度學(xué)習(xí)方法的優(yōu)越性,本文選取了具有典型代表的兩種深度學(xué)習(xí)方法CNN和RNN來提取程序的語法語義特征并自動(dòng)訓(xùn)練與預(yù)測(cè)。CNN采用1維卷積核提取隱藏特征,RNN采用Bi-LSTM的雙向循環(huán)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)隱式語法語義特征。 表8列出了DP-MHA與基于深度學(xué)習(xí)方法CNN和RNN之間的F1值對(duì)比結(jié)果。DP-MHA比CNN和RNN在F1值的W/T/L上分別都贏了5次。此外從F1值的平均值來看,DP-MHA相較于CNN和RNN方法分別提升了7.1%、4.9%。綜合以上比較結(jié)果,可判得在缺陷預(yù)測(cè)模型穩(wěn)定性方面,DP-MHA都要比基于CNN和RNN的深度學(xué)習(xí)方法提取程序語法語義特征的方法來得更優(yōu)。 表8 DP-MHA與基于深度學(xué)習(xí)方法之間的F1值比較 本文針對(duì)同項(xiàng)目軟件缺陷預(yù)測(cè)問題,提出了一種基于混合注意力機(jī)制的軟件缺陷預(yù)測(cè)方法DP-MHA,運(yùn)用節(jié)點(diǎn)嵌入與位置編碼技術(shù)提取AST特征信息,放入多頭注意力層中學(xué)習(xí)節(jié)點(diǎn)的上下文語法語義信息,然后使用全局注意力機(jī)制提取關(guān)鍵特征,放入預(yù)測(cè)輸出層中進(jìn)行訓(xùn)練與預(yù)測(cè),該方法學(xué)習(xí)得到的程序語法語義特征有效提升了軟件缺陷預(yù)測(cè)模型的性能。該方法仍有一些工作值得后續(xù)開展研究,具體而言為:(1)考慮跨項(xiàng)目軟件缺陷預(yù)測(cè)的應(yīng)用場景,并驗(yàn)證該方法是否能提升預(yù)測(cè)性能;(2)在實(shí)際工程項(xiàng)目[21-22]數(shù)據(jù)集中進(jìn)一步驗(yàn)證該缺陷預(yù)測(cè)方法的效果與性能。2.3 DP-MHA神經(jīng)網(wǎng)絡(luò)構(gòu)建
3 實(shí)驗(yàn)設(shè)計(jì)
3.1 實(shí)驗(yàn)數(shù)據(jù)集
3.2 實(shí)驗(yàn)環(huán)境與評(píng)價(jià)指標(biāo)
4 結(jié)果的分析和討論
4.1 選取的經(jīng)典缺陷預(yù)測(cè)方法
4.2 與基于靜態(tài)度量元方法的性能比較
4.3 與基于無監(jiān)督學(xué)習(xí)方法的性能比較
4.4 與基于深度學(xué)習(xí)方法的性能比較
5 結(jié)束語