席圣渠,徐鋒,陳鑫,李宣東
1. 南京大學計算機科學與技術系,江蘇 南京 210023;2. 計算機軟件新技術國家重點實驗室(南京大學),江蘇 南京 210023
在軟件開發過程中,軟件測試與缺陷修復往往會占據軟件總開發成本的三分之一以上[1]。為了更有效地管理缺陷,軟件項目中普遍使用缺陷報告進行系統的記錄和追蹤。當缺陷報告被確認為新缺陷時,項目管理者首先會進行缺陷報告預檢(以下簡稱缺陷預檢),對缺陷報告進行預評估,以確定缺陷的優先等級、委派相關責任開發者進行修復,并在責任開發者無法按時完成修復時委派新的責任開發者,即缺陷再分派。缺陷預檢位于缺陷報告生命周期的起點,良好的缺陷預檢能極大地提高軟件維護的效率與質量,是保障軟件可信性的關鍵環節。
傳統意義上,缺陷預檢由項目管理者人工完成。然而,隨著軟件項目的不斷擴大,缺陷的數量與日俱增,繁雜而耗時的缺陷預檢給管理者帶來了很大負擔。對于快速發展,數量、種類、涵蓋范圍不斷增大的開源軟件項目而言,此類問題更是如此。由于開源項目開發者自由加入、流動性大、組織松散等特點,開源項目往往存在缺陷數量多、預檢不及時、分派難度大等問題。據統計,截至2009年8月,開源項目Eclipse已收錄超過25萬份缺陷報告,開源項目Mozilla已收錄超過50萬份缺陷報告。平均而言,前者平均每天收到120份新缺陷報告,后者則有170份之多[2]。此外,提交到Eclipse項目的新缺陷報告平均需要16.7天才會得到項目管理團隊的首次操作[3]。由此可見,在開源項目中,由于缺陷數量眾多、組織管理松散、開發者自由加入且水平高低不一的特點,缺陷預檢容易出現繁雜性、困難性、滯后性,因而需要自動化、智能化的方法輔助開源項目管理者進行缺陷預檢,以保障開源軟件的可信性,進而促進開源軟件生態的良性發展。
另外,經過數十年積累,開源軟件生態已經儲備了大量與軟件開發相關的數據,尤其是高質量的已修復缺陷報告,為自動化、智能化缺陷預檢提供了先決條件。可通過數據挖掘、信息檢索等方法,從大規模的已修復缺陷報告中學習相關的缺陷預檢經驗知識,用于輔助解決開源項目缺陷數量多、預檢不及時、分派難度大的問題,從而提高開源項目軟件維護的效率與質量,進而保障開源軟件的可信性。軟件項目從業者(管理者、開發者、測試者)普遍認可自動缺陷報告管理技術的積極作用[4]。具體到缺陷預檢技術,可以利用已修復缺陷報告數據設計并訓練相應機器學習模型,用于缺陷報告的優先級分類、為缺陷報告分派責任開發者,并在責任開發者無法及時完成修復任務時,推薦新的責任開發者。
上述基于軟件大數據的智能化缺陷預檢技術已成為當前的研究熱點[3-31],然而,當前研究的主要關注點在于如何利用新的機器學習模型與方法、特征提取技術,或尋求更多的數據特征,以取得在測試數據集上的準確率的提升。當前技術較少考慮開源項目的特點,難以滿足開源項目缺陷預檢的需求。
為此,本文首先根據開源項目的特點,歸納了缺陷預檢的3個關鍵任務及其挑戰,并提出一套完整的自動化缺陷預檢框架與技術。
軟件缺陷管理一直是軟件維護實踐中的重要內容,也是軟件工程研究的重點問題。從工業界和學術界的普遍認知來看,缺陷預檢是缺陷報告生命周期(如圖1所示)的開端和重要環節,缺陷預檢包含以下3個較為關鍵的任務。
● 缺陷優先級分類:用于確定缺陷修復的優先次序,對應“新缺陷”向“已分派缺陷”轉換的過程,人工進行缺陷優先級分類往往要求缺陷報告管理者具有豐富的經驗和對軟件項目當前目標的充分理解,而錯誤的優先級分類將導致項目團隊資源利用率的低下[5]。
● 缺陷分派:用于確定新缺陷報告的責任開發者,對應的缺陷報告將被標記為“已分派缺陷”,人工進行缺陷分派往往要求缺陷報告管理者逐條閱讀缺陷報告,并將其與合適的開發者匹配,而錯誤的缺陷分派會導致缺陷再分派,進而延誤缺陷修復進程[3]。

