?

基于BERT-PFMM的軟件缺陷預測方法*

2022-08-31 09:02湯怡佳王麗俠韓建民葉榮華曹小倩
關鍵詞:源代碼語義向量

湯怡佳, 王麗俠, 韓建民, 于 娟, 葉榮華, 姚 鑫, 曹小倩

(1.浙江師范大學 數學與計算機科學學院,浙江 金華 321004;2.浙江師范大學 行知學院,浙江 蘭溪 321100)

0 引 言

隨著軟件規模及復雜度的增加,軟件缺陷的發現變得愈發困難,軟件缺陷預測技術也受到廣泛的關注.軟件缺陷預測能夠判斷一個軟件模塊是否有缺陷,從而幫助測試人員更好地分配測試資源,安排測試過程,進而改進軟件產品的質量.因此,近年來,軟件缺陷預測方法的研究成為軟件工程領域的熱門課題.

早期的軟件缺陷預測以人工提取軟件特征為基礎[1].人工提取的軟件特征主要包含:項目源代碼的行數、復雜度、耦合度等[2-4].然而,人工提取的軟件特征,僅代表代碼的統計特征,忽略了潛藏在代碼中的結構和語義信息.這無疑會造成軟件缺陷預測性能的降低.而抽象語法樹以樹狀的形式表示源代碼,能夠更準確地表達程序模塊的語法結構和語義信息.研究表明,利用抽象語法樹可以更準確地預測軟件缺陷[5].

近年來,研究人員將深度學習技術運用到軟件特征提取和軟件缺陷預測中[6],典型的基于深度學習的軟件特征提取技術有:深度信念網絡(deep belief network,DBN)[7]、長短期記憶網絡(long short-term memory,LSTM)[8]、卷積神經網絡(convolutional neural network,CNN)[9].DBN學習的是數據和標簽之間的聯合分布,但忽略了源代碼的結構信息;CNN模型可以很好地提取局部語義特征,但是無法捕獲長文本間的語義信息;LSTM網絡具備長時記憶的能力,能夠捕獲長文本間的語義信息,但是訓練中需要大量的數據和計算時間.這些方法的共同問題是使用上下文無關的詞嵌入方法對文本數據進行編碼,忽略了單詞在不同上下文中表示的語法和語義的差異,表示能力存在不足.

為解決上述不足,本文提出一種結合預訓練模型BERT(bidirectional encoder representations from transformers)和感知特征混合模型PFMM(perceptual features mixing model)的軟件缺陷預測方法BERT-PFMM.BERT利用注意力機制,可以充分理解和動態獲取上下文相關的語義信息[10],從中自動提取軟件特征;PFMM網絡架構可以以較小的計算代價將BERT提取的特征映射到更容易分類的空間,使PFMM的輸出與標簽的對應關系更強.相對其他深度學習方法,BERT-PFMM可以更充分理解文本語義信息,自動提取軟件特征,優化詞向量表示;PFMM網絡可以增強特征與模型輸出的關系,以提升軟件缺陷預測的準確性.

具體而言,本文主要工作包括:

1)利用抽象語法樹對源代碼進行解析,進而生成節點向量;

2)引入BERT模型動態獲取節點間的上下文信息,提取出語義特征;

3)提出了PFMM模型,PFMM將BERT提取的特征映射到更容易分類的空間,提升了軟件缺陷預測的效果;

4)對Promise存儲庫的7個項目進行實驗,實驗結果表明,所提出的BERT-PFMM模型與現有的軟件缺陷預測方法相比,具有更好的性能.

1 相關工作

1.1 基于傳統機器學習的軟件缺陷預測方法

早期的軟件缺陷預測研究工作,大多通過建立軟件度量與缺陷之間的關系來構建缺陷預測模型.Okutan等[11]通過貝葉斯網絡來檢驗軟件度量和缺陷傾向之間的關系,研究表明,類響應、代碼行數和源代碼質量是最有效的度量指標;Lee等[12]提出了基于微交互度量的軟件缺陷預測方法,研究表明,微交互度量可以顯著提高缺陷預測的準確性;Arar等[13]采用樸素貝葉斯方法過濾冗余特征,選擇合適的特征;Wang等[14]提出了基于多核集成學習的軟件缺陷預測方法,研究表明,多核集成學習可以更好地表示高維特征空間中的缺陷數據,并通過組裝一系列弱分類器來減少數據不平衡問題.

