DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing
文章目錄
- DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing
-
- 摘要
- 初步
-
- DNN軟體開發和部署
- 基于覆寫的灰盒模糊
- 方法
-
- DeepHunter概述
- Transformation and Mutation
- Power Scheduling
- Plugable Coverage-Guided Fuzzing
- Batch Prioritization
- Experiments
- 相關工作
論文标題
- DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing
- DeepHunter:通過涵蓋引導模糊來尋找深層神經網絡缺陷
- 2018.12
貢獻
- 我們提出了一個通用的覆寫制導模糊架構DeepHunter來系統地測試基于DNN的軟體,這是最早對DNN進行回報制導測試的研究之一。DeepHunter的設計考慮了測試DNNs的獨特性和向實際規模DNN的可擴充性。(1)具體地說,測試執行可以很容易地并行化。我們提出了一種基于批處理的政策,并利用它來保持在獲得模糊結果時的高吞吐量。(2)為了能夠在有效域内大規模自動生成新的測試輸入,提出了一種基于變形變異的測試生成技術,保留了變異前後的輸入語義。(3)提出使用可插入的回報分析元件來指導測試生成,包括一組6個不同粒度的測試準則,以進一步指導模糊化過程
- 我們進行了一項大規模的實證研究,以評估DeepHunter在系統地生成覆寫增強測試方面的有用性,并以最近提出的6個覆寫标準為指導。
- 我們進一步研究了最近提出的每一個測試覆寫标準如何幫助指導模糊化,(1)DNN模型品質評估,(2)錯誤行為檢測,以及(3)為平台遷移引入量化缺陷。
總的來說,我們發現DeepHunter在以下方面可以有效地生成有用的測試:(1)提高目标覆寫率;(2)評估DNN模型品質;(3)檢測錯誤行為;以及(4)捕獲量化DNN版本失敗的敏感情況。據我們所知,這項工作是迄今為止規模最大的DNN測試經驗評估之一,使用了3個資料集(包括ImageNet)、7個DNN模型(具有VGG-16、ResNet-50等大型模型)和一組6個覆寫标準作為CGF指導。我們将把DeepHunter作為一個開放的架構向公衆開放,以促進對DNN測試的進一步比較研究。
本篇是基于DNN覆寫理論的fuzz,并提出了一個架構deephunter,相當于tensorfuzz的擴充
目前基于覆寫的神經元測試到底用處多大仍待考核
摘要
随着過去十年的資料爆炸,基于深度神經網絡(DNN)的軟體經曆了前所未有的飛躍,正在成為許多新型工業應用的關鍵驅動力,包括許多安全關鍵場景,如自動駕駛。盡管DNN在各種人類智能任務中取得了巨大的成功,但與傳統軟體類似,DNN也可能因隐藏的缺陷而表現出不正确的行為,進而導緻嚴重的事故和損失。本文提出了一種自動模糊測試架構DeepHunter,用于尋找通用DNNs的潛在缺陷。DeepHunter執行變形變異以生成新的語義保留的測試,并利用多個Plugable覆寫标準作為回報,從不同的角度指導測試生成。為了能夠擴充到實際大小的DNN,DeepHunter在一批中維護多個測試,并根據主動回報确定測試選擇的優先級。DeepHunter在3個流行的資料集(MNIST、CIFAR-10、ImageNet)和7個具有不同複雜性的DNN上進行了廣泛的有效性調查,在6個覆寫标準的大集合上作為回報。大規模實驗表明,DeepHunter可以(1)顯著提高引導覆寫率;(2)生成有用的測試來檢測錯誤行為,便于DNN模型品質評估;(3)準确捕獲DNN量化過程中的潛在缺陷,用于平台遷移。
初步
對于傳統軟體來說,變異通常是相當随機的,并且經常生成無效(或無意義)的種子,這些種子将被程式中的健全性檢查很早就拒絕。是以,通用模糊器通常隻能找到較淺的錯誤,例如解析錯誤和不正确的輸入驗證。另一方面,DNN軟體的輸入通常需要特殊的格式,違反格式規範的輸入甚至在學習過程開始之前就會被拒絕。是以,基于一些中間表示而不是原始資料來定制DNN感覺的變異政策被認為是更具成本效益的
現有的技術,特别是覆寫準則[22-24]是否能對DNN模糊提供有意義的指導,還缺乏廣泛深入的研究。
DNN軟體開發和部署

