李 勇,劉戰東,張海軍
(1.新疆師范大學 計算機科學技術學院,新疆 烏魯木齊 830054;2.新疆師范大學 數據安全重點實驗室,新疆 烏魯木齊 830054)
隨著計算機軟件規模和復雜度的日益增加,特別是大型系統對軟件的強烈依賴,軟件在運行過程中一旦失效可能導致嚴重的后果,有時甚至是致命的[1],導致軟件失效的根本原因是系統中存在軟件缺陷。通過軟件缺陷預測技術對軟件系統中可能存在缺陷的模塊及其分布進行預測,可以有效提高軟件測試的效率,對提高軟件系統質量和保證軟件可靠性具有重要意義[2]。
軟件缺陷預測是指基于軟件開發過程中積累的歷史數據構建預測模型,對目標軟件模塊是否存在缺陷、缺陷嚴重程度或缺陷數量的分布等情況進行預測。通常情況下基于目標項目的歷史數據,采用傳統機器學習技術構建的模型可以獲得理想的預測效果[3]。但在軟件缺陷預測實踐應用中,要進行預測的軟件往往是新開發的項目,沒有或只有較少的歷史軟件數據,而且進行數據標注的代價較高。雖然已有大量來自不同組織的軟件缺陷數據集在互聯網上公開,但不同軟件項目間通常存在數據漂移問題,無法采用傳統的學習算法訓練模型[4]。
遷移學習是指可以采用與目標領域相關的數據訓練模型,適用于目標領域沒有歷史積累數據的情況。基于遷移學習技術實現跨項目的軟件缺陷預測是近幾年該領域的研究熱點之一,相關研究人員開展了大量工作,有力地促進了軟件缺陷預測技術的發展。文中對該問題相關的研究文獻進行綜述。首先對相關的知識進行介紹,包括軟件缺陷預測技術和遷移學習技術;然后對已有的研究進展進行分類評述;接著對研究中存在的問題以及未來研究工作進行展望;最后對全文進行總結。
軟件缺陷預測是實證軟件工程方向的一個活躍領域,通過對歷史軟件缺陷數據進行屬性度量后,基于機器學習技術構建軟件缺陷預測模型是目前研究者關注的熱點。基于機器學習構建軟件缺陷預測模型的前提是認為軟件缺陷與軟件內部度量屬性之間存在某種關系,發現這些關系也成為軟件度量發展的一個目標。現有研究文獻在構建缺陷預測模型時使用的度量屬性可以分為代碼規模和復雜度度量、面向對象度量以及開發過程度量等。文獻[5]指出各種常見的度量屬性對于構建軟件缺陷預測模型都是有效的,模型的性能取決于學習算法的選擇。
隨著機器學習技術的發展和應用,傳統監督學習算法如樸素貝葉斯、決策樹、隨機森林、神經網絡和集成算法等都被用來構建預測模型,各種算法在不同的應用環境中均取得了理想的預測性能[6]。也有文獻針對軟件缺陷預測中的特性問題進行深入的研究,如類數據的不平衡性[7]、代價敏感問題[8]和缺陷預測成本有效性[9]等。考慮到軟件歷史數據的標注代價問題,有研究提出了無監督或半監督的模型學習方式,如文獻[10]將采用自適應閾值過濾的方法實現無監督的預測模型構建,文獻[11]提出基于LDS算法的半監督模型構建方法。由于傳統機器學習技術在構建模型時都假設訓練數據與測試數據具有相同的特征空間和數據分布,所以現有研究中對模型的評價通常是基于目標項目數據構建模型,然后采用交叉驗證的方式計算其準確率、召回率、AUC等指標以實現模型的驗證和比較。
然而在軟件工程實踐中,需要進行缺陷預測的往往是新開發項目的軟件模塊,而新開發項目一般沒有或者只有少量的歷史數據無法用于構建預測模型。現在互聯網上已有許多專門用于軟件缺陷預測研究的公開數據集,如創建于2005年的PROMISE軟件工程預測模型數據庫[12],其中的數據集均取自真實的軟件項目。但是每個項目由于其不同的上下文環境導致軟件缺陷數據的特征空間和分布不同,采用傳統機器學習技術直接構建跨項目缺陷預測模型無法獲得理想的預測效果[4]。
根據NIPS在2005年對遷移學習的定義,其目標是從相似但不同的領域直接進行知識的遷移,用于解決傳統機器學習在遇到特征空間和分布變化時需要重新學習模型的問題[13]。由于遷移學習放寬了傳統機器學習在構建模型時要求訓練數據和測試數據獨立同分布的假設,實現了目標領域缺乏訓練數據時的模型構建。近年來,遷移學習技術獲得了廣泛的研究和關注。
在遷移學習中的領域D可以表示為D={χ,P(X)},其中χ為特征空間,P(X)為對應的邊緣概率分布,X={x1,x2,…,xn}∈χ,xi為第i個實例的屬性向量;學習任務表示為T={Y,f(·)},其中Y是標簽空間,f(·)是目標函數。遷移學習的目標是當Ds≠Dt或者Ts≠Tt時,使用Ds和Ts中有用的知識提高目標領域Dt的學習函數泛化性能,其中Ds表示源領域,Dt表示目標領域,Ts和Tt分別表示Ds和Dt對應的學習任務。在采用遷移學習進行模型構建時,Ds中有足夠的標注數據,而Dt中沒有或者只有少量的標注數據。為了實現模型的遷移,可以通過特征遷移和實例遷移的方法實現[14]。基于特征遷移的方法是指通過特征變換的方式使源領域數據與目標領域數據分布最為接近,然后采用傳統的學習算法訓練模型,常見的特征遷移算法有TPLSA[15]、MMDE[16]和TCA[17]等。而實例遷移方法是根據源領域樣例對目標領域的貢獻程度形成新的訓練數據用于目標領域模型的構建,常見的實例遷移算法有TrBagg[18]和TrAdaBoost[19]等算法。
目前遷移學習技術已經被廣泛應用在各種跨領域學習任務中,如文本處理、圖像處理和人工智能規劃等[20]。文中關注的是軟件缺陷預測領域,基于遷移學習的軟件缺陷預測研究目標是解決跨項目軟件缺陷預測模型的領域適應問題。在軟件缺陷預測中,當Ds=Dt且Ts=Tt時,為傳統的機器學習問題。當Ds≠Dt時,表示源項目和目標項目軟件缺陷特征空間不同,如不同的開發上下文環境導致的Xs≠Xt或Ps(X)≠Pt(X)。對于Ts≠Tt,則表示缺陷預測任務不同,常見的軟件缺陷預測任務包括預測模塊是否存在缺陷、缺陷的數量或缺陷的嚴重程度等。在跨項目的軟件缺陷預測中,所關注的是學習任務相同Ts=Tt,但領域特征分布不同,即Ds≠Dt的情況。也就是將從已有標注數據的源項目軟件數據中學習到的知識遷移到與源項目的特征空間和缺陷分布不同的目標項目中實現缺陷的預測。