雖然目前已有多種軟件度量用來衡量軟件特性,但是軟件度量作為一種統計學特征不能很好地反映源代碼的語法和語義,導致軟件缺陷預測的準確性偏低.

1.2 基于深度學習的軟件缺陷預測方法

近年來,深度學習被用于挖掘軟件源代碼中的非線性特征.Wang等[15]利用DBN從源代碼自動提取出語義特征用于缺陷預測,從而提升了軟件缺陷預測性能;Jian等[16]將CNN從源代碼提取出的局部特征與靜態特征相結合,并進行軟件缺陷預測,F1的平均值比基于DBN的模型[15]提高了12%;Phan等[17]為了更好地探究程序的語義特征,嘗試通過卷積神經網絡從程序流程圖中進行學習,提出了基于圖的卷積神經網絡的預測模型;Liang等[18]提出了Seml方法,該方法結合詞嵌入和深度學習進行缺陷預測;Fan等[19]提出了一種基于注意力的遞歸神經網絡方法,該方法利用RNN,從抽象語法樹提取的節點向量中提取語義特征,然后使用注意力機制生成關鍵特征,從而提高軟件缺陷預測模型的性能;Deng等[20]利用LSTM學習源代碼的語義,提取上下文特征,最后使用這些特征來確定軟件模塊是否有缺陷;Zhou等[21]將雙向長短期記憶網絡和樹狀長短期記憶網絡相結合,從源代碼中獲取語義特征進行軟件缺陷預測;Zheng等[22]為了提取出軟件中關鍵的語義和語法特征,提出了一種基于Transformer的軟件缺陷預測方法.

盡管基于深度學習的軟件缺陷預測已有很多研究成果,但現有的基于深度學習的方法需要大量的數據,否則難以訓練出很好的缺陷預測模型,從而影響預測結果的準確性.

2 基于BERT-PFMM的軟件缺陷預測模型

2.1 總體框架

本文總體工作流程如下:

1)預處理:將源碼文件解析為抽象語法樹,再對抽象語法樹進行深度優先遍歷,選取其中具有表征性的節點,生成節點向量,每一個源碼文件生成一個節點向量;

2)特征提?。築ERT模型利用詞嵌入將節點向量進行編碼,并從中提取出具有上下文信息的全局語義特征;

3)特征加強及分類:將BERT模型提取出的全局語義特征輸入PFMM模型,利用PFMM的權重矩陣將輸入的全局語義特征映射到更容易劃分邊界的高維空間,利用分類器進行軟件缺陷預測.

圖1所示為本研究的軟件缺陷預測框架的整體流程圖.

圖1 基于BERT-PFMM的軟件缺陷預測模型框架圖

2.2 抽象語法樹及節點向量的生成

以Java項目作為研究對象,利用Python依賴包Javalang構造Java源代碼的抽象語法樹.

構造好源代碼的抽象語法樹后,使用深度優先遍歷(depth first search,DFS)算法遍歷該抽象語法樹,生成源代碼的節點向量.為降低向量維度,在遍歷抽象語法樹時,只選擇對源代碼有意義的節點,選擇的依據有:1)方法調用和類創建節點,將方法名和類名作為節點表示;2)聲明節點,包括方法聲明、類型聲明、接口聲明、枚舉聲明等;3)控制流節點,如條件控制、循環控制、異??刂频?;4)其他節點:其他重要的節點.所選用的節點如表1所示.

表1 本文選取的AST節點

由于節點向量中的分量命名因不同的程序而有所不同,為了加強不同項目中提取的節點向量間的聯系,按如下方式對每一個分量進行處理并過濾不重要的信息:

1)將字符串組合分量分割成子串.利用正則表達式找到以駝峰命名法或者下劃線構成的組合分量,將其分割成完全小寫的子串.例如toString被分割為[to,string].

2)對子串進行排序,然后使用下劃線拼接構成新的分量.例如[to,string]被拼接為string_to.

3)過濾掉不重要的信息:停用詞及編程中的關鍵字.例如main和args.

本文將所有節點向量所生成的樣本數據長度截斷為256個節點,不足的后面補零.

圖2給出了從源代碼到節點向量的全部流程.

圖2 從源代碼到節點向量的全部流程

