在軟件缺陷預(yù)測(cè)中使用軟件可視化和遷移學(xué)習(xí)
文章的動(dòng)機(jī)是避開(kāi)源代碼的中間表示,將源代碼表示為圖像,直接提取代碼的語(yǔ)義信息以改進(jìn)缺陷預(yù)測(cè)的性能。
首先,看到如下圖所示的motivation示例。File1.java和File2.java兩個(gè)示例中,雖然都包含了1個(gè)if語(yǔ)句、2個(gè)for語(yǔ)句和4個(gè)函數(shù)調(diào)用,但代碼的語(yǔ)義和結(jié)構(gòu)特征是不相同的。為驗(yàn)證將源代碼轉(zhuǎn)換成圖像是否有助于區(qū)分不同的代碼,作者進(jìn)行了實(shí)驗(yàn):將源代碼根據(jù)字符的ASCII十進(jìn)制數(shù)對(duì)應(yīng)到像素,排列成像素矩陣,獲取源代碼的圖像。作者指出,不同的源代碼圖像存在差異。
Fig. 1 Motivation Example
文章主要的貢獻(xiàn)如下:
將代碼轉(zhuǎn)換成圖像,從中提取語(yǔ)義和結(jié)構(gòu)信息;
提出一種端到端的框架,結(jié)合自注意力機(jī)制和遷移學(xué)習(xí)實(shí)現(xiàn)缺陷預(yù)測(cè)。
文章提出的模型框架如圖2所示,分為兩個(gè)階段:源代碼可視化和深度遷移學(xué)習(xí)建模。
Fig. 2 Framework
1.源代碼可視化
文章將源代碼轉(zhuǎn)換成6個(gè)圖像,過(guò)程如圖3所示。將源代碼字符的10進(jìn)制ASCII碼轉(zhuǎn)換成8bit無(wú)符號(hào)整數(shù)向量,按行和列對(duì)這些向量進(jìn)行排列,生成圖像矩陣。8bit整數(shù)直接對(duì)應(yīng)到灰度等級(jí)。為解決原始數(shù)據(jù)集較小的問(wèn)題,作者在文章中提出了一種基于顏色增強(qiáng)的數(shù)據(jù)集擴(kuò)充方法:對(duì)R、G、B三個(gè)顏色通道的值進(jìn)行排列組合,產(chǎn)生6個(gè)彩色圖。這里看著挺迷的,變換了通道值后,語(yǔ)義和結(jié)構(gòu)信息應(yīng)該有所改變吧?但是作者在腳注上進(jìn)行了解釋?zhuān)鐖D4所示。
Fig. 3 源代碼可視化流程
Fig. 4 文章腳注2
2.深度遷移學(xué)習(xí)建模
文章使用DAN網(wǎng)絡(luò)來(lái)捕獲源代碼的語(yǔ)義和結(jié)構(gòu)信息。為增強(qiáng)模型對(duì)重要信息的表達(dá)能力,作者在原始DAN結(jié)構(gòu)中加入了Attention層。訓(xùn)練與測(cè)試流程如圖5所示,其中conv1-conv5來(lái)自于AlexNet,4個(gè)全連接層fc6-fc9作為分類(lèi)器。作者提到,對(duì)于一個(gè)新的項(xiàng)目,訓(xùn)練深度學(xué)習(xí)模型需要有大量的標(biāo)簽數(shù)據(jù),這是困難的。所以,作者首先在ImageNet 2012上訓(xùn)練了一個(gè)預(yù)訓(xùn)練模型,使用預(yù)訓(xùn)練模型的參數(shù)作為初始參數(shù)來(lái)微調(diào)所有卷積層,進(jìn)而減少代碼圖像和ImageNet 2012中圖像的差異。
Fig. 5 訓(xùn)練與測(cè)試流程
3.模型訓(xùn)練和預(yù)測(cè)
對(duì)Source項(xiàng)目中有標(biāo)簽的代碼和Target項(xiàng)目中無(wú)標(biāo)簽的代碼生成代碼圖像,同時(shí)送入模型;二者共享卷積層和Attention層來(lái)提取各自的特征。在全連接層計(jì)算Source和Target之間的MK-MDD(Multi Kernel Variant Maximum Mean Discrepancy)。由于Target沒(méi)有標(biāo)簽,所以只對(duì)Source計(jì)算交叉熵。模型使用mini-batch隨機(jī)梯度下降沿著損失函數(shù)訓(xùn)練模型。對(duì)每一個(gè)<source, target>對(duì)的500個(gè)epoch,根據(jù)最好的F-measure從中選出一個(gè)epoch。
在實(shí)驗(yàn)部分,作者選擇了PROMISE數(shù)據(jù)倉(cāng)庫(kù)中所有開(kāi)源的Java項(xiàng)目,收集了它們的版本號(hào)、class name、是否存在bug的標(biāo)簽。根據(jù)版本號(hào)和class name在github中下載源碼。最終,共采集了10個(gè)Java項(xiàng)目的數(shù)據(jù)。數(shù)據(jù)集結(jié)構(gòu)如圖6所示。
Fig. 6 數(shù)據(jù)集結(jié)構(gòu)
對(duì)于項(xiàng)目?jī)?nèi)缺陷預(yù)測(cè),文章選擇如下baseline模型進(jìn)行對(duì)比:
對(duì)于跨項(xiàng)目缺陷預(yù)測(cè),文章選擇如下baseline模型進(jìn)行對(duì)比:
總結(jié)一下,雖然是兩年前的論文了,但感覺(jué)思路還是比較新奇的,避開(kāi)AST等一系列代碼中間表示,直接將代碼轉(zhuǎn)換成圖像提取特征。但是還是比較疑惑,代碼轉(zhuǎn)換成的圖像真的包含源代碼語(yǔ)義和結(jié)構(gòu)信息嗎?感覺(jué)可解釋性不太強(qiáng),哈哈。后面需要做實(shí)驗(yàn)分析下吧。