在軟件工程中,每個項目存在不同的上下文環境,如開發過程、開發者信息和程序語言等因素,導致軟件缺陷數據的特征空間和分布不同,即跨項目的軟件缺陷數據間存在數據漂移問題[22-23]。文獻[4]采用12個軟件項目的622個組合實現跨項目的預測,結果表明只有3.4%的組合可以獲得較為理想的預測結果,進一步驗證了軟件項目間存在數據的漂移問題。因此,在跨項目的軟件缺陷預測中必須對源項目和目標項目數據進行相應的處理才能獲得理想的預測性能。采用遷移學習技術實現跨項目的軟件缺陷預測流程如圖1所示。下面將依據遷移學習的特點將現有研究文獻中提出的方法分為軟件屬性特征遷移和軟件模塊實例遷移兩類進行綜述。

圖1 跨項目的軟件缺陷預測流程
現有研究文獻在構建缺陷預測模型時使用的軟件特征度量屬性可以分為軟件代碼度量屬性和開發過程度量屬性兩類。為了實現跨項目的缺陷預測,有研究者提出了基于特征遷移的跨項目軟件缺陷預測方法。其主要思想是通過對軟件缺陷數據屬性特征進行相應的處理,使得源項目和目標項目在保證各自軟件缺陷數據特性的同時其數據分布最為相似,然后采用傳統的學習算法構建預測模型,實現跨項目的缺陷預測。根據對數據特征的處理方式不同,現有研究文獻中提出的方法可歸納為特征選擇、特征轉換和特征映射三種。
2.2.1 基于特征選擇的遷移方法
基于特征選擇的方法是指找出源項目與目標項目軟件缺陷數據的最小特征子集,該特征子集在保證源項目和目標項目軟件缺陷特性的同時使得數據分布一致,從而實現軟件缺陷預測模型的遷移。文獻[24]在實驗中通過迭代選擇的方式獲得使模型性能穩定的“最優屬性子集”后,采用樸素貝葉斯和邏輯回歸算法構建跨項目的缺陷預測模型,該模型在可接受指標范圍(預測率大于70%)內,實現了模型性能與模型構建成本的平衡。
基于特征選擇的方法適用于源項目和目標項目軟件缺陷數據采用相同的屬性度量體系,但缺陷數據分布不同的情況。其優點是在模型構建中選擇較少的度量屬性,可以有效降低模型的成本。由于該方法實現模型遷移的前提要求源項目和目標項目數據存在潛在的屬性子集,該屬性子集對軟件缺陷數據處理中度量屬性的選擇有指導意義。但該方法在實踐中對源項目數據要求較高,而且由于所獲取的屬性子集對軟件模塊的缺陷特征描述有限,在實踐應用中不一定會獲得理想的性能。
2.2.2 基于特征轉換的遷移方法
基于特征轉換的模型遷移方法是指對源項目或目標項目的軟件缺陷數據屬性特征進行變換,使得跨項目的軟件數據特征分布相似從而實現模型的遷移。在進行特征轉換時,根據不同情況可以只對源項目或目標項目的缺陷數據屬性特征進行轉換,也可以對兩者均進行轉換。
文獻[25]提出采用屬性度量補償的方式實現不同程序語言編寫的跨項目軟件缺陷預測。由于不同項目間的屬性度量值范圍不同,通過補償的方式將源項目和目標項目的屬性度量值調節至相似水平,結果表明可以有效提高預測模型的準確率和召回率。該方法要求源項目和目標項目的軟件規模相似,該文獻在研究中僅使用兩個項目的數據集實驗,說服力相對較弱。而文獻[26]則對源項目和目標項目軟件數據屬性特征均進行對數轉換,使其取值范圍相似,在轉換的同時去除數據中的離群點,結果表明可以在跨項目軟件缺陷預測中獲得較好的預測結果。
基于特征轉換的模型遷移方法適用于源項目和目標項目軟件度量屬性類似,但屬性取值范圍差異較大時的情況。而且在使用該方法的兩篇文獻中均采用相同開發組織的不同項目數據進行實驗,當跨項目軟件缺陷數據分布差異較大時,屬性特征轉換對數據分布的改變有限,因此該方法不適用于源項目和目標項目軟件數據分布差異較大的情況。
2.2.3 基于特征映射的遷移方法
基于特征映射的遷移方法是指將源項目和目標項目的軟件缺陷數據原始特征空間映射到某一潛在特征空間,在該潛在特征空間下,源項目和目標項目的數據分布最為接近,然后基于該潛在空間實現跨項目的軟件缺陷預測模型遷移。該方法與特征選擇和特征轉換方法的區別在于映射得到的是全新的特征空間。
文獻[27]提出基于遷移成分分析TCA+的跨項目軟件缺陷預測模型。TCA是指在保證數據差異的約束條件下獲得源項目和目標項目數據特征的線性映射函數,通過該函數將跨項目數據映射到潛在的特征空間實現模型的遷移。在實驗中為了避免數據屬性取值范圍不同對模型性能的影響,提出TCA+實現自動正規化算法,有效提高了預測模型的性能。文獻[28]將跨項目軟件缺陷預測模型遷移問題形式化為一個半正定矩陣,獲得該半正定規劃問題的解后采用PCA進行降維得到新的潛在特征空間,從而實現模型的遷移。
基于特征映射的遷移方法適用于源項目和目標項目的軟件缺陷數據度量屬性體系不同或差異較大時的情況。該方法的不足是在模型構建中沒有使用軟件缺陷信息,僅使用源項目和目標項目軟件缺陷數據映射后的分布信息,對模型性能的提高有限。
在軟件缺陷預測中,待實現預測的軟件程序單元可以在不同的粒度層次進行屬性度量,如方法度量、類度量、包度量和文件度量等。文中將軟件缺陷數據中的度量程序單元稱為軟件模塊實例。基于實例的跨項目軟件缺陷預測方法是指在軟件模塊實例層對源項目數據進行處理實現模型的遷移。根據對軟件模塊實例的處理方式不同,現有研究文獻中提出的方法可以歸納為實例選擇、實例權值和局部模型三種。
2.3.1 基于實例選擇的遷移方法
基于實例選擇的方法是指根據目標項目軟件模塊實例的特征從源項目中選擇合適的標注實例構成模型數據,實現跨項目的模型遷移。從源項目數據中所選模塊實例的質量決定著最終模型的預測性能。如果所選模塊實例較少則不能充分反映目標項目的缺陷特征,容易導致預測率較低。但如果引入不相關的模塊實例較多時,容易導致模型的誤報率較高。
文獻[29]提出Burak數據選擇方法,對于目標項目中的每個軟件模塊實例使用KNN算法從多個源項目數據中尋找與其最接近的若干模塊實例組成目標項目的訓練數據。在該文獻的實驗中僅使用目標項目軟件模塊實例去引導源項目實例的選擇,而沒有關注源項目中的數據特性。當目標項目數據遠小于源項目數據時,源項目數據可以提供更多的信息,即特征不相似的實例有可能包含對模型訓練有用的信息。針對該問題文獻[30]提出Peters數據選擇方法,采用源項目數據尋找目標項目中與其最近鄰的模塊實例,將所有與目標項目最近鄰的源項目實例構成模型訓練數據,其結果要優于Burak方法,該方法的優點是在項目開發的早期階段當目標項目數據較少時,也可以獲得較好的預測性能。在這兩篇文獻中存在的不足是對于數據的選擇均從源項目或目標項目的每個軟件模塊實例出發,當數據量增大時算法的運行時間呈指數增長,而且沒有考慮數據的整體分布特征。
文獻[31]提出在跨項目缺陷預測時,如果可以充分利用源項目和目標項目之間存在的分布特征相關性,從數據中獲取先驗知識指導源項目數據的選擇可以很大程度提高模型的性能。為此文獻[32]提出根據分布特征從大量源項目數據中獲取目標項目的訓練數據。該文獻在實驗中從項目數據層定義其特征屬性,然后通過聚類的方式尋找多個源項目數據作為訓練集,結果表明可以有效提高模型的預測率。但由于從項目數據層進行數據選擇會引入不相關的軟件模塊實例,所以導致了模型綜合評價指標仍然較低。也有研究者提出采用智能算法從多個源數據中尋找最優數據集的方法,如文獻[33]使用遺傳算法實現最優模型訓練集的選擇,然后采用集成的方式構建模型,有效降低了模型的誤報率。
2.3.2 基于實例權值的遷移方法
基于實例權值的遷移方法是指根據源項目軟件缺陷數據中每個模塊實例對目標模型的作用不同分配權值,然后基于重新分配權值的數據實現模型的遷移,在現有研究文獻中一般采用權值更新的方式。
文獻[34]提出遷移貝葉斯TNB算法用于構建跨項目的軟件缺陷預測模型。首先提取目標項目軟件缺陷數據的分布特征,然后對源項目數據中的每個軟件模塊實例與目標項目數據特征進行比較,基于數據引力方法計算每個實例的權值,采用加權的訓練數據構建模型。該方法的優勢在于使用了源項目中所有軟件模塊的信息,而且只需要計算一次目標項目數據的分布特征,降低了單個實例比較選擇中運算量較大的問題,算法的時間復雜度是與數據量成線性關系。其不足是對目標數據信息考慮較少。類似的還有文獻[35]提出代價敏感的TrAdaBoost算法實現模型遷移,該方法綜合了軟件缺陷數據的類分布不平衡以及不同誤分代價的差異,結合實例遷移TrAdaBoost和代價敏感AdaC2算法實現。其優點是充分考慮到了不同誤分代價,但在應用中代價值只能通過手工設置,不利于實踐操作。
2.3.3 基于局部模型的遷移方法
基于實例選擇和實例權值的遷移方法都是通過對源項目和目標項目軟件模塊實例的處理從而構建最終的全局模型。考慮到軟件系統的復雜性,有研究提出在實現軟件質量模型時,應該基于最小軟件模塊集合學習“專有規則”。基于局部模型的遷移方法是指根據相似性將目標項目軟件數據分為多個簇,對每個簇選擇相應的源項目數據構建局部模型,然后通過多個局部模型實現跨項目的缺陷預測。
文獻[36]采用聚類算法形成源項目和目標項目軟件模塊實例簇,以簇為單位選擇數據并構建局部模型,結果表明通過局部模型實現的預測性能要優于全局模型。文獻[37]也取得了同樣的結果,該文獻從38個軟件項目的92版本數據中實現相似項目的聚類,表明基于相似聚類簇訓練的模型預測率較高于采用目標項目數據的模型。但也有研究者提出雖然局部模型的預測性能要優于全局模型,但多個局部模型性能平均后這種優勢會抵消,仍然建議采用全局模型的方式實現預測[38]。
基于局部模型的跨項目預測方法結合了項目數據分布特征和實例特征,可以較好地反映目標項目的軟件缺陷特征,通過多個局部模型進行預測可以獲得較好的性能。但是該方法在每次進行缺陷預測時都要重新進行源項目和目標項目數據的聚類和局部模型訓練,在實踐應用中代價較高。
基于特征遷移的方法在模型構建中對軟件缺陷信息沒有充分利用導致了模型性能提高有限,而基于實例遷移的方法在進行訓練數據選擇時對模塊實例的數據分布特征考慮不足,容易造成算法運行效率低和模型預測率高但準確率低等問題。在未來的研究中應該將數據特征和實例選擇結合起來,在充分考慮項目數據分布特征的前提下實現軟件模塊實例的選擇,進一步提高最終模型的預測性能。另外如果在模型構建中可以結合目標項目軟件模塊的缺陷預測及修復實現部分數據的標注并有效利用,可以有效地避免現有模型方法容易造成過擬合的問題。
現有研究文獻對跨項目軟件缺陷預測模型的評價都是采用準確率、召回率和F值等傳統的評價指標。文獻[39]提出對于跨項目缺陷預測模型即使較低的準確率對軟件測試和軟件質量保證也能起到有效的作用。在未來的研究中針對軟件缺陷預測實踐中,如何使得模型構建成本與模型性能平衡,或者如何構建符合實踐需求指標的模型直接決定著跨項目的預測模型構建方法和模型的評價,對于該問題需要進一步深入研究。
在實現跨項目數據驅動的軟件缺陷預測中,數據的來源是必須考慮的問題。目前互聯網上已經有許多公開的軟件缺陷數據集用于實驗研究,而且越來越多的研究者在公開自己采集處理后的軟件缺陷數據。面對大量數據如何有效的組織管理并構建統一的軟件缺陷數據共享庫對實現跨項目軟件缺陷數據選擇和模型構建尤為重要。
現有研究中實現跨項目軟件缺陷預測的目的是為了對未知軟件模塊進行是否存在缺陷或者缺陷分布的預測。如果能從已有源項目軟件缺陷數據中學習到具有可解釋、可理解的規則,進行合理的組織選擇并進行可視化后用于指導軟件開發實踐,不但可以更加有效地利用已積累的多源項目數據,而且可以找到提高軟件質量的根本原因,對于軟件工程的實踐具有重要意義。
跨項目軟件缺陷預測研究是目前實證軟件工程領域的前沿方向。利用遷移學習技術實現跨項目的預測可以有效降低模型構建成本,從而提高軟件測試效率和保證軟件質量。文中對已有研究成果中提出的方法進行分類綜述,并指出了其存在的不足和未來的研究方向,為完善跨項目的軟件缺陷預測研究與應用提供了理論基礎和技術參考。