劉 燁 黃金筱 馬于濤
(武漢大學計算機學院 武漢 430072)(ye_liu@whu.edu.cn)
當前,以GitHub(1)https://github.com為代表的互聯網上開源、開放的社交化軟件開發環境已然成形并逐漸流行起來.在這種環境下以社群(community)為主體的群智化軟件開發方法[1],通過自由競爭與合作創新,有望真正釋放軟件開發者乃至軟件用戶的生產力和創造力(也有學者稱之為“群智之力量”[2]),正在改變或將重塑商業軟件的傳統開發方式[3].例如,繼將.NET框架在GitHub上開源后,微軟公司還計劃把Windows操作系統發布為開源軟件.
互聯網上的群體協作被認為是這種新型開發方法的主要特點[4].然而,在網絡社群松散的組織結構(相對于公司的嚴格管理)下,如何通過群體協作來確保軟件質量就成為一個重要的研究問題.軟件缺陷修復作為軟件演化與維護中的重要一環,是目前軟件質量保證常用的一種手段.隨著軟件項目規模的日益增長(生態化發展趨勢),如何提升缺陷修復的效率和效果已成為群智化軟件開發與維護亟待解決的問題,受到了學術界和工業界的共同關注.
絕大多數的軟件項目通常會采用缺陷跟蹤系統(bug tracking system, BTS)來追蹤和管理缺陷的修復過程[5],如Bugzilla(2)https://www.bugzilla.org.BTS為追蹤缺陷報告的狀態提供了一個公共平臺.當開發者或用戶發現缺陷后,便可以在BTS中創建相應的缺陷報告并進行提交,一旦該缺陷報告被確認,它就開始了其生命周期,直至最后被修復而關閉(closed).在這個過程中,缺陷分派(bug triaging)是指將一個新的缺陷報告分配給一個合適的開發者進行修復的活動[6].考慮在此期間缺陷報告會被開發者評論、重新分配(reassign)乃至修改,缺陷分派在本質上是一個集群體智慧進行協作的過程,最后提供修復者(fixer)推薦服務.
2001-10—2010-12期間,知名開源項目Eclipse(3)https://www.eclipse.org在Bugzilla上提交的缺陷報告超過33萬個,平均每天有90個缺陷報告等待處理,而參與Eclipse項目的開發者超過1 800人.人工分配不僅耗時耗力,而且容易造成缺陷的重新分配(主要是因為指派的開發者不合適).在過去的數年中,基于機器學習的自動分派方法已取代人工分配方法,減少了缺陷修復所耗費的人力成本和時間成本.根據文獻[7]的分析,已有的缺陷自動分派方法主要分為3類:基于文本分類(text classification)的方法、基于再分配圖(tossing graph)的方法以及混合方法.其中,基于文本分類的自動分派方法已成為主流技術,其主要思路是從已修復的缺陷報告中學習表征缺陷與修復者之間關系的文本特征,再針對新的缺陷報告預測可能的開發者.近年來,隨著深度學習在自然語言處理(natural language processing, NLP)領域的成功應用,研究者開始嘗試利用詞向量化(embedding)和深度學習技術來進一步提高缺陷自動分派的準確率.
然而,在這些方法中常用的卷積神經網絡(con-volutional neural network, CNN)和循環神經網絡(recurrent neural network, RNN)也存在一定的局限性.一方面,CNN利用卷積核捕捉文本的局部信息來構建特征,但容易丟失文本的序列信息;另一方面,RNN能捕捉文本的序列信息,但缺乏捕捉文本的局部信息的能力.針對上述問題,本文提出了一種基于混合神經網絡和注意力機制的缺陷自動分派方法Atten-CRNN.該方法利用CNN與RNN各自的優點來充分地學習缺陷報告中的(局部)文本特征與序列特征.此外,該方法也利用注意力機制學習CNN抽取的各個文本特征的權重,用于加強文本特征對最終分類效果的影響,從而提高缺陷報告分配的準確率.
本文的主要貢獻有3個方面:
1) 針對缺陷報告包含的文本信息,我們提出了一種結合CNN和RNN各自優勢的混合神經網絡模型,用于更全面地捕獲文本特征和序列特征;
2) 在混合神經網絡模型中引入注意力機制,通過學習獲得的文本特征對于分類的貢獻程度(權重),進一步提高文本分類的效果;
3) 在2個大型開源軟件項目(本質上是包含眾多子項目的2個軟件生態系統)Eclipse和Mozilla(4)https://www.mozilla.org的數據集(分別包含20萬和22萬個已修復的缺陷報告)上進行了驗證,實驗結果表明Atten-CRNN在預測準確率方面優于選定的基準模型.
缺陷自動分派常用的方法是將缺陷分派問題轉換為文本分類問題,再利用機器學習的方法預測可能的開發者.Cubranic等人[8]率先從缺陷報告的標題以及評論字段的文本內容中提取關鍵字作為特征,用詞袋模型(bag of words, BOW)來表示每個缺陷報告,然后訓練出基于條件獨立假設的樸素貝葉斯(na?ve Bayes, NB)模型.因此,對于新提交的缺陷報告,可以將其分配給后驗概率最大的開發者.隨后,Anivk等人[6]在Cubranic等人的工作上進行了改進,他們過濾掉訓練集中無效的缺陷報告和修復缺陷次數低于9次的開發者,并通過實驗證明了支持向量機(support vector machine, SVM)模型能夠取得更好的結果.Xuan等人[9]提出了一種基于半監督學習的缺陷自動分派方法,將最大期望算法(expectation maximization, EM)與NB模型相結合,用以提升分類的性能.此外,基于主題模型(topic model)的方法則利用抽取的主題來衡量缺陷報告之間以及缺陷報告與開發者技能之間的相似性,進而給出預測結果.文獻[10-12]對隱狄利克雷分配(latent Dirichlet allocation, LDA)模型[13]進行了改進,在Eclipse等項目上取得了不錯的預測效果.
雖然基于傳統機器學習算法的缺陷自動分派方法能夠在一定程度上提升工作效率,但仍存在人工構建特征、文本表示能力有限等問題.近幾年隨著深度學習的飛速發展,研究者開始將深度學習引入到缺陷分派領域,取得了優于傳統機器學習算法的效果.胡星等人[14]提出了一種基于深度學習的缺陷分派方法,選取缺陷報告中的標題、描述、所屬產品及組件字段的內容作為文本信息,分別利用CNN模型以及長短期記憶模型(long short term memory,LSTM)進行開發者預測.Lee等人[15]也將CNN模型應用于缺陷自動分派中,并從工業應用的角度解決了多語言問題;與胡星等人工作不同的是,Lee等人考慮了開發者的活躍度,進一步提高了預測準確率.類似地,宋化志等人[16]也提出了基于CNN模型的缺陷自動分配方法,并驗證了其效果優于SVM和LSTM.Florea等人[17]則采用并行的CNN與RNN來解決該問題,與前面方法不同的是,該方法采用了Paragraph2Vec對文本進行分布式詞袋表示(簡稱PV-DBOW),并利用并行方式加速模型的學習.
另一方面,席圣渠等人[18]提出了一種基于RNN模型的缺陷分派方法,該方法利用雙向長短期記憶模型(bi-directional long short term memory,Bi-LSTM)和池化(pooling)的方法來提取缺陷報告中的文本特征,再利用LSTM模型提取特定時刻的開發者的活躍度特征.結合上述2種特征,使用監督學習算法進行學習.Mani等人[19]提出了一種基于Bi-LSTM 和注意力機制的DBRNN-A模型,將缺陷報告的標題與描述作為缺陷報告的文本內容,使用未分配的缺陷報告作為訓練集來訓練特征器,使用已分配的缺陷報告訓練分類器,以此來提高模型的泛化能力.Xi等人[20]提出了一種SeqTriage模型來進行開發者的預測,該模型是一種Seq2Seq模型,利用缺陷報告的文本內容作為編碼器(encoder)的輸入,得到相應的文本特征,再將該文本特征、缺陷報告提交者、上下文特征作為解碼器(decoder)的輸入,預測可能的修復者.
基于上述分析,與本研究相關的基于深度學習的缺陷自動分派相關工作的總結如表1所示:

Table 1 Summary of Related Work Based on Deep Learning表1 基于深度學習的相關研究工作總結
如引言所述,Bugzilla作為一種缺陷跟蹤系統,常被一些軟件項目用于追蹤和管理缺陷的修復過程.例如在Eclipse項目中,當一個軟件缺陷被發現時,開發者會使用缺陷報告來記錄軟件缺陷的詳細信息,并將其提交到Bugzilla系統中.一個正規的缺陷報告(如6807號(5)https://bugs.eclipse.org/bugs/show_bug.cgi?id=6807)主要包括預定義字段、缺陷描述字段、缺陷修復歷史記錄、評論字段和相關附件字段.
缺陷報告的預定義字段主要包含bug ID(編號)、title(標題)、status(狀態)、reported(提交者及提交時間)、product(所屬產品)、component(所屬組件)、version(版本)、importance(優先級與重要性)等屬性.這些字段描述了軟件缺陷的屬性信息以及狀態信息,其中部分字段在軟件缺陷生命周期的不同時段會發生改變.
缺陷報告的描述字段主要包括description(詳細描述)和comments(評論),用于對軟件缺陷進行詳細描述,以及記錄開發者對解決該缺陷所進行的討論與建議.從以往的研究工作來看,這部分內容對于分配給合適的開發者來解決給定的軟件缺陷起著重要作用,因而需要加以利用和分析.
缺陷修復歷史記錄字段主要記錄了缺陷的處理情況及狀態變化.每條記錄包含Who,When,What,Removed和Added 5個屬性,描述了開發者對某一個軟件缺陷實施操作的歷史行為.從該歷史記錄中可以獲得軟件缺陷的最終修復者,以及該缺陷被成功修復的時間.此外,相關附件字段為attachments(附件),主要是用于管理開發者提交的與該軟件缺陷有關的其他信息.
近年來,注意力機制被廣泛應用于基于深度學習的NLP和計算機視覺各個任務中.例如,Google在2017年提出了針對NLP翻譯任務的Multi-head self-attention模型[21],該模型是一種摒棄了RNN架構的Self-Attention,Scaled-Attention作為該模型的一部分(其具體使用情況討論見4.6節),其計算:

(1)

在計算機視覺領域,Chen等人對常用的Soft-Attention進行了改進,提出了Channel-wise-Attention(CWA)和Spatial-Attention(SA)[22]2種新的注意力機制,并在圖像描述(image captioning)任務中取得了良好的效果.在該工作中,CWA模塊和SA模塊被添加在CNN模型的池化層和全連接層之間.對于N個同樣大小的卷積核而言,經過卷積與池化后,從圖像中抽取的是不同的特征(一種卷積核抽取一種特征).通過對不同特征以及目標結果(如通道和位置)進行學習,能得到不同特征圖的貢獻值(即注意力權重).再將注意力權重與特征圖進行相乘,對有積極作用的特征圖進行強化,對無積極作用的特征圖進行弱化,從而達到提高模型效果的目的.CWA模塊的實現表示:
b=tanh((Wc?v+bc)⊕Whcht-1),
(2)

(3)

不同于CWA計算各個通道上特征圖的注意力權重,SA(其具體使用情況討論見4.6節)計算同一特征圖中不同像素點(位置)的注意力權重.通過將特征圖中不同通道對應位置的值進行相乘并求和,將特征圖從三維結構壓縮到二維結構,再將各個位置元素的值映射到0-1之間,即為特征圖中基于位置的注意力權重.類似地,SA模塊的實現:
a=tanh((WsV+bs)⊕Whsht-1),
(4)
α=softmax(Wia+bi),
(5)

最后,將該注意力權重與原始特征圖進行相乘,得到對應的新的特征圖.
本文所提出的基于混合神經網絡模型與注意力機制的缺陷自動分派方法,其整體流程主要包含3個步驟:
步驟1.數據預處理.對收集到的缺陷報告數據集進行清洗與整理,包含從原始數據集中提取每個缺陷的修復時間、修復者、所屬產品、所屬組件、標題、描述以及評論.實施的預處理工作主要包括:
① 在數據集中的缺陷所屬產品與所屬組件字段存在大量的專業術語縮略詞,如UI,API等.本文對上述縮略詞進行了替換,如使用user interface替換UI.
② 對缺陷修復時間進行了時區轉換,便于在統一的時間標尺上進行分析.
③ 將每個缺陷的標題、描述以及評論整合成一個文本,并對其進行分詞、去除停用詞、去除數字與非字母、提取詞干等操作.此外,將所屬產品和所屬組件信息與上述預處理后的文本進行合并,形成最終的缺陷報告文本內容.
步驟2.增量學習(incremental learning)與驗證.按照缺陷修復時間對數據集進行升序排序,并將數據均分為11份,并采用“十折增量學習”[23]的方法進行訓練與驗證.在第1輪時,使用第1份數據作為訓練集,第2份數據作為測試集;在第2輪時,使用第1份和第2份數據作為訓練集,第3份數據作為測試集;依此類推,到第10輪時,以第1份到第10份數據作為訓練集,第11份數據作為測試集.該部分包含4步:
① 利用給定的訓練集對分類模型進行訓練.主要通過CNN模型提取缺陷報告的文本特征,以及利用RNN模型提取缺陷報告的序列特征,具體內容見3.2.1節.
② 利用注意力機制對CNN模型提取出來的文本特征進行進一步學習與加強,并將加強后的文本特征與序列特征結合,再使用該組合特征進行分類模型的訓練,具體內容見3.2.2節和3.2.3節.
③ 使用測試集進行預測.將測試集進行同樣的文本處理后作為分類模型的輸入,得到所有開發者的概率值排名,然后推薦前k個開發者作為給定缺陷的候選修復者.
④ 計算分類模型的評價指標值.
步驟3.對分類模型的預測效果進行評價.由于使用了“十折增量學習”方法對分類模型進行訓練,使用10輪預測結果的均值作為該分類模型的最終評價效果.
本文所提方法的核心是基于混合神經網絡模型與注意力機制的缺陷修復者分類模型Atten-CRNN,主要是基于深度學習中的卷積神經網絡CNN與循環神經網絡RNN以及注意力機制CWA模塊,其結構如圖1所示.

Fig.1 Diagram of the Atten-CRNN model圖1 Atten-CRNN模型的結構圖
3.2.1 文本特征抽取
CNN具有善于捕捉文本局部特征(類似于N-gram語言模型)的優勢,卻很難獲取文本的長距離語義特征以及文本的序列特征.另一方面,RNN作為一種循環遞歸模型,能夠捕獲文本的序列特征和進行長距離記憶.因此,本文利用CNN與RNN抽取缺陷報告的(局部)文本特征以及序列特征.文本特征與序列特征的抽取主要包含3個步驟:
步驟1.和表1中列舉的方法一樣,本文也利用word2vec[24]進行詞向量化.假設一個文本的長度為l,缺陷報告文本詞匯表大小為D,使用one-hot編碼對文本進行表示,則文本可用0-1矩陣l×D表示.在經過word2vec進行詞向量化后(詞向量維度設置為d),該文本便可使用一個維度為l×d的矩陣表示.
① 卷積操作.使用3×d,4×d,5×d大小的卷積核對文本矩陣S進行卷積操作,即使用參數矩陣Wj×d(j=3,4,5)從上向下滑動并與文本矩陣進行相乘,表示為
Sj=Wj×d·S[i:i+j-1],
(6)

② 池化操作.對卷積操作后得到的文本特征向量進行池化,即對于每一個特征向量,保留向量中的最大值作為對應的文本特征:
vj=max(Sj),
(7)


(8)

步驟3.利用LSTM提取序列特征.將經過word2vec詞向量化后的文本向量作為LSTM模型的輸入,可得到l個輸出結果{o1,o2,…,ol},選取每個輸出向量中的最大值來構成LSTM模型抽取的序列特征向量z:
z=(max(o1),max(o2),…,max(ol)).
(9)
3.2.2 利用注意力機制強化文本特征
CNN模型特有的卷積結構使得不同的卷積核能從文本內容中學習到不同的文本特征,類似于圖像的特征圖.借鑒CWA對不同通道的特征圖及其關系進行學習的思想,本文希望得到各個文本特征對于分類結果的貢獻程度,將其作為權重加入到文本特征中,從而通過強化對于分類結果有積極作用的文本特征來提高最終的修復者分配準確率.因此,在CNN模型的最后一層加入改進后的CWA來學習文本特征的注意力權重.該過程主要分為2個步驟:
傳統生物課堂教學主要是以教為中心,教師以知識傳授者的身份出現,是學生學習的主要信息源,并且教師在整個教育過程中控制著學生的學習過程。在傳統教學中,教師的教學行為主要表現以下幾個方面。
1) 權重(重要程度)的學習.針對M個大小為j的卷積核抽取的文本特征,學習各個文本特征影響分類效果的重要程度(即權重向量aj),由于這里沒有同時使用LSTM進行序列特征提取,改進后的CWA模塊:
cj=tanh(Wj?Vj+bj),
(10)
aj=sigmoid(cj),
(11)