圖1 缺陷報告生命周期
● 缺陷再分派:當責任開發者無法修復缺陷時,選擇新的責任開發者。對于已分派缺陷、歸檔缺陷,由于責任開發者能力不足、無法及時處理等原因,需要進行缺陷再分派。不及時的缺陷再分派會影響缺陷修復效率,而開源項目中有接近40%的缺陷報告需要至少一次再分派[3]。
開源項目組織管理松散、開發者可自由加入且水平高低不一等特點使得缺陷預檢中上述3個關鍵任務的自動化面臨挑戰,具體如下。
● 缺陷優先級分類方面。開源項目管理松散,缺乏專職的缺陷管理者,這使得開源項目中存在大量未分類的缺陷報告(其優先級為默認優先級),導致從開源項目中獲得的訓練數據的優先級分布很不均衡,即默認優先級缺陷報告數量巨大,而其他優先級類別的缺陷報告數量較少。若將其簡單建模為分類問題,則容易出現默認優先級分類預測準確率較高,而真正影響項目團隊資源分配的邊沿優先級(edge priority),即較低或較高優先級的分類預測準確率低下的情況。因此,如何利用開源項目中的分類標簽不平衡且存在大量噪聲的訓練數據來提高邊沿優先級的預測準確率,成為缺陷優先級分類任務面臨的主要挑戰。
● 缺陷分派方面。由于開源項目開發者可自由加入,大量開發者利用業余時間加入開源項目,不同開發者的參與意愿強弱存在差異,表現為投入項目的時間長短不一,活躍程度也有差別。若簡單地推薦能力與缺陷描述相近的開發者,容易出現開發者失效,即開發者長時間無響應,甚至開發者已經離開項目的情況,嚴重時可影響缺陷修復流程[6],降低缺陷分派準確率;相反,在存在多名能力相近的開發者時,選擇參與意愿強、活躍程度高的開發者更符合現實場景需求。因此,如何動態地建模和評估開發者的參與意愿,并在能力相近的開發者中優先推薦活躍程度高的開發者,以降低失效風險、提高缺陷分派準確率,成為缺陷分派任務面臨的主要挑戰。
● 缺陷再分派方面。由于開源項目開發者水平高低不一,當開發者因能力不足等原因無法修復缺陷時,往往需要尋找經驗更豐富且原有責任開發者信賴的開發者,以完成缺陷的修復。若將問題簡化為缺陷分派,則缺乏對原有責任開發者無法修復缺陷這一反饋信息的利用,會降低缺陷再分派的準確率。另外,用作訓練的已修復缺陷報告中往往包含大量缺陷傳遞序列,即責任開發者變更的歷史記錄,其中隱含著開發者之間經驗與信賴的偏序關系,其為反饋信息的利用提供了可參照的經驗規律。因此,如何充分使用缺陷傳遞序列、挖掘其中隱含的開發者之間的經驗與信賴關系,以利用無法修復的反饋信息來提升缺陷再分派的準確率,成為缺陷再分派任務面臨的主要挑戰。
缺陷預檢領域存在大量缺陷優先級分類[7-15]、缺陷分派[16-27]的研究工作,以及源于或服務于工業界的文獻資料[2,21]。這些工作普遍基于缺陷報告文本信息,采用機器學習方法構建分類問題,或采用信息檢索方法構建相似度模型。而對于開源項目中較為突出的缺陷再分派問題,相關研究工作較少。因此,本節將主要介紹前兩者的研究思路與進展,并討論其在應對開源項目預檢任務面臨的挑戰時存在的不足。
參考文獻[7]最早提及缺陷報告優先級分類,采用監督與無監督混合的方法將相似缺陷報告聚類,并認為同一個聚類內的缺陷報告描述相似或相同的問題,因而應當具有相同的優先級;作者在特征選取、聚類方法、可視化等方面做了較為深入的研究,然而該方法未對缺陷報告優先級做出明確判斷,較難進行實際應用。
隨后,Kanwal J等人[8]提出基于支持向量機(support vector machine,SVM)的分類方法,目標是為新缺陷報告分配一個優先級級別,優先級高的缺陷報告將更受項目組重視,并更快被修復。該方法將精度(precision)和召回率(recall)作為評估指標,并通過實驗驗證了方法的有效性。Tian Y等人[9]深入研究了多種可能影響優先級分類的因素,以選取更有效的訓練特征,并采用線性回歸和閾值截斷的方法訓練分類模型,以緩解訓練數據不平衡的問題。Umer Q等人[10]進一步研究了情感分析在缺陷優先級分類中的作用,采用支持向量機模型,將缺陷報告情感特征作為輸入,以提升優先級分類的準確率。其后,Umer Q等人[11]進一步研究了分類器的影響,采用基于深度學習的分類模型,用卷積神經網絡(convolutional neural network,CNN)抽取文本特征,并融合情感特征,共同預測缺陷優先級。然而,這些工作仍存在邊沿優先級預測準確率低的問題,難以應用于實際軟件的開發過程,需要進一步研究優化改進的相關技術。
另外,區別于以上預測明確優先等級的工作,Valdivia-Garcia H等人[12]關注檢測阻塞缺陷,此類缺陷會影響其他缺陷的修復,因而具有很高的修復優先級。作者基于6個大型開源項目數據,總結出了與阻塞缺陷關聯較為密切的14個因素,并以此建立了決策樹,以辨別阻塞缺陷。Jiang Y等人[13]則將缺陷報告按嚴重程度分為2類,并采用排序學習(learning to rank)過濾掉部分嚴重程度低的缺陷報告,以建立更有效的數據集,最終采用監督學習進行訓練和預測。Yang X L等人[14]關注高影響力缺陷報告的識別,結合非均衡學習策略(imbalanced learning strategies),緩解數據不均衡的問題。Ren H等人[15]則對阻塞缺陷進行了實證研究,從修復時間、開發者經驗等5個方面開展調研,結果表明,阻塞缺陷的修復往往更加耗時耗力,應當具有更高的修復優先級。然而,此類工作往往將缺陷報告簡化為二分類問題,缺乏對缺陷優先級的完整辨別與評估,降低了優先級分類的精確性。
綜上所述,相關工作或者邊沿優先級預測準確率低,難以應用于實際的開源軟件項目開發過程;或者將缺陷報告簡化為二分類問題,降低了優先級分類的精度,難以為開源項目的缺陷修復決策提供明確的信息。
缺陷分派問題最早由Cubranic D等人[16]提出,作者將問題建模為文本分類(開發者被視為類別)任務,輸入為缺陷報告文本,輸出為缺陷報告的候選責任開發者;利用標記數據訓練樸素貝葉斯模型,在開源項目數據集上驗證了方法的有效性。隨后,Anvik J等人[17]針對開源項目中的缺陷分派問題做了系統性的調研,并在樸素貝葉斯模型的基礎上,使用支持向量機、決策樹等方法來解決此類問題,結果顯示支持向量機的方法取得了最好的效果。由于開源項目具有開發周期長、開發者流動性大的特點,Tamrawi A等人[18]提出了基于模糊集的方法——Bugzie方法,通過過濾不活躍的開發者來提高預測準確率;然而,過濾篩選的方式過于簡單,無法刻畫開發者活躍程度的差異。
在文本信息之外,研究者也嘗試結合缺陷報告隸屬的產品、模塊等元數據信息。Yang G等人[19]首先使用主題模型抽取缺陷報告文本的特征,隨后在元數據一致的限制下查找相似缺陷報告,最后基于這些相似缺陷報告,推薦責任開發者。Xia X等人[20]則將元數據作為監督信息,設計全新的主題模型結構,以獲得更好的文本特征表示,并以此對開發者能力特征進行建模,基于新缺陷報告與開發者能力特征的匹配程度來推薦責任開發者。然而,雖然主題模型(如LDA[32-33])在自然語言處理方面得到了廣泛應用,但仍存在無法對詞序關系進行建模等問題,在文本內容理解上仍有提升空間。
近期,隨著深度學習方法在自然語言處理領域的廣泛應用,也出現了基于深度學習的缺陷分派研究。Lee S R等人[21]使用卷積神經網絡建模缺陷報告文本,并在多個工業界項目上驗證了方法的有效性。Mani S等人[22]則使用基于注意力機制的雙向循環神經網絡建模缺陷報告文本,以求準確率的提升。然而,這些方法大部分局限于缺陷報告文本,未能充分使用缺陷報告蘊含的多種信息。
研究者也嘗試融入代碼、相似缺陷報告、修復記錄等信息,進一步提升缺陷分派準確率。Alkhazi B等人[23]結合代碼相似度,認為編寫過缺陷相關代碼的開發者更適合修復缺陷。Zhang T等人[24]發現較短的缺陷報告不利于分派,故通過查找相似缺陷報告的方式拓展缺陷報告文本,并在此基礎上推薦責任開發者。Sun X B等人[25]關注安全缺陷,并對開發者的安全缺陷修復經驗進行建模,針對嚴重的安全缺陷,推薦經驗豐富的開發者。Yadav A等人[26]對開發者修復效率進行建模,并采用相似度的方式篩選責任開發者。Guo S等人[27]則關注開發者的修復歷史,優先選取近期有相似修復經驗的開發者。然而,這些方法普遍采用較簡單的語言模型,難以精確刻畫缺陷報告的文本特征。
綜上所述,相關工作存在信息使用不充分、文本建模較簡單的問題,導致開發者能力刻畫不全面、匹配缺陷相關開發者效果較差,且缺乏對開源項目中開發者活躍度的差異化區分,難以在能力相近的開發者中識別最活躍的開發者。
缺陷再分派方面的研究工作最近才被人們重視,相關研究工作較少,較為相似的工作如下所述。
Jeong G等人[3]整合缺陷再分派過程中責任開發者傳遞、變更的有向圖,并以此為依據,調整缺陷分派結果,提高傳遞圖上位于終點的開發者的排名,以此優化缺陷分派效果。Bhattacharya P等人[28]則在Jeong G等人[3]的基礎上進一步優化,通過分析包含元數據的傳遞圖,進一步優化缺陷分派效果。Wu H R等人[29]對缺陷傳遞序列的長度進行了研究,發現產品、模塊等4項屬性對缺陷傳遞序列的長度有顯著影響。然而,這些工作仍停留在對缺陷分派問題的優化層面,缺乏對缺陷再分派任務的關注。
Xia X等人[30]則研究了復發缺陷的成因,并提出了基于集成學習的復發缺陷預測方法。然而,該方法仍只關注復發缺陷的預測,缺乏復發缺陷可能存在的責任開發者變更的解決方法。Mi Q等人[31]發現,復發缺陷中存在部分不影響用戶體驗的非負面(non-negative)缺陷,此類缺陷普遍較容易修復,且不需要變更責任開發者。然而,這些工作更關注調研、分析層面,缺乏具體的應對缺陷再分派任務的方法。
綜上所述,缺陷再分派方面的研究工作較少,難以簡單采用缺陷分派技術應對開源項目中存在的大量缺陷再分派問題。
為了系統地解決開源軟件項目缺陷預檢中存在的3個關鍵任務,本文提出了一個基于大數據資源的缺陷報告智能預檢技術框架,如圖2所示。框架以開源項目缺陷追蹤系統中海量已修復缺陷報告的大數據資源為數據支撐。針對新缺陷,提出基于半監督學習的缺陷優先級分類方法、基于開發者活躍度的缺陷分派方法,分別預測缺陷報告的優先級和責任開發者;針對已分派缺陷或復發缺陷,提出基于開發者信賴關系的缺陷再分派方法,預測新的責任開發者。框架主要包括以下幾種方法。
● 基于半監督學習的缺陷優先級分類方法:由于開源項目組織管理松散,容易出現優先級未分類的情況,導致默認優先級P3中混雜了更高、更低優先級的數據,可信性不足。另外,由于P3數據中存在大量真實優先級標簽,全部丟棄也將影響訓練結果。假設P3中的數據符合以P3為均值的正態分布,結合其文本對標簽進行擬合,擾動得到P3數據的可能的優先級分布;將擾動后的數據作為訓練數據,在犧牲部分P3準確率的代價下,提升邊沿優先級的準確率。因此,為了充分利用已有數據,使用半監督學習的方法來提升缺陷邊沿優先級的分類準確率。
● 基于開發者活躍度的缺陷分派方法:由于開源項目開發周期長、開發者自由加入,開發者存在數量巨大、人員流動頻繁、活躍周期不固定的特點,優先推薦活躍程度高的開發者有利于又快又好地修復缺陷。為評估當前開發者的活躍程度,可以參照開發者在缺陷追蹤系統中的活動記錄,評估與缺陷報告相關度較高的開發者,當前時刻附近活動記錄越多的開發者越活躍,距離當前時刻越近的活動對活躍程度的影響越大。因此,結合開發者的活動記錄,對開發者活躍程度進行度量評估,以提升缺陷分派的準確率。
● 基于開發者信賴關系的缺陷再分派方法:由于開源項目的開發者水平高低不一,責任開發者無法完成修復時,往往要求助于能力更強且自身信賴的開發者。為了充分利用責任開發者無法完成修復這一反饋信息,可參照缺陷傳遞序列,對開發者之間的信賴關系進行建模,靠近序列末尾的開發者往往具有更加豐富的經驗,且更受其他開發者信賴。另外,缺陷的提交者也可能是開發者,將提交者納入信賴關系的建模有助于提高建模準確性。因此,為充分利用反饋信息,需結合缺陷傳遞序列,對開發者信賴關系進行建模,以提升缺陷再分派的準確率。