2.3 BERT模型

BERT模型主要目的是從輸入文本中提取出特征向量,通過遮蔽語言建模和下一個語句預測2個預訓練任務,獲取詞級和句子級特征.BERT模型是由多層雙向Transformer編碼器構成,能夠學習到詞級、句級及全局的語義信息.圖3為BERT結構圖,其中Trm為Transformer模型名稱縮寫,符號⊕為求和運算符,Ei,Ti分別表示第i個詞的嵌入向量和特征向量,EA表示該詞屬于句子A,Ewi表示第i個詞的詞向量,Epi表示第i個詞的位置編碼向量.

圖3 BERT結構圖[10] 圖4 Transformer編碼器[23]

在軟件缺陷預測任務中,將節點向量作為一個句子輸入到BERT模型中.BERT模型首先將詞序列中的詞進行分詞,在句子開頭添加一個CLS標記用于表示整個句子的語義信息,句子間使用SEP標記進行分隔,以此區分2個句子的句間關系.再將由詞嵌入、片段嵌入和位置編碼嵌入3種方式得到的向量相加,輸入到Transformer編碼器[23]進行特征提取,最終生成包含語義信息的特征.圖4為Transformer編碼器結構圖.

在每個單元中都有自注意力機制和前饋神經網絡,在它們之后還連接著求和與歸一化,其中自注意力機制是編碼器的核心,通過句子中詞與詞之間的關系調整權重系數矩陣,用于學習句子中詞與其他詞之間的關系.由于Transformer不能獲取詞在句子中的位置信息,為解決這個問題,BERT內的所有Transformer均需要增加位置編碼,并與輸入向量相加,從而加入了句子中每個字的相對位置信息.可以說,詞嵌入和片段嵌入是BERT模型引入的,而位置編碼則是Transformer模型自帶的.

相比于其他的語言模型,BERT模型通過引入大量的外部知識信息進行預訓練并從輸入的上下文提取詞的語義信息,最后獲得詞的更加完整的語義信息.

2.4 PFMM網絡結構

為了充分利用BERT提取的語義特征,本研究設計了PFMM網絡結構,將BERT提取的特征利用PFMM的權重矩陣映射到更容易劃分決策邊界的高維空間.

PFMM網絡結構如圖5所示,由3個部分組成:增強層、全局平均池化層和分類層.

圖5 PFMM結構圖

1)增強層:該層如圖6所示,將BERT的輸出向量作為增強層的輸入.首先將輸入數據進行層歸一化(layer normalization),從而防止模型過擬合,然后經過多層感知機(multilayer perceptron,MLP)將特征轉換到更加容易分類的空間,最后使用跳連接[24]來緩解網絡過深導致的梯度消失問題,增強層的變換函數如式(1)所示.

圖6 增強層

U=A+W2σ(W1fLayerNorm(A)).

(1)

式(1)中:U為增強層輸出的結果;A為增強層的輸入;W1,W2為MLP的權重;fLayerNorm為層歸一化,能夠保證數據特征分布的穩定性,加速模型的收斂;σ是一個非線性激活函數GELU(Gaussian error linerar units)[25],如式(2)所示.

σ=fGELU(x)=

(2)

2)全局平均池化層:負責對增強層的輸出進行均值池化,以便進行特征壓縮,保留顯著特征,減少模型參數量,從而降低模型的計算成本.

3)分類層:分類層包含2個部分,第1部分通過全連接神經網絡對全局平均池化層輸出的壓縮特征進行加權求和,第2部分通過softmax函數輸出軟件缺陷預測結果.

3 實驗分析

下面對BERT-PFMM模型進行性能評估,對比模型包括:原BERT模型及最近提出的用于軟件缺陷預測模型.

3.1 實驗環境及實驗數據集

BERT-PFMM網絡采用深度學習框架PyTorch (1.9.0) 實現,其他對比方法主要基于scikit-learn(0.21.2)和Python 3.8實現.所有實驗均在Windows工作站上運行,具體配置為:NVIDIA GeForce RTX 3090 GPU,Intel E5-1620 v2 CPU,32 GiB 內存.

使用的缺陷預測數據集來自 tera-Promise Repository.表2給出了從中選擇的7個項目的詳細信息,包括項目名稱、版本、平均文件數量和平均缺陷率.此外,對比實驗中還采用了Feng等[26]提供的以上7個項目的20個傳統缺陷預測特征.本研究選擇同一項目的2個版本,版本號小的用于訓練模型,版本號大的用于評估.

