[論文解讀]DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing

DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing


論文標題

  • 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} is one-time mutated from I\mathcal{I} if I\mathcal{I}^{\prime} is generated after a transformation t on I\mathcal{I} (denoted as ItI\mathcal{I} \stackrel{t}{\longrightarrow} \mathcal{I}^{\prime} ), where tPG.t \in \mathcal{P} \cup \mathcal{G} . An image I\mathcal{I}^{\prime} is sequentially mutated from I\mathcal{I} if I\mathcal{I}^{\prime} is generated after a sequence of one-time mutations(It0I1,I1t1I2,,IntnI)( denoted as It0,t1,,tnI)\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)

就是對原始圖像執行一系列的P或G操作,得到了變異後的圖像

Metamorphic Mutation. 然而,在模糊化過程中,一幅圖像可能會從原始圖像連續變異,在一系列變異之後生成有意義的圖像是具有挑戰性的。爲了提高變異的有效性,我們提出了Metamorphic Mutation.。

爲了儘可能保證突變圖像的有意義,我們採用了一種保守的策略,使得仿射變換隻被選擇一次,因爲多個仿射變換更容易產生無意義的圖像。我們假設仿射變換不會影響所選參數下的語義。像素值變換可以多次選擇,我們使用L0和L∞來限制像素級的變化。假設通過像素值變換將圖像i突變爲I0,則如果滿足f(i,I0)(等式1),則I0關於I是有意義的
f(I,I)={L255, if L0<α×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.
其中,0<α,β<1,L0表示變化的最大像素數,L_∞表示像素變化的最大值,size(I)表示圖像0<I0 < I中的像素數。

直觀地說,如果改變的像素數非常小(<α×Size(I)),我們假設它不改變語義,並且L_∞可以是任何值。如果更改的像素數超過邊界,則限制最大更改值(<β×255)。

G只執行一次,P可以執行多次,但P有限制,要麼變化像素數量少,變化程度高,要麼變化像素多,變化程度低

這個函數決定了突變的難易程度

Definition 2. Given a mutated image I\mathcal{I}, the original image (denoted as I0\mathcal{I}_{0} ) of I\mathcal{I} is the image in the initial seeds and I\mathcal{I} is one-time mutated or sequence mutated from I0\mathcal{I}_{0}, i.e., I0t0,,tnI,\mathcal{I}_{0} \stackrel{t_{0}, \ldots, t_{n}}{\longrightarrow} \mathcal{I}, where n0.n \geq 0 . The reference image (denoted as I0\mathcal{I}_{0}^{\prime} ) is defined as:
I0={Ij,0jn.tjGI0t0,,tjIjI0, \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.
參考圖像要麼是變異後的,要麼是原始圖像

算法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(II0))\beta \times 255 \times \operatorname{size}(\mathcal{I})-\operatorname{sum}\left(\operatorname{abs}\left(\mathcal{I}-\mathcal{I}_{0}^{\prime}\right)\right)

直觀地,突變勢近似地表示圖像i的突變空間,即滿足f(I0,I)f\left(\mathcal{I}_{0}^{\prime}, \mathcal{I}^{\prime}\right)的難度,β×255×Size(I)表示圖像可以更改的最大值

例如, 假設I\mathcal{I}^{\prime} 來自突變序列 I0:(I0t0I1,,IntnI),\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),中 序列前面的圖像 (e.g.,I1)\left(e . g ., \mathcal{I}_{1}\right)的突變潛力更可能高於在尾部的圖像(e.g., I\mathcal{I}^{\prime} ).

功率調度是DeepHunter爲不同種子(即圖像)決定變異機會的過程。爲了提高模糊化的效率,我們希望對更多具有較高突變潛力的圖像進行突變。

就是定義一個函數好選擇哪些種子突變

Plugable Coverage-Guided Fuzzing

在本文中,DeepHunter選擇六個不同的標準作爲不同的反饋,以確定是否應該保留新生成的批次以供進一步突變。該準則已被證明對捕獲內部DNN狀態是有用的。然而,由於每個神經元數值的巨大數值空間和DNN軟件的大規模性質,模糊器可能會因泛洪反饋而過載。事實上,如果沒有分類,具有相似神經元值的種子輸入將被不必要地保留。由於突變的本能,將會有大量這樣的突變體起源於給定的種子。爲了解決這個問題,我們將每個標準的數值神經元反饋間隔平均劃分爲不同的桶,每個桶將被視爲“等價類”。如果一個新的種子及其覆蓋範圍導致一個神經元落入現有的桶中,它就會失去興趣並被丟棄。該機制的靈感來自於傳統模糊框架(例如,AFL)中使用的“循環桶”實踐,以緩解跟蹤利用問題[45]。

BKNC是與TKNC相反的,選擇的是最不活躍的

Batch Prioritization

批次優先順序決定下一批應該挑選哪個批次。我們採用一種策略,即根據批次模糊化的次數以概率方式選擇批次。特別地,該概率是通過以下方式計算的:
P(B)={1f(B)/γ, if f(B)<(1pmin )×γpmin , 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.
其中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開發和部署過程中引入的潛在問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章