圖2 缺陷報告智能預檢技術框架
后文將依次對上述3個方法與技術進行具體介紹。
缺陷優先級分類的目標是預測新缺陷報告的優先等級。由于開源項目管理松散,存在大量默認優先級的缺陷報告,數據分布很不均衡[9],導致相關工作普遍出現分類失衡的狀況[9-10]。因此,采用半監督學習的方法將默認優先級數據視為無標簽或標簽可信性不高的數據,在盡可能犧牲少量默認優先級精度的情況下,換取邊沿優先級的準確性。為此,筆者提出了一個基于生成對抗網絡[34-35]的半監督學習方法——BrCCGAN來解決上述問題。
該方法的主要思想是:給定缺陷報告br,需訓練評分函數S(br)=prior∈{P1, P2,P3, P4, P5}。其中,邊沿優先級P1、P2、P4、P5更重要;P3為默認優先級,其標簽可信性不高[36]。因此,通過擾動默認優先級P3的標簽,擬合出符合文本的P3數據的標簽分布,以損失部分P3分類準確率為代價,提高邊沿優先級的分類準確率。
基于半監督學習的缺陷優先級分類方法的工作流程如圖3所示。具體而言:①將缺陷報告br和優先級prior視為完整的數據對
,優先級準確的數據對具有較高的融洽度,而優先級不準確的數據對融洽度較低;②生成器通過符合高斯分布的隨機擾動z來變更數據對中的優先級,產生虛假的優先級prior’;③判別器檢驗缺陷報告br與真實優先級prior或虛假優先級prior’的融洽度;④當生成器與判別器互相博弈,達到穩定收斂狀態時,固定其內部缺陷報告br的特征抽取網絡,并用此網絡抽取的特征單獨訓練分類模型,即最終的評分函數S。
此方法中生成器、判別器相互博弈的過程可表示為:

其中,G表示生成器,其輸入為缺陷報告br和符合高斯分布的隨機擾動z,輸出為虛假的優先級prior’;D表示判別器,其輸入為缺陷報告br與優先級組成的數據對,優先級可能為真實優先級prior或虛假優先級prior’;Objective表示目標函數,E表示數學期望,訓練過程需依次最小化生成器G的損失、最大化判別器D的損失,以達到兩者相互博弈的目的。
整個模型包含訓練、預測兩個部分。訓練部分,將由優先級確定的缺陷報告大數據作為輸入,此過程的主要目標為訓練生成器G和判別器D,為了降低參數規模,將兩者缺陷報告特征抽取網絡的參數共享,以簡化訓練過程、降低訓練開銷。預測部分,使用缺陷報告特征抽取網絡抽取新缺陷報告的特征向量,并使用獨立的優先級分類模型預測優先級prior。

圖3 基于半監督學習的缺陷優先級分類方法的工作流程
筆者基于CCGAN[34]實現了上述優先級分類方法BrCCGAN,主要改進在于選擇了更合理的文本特征抽取方法,并優化了整個生成對抗網絡的結構。
為了驗證方法的有效性,選取開源項目Eclipse作為實驗對象,共收集166 081份缺陷報告,按7:1:2的比率將其分割為訓練集、驗證集和測試集;選取基于線性回歸和閾值截斷的DRONE[9]、基于雙向循環神經網絡的BiRNN[10]、基于卷積神經網絡和情感分析的CPur[11]作為對比方法;選取精度和召回率作為評估指標。