2) 更新文本特征.利用注意力模型學習各個文本特征的重要程度,并將其與原來的文本特征進行相乘,從而獲得更新后的文本特征.

(12)

3.2.3 特征融合與分類
進一步地,將強化后的文本特征V′=[V3′,V4′,V5′]與序列特征z進行融合,輸入到分類模型中進行預測,具體操作:
t=concat(V′,z).
(13)


(14)
(15)
最后,將最小化分類的交叉信息熵作為損失函數(如式(15)所示),利用給定的訓練集按照算法1訓練分類模型.
算法1.基于混合神經網絡模型與注意力機制的缺陷自動分派算法.
輸入:訓練集TrainingText、訓練集標簽TrainingLabel;
輸出:Atten-CRNN模型的參數集合.
/*生成batch樣本集*/
① {(Batch_Xs,Batch_Ys)}=batches_
generator(TrainingText,TrainingLabel);
② FORBatch_X,Batch_YIN {(Batch_Xs,Batch_Ys)}
/*詞嵌入操作*/
③X=embedding(Batch_X);
/*CNN模型提取文本特征*/
④Conv_X=relu(W1?X+B1);
⑤Pool_X=max_pool(Conv_X);
/*CWA學習文本特征權重*/
⑥Tmp_C=tanh(W2?Pool_X+B2);
⑦Weight_C=sigmoid(Tmp_C);
⑧Weight_X=Wight_C·Pool_X;
⑨Feature_CNN=concatenate(Weight_X);
/*RNN模型(LSTM)提取序列特征*/
⑩Outputs=LSTM(X);
/*特征組合*/
Feature_RNN);
/*分類器訓練*/
Function并更新變量:W1,B1,W2,
B2,W3,B3;
本文使用Bugzilla中關于Eclipse與Mozilla兩個大型軟件項目(軟件生態系統)的歷史缺陷報告數據進行驗證,原始的實驗數據集(6)https://github.com/ssea-lab/BugTriage來源于文獻[25],其概要情況如表2所示.在該數據集中,所有收集的缺陷報告均為已修復的,即狀態為VERIFIED、決議(resolution)為FIXED.