圖1:基于DNN的通用軟體的開發和部署過程。我們建議的DeepHunter緻力于評估DNN軟體品質并查找其中的缺陷。
但是,如圖1所示,在開發和部署階段都可能引入缺陷。例如,資料收集、教育訓練計劃實施、教育訓練執行等都可能在DNN開發階段引入潛在的缺陷。類似地,量化和平台遷移也可能由于量化運算符或相容性問題而引入缺陷
開發和部署都有一系列的問題可能會導緻缺陷
基于覆寫的灰盒模糊
coverage-based grey-box fuzzing (CGF) ,這裡與tensorfuzz中的CGF (coverage-guided fuzzing)不太一樣
典型的CGF循環以下步驟:
(1)從種子庫中選擇種子;(2)對種子進行一定次數的變異,以生成新的測試,采用按位/按位元組翻轉、塊替換和對兩個種子檔案進行交叉等變異政策;(3)針對新生成的輸入運作目标程式,并記錄執行的軌迹;(4)如果檢測到崩潰,則報告故障種子,并将覆寫新軌迹的有趣種子儲存到種子庫中。這樣的疊代将繼續,直到給定的計算資源耗盡。CGF的兩個關鍵組成部分是變異和覆寫回報,它們在很大程度上決定了模糊化的效率。
盡管傳統程式和DNN之間存在巨大的差異,但CGF在前者上的成功仍然讓我們對後者的模糊有了深刻的了解。例如,目标傳統程式反映了DNN,模糊器的種子反映了DNN的輸入,覆寫回報可以是DNN的一些覆寫。考慮到DNN的獨特特性,從DNN模糊化的角度出發,開發有效的變異政策和覆寫準則仍然是一項具有挑戰性的工作。本文旨在通過設計有效的CGF架構來填補這一空白,在DNN的開發和部署過程中提供一個品質保證小工具。
方法
DeepHunter概述
圖2描述了DeepHunter的概述,算法1指定了詳細資訊。從高層次上講,DeepHunter由三個主要組成部分組成:變形突變,DNN回報和批處理池維護。我們将DNN的原子輸入(例如,圖像)定義為種子,将一組種子(例如,多個圖像)定義為批。由于DNNs可以一次快速預測多個種子(即一批),是以我們維護批次池而不是種子池,以提高模糊效果。在模糊過程中,DeepHunter首先選擇一批并生成大量突變種子,然後DNN一次性預測所有突變種子。最後,DeepHunter根據覆寫資訊對池進行維護。下面詳細介紹了DeepHunter的工作流程(參見算法1)。
Transformation and Mutation
傳統的模糊器,如AFL,通過按位/按位元組翻轉、塊替換、輸入檔案之間的交叉等來改變輸入。然而,這些政策通常生成太多在DNN模糊中沒有意義的輸入。例如,人類感官感覺不到的圖像或聲音應該從變異中丢棄。是以,一個挑戰是如何在增加突變的可變性和産生有意義的輸入之間取得平衡。如果突變變化非常小,新生成的輸入可能幾乎沒有變化;盡管它可能是有意義的,但模糊器發現失敗測試的機會較低。另一方面,如果突變變化非常大,可能會識别出更多失敗的測試;然而,失敗的測試更有可能是沒有意義的。
在這項工作中,我們主要關注圖像輸入。為了解決上述挑戰,我們開發了一種Metamorphic Mutation政策。基本目标是給定一個圖像i,指派器生成另一個新圖像i0,以便從人的角度看,i和i0的語義是相同的。
圖像變換。為了增加突變的可變性,我們選擇了八種圖像變換,分為兩類
- 像素值變換P:改變圖像對比度、圖像亮度、圖像模糊和圖像噪聲。
- 仿射變換G:圖像平移、圖像縮放、圖像剪切和圖像旋轉。
直覺地說,像素值變換P變換會更改圖像的像素值,而仿射變換G會移動圖像的像素。這些變換在[23]中已被證明是有效和有用的。
Definition 1. An image I ′ \mathcal{I}^{\prime} I′ is one-time mutated from I \mathcal{I} I if I ′ \mathcal{I}^{\prime} I′ is generated after a transformation t on I \mathcal{I} I (denoted as I ⟶ t I ′ \mathcal{I} \stackrel{t}{\longrightarrow} \mathcal{I}^{\prime} I⟶tI′ ), where t ∈ P ∪ G . t \in \mathcal{P} \cup \mathcal{G} . t∈P∪G. An image I ′ \mathcal{I}^{\prime} I′ is sequentially mutated from I \mathcal{I} I if I ′ \mathcal{I}^{\prime} I′ is generated after a sequence of one-time mutations ( I ⟶ t 0 I 1 , I 1 ⟶ t 1 I 2 , … , I n ⟶ t n I ′ ) ( denoted as I ⟶ t 0 , t 1 , … , t n I ′ ) \left(\mathcal{I} \stackrel{t_{0}}{\longrightarrow} \mathcal{I}_{1}, \mathcal{I}_{1} \stackrel{t_{1}}{\longrightarrow} \mathcal{I}_{2}, \ldots, \mathcal{I}_{n} \stackrel{t_{n}}{\longrightarrow} \mathcal{I}^{\prime}\right)\left(\text { denoted as } \mathcal{I} \stackrel{t_{0}, t_{1}, \ldots, t_{n}}{\longrightarrow} \mathcal{I}^{\prime}\right) (I⟶t0I1,I1⟶t1I2,…,In⟶tnI′)( denoted as I⟶t0,t1,…,tnI′)
就是對原始圖像執行一系列的P或G操作,得到了變異後的圖像
Metamorphic Mutation. 然而,在模糊化過程中,一幅圖像可能會從原始圖像連續變異,在一系列變異之後生成有意義的圖像是具有挑戰性的。為了提高變異的有效性,我們提出了Metamorphic Mutation.。
為了盡可能保證突變圖像的有意義,我們采用了一種保守的政策,使得仿射變換隻被選擇一次,因為多個仿射變換更容易産生無意義的圖像。我們假設仿射變換不會影響所選參數下的語義。像素值變換可以多次選擇,我們使用L0和L∞來限制像素級的變化。假設通過像素值變換将圖像i突變為I0,則如果滿足f(i,I0)(等式1),則I0關于I是有意義的
f ( I , I ′ ) = { L ∞ ≤ 255 , if L 0 < α × size ( I ) L ∞ < β × 255 , otherwise f\left(\mathcal{I}, \mathcal{I}^{\prime}\right)=\left\{\begin{array}{l} L_{\infty} \leq 255, \quad \text { if } L_{0}<\alpha \times \operatorname{size}(\mathcal{I}) \\ L_{\infty}<\beta \times 255, \quad \text { otherwise } \end{array}\right. f(I,I′)={L∞≤255, if L0<α×size(I)L∞<β×255, otherwise
其中,0<α,β<1,L0表示變化的最大像素數,L_∞表示像素變化的最大值,size(I)表示圖像 0 < I 0 < I 0<I中的像素數。
直覺地說,如果改變的像素數非常小(<α×Size(I)),我們假設它不改變語義,并且L_∞可以是任何值。如果更改的像素數超過邊界,則限制最大更改值(<β×255)。
G隻執行一次,P可以執行多次,但P有限制,要麼變化像素數量少,變化程度高,要麼變化像素多,變化程度低
這個函數決定了突變的難易程度
Definition 2. Given a mutated image I \mathcal{I} I, the original image (denoted as I 0 \mathcal{I}_{0} I0 ) of I \mathcal{I} I is the image in the initial seeds and I \mathcal{I} I is one-time mutated or sequence mutated from I 0 \mathcal{I}_{0} I0, i.e., I 0 ⟶ t 0 , … , t n I , \mathcal{I}_{0} \stackrel{t_{0}, \ldots, t_{n}}{\longrightarrow} \mathcal{I}, I0⟶t0,…,tnI, where n ≥ 0. n \geq 0 . n≥0. The reference image (denoted as I 0 ′ \mathcal{I}_{0}^{\prime} I0′ ) is defined as:
I 0 ′ = { I j , ∃ 0 ≤ j ≤ n . t j ∈ G ∧ I 0 ⟶ t 0 , … , t j I j I 0 , \mathcal{I}_{0}^{\prime}=\left\{\begin{array}{l} \mathcal{I}_{j}, \exists 0 \leq j \leq n . t_{j} \in \mathcal{G} \wedge \mathcal{I}_{0} \stackrel{t_{0}, \ldots, t_{j}}{\longrightarrow} \mathcal{I}_{j} \\ \mathcal{I}_{0}, \end{array}\right. I0′={Ij,∃0≤j≤n.tj∈G∧I0⟶t0,…,tjIjI0,
參考圖像要麼是變異後的,要麼是原始圖像
算法2顯示了變異的細節,
它将原始圖像I作為輸入,
将變異的圖像I0作為輸出。
state: 目前突變狀态0或1,如果目前突變狀态為0,則可以從仿射變換和像素值變換(第4行)中進行選擇。如果突變狀态為1,則隻能使用像素值轉換(第6行)
TRY_NUM:最大試驗次數
Power Scheduling
如算法2中所述,DeepHunter隻需有限的嘗試次數即可變異一幅圖像。如果滿足f(I0,I0),則i的變異是成功的。實際上,突變成功的可能性取決于滿足f(I0,I0)的難度
mutation potential: β × 255 × size ( I ) − sum ( abs ( I − I 0 ′ ) ) \beta \times 255 \times \operatorname{size}(\mathcal{I})-\operatorname{sum}\left(\operatorname{abs}\left(\mathcal{I}-\mathcal{I}_{0}^{\prime}\right)\right) β×255×size(I)−sum(abs(I−I0′))
直覺地,突變勢近似地表示圖像i的突變空間,即滿足 f ( I 0 ′ , I ′ ) f\left(\mathcal{I}_{0}^{\prime}, \mathcal{I}^{\prime}\right) f(I0′,I′)的難度,β×255×Size(I)表示圖像可以更改的最大值
例如, 假設 I ′ \mathcal{I}^{\prime} I′ 來自突變序列 I 0 ′ : ( I 0 ′ ⟶ t 0 I 1 , … , I n ⟶ t n I ′ ) , \mathcal{I}_{0}^{\prime}:\left(\mathcal{I}_{0}^{\prime} \stackrel{t_{0}}{\longrightarrow} \mathcal{I}_{1}, \ldots, \mathcal{I}_{n} \stackrel{t_{n}}{\longrightarrow} \mathcal{I}^{\prime}\right), I0′:(I0′⟶t0I1,…,In⟶tnI′),中 序列前面的圖像 ( e . g . , I 1 ) \left(e . g ., \mathcal{I}_{1}\right) (e.g.,I1)的突變潛力更可能高于在尾部的圖像(e.g., I ′ \mathcal{I}^{\prime} I′ ).
功率排程是DeepHunter為不同種子(即圖像)決定變異機會的過程。為了提高模糊化的效率,我們希望對更多具有較高突變潛力的圖像進行突變。
就是定義一個函數好選擇哪些種子突變
Plugable Coverage-Guided Fuzzing
在本文中,DeepHunter選擇六個不同的标準作為不同的回報,以确定是否應該保留新生成的批次以供進一步突變。該準則已被證明對捕獲内部DNN狀态是有用的。然而,由于每個神經元數值的巨大數值空間和DNN軟體的大規模性質,模糊器可能會因泛洪回報而過載。事實上,如果沒有分類,具有相似神經元值的種子輸入将被不必要地保留。由于突變的本能,将會有大量這樣的突變體起源于給定的種子。為了解決這個問題,我們将每個标準的數值神經元回報間隔平均劃分為不同的桶,每個桶将被視為“等價類”。如果一個新的種子及其覆寫範圍導緻一個神經元落入現有的桶中,它就會失去興趣并被丢棄。該機制的靈感來自于傳統模糊架構(例如,AFL)中使用的“循環桶”實踐,以緩解跟蹤利用問題[45]。
BKNC是與TKNC相反的,選擇的是最不活躍的
Batch Prioritization
批次優先順序決定下一批應該挑選哪個批次。我們采用一種政策,即根據批次模糊化的次數以機率方式選擇批次。特别地,該機率是通過以下方式計算的:
P ( B ) = { 1 − f ( B ) / γ , if f ( B ) < ( 1 − p min ) × γ p min , otherwise P(B)=\left\{\begin{array}{l} 1-f(B) / \gamma, \text { if } f(B)<\left(1-p_{\text {min }}\right) \times \gamma \\ p_{\text {min }}, \quad \text { otherwise } \end{array}\right. P(B)={1−f(B)/γ, if f(B)<(1−pmin )×γpmin , otherwise
其中B是批次,f(B)表示批次B已經模糊化了多少次,pmin>0是最小機率。參數γ和pmin的值可以調整
這裡的基本思想是對很少fuzz的批次進行優先排序。例如,新突變批次的機率為1,因為它獲得了新的覆寫範圍,并且被認為是有趣的。為了保持多樣性,其他經過多次模糊化的批次也有一個最小的選擇機率Pmin。
Experiments
DeepHunter用Python和C實作:基于深度學習架構Kera(2.1.3版)[10]和TensorFlow(1.5.0版)後端[9],用Python實作變形突變元件和DNN覆寫回報元件;為了提高效率,批量維護元件用C語言實作。我們通過調查以下研究問題來評估DeepHunter:
問1:在六個測試标準的指導下,DeepHunter可以達到什麼覆寫率?
問2:DeepHunter是否有效地促進了DNN模型的評估?
問3:DeepHunter能否實作對DNN的各種錯誤行為檢測?
問4:DeepHunter能否檢測到DNN量化過程中引入的潛在缺陷?
由不同測試标準指導的覆寫結果
RQ1的答案:DeepHunter通過不同的标準指導顯著提高了覆寫範圍。
DNN模型品質評價
對于RQ2,我們嘗試評估DeepHunter是否啟用了DNN模型品質評估。是以,除了用于MNIST和CIFAR-10的每個模型的最佳候選C執行個體外,我們還從前兩個訓練階段的每個階段中選擇了另外兩個執行個體A和B,這使得我們可以将模型品質關系QA<QB<QC排序為基礎
A,B是沒訓練完全好的模型,即epoch低
我們已經使用DeepHunter生成每個模型的執行個體C的測試。在這些測試中,我們保留C正确預測的測試,并在執行個體A和B上運作這些測試
我們看到,在我們生成的測試下,執行個體A和B的大部分準确性(參見表5)都低于原始測試的準确性(參見表2)。相反,在我們生成的測試下,執行個體A和B之間的大多數絕對精度差異超過了原始測試資料下的絕對精度差異。這表明生成的測試可以更好地區分執行個體A和B的品質,執行個體C比其他兩個執行個體能夠生成高品質的測試,這與我們的預期是一緻的。
RQ2的答案:DeepHunter通過引導式模糊測試簡化了模型品質評估。使用不同的覆寫指導生成的測試展示了不同的測試能力,為模型品質提供了不同的回報。
就是說訓練好的模型比沒訓練好的覆寫率高
DNN錯誤行為檢測
對于RQ3,在DeepHunter的Fuzz測試過程中,我們不斷收集生成的觸發DNNs錯誤行為的測試。由于我們的變形變種對輸入進行基于限制的變換,為了保證變換前後圖像的語義不變,我們對變換前後的圖像進行了批量預測檢查,并記錄了觸發被測DNN錯誤行為的測試。表6顯示了從每個模型的建議覆寫标準中檢測到的錯誤行為。是以,DeepHunter成功生成測試來觸發DNN的錯誤行為也就不足為奇了。最近的工作[22,23]已經表明,僅基于神經元覆寫的測試已經産生了數千個錯誤的觸發測試。
RQ3的答案:DeepHunter可以有效地生成測試來觸發測試下DNN的錯誤行為,它還可以很好地擴充到實際大小的資料集和DNN模型。
受控DNN量化設定下的缺陷檢測
為了回答RQ4,最近有在移動裝置、邊緣計算裝置等不同平台上部署DNN解決方案的強烈需求。由于計算和功耗的限制,通常的做法是将DNN模型從高精度浮點量化到低精度形式,以減小部署的規模。然而,量化可能會引入潛在的意想不到的錯誤行為。一個有效的測試套件應該能夠捕獲這樣的錯誤案例,作為回報給DL開發人員,以便進一步分析和調試。在這個研究問題中,我們調查DeepHunter是否有助于在量化過程中檢測潛在的缺陷。
對于表2中所研究的每個DNN模型(即32位浮點精度),我們用3種配置進行量化:(1)随機抽樣1%的權重将32位浮點截斷為16位,得到混合精度DNN模型;(2)随機抽樣50%的權重以将32位浮點截斷為16位;以及(3)将所有權重從32位浮點截斷為16位。
請注意,每個資料集的初始種子不能檢測量化前後的錯誤行為。然後,我們重用DeepHunter生成的測試來評估量化模型,結果彙總在表7中。在所有情況下,DeepHunter都能夠檢測量化過程中引入的潛在次要錯誤行為。
在許多配置中,使用NBC和SNAC指導生成的測試檢測到更多錯誤問題。一個潛在的原因是,NBC和SNAC較高的測試往往會覆寫神經元的角區行為,這可能會引發量化模型的錯誤行為。另一個有趣的發現是,我們發現全量化DNN模型的錯誤觸發測試次數有時可能小于混合精度量化模型。直覺地說,量化比越大,失去精度的權重就越多,可能會引入更多的錯誤行為。然而,我們的評估結果提示,有時由于較大的權重精度損失而引入的誤差可能會互相抵消,進而獲得誤差較小的量化版本。
RQ4的答案:DeepHunter可以有效地檢測DNN量化過程中引入的潛在缺陷,盡管會有輕微的精度損失。
讨論和對有效性的威脅
根據覆寫結果(參見。表4)以及相應的判據定義,我們發現KMNC是一個細粒度的判據,代表了k-多節神經元,很容易産生有趣的測試。例如,KMNC的平均覆寫增益為47%,超過了其他。另一方面,NC是一個相對粗粒度的标準,它記錄了激活神經元的比率。正因為如此(見表5),NC指導的模糊測試不能産生有效的結果來評估各種品質的模型。表2和表3中的結果還表明,NC在錯誤觸發測試檢測和敏感缺陷檢測方面的效果較差。
與KMNC和NC相比,其他四個标準在指導模糊測試方面表現出不同的行為,其中一些标準可能很難涵蓋,如SNAC和NBC。他們傾向于在生成角例測試時指導模糊測試,以便在許多情況下觸發更多的錯誤行為
相關工作
DeepHunter與TensorFuzz的差別主要展現在三個方面。在TensorFuzz中,突變器隻向輸入提供一種類型的突變,即加性噪聲。在DeepHunter中,基于全局和局部圖像變換,賦予變異體8種保持語義的變形突變類型,進而産生既多樣又可信的變形輸入。此外,在TensorFuzz中,回報僅依賴于一個标準,即基本神經元覆寫。相反,在DeepHunter中,我們使用了一組六個多粒度神經元覆寫标準來向模糊器提供多方面的回報。最重要的是,DeepHunter與TensorFuzz在測量範圍上也有所不同。事實上,本文的重點是對多個覆寫進行大規模的實證研究,以考察它們的有用性,以指導測試生成來檢測DNN開發和部署過程中引入的潛在問題。