表1 基于半監督學習的缺陷優先級預測方法的精度與召回率
基于半監督學習的缺陷優先級分類方法BrCCGAN的實驗結果見表1,橫向為不同優先級下的精度與召回率,縱向為選取的對比方法。實驗結果顯示,較同類工作,BrCCGAN的P3優先級預測準確率稍有下降,但邊沿優先級的預測準確率有顯著提升,表明本文所提優先級分類方法具有較強的實用價值。
缺陷分派的目標是推薦責任開發者。開源項目容易出現推薦的責任開發者失效的情況。另外,當前較為活躍的開發者往往愿意為項目貢獻更多的力量。因此,筆者提出了一個基于循環神經網絡的開發者活躍度建模方法DeepTriage來進行缺陷分派。
本方法的主要思想是:在利用循環神經網絡建模缺陷報告文本詞序關系的同時,對開發者活躍度進行建模,優先推薦當前活躍的開發者修復缺陷,以緩解推薦的開發者無法修復、修復效率低的問題,即給定缺陷報告br、修復記錄信息his,需訓練評分函數S(br,his)=d∈D。其中,D表示開源項目開發者的集合。
基于開發者活躍度的缺陷分派方法的工作流程如具體而言,包括3個重要部分:①文本高層特征抽取,對缺陷報告文本br建模,并獲取文本特征表示ht;②開發者活躍度高層特征抽取,建模修復記錄信息his,并獲取活躍度特征表示ha;③高層特征融合,將ht和ha的特征表示進行融合,以獲取分類器的輸入特征。以下將依次對這3個部分進行詳細介紹。圖4所示。