Table 2 Experimental Dataset Used for Bug Fixer Classification表2 缺陷修復者分類實驗數據集
該數據集中包含關于Eclipse與Mozilla兩個項目的缺陷描述信息(包括缺陷編號、缺陷所屬組件、缺陷所屬產品等信息),文本信息(包括標題、描述與評論),以及缺陷修復歷史記錄(包括修復時間、修復者、缺陷狀態變化等).對于缺陷報告的類別設定,本文將最后一個解決缺陷的開發者作為最終的類別標簽(即修復者),而不是考慮所有在缺陷分派過程中出現的開發者以及發表過評論的開發者.雖然這是一個群體協作的過程,但最終的修復者是唯一的.此外,開源軟件社區中的開發者流失現象是普遍存在的,會對缺陷修復者的推薦效果造成一定的影響.因此,為規避這種影響帶來的風險,本研究做了假設:這2個大型項目有長期穩定的核心開發和維護人員.
根據表1的分析,深度學習模型在Eclipse等數據集上的分類效果要明顯優于NB,SVM等傳統的機器學習算法[6,8,25].此外,word2vec在抽取文本特征方面要優于LDA和詞頻-反文檔頻率(term frequency-inverse document frequency, tf-idf)[26]技術.因此,我們將近3年提出的基于CNN,RNN和注意力機制的缺陷自動分派方法作為基準方法(主要包括3類)來驗證本文所提方法的有效性.
1) 基于CNN模型的缺陷自動分派方法.這類方法的核心是設計CNN架構的(文本)分類模型,相關工作主要包括文獻[14-17],而它們之間最大的區別在于CNN模型的具體實現,如卷積層、池化層、參數調優等.因此,在本文中我們將CNN模型作為一類基準方法,而不再特指某篇具體的文獻.
2) 基于RNN模型的缺陷自動分派方法.RNN因其鏈式遞歸結構能夠處理序列數據,并且能夠捕獲文本的序列特征和進行長距離記憶,在NLP任務中具有天然的優勢.于是,文獻[14,17-18]都提出了使用LSTM架構的分類模型來解決缺陷分派問題.由于文本中包含的上下文信息也在一定程度上影響模型的分類效果,一些已有工作[18-19]嘗試使用Bi-LSTM架構的分類模型,并在相關任務中被證明其效果優于LSTM模型.
3) 基于深度學習和注意力機制的缺陷自動分派方法.例如文獻[19]利用Bi-LSTM架構和注意力機制訓練預測模型,而文獻[20]則使用Encoder-Decoder架構和注意力機制來提取對分類更有用的文本特征.如本節所述,我們也將不同類型的神經網絡架構和注意力機制組成的模型作為一類基準方法.
參考文獻[8,16,27-28],本文采用準確率(命中率)作為缺陷自動分派方法分類結果的評價指標.在這里準確率是指,對于給定的測試數據集,缺陷自動分派方法正確分類的缺陷報告數與總缺陷報告數之比,定義:

(16)
其中,Accuracyk表示Top-k的準確率,Nk表示缺陷報告中分類正確的缺陷報告數,N表示缺陷報告總數.選取預測分數排名前k的開發者作為候選修復者,如果其中存在與真實標簽相同的結果,那么分類正確.例如,Top-5是指為某個缺陷選取預測出的前5名開發者,若其中存在實際修復者,則分類正確.
此外,本文也使用浮點運算次數(floating point operations,FLOPs)和參數量#Parameters這2個常用量化指標來評估不同方法的(時間)效率.在確定的硬件資源條件下,方法的效率與計算開銷成反比.相關結果使用TensorFlow(7)https://www.tensorflow.org中相應的函數計算得到.
本文所有實驗是在Dell T5810 Precision工作站上進行的.該工作站硬件配置如下:8核Intel Xeon E5-1620 V3 處理器、16 GB內存、華碩GTX 1080顯卡;其軟件環境配置為:Ubuntu 16.04(64位)操作系統,Python 3.6.7語言及編程環境,TensorFlow 1.1.0、CUDA(Compute Unified Device Architecture)8.0深度學習工具集,以及NLTK(8)https://www.nltk.org3.2.2 NLP工具.
為保證對比實驗的一致性和公平性,實驗中采用word2vec模型作為詞向量模型,并設置詞向量維度為300;CNN架構模型的卷積核的大小均設置為3,4,5,每種大小的卷積核的個數設置為150[16];對于RNN架構模型,設置其隱藏神經元個數為150;各種模型均采用Dropout方法進行正則化處理,取值為0.5;激活函數采用線性整流函數(rectified linear unit, ReLU);其他參數均為所使用軟件工具的默認設置.
4.5.1 不考慮注意力機制的對比結果
根據4.2節的分析,選取CNN,LSTM,Bi-LSTM 3種架構的分類模型作為基準模型,與CRNN(Atten-CRNN不考慮注意力的變體)進行對比實驗.對4種模型均采用“十折增量學習”的模式進行訓練,并使用10輪預測準確率的均值作為最終的評價結果,如表3所示.由于篇幅限制,這里只展示CRNN模型在10輪中的所有預測結果,如表4所示.
從表3可以看出,在Eclipse和Mozilla項目中,CRNN模型在Top-1~Top-5上的預測準確率均高于3種基準模型.相對于Bi-LSTM模型而言,CRNN模型準確率的提升幅度最大.在Eclipse項目中,CRNN模型在Top-1~Top-5上比Bi-LSTM模型分別提升了31.94%,30.74%,29.70%,29.49%和17.72%;在Mozilla項目中,前者比后者的預測準確率,提升了59.42%,49.03%,45.02%,38.21%和35.47%.

