DeepJIT:用于實時缺陷預測的端到端深度學習框架
提出了一種用于JIT缺陷預測的端到端深度學習框架,從Commit消息和代碼變更中提取特征,基于所提特征來識別缺陷。作者在QT和OPENSTACK上對框架性能進行了評估,在QT下的AUC有10.36-11.02%的進步,在OPENSTACK下有9.51-13.69%的進步。DeepJIT的框架如圖1所示,由(1)輸入層,(2)特征提取層,(3)特征聯合層和(4)輸出層組成。
Fig. 1 DeepJIT框架
- 輸入層:
- 對于Commit,基于NLTK提取其單詞序列,使用PorterStemmer產生詞根,刪除停用詞以及罕見詞(在Commit中出現不到3次的詞)。
- 對于代碼變更,同樣使用NLTK進行處理。每個變更的文件通過一組刪除和添加的代碼行表示,每一個代碼行被處理為一個單詞序列。同時,使用
<num>標簽表示數字,使用<unk>標簽表示未知詞,在每一行的開頭添加<added>或<deleted>標簽聲明該行是添加的還是刪除的。 - 特征提取層:
特征提取層的核心是兩個分別用于處理Commit向量和代碼變更向量的CNN。圖2是DeepJIT框架中用于處理Commit的CNN網絡結構。給定一個Commit詞序列,Commit的矩陣表示M由詞的詞向量組成,即:。
Fig. 2 用于處理Commit的CNN網絡結構
用于處理代碼變更的CNN網絡結構如圖3所示。作者提到,雖然代碼變更可以看做是單詞序列,但是其與自然語言的區別在于代碼是有結構的。代碼變更包括(1)不同文件的變更和(2)每個文件中不同種類的變更(添加和刪除)。
給定一個代碼變更C,涉及不同的文件。包含一系列的刪除和添加的代碼行。每一個代碼行由一個詞序列組成。因此,一個文件的代碼變更矩陣是一個N x L x d的矩陣,其中N表示文件中的代碼變更行數,L表示每一行的詞數,d表示詞嵌入維度。每一行經過一個CNN提取對應的行向量,行向量組合起來形成文件向量。文件向量再過一個CNN得到對應的表征向量。
C中的每一個文件F的表征向量被拼接起來作為C的表征向量,拼接方式如下。

Fig. 3 用于處理代碼變更的CNN網絡結構
- 特征聯合層:
特征聯合層的結構如圖4所示。Commit的表征向量和代碼變更向量被拼接起來,傳入全連接層進行特征融合,最終輸出一個概率值。

其中,h表示全連接層輸出。
Fig. 4 特征聯合層
由于存在缺陷的提交相比于clean提交的數據量差距很大,存在樣本不平衡的問題。為此,作者涉及了一個loss function來解決這個問題。

接下來就到了實驗部分,數據集如圖5所示,評估指標使用AUC。具體的參數設置請參考原文。
Fig. 5 數據集
為說明DeepJIT相對于state-of-art方法的有效性,作者設置了3個評估實驗:
- 5折交叉驗證。
- 短周期:JIT模型是使用在一個時間段發生的Commit來訓練的。假設較舊的提交更改可能具有不再影響最新提交的特征。
- 長周期:受到“更大量的訓練數據傾向于在缺陷預測問題中實現更好的性能”的啟發,使用在特定時期之前發生的所有提交來訓練JIT模型。
圖6是為短周期和長周期選擇訓練集的示例。使用Period 5作為測試數據集。當使用短周期模型時,使用Period 4作為訓練數據集;而使用長周期模型時,使用Period 1-4作為訓練數據集。
然而,實驗結果表明,三種評估方式下模型的性能相差無幾,說明基于過去或未來數據的訓練之間沒有差異。
Fig. 6 短周期和長周期選擇訓練集的示例
除此之外,作者還對(1)DeepJIT是否受益于Commit特征和代碼變更特征、(2)人工提取的特征對DeepJIT是否有效以及(3)DeepJIT的時間消耗進行了實驗。這里主要看一下是時間消耗的問題(因為我現在實驗就面臨著訓練一次的時間成本很高的情況),如圖7所示。作者是在Tesla P100上訓練的.
Fig. 7 時間消耗