圖4 基于開發者活躍度的缺陷分派方法的工作流程
(1)文本高層特征抽取
文本高層特征抽取使用了雙向循環神經網絡。得益于循環神經網絡在文本分類上的進步[37-38],基于雙向循環神經網絡的文本高層特征抽取方法逐漸成為主流。具體而言,以獨熱編碼的形式依次輸入單詞,從順序、倒序兩個方向進行遍歷;對于每個單詞,將其正向、逆向的特征進行拼接,輸入最大池化層,以整合單詞特征,得到保留了最關鍵信息的整體表示,此過程可表示為:

其中,br=(t1,t2,…,tN)表示缺陷報告的文本信息,第i個單詞表示為ti;N表示文本長度;forward、backward分別表示雙向循環神經網絡的正向、逆向遍歷過程;hti表示第i個單詞的高層特征,和分別表示第i-1個單詞的正向特征和第i+1個單詞的逆向特征;maxpooling表示最大池化層;ht表示缺陷報告的文本高層特征。
(2)開發者活躍度高層特征抽取
開發者活躍度高層特征抽取首先獲取開發者的修復記錄信息his,然后將修復記錄信息輸入神經網絡,以得到高層特征。在修復記錄獲取方面,給定新缺陷報告的提交時刻,需獲取提交時刻向前一段時間內的修復記錄,并將其按照時間順序排列;由于開源項目缺陷報告數量巨大,為了約束his的長度,采用目標缺陷報告的產品、模塊元數據進行過濾,即只保留產品、模塊相同的修復記錄;若無法找到相應修復記錄,則his被設置為空列表。在高層特征抽取方面,采用單向循環神經網絡獲得最后節點的狀態,以保障越靠近當前時間節點的修復記錄影像越大,此過程可表示為:

其中,forward表示順序輸入的單向循環神經網絡;M表示修復記錄的長度;haM-1表示第M-1個修復記錄對應的高層特征,其值同樣由forward輸出得到;hisM表示第M條修復記錄;ha表示開發者活躍度高層特征表示,由于將最后節點的狀態作為特征表示,故ha=haM。
(3)高層特征融合
高層特征融合將文本高層特征、開發者活躍度高層特征融合在一起,共同進行后續預測,即:

其中,ht和ha分別表示文本高層特征、開發者活躍度高層特征;h表示融合后的特征;⊕表示特征融合操作,是此步驟的核心。特征融合操作通常采用拼接、元素間相加、元素間相乘3種較為簡單的方法。本文采用特征向量相互影響更為激烈的元素間相乘方法,以便讓開發者活躍度特征更多地影響責任開發者的預測。
模型的最后,評分函數S需建立融合的高層特征到項目開發者的映射,并選擇預測值最高的開發者作為推薦的責任開發者。采用深度學習中常用的全連接層完成映射,可表示為:

其中,h表示融合后的高層特征,dense為全連接層,其輸出維度等同于項目中開發者的數量|D|;argmax表示選擇預測值最高的開發者;d表示推薦的責任開發者的編號。
整個模型包含訓練、預測兩個部分。訓練部分,將已經標記歸檔的缺陷報告大數據作為輸入,這些缺陷報告皆包含真實修復缺陷的責任開發者信息,并可抽取出文本信息及開發者修復記錄信息。這些數據共同構成訓練實體,完成模型的訓練。測試部分,輸入新的缺陷報告,以及從缺陷追蹤系統中抽取的開發者活動記錄,則可得到推薦的責任開發者d。
筆者基于oh-LSTMp(one-hot LSTM with pooling)[37]實現了上述缺陷分派方法DeepTriage,主要改進在于增加了開發者活躍度的特征抽取網絡,并試驗了多種特征融合方法對分派結果的影響。
為了驗證方法的有效性,選取開源項目Eclipse、Netbeans、Mozilla、Redhat作為實驗對象,將缺陷報告按照時間排序,并分為11份,每次選取前n份作為訓練集、第n+1份作為測試集,共進行10輪實驗,并對比平均結果;選取經典分類方法SVM[39]、Yang等人[19]基于主題模型并融合元數據的方法提出的模型(以下簡寫為Yang)、TopicMinerMTM[20]作為對比方法;選取準確率(accuracy)作為評估指標。

表2 基于開發者活躍度的缺陷分派方法的Top-1準確率
基于開發者活躍度的缺陷分派方法DeepTriage的Top-1準確率見表2,縱向表示選取的4個實驗對象,橫向表示選取的對比方法。實驗結果顯示,與對比算法相比,DeepTriage的Top-1準確率在各個項目中均有顯著提升,表明優先推薦活躍度高的開發者有利于切實完成缺陷修復工作,本文所提缺陷分派方法具有較強的實用價值。
缺陷再分派的目標是在需要變更責任開發者時,推薦新的責任開發者。不同于缺陷分派任務,缺陷再分派包含額外的傳遞序列tos信息,tos中靠后的開發者通常具有更強的技術水平,更加受到其他開發者信賴;建模開發者之間的信賴關系有利于缺陷的有效修復,且更加符合項目開發者的再分派任務。為此,筆者提出了一個基于編碼器、解碼器(encoder-decoder)模型[40-41]的方法iTriage來解決上述問題,以同時建模缺陷報告文本信息與開發者之間的信賴關系。
本方法的主要思想是:將傳遞序列tos建模為解碼過程,預訓練開發者間的信賴關系;當需要進行缺陷再分派時,使用此預訓練模型獲取文本、傳遞序列的特征,并結合元數據特征共同預測最終的責任開發者。此過程避免了對缺陷傳遞過程的模擬,直接關注最終目標,有利于提高缺陷再分派的準確率,即給定需要變更責任開發者的缺陷報告br、缺陷報告的傳遞序列tos,需訓練評分函數S,使得S(br,tos)=d∈D。其中,D表示開源項目開發者的集合;tos表示從缺陷提交者開始,包含一個或多個責任開發者的傳遞序列。對于已修復的缺陷,tos中最后的開發者表示完成修復的開發者;對于需再分派的缺陷,則表示無法完成修復的開發者,通常需要指定不同的新責任開發者。
基于開發者信賴關系的缺陷再分派方法的工作流程如圖5所示。具體而言,包括3個重要部分:①文本編碼器,建模缺陷報告文本br的特征;②傳遞序列解碼器,模擬缺陷報告的傳遞過程,通過預訓練的方式學習開發者間的信賴關系;③開發者推薦模型,結合文本特征、傳遞狀態特征和元數據特征,共同推薦新的責任開發者。以下將依次對這3個部分進行詳細介紹。
(1)文本編碼器
文本編碼器采用雙向循環神經網絡建模缺陷報告文本特征。區別于缺陷分派,此處直接輸出每個單詞的特征表示,并記錄遍歷所有單詞后的狀態特征,可表示為:

其中,br=(t1,t2,…,tN)表示缺陷報告文本的集合;hti表示第i個單詞的高層特征,這些特征將通過后續的注意力機制進行整合;state0表示完整遍歷后的狀態信息,其中數字0表示解碼器的初始狀態。
(2)傳遞序列解碼器
傳遞序列解碼器采用循環神經網絡建模。解碼器通過循環神經網絡模擬缺陷報告在責任開發者間傳遞的過程,學習開發者之間的信賴關系。為確定j時刻輸出的開發者,需要缺陷報告的全部文本特征、j-1時刻的隱含狀態、j-1時刻的責任開發者。可表示為:

其中,statej、dj分別表示j時刻的隱含狀態、輸出的責任開發者。statej的初始狀態為解碼器最后輸出的狀態;dj的初始狀態則區別于傳統模型采用特殊開始符
在此過程中,也將采用注意力機制整合文本特征。具體方法為:使用解碼器j-1時刻的隱含狀態,重新計算單詞特征的權重,并加權求和。可表示為:

其中,cj表示j時刻的完整缺陷報告文本上下文特征。
(3)開發者推薦模型
開發者推薦模型采用基于全連接層的分類方法。其輸入包括當前j時刻的文本上下文特征、解碼器隱含狀態特征,以及缺陷報告整體的元數據特征。可表示為:

其中,m表示元數據特征,此特征可使用簡單的嵌入層獲得;由于元數據在缺陷報告中長期保持穩定,因而在任意時刻j都可使用相同的元數據特征m。
整個模型包括訓練、預測兩個部分。訓練部分,將歸檔缺陷報告大數據作為監督,學習并優化模型參數。測試部分,模型參數固定,給定待變更責任開發者的缺陷報告,首先經過文本編碼器、傳遞序列解碼器獲取文本上下文特征c、解碼器隱含狀態特征state;其次,提取元數據,并得到元數據特征m;最后,將3種特征輸入開發者推薦模型,則可得到推薦的新責任開發者。
筆者基于編碼器、解碼器模型[41]實現了上述缺陷再分派方法iTriage,主要改進在于將缺陷在開發者間傳遞的過程建模為解碼過程,并添加了開發者推薦模型,結合缺陷再分派時刻的文本上下文特征、傳遞狀態特征、元數據特征,直接預測最終的修復者。

圖5 基于開發者信賴關系的缺陷再分派方法的工作流程
為了驗證方法的有效性,選取開源項目Eclipse、Mozilla、Gentoo作為實驗對象,采用模擬時序的十折驗證作為測試方法;選取經典文本分類方法SVM[39]、基于注意力機制的循環神經網絡DBRNN+A方法[21]、基于卷積神經網絡的方法CNN Triager[22]作為對比方法;選取準確率作為評估指標。

表3 基于開發者信賴關系的缺陷再分派方法的Top-1準確率
基于開發者信賴關系的缺陷再分派方法iTriage的Top-1準確率見表3,縱向表示實驗對象,橫向表示對比方法。此外,實驗進一步驗證了缺陷再分派情況下的分派準確率,iTriage@1表示第一次分派的預測準確率,iTriage@2、iTriage@3分別表示第一次、第二次再分派(即第二次、第三次分派)的準確率。實驗結果顯示,iTriage第一次分派的預測準確率已有顯著提升,表明了將提交者納入信賴關系建模的有效性;且在隨后的第一次、第二次再分派中,準確率得到進一步提升,表明了缺陷報告在開發者間傳遞的反饋信息的有效性,本文所提缺陷再分派方法具有較強的實用價值。
本文提出了一個智能化缺陷報告預檢技術的框架,結合開源項目的特點,并利用已修復缺陷報告的大數據作為支撐,基于深度學習的相關模型與技術,針對缺陷預檢的3個關鍵任務提出了相應的自動化技術:基于半監督學習的缺陷報告優先級預測方法、基于開發者活躍度的缺陷分派方法、基于開發者信賴關系的缺陷再分派方法。
面向開源項目的缺陷報告預檢技術,尤其是缺陷再分派技術的研究日益被重視,仍有許多問題需要更加深入的分析和研究,如缺陷報告質量對缺陷預檢工作的影響如何,代碼托管平臺中缺陷報告和代碼變更的關聯信息、開發者評價信息等如何用于提高缺陷預檢的準確率等。