Table 3 Performance Comparison of Four Classification Models on the Experimental Dataset表3 4種模型在實驗數據集上的效果比較
Note: Numbers shown in bold font indicate the best prediction results.

Table 4 Prediction Results of CRNN in the ten-fold Incremental Learning Process表4 CRNN模型在“十折增量學習”中的預測結果 %
此外,就方法的效率而言,從FLOPs和參數量2個指標(值越小越好)來看,CRNN模型要優于Bi-LSTM模型,但比LSTM模型略差,也不如CNN模型.考慮到上述這些模型使用了相同的詞向量方法(word2vec),在計算表3中的參數量時并沒有包含嵌入層的參數量(14.180×106).
雖然文獻[14,18]的實驗結果表明,在解決基于文本分類的缺陷自動分派問題上,RNN架構的分類模型能取得優于傳統機器學習算法的預測效果,并且與CNN架構分類模型的效果沒有明顯的差別.然而,根據本文的實驗結果,LSTM模型的預測效果要明顯劣于CNN模型,但仍然優于Bi-LSTM模型.這可能是因為數據集中缺陷報告的文本內容,特別是描述及評論字段,包含了大量的非正式化的語言表述,導致其上下文關聯性較弱,在一定程度上削弱了文本的序列特征.
上述推斷也可以在CRNN模型與CNN模型分類效果的對比中得到驗證.相對于CNN模型而言,CRNN模型還抽取了文本的序列特征,但在Top-1~Top-5上準確率的提升幅度,在Eclipse中的范圍變化從Top-4的4.80%到Top-5的6.81%,在Mozilla中的范圍變化從Top-5的4.09%到Top-1的10.01%.上述結果表明抽取的序列特征會影響最終的預測結果,但是對分類效果的影響有限.
4.5.2 基于注意力機制的對比結果
進一步地,為了驗證注意力機制是否有助于提升分類模型的預測效果,仍舊選取CNN,LSTM,Bi-LSTM 3種架構的分類模型作為骨架(backbone),然后引入注意力機制,與本文所提出的Atten-CRNN模型進行對比實驗,評價方法與4.5.1節中的一致.4種基于注意力機制的分類模型在實驗數據集上的效果對比結果表5所示.由于篇幅限制,這里也只展示本文所提出的Atten-CRNN模型在10輪中的所有預測結果,如表6所示.