表2 Java項目信息

3.2 實驗參數設置

本文實驗中,BERT預訓練模型采用“BERT-base,Uncased”模型.該模型總參數量為110×106.使用Adam(adaptive moment estimation)進行模型優化.具體參數設置如表3所示.

表3 參數設置

3.3 基線方法

為了比較上下文語義特征和靜態代碼度量對軟件缺陷預測性能的影響,本文選擇了兩大類共6種對比方法與BERT-PFMM模型進行比較:

隨機森林(random forest,RF):基于20個靜態代碼度量的隨機森林方法.

邏輯回歸(logistic regression,LR):基于20個靜態代碼度量的邏輯回歸方法.

深度森林(deep forest,DF)[27]:基于樹的集成學習方法.

CNN:一種基于文本序列卷積的深度方法,最終利用全連接網絡進行分類.

DBN:使用DBN從源代碼中提取特征,利用全連接網絡進行分類.

BERT:使用BERT的預訓練模型自動提取語義特征,利用全連接網絡完成分類.

其中,BERT,DBN和CNN是深度學習方法,其他為傳統方法.深度神經網絡生成的輸入數據與BERT-PFMM模型生成的輸入數據相同.

3.4 評價指標

采用4個常用的評估指標評估BERT-PFMM模型的性能:精確度(precision,P),召回率(recall,R),F1值(F1-score,F1)和ROC曲線下面積(area under ROC curve,AUC).計算公式如下:

P=NTP/(NTP+NFP);

(3)

R=NTP/(NTP+NFN);

(4)

F1=2PR/(P+R).

(5)

式(3)~式(5)中:NTP為所有預測結果中真正類(true positive)的實例數,即真實類別和預測類別均為正類;NFN為假負類(false negative)的實例數,即真實類別為正類,預測類別為負類;NFP為假正類(false positive)的實例數,即真實類別為負類,預測類別為正類.

精確度P為查準率,P值越高,表明將無缺陷樣本錯誤標記為有缺陷樣本的可能性越小.召回率R為查全率,R值越高,模型標記出的真實缺陷樣本越多.單獨使用P或R很難準確評估模型性能.F1值是為了克服P和R的不足而提出的一種調和平均值,是綜合衡量P和R的一個指標.

AUC表示受試者工作(receiver operating characteristic,ROC)曲線下的面積,適用于評估類不平衡的數據集.為了繪制ROC曲線,首先需要將測試樣例按照預測模型給出的正例概率降序排序;然后逐步改變劃分正例樣本和反例樣本的概率閾值,并計算出真正例率和假正例率,用作ROC曲線上的點.AUC取值范圍為0~1,值越高越好.

3.5 實驗結果

3.5.1 深度學習方法與傳統方法的性能比較

深度學習方法,包括BERT-PFMM,DBN和CNN,統一使用抽象語法樹算法對代碼提取語義信息生成特征數據集.傳統方法利用LR和RF,以及一個新的基于樹的集成學習方法DF,通過對20個手動提取出的靜態代碼度量挑選出有效特征,為了結果的有效性,對不平衡數據集進行了SMOTE過采樣操作.

實驗結果如表4和表5所示,其中包括7個項目名稱、3個深度學習方法、2個傳統方法和深度森林方法的實驗結果.表4的結果數據展示的是F1值,其值越大表明模型的性能越好.表5的結果數據展示的是AUC,其值越大表明模型的分類能力越好;“W/D/L”統計了在7個項目中,本文提出的模型比其他模型有更好、相等及更差性能的項目數.表4和表5中評價指標較高的數值用黑體顯示.

表4 BERT-PFMM與基線模型的性能比較(F1值)

表5 BERT-PFMM與基線模型的性能比較(AUC)

