曲豫賓,陳 翔,李 龍
(1. 桂林電子科技大學(xué) 廣西可信軟件重點實驗室,廣西 桂林 541004; 2. 江蘇工程職業(yè)技術(shù)學(xué)院 信息工程學(xué)院,江蘇 南通 226001; 3. 南通大學(xué) 信息科學(xué)技術(shù)學(xué)院,江蘇 南通 226019)
軟件缺陷預(yù)測用于識別軟件開發(fā)過程中的軟件缺陷,軟件開發(fā)過程中產(chǎn)生的歷史數(shù)據(jù)構(gòu)成了軟件缺陷預(yù)測分類器的訓(xùn)練數(shù)據(jù),這些數(shù)據(jù)可以從文件、類等多粒度進行標(biāo)注[1-4]. 基于軟件開發(fā)過程,面向歷史數(shù)據(jù)的度量元用于構(gòu)建分類模型,這些度量元包括基于代碼行數(shù)的度量元、Halstead科學(xué)度量以及McCabe環(huán)路復(fù)雜度等[4]. 傳統(tǒng)的項目內(nèi)缺陷預(yù)測模型主要關(guān)注靜態(tài)度量元,基于度量元進行分類模型構(gòu)建,基于潛在的有缺陷模塊應(yīng)具有相同的統(tǒng)計分布特征. 但在實際軟件開發(fā)過程中,靜態(tài)度量元構(gòu)建的分類器無法預(yù)測具有相同統(tǒng)計特征分布卻不同語義特征的代碼模塊,如JAVA代碼中Queue隊列的add,remove方法的先后順序雖然具有相同的統(tǒng)計分布特征,卻有明顯不同的語義特征. 通過使用自編碼網(wǎng)絡(luò)[5]、卷積神經(jīng)網(wǎng)絡(luò)(CNN)[6]等深度學(xué)習(xí)框架能從源數(shù)據(jù)集中學(xué)習(xí)到語義特征,建立面向語義學(xué)習(xí)的軟件缺陷預(yù)測模型. 在實際訓(xùn)練數(shù)據(jù)集標(biāo)注過程中,擁有不同的數(shù)據(jù)標(biāo)記卻在特征空間中有相同的特征,這種類重疊問題是由標(biāo)注過程中多種因素導(dǎo)致的. 類重疊問題是數(shù)據(jù)挖掘以及機器學(xué)習(xí)中常見的問題,其影響了分類性能. 類重疊的訓(xùn)練樣例模糊了分類邊界,增大了分類難度[7]. 很多應(yīng)用領(lǐng)域都存在類重疊問題,如信用卡欺詐檢測和文本分類領(lǐng)域等. Chen等[8]提出了使用基于k近鄰的方法處理存在類重疊的樣例;文獻[7]提出使用改進的K-means聚類算法清理重疊樣例. 但這些策略都是基于傳統(tǒng)的靜態(tài)度量元進行的,而面向基于語義學(xué)習(xí)的軟件缺陷預(yù)測的類重疊問題研究目前報道較少.
基于此,本文將基于卷積神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)框架應(yīng)用到跨版本軟件缺陷預(yù)測中,提出一種面向跨版本軟件缺陷預(yù)測的深度學(xué)習(xí)框架,從前一個版本的歷史數(shù)據(jù)中根據(jù)抽象語法樹構(gòu)建基于文件級別的特征語義向量;以該語義向量為基礎(chǔ),改進數(shù)據(jù)抽樣策略,融合基于近鄰的樣例清理策略與基于K-means 算法的清理策略,對訓(xùn)練數(shù)據(jù)集進行預(yù)處理,作為Logistic模型分類器的輸入訓(xùn)練分類模型;將下一個版本軟件代碼作為測試數(shù)據(jù)集,用常見的AUC(area under curve)作為分類性能的評價指標(biāo),測試了該清理策略的有效性. 通過對實驗結(jié)果使用Friedman測試與Nemenyi后檢驗進行統(tǒng)計分析,證明該策略能解決類重疊問題,提升了基于深度語義學(xué)習(xí)特征的分類器性能.
針對軟件缺陷預(yù)測過程中未充分使用源代碼語義特征以及訓(xùn)練數(shù)據(jù)集中的類重疊問題,提出一種面向類重疊的跨版本軟件缺陷深度特征學(xué)習(xí)方法CnnSncr,該方法采用混合式最近鄰清理策略處理深度語義特征學(xué)習(xí)過程中的類重疊. 用該方法可自動地從源代碼中學(xué)習(xí)語義和結(jié)構(gòu)特征,為分類器提供基于深度語義學(xué)習(xí)的特征向量. 該方法的整體流程如圖1所示.
圖1 面向類重疊的跨版本軟件缺陷深度特征學(xué)習(xí)方法CnnSncr流程Fig.1 CnnSncr work flow of cross-version software defect deep feature learning method for class overlap
該方法首先從訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集出發(fā),構(gòu)建抽象語法樹用軟件開發(fā)過程中發(fā)布的前一個版本的歷史數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)集,下一個版本的軟件開發(fā)數(shù)據(jù)作為測試數(shù)據(jù)集. 構(gòu)建抽象語法樹過程中,選擇如圖2所示的具有代表性的語法樹節(jié)點[6]表示軟件模塊,每個軟件模塊構(gòu)筑符號向量.
圖2 具有代表性的語法樹節(jié)點Fig.2 Representative syntax tree nodes
符號向量采用one-hot編碼方式進行編碼,先對輸入向量進行詞嵌入,作為卷積神經(jīng)網(wǎng)絡(luò)的輸入,卷積神經(jīng)網(wǎng)絡(luò)再從輸入向量中自動學(xué)習(xí)深度語義特征. 由于標(biāo)注過程中存在噪聲,類重疊不可避免[7-8],因此需對深度語義特征進行預(yù)處理. 由于在軟件缺陷預(yù)測數(shù)據(jù)集中普遍存在類不平衡問題[9-10],因此需對訓(xùn)練數(shù)據(jù)進行過采樣,而過采樣完的數(shù)據(jù)集可能會產(chǎn)生更多的類重疊. 從近鄰出發(fā),對多數(shù)類和少數(shù)類同時進行清理,處理潛在的重疊軟件模塊向量. 將經(jīng)過預(yù)處理的深度語義特征作為傳統(tǒng)分類器,如Logistic回歸分類器的輸入. 在Logistic回歸分類器上訓(xùn)練分類模型,并對測試數(shù)據(jù)集進行測試.
卷積神經(jīng)網(wǎng)絡(luò)具有深度特征提取的能力,基于源代碼使用one-hot編碼后的特征向量具有內(nèi)在的語義和語法結(jié)構(gòu),通過引入卷積神經(jīng)網(wǎng)絡(luò)能創(chuàng)建表征語義信息的新深度特征向量. 考慮到不同的源代碼之間文件大小差異較大,該卷積神經(jīng)網(wǎng)絡(luò)框架既不同于文獻[8]使用的標(biāo)準(zhǔn)卷積神經(jīng)網(wǎng)絡(luò)框架,也未采用在某些理論分析中使用的復(fù)雜學(xué)習(xí)框架[11-12]. 同時該框架與文獻[5]提出的基于深度信念網(wǎng)絡(luò)框架也有較大差異. 基于深度信念網(wǎng)絡(luò)的深度語義學(xué)習(xí)框架采用無監(jiān)督學(xué)習(xí)模式,語義特征學(xué)習(xí)過程中訓(xùn)練數(shù)據(jù)集并未參與梯度下降的優(yōu)化過程. 本文提出的基于卷積神經(jīng)網(wǎng)絡(luò)的語義特征學(xué)習(xí)模型采用有監(jiān)督的深度語義學(xué)習(xí)模式,通過對訓(xùn)練數(shù)據(jù)集的優(yōu)化生成更適合當(dāng)前項目的語義. 文獻[13]提出的采用代碼注釋嵌入的軟件缺陷語義學(xué)習(xí)框架與文獻[8]使用的標(biāo)準(zhǔn)卷積神經(jīng)網(wǎng)絡(luò)框架均采用卷積神經(jīng)網(wǎng)絡(luò),在軟件缺陷預(yù)測相關(guān)研究中取得了較好的效果.
假設(shè)當(dāng)前軟件項目有n個文件數(shù)目:X={x1,x2,…,xn},則軟件缺陷預(yù)測問題可被形式化為學(xué)習(xí)任務(wù),該學(xué)習(xí)任務(wù)從訓(xùn)練數(shù)據(jù)集中學(xué)習(xí)預(yù)測函數(shù)為
F:X→Y,yi∈Y={1,0},
(1)
其中yi∈Y,表示軟件模塊是否含有軟件缺陷. 深度特征語義向量生成總體過程如圖3所示.
圖3 深度特征語義向量生成過程Fig.3 Deep feature semantic vector generation process
將訓(xùn)練過的詞嵌入向量作為卷積神經(jīng)網(wǎng)絡(luò)的輸入. 在輸入方向設(shè)置多個一維卷積核,從詞嵌入向量中提取單詞的特征,并將輸出結(jié)果輸入到池化層. 為對優(yōu)化過程中的參數(shù)進行約束,引入正則化,采用dropout方法在反向傳播誤差更新權(quán)值時隨機刪除部分神經(jīng)元. 對池化層輸出展開為全連接層,多次迭代訓(xùn)練得到語義特征向量. 訓(xùn)練過程中采用小批量梯度下降算法[15],選用Adam優(yōu)化器[16]. 基于該語義特征向量判斷當(dāng)前模塊是否存在缺陷.
基于卷積神經(jīng)網(wǎng)絡(luò)的深度語義學(xué)習(xí)模型,能從軟件開發(fā)過程中的源代碼學(xué)習(xí)到語義特征. 軟件缺陷模塊標(biāo)注存在特征相同但標(biāo)記不同的情況,稱為類重疊[7-8],類重疊問題也存在于文本分類[17]等領(lǐng)域. 文獻[7-8]針對軟件缺陷預(yù)測研究了類重疊問題對跨項目軟件缺陷預(yù)測等的性能,提出了用NCL(neighborhood cleaning learning)和IKMCCA(improvedK-means clustering cleaning approach)策略緩解該問題. 但這些策略并未針對深度語義特征中存在的類重疊問題進行研究,同時對普遍存在的類不平衡問題也僅使用了消除潛在缺陷模塊類的方式獲取數(shù)據(jù)集的平衡. 基于此,本文提出使用混合式的策略SNCR(special neighborhood cleaning rule)解決類重疊問題. 該策略的偽代碼如下.
算法1混合式最近鄰策略(SNCR).
步驟1) 輸入: 訓(xùn)練數(shù)據(jù)集T={Cmax,Cmin},其中Cmax屬于多數(shù)類,Cmin屬于少數(shù)類,d表示有缺陷模塊與所有模塊數(shù)目的比值;
輸出: 清理完成的數(shù)據(jù)集T′={C?max,C?min};
步驟2) 遍歷Cmin集合中的每個樣例;
步驟3) 利用歐氏距離選擇k最近鄰;
步驟4) 選擇樣例xi(nn),生成隨機數(shù)δ∈{0,1};
步驟5) 利用當(dāng)前樣例與xi(nn)生成新樣例xi1=xi+δ(xi(nn)-xi);
步驟8) 根據(jù)預(yù)定義的歐氏距離計算與當(dāng)前樣例最近的Nx個樣例;
步驟9) 如果Nx中任意一個樣例包含于集合Cmax,則刪除該樣例;
步驟14) 使用標(biāo)準(zhǔn)K-means算法將數(shù)據(jù)集分為k簇;
步驟15) 循環(huán)遍歷每個簇;
步驟17) 如果當(dāng)前比值 ?′>?,則刪除當(dāng)前簇中少數(shù)類;
步驟18) 如果當(dāng)前比值 ?′,則刪除當(dāng)前簇中多數(shù)類;
步驟19) 合并所有簇中的剩余樣例為新的輸出集合T′.
該策略以生成的深度語義特征向量集合為輸入,根據(jù)集合中標(biāo)記的不同,將樣例分為Cmax和Cmin兩類,算法過程主要分為如下三步:
1) 對少數(shù)類樣例循環(huán)遍歷,根據(jù)歐氏距離選擇k個最近鄰,并使用隨機種子數(shù)在某個樣例與最近鄰之間生成新的樣例,迭代完成過采樣,實現(xiàn)多數(shù)類與少數(shù)類之間的平衡,解決類不平衡問題;
本文提出SNCR策略的目的是由于軟件缺陷深度語義數(shù)據(jù)集包含大量數(shù)據(jù),并且類重疊的問題不可避免,僅對多數(shù)類別進行欠采樣解決類別不平衡問題是不合理的. 首先利用過采樣使不同類型直接達到數(shù)據(jù)平衡. 同時,過采樣也可能導(dǎo)致更多的類重疊. 此時,對當(dāng)前多數(shù)類和少數(shù)類執(zhí)行最近鄰居學(xué)習(xí),并消除潛在的類重疊實例. 由于深度語義數(shù)據(jù)量相對較大,因此除使用上述最近鄰方法查找潛在的類重疊實例外,還可以通過引入標(biāo)準(zhǔn)K-means算法分析當(dāng)前數(shù)據(jù)集. 對數(shù)據(jù)集執(zhí)行聚類分析,并刪除每個集群中的異常實例.
本文實驗在至強E5-2670的CPU與16 GB內(nèi)存的工作站上完成,同時在NVIDIA GeForce RTX 2070的GPU上訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)并進行分析處理. 實驗中使用的相關(guān)分類器來源于scikit-learn,深度神經(jīng)網(wǎng)絡(luò)庫采用TensorFlow 2.0穩(wěn)定版本. 卷積神經(jīng)網(wǎng)絡(luò)的輸入向量維數(shù)為93維,經(jīng)過詞嵌入后輸出為20維. 源數(shù)據(jù)集作為訓(xùn)練數(shù)據(jù)時,對數(shù)據(jù)集進行了隨機分層抽樣,共訓(xùn)練1 000個批次,每個批次的樣例數(shù)目為1 024個.
實驗采用的軟件缺陷預(yù)測數(shù)據(jù)集來源于PROMISE數(shù)據(jù)庫(http://openscience.us/repo/defect),該數(shù)據(jù)集為公開的數(shù)據(jù)集,廣泛應(yīng)用于軟件缺陷預(yù)測中. 選擇該數(shù)據(jù)集中7個開源的JAVA軟件項目進行實驗,因為每個軟件項目的版本號、類名稱、相關(guān)標(biāo)記都是確定的,與類名稱相對應(yīng)的源代碼從GitHub上下載并進行分析處理. 實驗中所用7個項目的項目描述、版本號、缺陷模塊比例等信息列于表1. 為獲取項目中需用的訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集,參考文獻[18]方法,將前一個版本的源代碼作為訓(xùn)練數(shù)據(jù)集,將下一個相鄰版本的源代碼作為測試數(shù)據(jù)集. 本文實驗中未使用傳統(tǒng)基于統(tǒng)計的軟件缺陷特征.
表1 實驗所用數(shù)據(jù)集中項目信息
圖4 不同策略使用AUC指標(biāo)對比的小提琴圖Fig.4 Comparison of violin plot of AUC index for different strategies
基于軟件缺陷預(yù)測數(shù)據(jù)集中常見的類不平衡問題,選擇AUC作為分類器性能的評價指標(biāo). AUC定義為ROC曲線與坐標(biāo)軸所包圍的區(qū)域,最大值不能超過1,AUC值越接近1,則分類器檢測的真實性越高; 反之,當(dāng)AUC接近最小值0.5時,則沒有應(yīng)用價值. 本文首先使用Friedman測試確定不同數(shù)據(jù)處理策略之間是否存在統(tǒng)計學(xué)上的顯著差異,如果存在統(tǒng)計學(xué)上的顯著差異,則應(yīng)用post-hoc Nemenyi測試比較差異.
為比較類重疊對基于深度語義的軟件缺陷預(yù)測分類性能的影響,將SNCR策略與IKMCCA策略以及NCR策略的性能進行對比. 為使實驗結(jié)果更具說服力,將以上3種數(shù)據(jù)預(yù)處理策略與無數(shù)據(jù)預(yù)處理的情況進行比較,該策略被記為noclean策略.
使用IKMCCA和SNCR策略時,算法中的超參數(shù)值p%被設(shè)定為少數(shù)類與多數(shù)類之比. 不同數(shù)據(jù)處理策略的性能對比小提琴圖如圖4所示. 由圖4可見,使用SNCR策略可獲得Logistic回歸模型分類器上AUC度量的最佳中值,即與noclean策略相比,清洗策略解決類重疊問題性能更優(yōu);與IKMCCA和NCR策略相比,SNCR策略在7個開源項目組成的數(shù)據(jù)集上性能更好.
評價指標(biāo)的圖形顯示不能量化表明不同策略的直接差異,同時,為基于統(tǒng)計學(xué)比較差異訓(xùn)練數(shù)據(jù)集上不同策略的性能,使用置信度為95%的非參數(shù)Friedman測試對實驗結(jié)果進行統(tǒng)計分析. 假設(shè):
(H0) 基于深度學(xué)習(xí)學(xué)出的語義特征,不同針對類重疊問題的數(shù)據(jù)預(yù)處理方法不存在性能差異;
(H1) 基于深度學(xué)習(xí)學(xué)出的語義特征,不同針對類重疊問題的數(shù)據(jù)預(yù)處理方法存在性能差異.
設(shè)顯著性水平α=0.05,計算結(jié)果表明,計算值小于臨界值,因此條件(H0)不成立,從而這4種策略間存在統(tǒng)計差異. 為揭示不同策略間的差異,進一步采用post-hoc Nemenyi測試分析方法,使用4種數(shù)據(jù)處理策略的AUC指標(biāo)結(jié)果列于表2.
表2 4種不同策略的AUC指標(biāo)計算結(jié)果
綜上所述,類重疊問題的結(jié)果是語義特征向量在特征空間中重疊,這種模糊性削弱了分類器的邊界,并導(dǎo)致分類器性能下降. 因此,以解決深度語義特征學(xué)習(xí)和清除噪聲為目標(biāo),本文提出了一種SNCR策略,并通過實驗證實了該策略解決類重疊問題可有效提高分類器的性能. 在PROMISE公開數(shù)據(jù)集上進行測試的結(jié)果表明,采用混合式最近鄰清理策略能處理類不平衡問題與類重疊問題. 對數(shù)據(jù)的統(tǒng)計分析結(jié)果表明,該策略能提升基于深度語義學(xué)習(xí)的軟件缺陷預(yù)測性能,AUC指標(biāo)最多在中值上提升14.8%. 軟件質(zhì)量保障問題包括:軟件缺陷中的語義學(xué)習(xí)問題[18]、跨項目軟件缺陷預(yù)測問題[19]、軟件缺陷分析算法[20]、隨機測試方法[21]、惡意軟件分類[22]、基于機器學(xué)習(xí)的項目缺陷預(yù)測方法[23-24]等,其中基于機器學(xué)習(xí)的方法需要高質(zhì)量的數(shù)據(jù)樣例,在訓(xùn)練數(shù)據(jù)集中應(yīng)該存在盡可能少的數(shù)據(jù)噪聲,采用本文提出的SNCR策略,能構(gòu)建更高質(zhì)量的訓(xùn)練數(shù)據(jù)集,提升模型的準(zhǔn)確度.