Table 5 Performance Comparison of Four Attention-based Classification Models on the Experimental Dataset表5 4種基于注意力機制的模型在實驗數據集上的效果對比
Note: Numbers shown in bold font indicate the best prediction results.
從表5可以看出,本文所提出的Atten-CRNN模型在2個項目中的準確率(Top-1~Top-5)均明顯高于3種基準模型.比較而言,Atten-CRNN模型的準確率明顯高于Bi-LSTM+Attention模型,并且在Eclipse項目中,Atten-CRNN模型的準確率在Top-1~Top-5上較Bi-LSTM+Attention模型分別提升了108.09%,77.47%,61.81%,53.79%和48.63%;在Mozilla項目中,前者比后者的預測準確率提升了170.30%,135.21%,116.92%,105.26%和97.08%.對于CNN+Attention而言,Atten-CRNN的準確率也仍有提升.其中,在Eclipse項目中,Atten-CRNN模型在Top1~Top-5上的提升幅度分別為5.31%,3.69%,5.72%,4.70%和4.88%;在Mozilla項目中,該模型的預測準確率分別提升了3.31%,5.54%,5.95%,5.53%和4.99%.因此,引入注意力機制后,Atten-CRNN模型可以更好地捕捉對分類任務有積極作用的文本特征,通過對有積極作用的文本特征進行加強,從而提升預測的準確率.
通過比較表3和表5可以發現,引入注意力機制后,所有模型的FLOPs和參數量2個指標的值都出現了不同程度的增長.這表明使用注意力機制會增加算力和時間的開銷,在一定程度上降低效率.總的來說,Atten-CRNN模型在效率方面要優于使用注意力機制的Bi-LSTM模型,但比使用注意力機制的LSTM模型略差,也不如使用注意力機制的CNN模型,這與4.5.1節中的結果是吻合的.
本節主要用于討論注意力機制的位置選擇(即使用注意力機制用于加強文本特征還是序列特征)和種類選擇對缺陷自動分派方法準確率的影響.為保證實驗的一致性,這里采用了與4.4節相同的參數配置.
4.6.1 注意力機制的位置選擇
理論上,注意力機制可用于單獨加強文本特征、單獨加強序列特征,或者同時加強二者.分別對混合模型CRNN中的CNN層添加CWA機制(圖2中用“Text feature”表示),對RNN層添加CWA機制(圖2中用“Sequence feature”表示),同時對CNN層與RNN層添加CWA機制(圖2中用“Both”表示),在Top-5上的預測結果如圖2所示:

Fig.2 Effect of the location of attention on the Top-5 prediction results圖2 注意力機制的位置對Top-5預測結果的影響
如圖2所示,不論是在Eclipse項目中還是在Mozilla項目中,單獨使用CWA注意力機制用于強化文本特征的分類效果最好(分別達到了63.31%和49.00%),但是單獨強化序列特征的分類效果相對較差,而同時強化文本特征與序列特征的分類效果與單獨強化序列特征的效果相當(61.80%對61.46%和48.25%對48.47%).由于缺陷報告中存在大量的專業術語以及非正規語法,使得缺陷報告文本內容的序列特征較弱,使用注意力機制對其進行加強的效果并不明顯.然而,使用注意力機制對文本特征進行學習并加強,能夠進一步提高缺陷自動分派的預測準確率.
4.6.2 注意力機制的種類選擇
可用于強化文本特征的注意力機制主要包括Self-Attention,Spatial-Attention以及CWA,不同的注意力機制可能對預測準確率產生不同的影響,在2個項目中Top-5上的效果分析結果如圖3所示:

Fig.3 Effects of three attention mechanisms on the Top-5 prediction results圖3 3種注意力機制對Top-5預測結果的影響
在2個項目中,Atten-CRNN模型在使用CWA時的準確率最高、在使用Self-Attention時的準確率最低,前者比后者在2個項目上分別提高了40.83%與28.85%,而在使用Spatial-Attention時的效果稍遜于使用CWA.通過對3種注意力機制進行分析可知,CWA用于對不同文本特征進行注意力權重的學習;Self-Attention側重于學習文本特征之間的相關關系,而這種關系對于分類效果并無明顯促進作用;Spatial-Attention主要是學習同一個文本特征內的位置關系.在序列特征對預測結果影響不大的情況下,文本特征內的位置關系對于模型的分類效果也有較大影響(接近使用CWA的效果),在后續的研究中應加以利用.
本文結合CNN,RNN和注意力機制的優點,提出了一種基于混合神經網絡模型與注意力機制的缺陷自動分類模型Atten-CRNN,并在Eclipse和Mozilla兩個大型軟件項目中驗證了其有效性.但是,本文所提出的方法及相關結論仍舊存在一些潛在的威脅(threat).
對于內部效度(internal validity)的威脅主要包括模型的構建和注意力機制的使用.Atten-CRNN模型中的CNN層結構較為簡單,僅使用了一層的卷積結構,而近年來深度CNN憑借其深層結構能夠更好地捕獲特征,在計算機視覺和NLP各個任務中均有著良好的表現.因此,Atten-CRNN模型的CNN層還有進一步的提升空間.對于強化文本特征的注意力機制,本文僅選取了3種流行的注意力模型進行實驗驗證,不能否認除了這3種模型外,可能存在其他效果更好的注意力模型.此外,實驗中各類參數的設置也是一個不容忽視的內部效度威脅.在本文中,部分參數是參考以往文獻的結果,部分參數是基于所使用軟件工具的默認設置,還有部分參數是針對給定數據集進行了微調(fine-tuning).這些參數的改變可能會影響實驗結果.
對于外部效度(external validity)的威脅主要包括所提方法的通用性.由于本文僅使用了Eclipse與Mozilla兩個項目的數據進行實驗,無法保證所提方法在解決其他項目的缺陷分派問題時同樣也具有最好的效果,其通用性還有待進一步驗證.此外,在缺陷修復過程中存在由多個開發者共同完成修復工作的情況,文獻[20,23]采用了再分配圖[28-29]的方式進行多個開發者的預測,且預測召回率(recall)明顯高于純文本分類方法.這類工作的主要思路是將缺陷分派看作是由多個開發者協作完成的一個過程,從而歸結為多標簽分類問題.考慮到相關的開發者在找到最終修復者的過程中都發揮了作用,因此通常一次性推薦一群可能的開發者(有可能是修復者,也有可能是負責再分配給修復者的開發者),而從確保獲得較高的召回率.但是,這種做法不同于本文的研究思路,即直接推薦可能的修復者(單標簽分類).這也是本文沒有將文獻[20]提出的方法作為基準方法的原因.但是,未來可將本文方法與再分配圖進行結合,來進一步提高預測的準確率.
在群智化軟件開發時代,提高缺陷修復效率與效果是確保軟件質量的一種重要手段.其中,缺陷自動分派是一種典型的群體協作活動,其輸出是修復者推薦服務,蘊含了專家智慧和機器智能.已有研究雖然嘗試使用不同的深度學習模型來解決缺陷自動分派中的文本特征提取問題,但也存在各自的不足.因此,本文提出了一種基于混合神經網絡與注意力機制的缺陷自動分派方法Atten-CRNN,充分利用CNN、RNN和注意力機制的優點,更全面、更合理地捕獲缺陷報告中的文本特征,用于預測可能的開發者進行缺陷修復.在Eclipse和Mozilla兩個大型的知名軟件開源項目中進行了實證研究,實驗結果表明,Atten-CRNN模型的預測準確率高于基于CNN架構和RNN架構的分類模型,從而驗證了該模型在處理缺陷自動分派問題上的有效性.
未來的研究工作主要包括2個方面:1)在更多的生態化開源軟件項目中驗證本文所提方法的通用性和有效性.2)充分利用開發者之間的各種協作或社交關系,如再分配關系、郵件通信關系、GitHub上的關注(follow)關系等,構建基于文本分類和關系網絡的混合模型,并綜合考慮開發者的活躍程度、工作狀態等特征,從而進一步提高缺陷分派的準確率.
致謝在此向對本文工作提出寶貴評審意見的審稿專家和編輯表示衷心地感謝,并向在本文實驗過程中給予技術支持的宋化志同學、耿嘯同學表示感謝!