從表4和表5可以看出,在絕大多數情況下深度學習方法優于傳統方法.例如,在Lucene項目上使用BERT-PFMM,DBN,CNN方法后F1值分別為0.842,0.630,0.743.而在Lucene項目上使用LR,RF,DF后F1值只有0.598,0.610,0.655.從實驗數據可以看出,使用深度學習方法提取語義信息之后模型對于判別軟件模塊是否存在缺陷的能力優于傳統方法,具有一定的提升.從表4的最后一行所展示的所有模型在不同數據集上的平均結果也可以看出,深度學習方法比傳統方法具有更高的F1值,對于缺陷預測的性能更好.表5列出了每個項目上的AUC值.在大多數情況下,深度學習方法的AUC值要高于傳統方法.從表5的最后一行展示的7個項目的平均值可以看出,深度學習方法提高了對有缺陷代碼和無缺陷代碼的識別能力.

幾種深度學習方法中,BERT-PFMM方法較DBN和CNN方法具有很大的提升,在平均結果上F1值分別提升了12.4%和10.3%,AUC值分別提升了15.7%和11.6%.說明BERT-PFM方法更具優勢,也表明了使用根據上下文提取語義信息提高了模型識別代碼模塊中潛在缺陷的能力.

3.5.2 BERT-PFMM模型與其他方法比較

從深度學習方法和傳統方法的對比實驗中可以看出,使用深度學習方法更具優勢.BERT-PFMM模型與選用的基線方法相比,分類能力具有顯著提升.

本研究還選用了4個其他方法進行對比,實驗對比結果如表6所示.從表6可以看出,BERT-PFMM方法比其他4種方法具有顯著優勢,例如,Camel項目在使用BERT-PFMM,GH-LSTM,DP-Transformer,Seml,Fences方法后的F1值對應為0.661,0.454,0.526,0.463,0.540,可以看出,BERT-PFMM具有最大值.從不同數據集的平均結果上看,本文提出的方法更具有優勢,相比于其他4個方法而言分別提升了8.5%,6.0%,9.6%和7.9%.從而可以表明BERT-PFMM方法的有效性和優勢.

表6 BERT-PFMM與別的方法的性能比較(F1值)

3.5.3 BERT-PFMM模型與BERT模型性能比較

為了驗證PFMM的有效性,將BERT-PFMM與原始的BERT模型進行對比,實驗結果如表7所示.從整體上看,BERT模型的精確度比BERT-PFMM模型要好,但召回率、F1值和AUC普遍低于BERT-PFMM模型.從不同項目的平均結果來看,BERT-PFMM模型與BERT模型的F1值相比提高了3.0%,AUC相比提高了1.9%.從表7可以看出,BERT-PFMM模型在BERT模型基礎上加入PFMM模塊是有效的.

表7 BERT-PFMMM模型與BERT模型的性能比較(精確度、召回率、F1值和AUC)

4 結 語

為了解決帶標簽樣本缺乏和現有工作未充分利用上下文語義信息的不足,提出了BERT-PFMM模型,以提高軟件缺陷預測的準確率,降低測試成本.BERT-PFMM模型可以將BERT提取的特征利用PFMM的權重矩陣映射到更容易劃分決策邊界的高維空間.使用預先從大量無標簽語料庫訓練好的BERT模型,將訓練后的參數應用到缺陷預測中進行優化,從而緩解數據集缺乏導致訓練不充分的問題.為提取深層上下文語義信息并加以充分利用,在BERT模型上增加了PFMM模塊使其輸出與標簽的對應關系更強.在7個開源項目上的實驗結果表明,BERT-PFMM的F1值與DBN相比平均提高了12.4%,與CNN相比平均提高了10.3%,與最近提出的GH-LSTM方法相比平均提高了8.5%,與BERT模型相比平均提高了3.0%.另外,BERT-PFMM的AUC與DBN相比平均提高了15.7%,與CNN相比平均提高了11.6%,與BERT模型相比平均提高了1.9%.

在今后的研究中,為驗證BERT-PFMM在缺陷預測任務上的通用性,考慮在更多項目及各種編程語言(例如,Python,C++)環境下進行實驗.此外,還可以嘗試將靜態代碼度量結合到BERT-PFMM中,檢測二者結合是否能夠進一步提高軟件缺陷預測的能力.

猜你喜歡
源代碼語義向量
真實場景水下語義分割方法及數據集
向量的分解
基于TXL的源代碼插樁技術研究
聚焦“向量與三角”創新題
語言與語義
基于語法和語義結合的源代碼精確搜索方法
解密別克安全“源代碼”
向量垂直在解析幾何中的應用
“吃+NP”的語義生成機制研究
向量五種“變身” 玩轉圓錐曲線
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合