[論文解讀] DeepMutation: Mutation Testing of Deep Learning Systems

DeepMutation: Mutation Testing of Deep Learning Systems

簡介

論文標題

  • DeepMutation: Mutation Testing of Deep Learning Systems
  • DeepMutation:深度學習系統的變異測試
  • 2018.8

貢獻

  • 提出了一種專門針對DL系統的變異測試框架和工作流程,實現了對測試數據集的質量評估和薄弱環節定位。
  • 我們設計了8個源級(即關於訓練數據和訓練程序)的變異算子,以將錯誤引入DL編程元素。我們進一步設計了8個變異算子,將故障直接注入到DL模型中。
  • 我們提出了兩個DL特定的突變測試度量,以允許對測試質量進行定量測量。
  • 我們在廣泛研究的DL數據集和模型上對所提出的突變測試框架進行了評估,以證明該技術的有效性,這也可以潛在地促進測試集的增強

即: 源級變異算子 模型級變異算子 兩個變異測試度量

作者又提出了 DeepMutation++: A Mutation Testing Framework for Deep Learning Systems ,進一步擴充了變異測試
令附MuNN: Mutation Analysis of Neural Networks的解讀網址

摘要

深度學習(DL)定義了一種新的數據驅動編程範例,其中內部系統邏輯在很大程度上是由訓練數據塑造的。評估DL模型的標準方法是在測試數據集上檢查它們的性能。測試數據集的質量對於獲得訓練模型的可信度非常重要。在使用不充分的測試數據集的情況下,已經達到較高測試精度的DL模型可能仍然缺乏通用性和健壯性。在傳統的軟件測試中,突變測試是一種成熟的測試集質量評估技術,它分析測試集在多大程度上檢測到注入的故障。然而,由於傳統軟件與基於深度學習的軟件有着根本的不同,傳統的變異測試技術不能直接應用於DL系統。本文提出了一種專門用於DL系統的變異測試框架來度量測試數據的質量。爲此,通過與傳統軟件相同的突變測試精神,我們首先定義了一組源級突變算子來向DL的源(即訓練數據和訓練程序)注入錯誤。然後,我們設計了一組模型級變異算子,直接向DL模型注入故障,而不需要訓練過程。最後,通過分析注入故障能被檢測到的程度來評價測試數據的質量。在兩個公共數據集,即MNIST和CIFAR-10上,用三個DL模型驗證了所提出的突變測試技術的有效性。

初步

突變測試

突變測試

對於傳統軟件來說,突變測試(MT)[6]已經被確立爲系統地評估測試數據質量和定位測試數據薄弱環節的最重要技術之一。MT的一個關鍵步驟是設計和選擇變異算子,這些變異算子將潛在的故障引入被測軟件(SUT),以創建SUT[6]、[7]的修改版本(即,突變體)。MT通過檢查測試集在多大程度上能夠檢測到突變體和對應的原始SUT的行爲差異來衡量測試的質量

DL系統的突變測試

對於DL系統的突變測試,合理的方法是設計突變算子,將潛在故障注入到訓練數據或DNN訓練程序中。在注入故障之後,使用突變的訓練數據或訓練程序重新執行訓練過程,以生成對應的突變的DL模型。

通過注入各種故障而產生的若干變異的DL模型: {M1,M2,,Mn}\left\{M_{1}^{\prime}, M_{2}^{\prime}, \ldots, M_{n}^{\prime}\right\}

原始模型:MM

針對測試集TT執行和分析每個突變模型MiM_{i}^{\prime} ,給定測試輸入tTt∈T,當M和MiM_{i}^{\prime}的輸出在t上不一致時,t檢測到MMMiM_{i}^{\prime}的行爲差異。

與傳統軟件的突變測試類似[6],原始DL模型M和突變模型 {M1,M2,,Mn}\left\{M_{1}^{\prime}, M_{2}^{\prime}, \ldots, M_{n}^{\prime}\right\}能被T檢測到,說明T的質量越高。

DL與傳統軟件區別

詳細區別可以看DL測試綜述

傳統軟件突變測試流程

傳統軟件突變測試[6]、[16]的一般過程如圖2所示。

  • 給定一個原始程序P,根據預定義的規則(突變操作符)創建一組錯誤程序P0(突變),每個規則(突變操作符)對P稍作修改。例如,突變操作符可以在語法上將程序中的‘+’操作符更改爲‘−’操作符[17]-[19]。
  • 通常在實際的突變測試過程開始之前的預處理步驟被用來過濾掉不相關的測試。具體地說,針對P執行完整測試集T,並且僅將通過的測試T0(T的子集)用於突變測試。
  • 在下一步中,P0的每個突變體在T0上執行。如果突變體P0∈P0的測試結果與P的測試結果不同則p0被殺死;否則,p0存活。
  • 當P0中的所有突變體都已經針對T0進行了測試時,突變得分計算爲殺死的突變體與所有生成的突變體的比率(即#muant kill/#muants all),這表明了測試集的質量。
  • 從概念上講,突變分數較高的測試套件更有可能捕獲程序中的真正缺陷[20]。在獲得突變測試結果之後,開發者可以基於來自突變測試的反饋[21]、[22]進一步提高測試集的質量(例如,通過添加/生成更多測試)。突變測試的總體目標是評估測試集T的質量,進而提供反饋和指導測試改進。

DL系統的源級突變測試

DL系統的源代碼級突變測試工作流

  • 圖3顯示了我們的源代碼級突變測試技術的關鍵工作流。在初始化階段,DL開發者準備訓練程序P和一組訓練數據D。在用D運行P的訓練過程之後,獲得DL模型M。
  • 當突變測試開始時,通過應用突變算子(在表I中定義)略微修改原始訓練數據D和程序P,並生成相應的突變體D0和P0
  • 在下一步中,訓練數據突變體或訓練程序突變體參與訓練過程,以生成突變的DL模型M0。當得到突變的DL模型時,針對過濾後的測試集T0執行和分析,以評估測試數據的質量。
  • 我們強調,本文提出的突變算子並不是爲了直接模擬人的錯誤,而是爲了提供對測試數據集的質量進行定量度量的方法。特別地,原始DL模型和突變模型(由變異算子產生)T0之間的行爲差異越大,T0的質量就越高。

DL系統的源級變異算子

我們提出了兩組變異算子,即數據變異算子和程序變異算子,它們對源進行相應的修改以引入潛在的故障(參見表I)。

1)數據變異算子:訓練數據在建立DL模型中起着至關重要的作用。訓練數據通常很大,並且手動標記[23]-[25]。準備訓練數據通常很費力,有時還容易出錯。我們的數據變異算子是基於對數據收集過程中可能出現的潛在問題的觀察而設計的。這些運算符可以全局地應用於所有類型的數據,或者僅局部地應用於整個訓練數據集中的特定類型的數據。

  • 數據重複(DR):DR操作員複製一小部分訓練數據。訓練數據通常來自多個來源,其中一些來源非常相似,並且同一數據點可以多次收集。
  • 標籤錯誤(LE):訓練數據集D中的每個數據點(d,l),其中d表示特徵數據,l是d的標籤。由於D通常相當大(例如,MNIST數據集[23]包含60,000個訓練數據),一些數據點可能被錯誤標記的情況並不少見。le操作符通過更改數據的標籤來注入此類錯誤。
  • 數據丟失(DM):DM操作員刪除一些訓練數據。由於疏忽或錯誤地刪除了一些數據點,可能會發生這種情況。
  • 數據打亂(DF):DF操作員在訓練過程之前將訓練數據打亂到不同的順序。理論上,針對同一組訓練數據運行的訓練程序應該獲得相同的DL模型。然而,訓練過程的實施往往對訓練數據的順序敏感。在準備訓練數據時,開發人員通常不太注意數據的順序,因此在訓練過程中很容易忽略這些問題
  • 噪聲擾動(NP):NP操作符隨機向訓練數據添加噪聲。數據點可能攜帶來自各種來源的噪音。例如,相機捕獲的圖像可能包括由不同天氣條件(即雨、雪、灰塵等)引起的噪音。NP操作員試圖模擬與有噪聲的訓練數據相關的潛在問題(例如,NP將隨機擾動添加到圖像的某些像素)。

2)程序變異算子:與傳統程序類似,訓練程序通常在特定的DL框架下使用高級編程語言(如Python和Java)進行編碼。傳統軟件[26]-[30]有很多基於語法的突變測試工具,直接將這些工具應用於培訓項目似乎很簡單。但是,由於DL培訓計劃對代碼更改非常敏感,因此此方法通常不起作用。即使是微小的改變也可能導致訓練程序在運行時失敗或產生明顯的訓練過程異常(例如,在訓練的早期迭代/時段中預測精度明顯較低)。考慮到DL訓練方案的特點,我們設計了以下操作員來注入潛在故障。

  • 層移除(LR):在刪除的層的輸入和輸出結構相同的情況下,LR隨機刪除DNN的一層。雖然可以刪除滿足該條件的任何層,但是任意刪除層可以生成與原始DL模型明顯不同的DL模型。因此,LR算子主要集中在層(例如,密集的BatchNormalization層[31]),其刪除不會對突變模型產生太大的影響。LR運算符模擬開發人員刪除表示DNN層的一行代碼的情況。
  • 層添加(LAS):與LR運算符不同,LAS運算符將層添加到DNNS結構。LA專注於添加層,如Activation、BatchNormalization,它引入了由於添加或複製表示DNN層的一行代碼而可能導致的故障。
  • 激活函數去除(AFRs):由於DNN具有較高的代表性(即量化爲VC維[15]),激活函數在DNNs的非線性中起着重要作用。AFRS操作符隨機刪除層的所有激活函數,以模擬開發人員忘記添加激活層的情況。

DL系統的變異測試度量

對於DL系統的突變測試,使用傳統軟件的突變得分指標進行突變測試是不合適的。在DL系統的突變測試中,當T0的規模較大時,T0相對容易殺死一個突變體m0,因此,如果我們直接使用DL系統的突變得分作爲被殺死的突變體與所有突變體的比率,我們的度量將失去評估DL系統測試數據質量的精度。

本文主要研究DL系統的分類問題。3假設我們有一個k-分類問題,設C={c1,,ck}C=\left\{c_{1}, \ldots, c_{k}\right\}是所有k類輸入數據。對於測試數據點tTt^{\prime} \in T^{\prime},如果滿足以下條件,我們說tt^{\prime}殺死了ciCc_{i} \in C類的突變體mMm^{\prime} \in M^{\prime}:

  • tt^{\prime}被原始DL模型M正確分類爲cic_{i}
  • tt^{\prime}未被mm^{\prime}分類爲cic_{i}

我們定義DL系統的突變分數如下,其中KilledClasses(T’,M’)是被T’中的測試數據殺死的m’的集合
MutationScore(T,M)=mM KilledClasses (T,m)M×C MutationScore \left(T^{\prime}, M^{\prime}\right)=\frac{\sum_{m^{\prime} \in M^{\prime}} | \text { KilledClasses }\left(T^{\prime}, m^{\prime}\right) |}{\left|M^{\prime}\right| \times|C|}
分子: 突變模型中分錯了多少個類 分母:所有的突變模型 *分類的數目

這個指標感覺不是很好,因爲只跟類別掛鉤,不細緻

一般來說,可能很難準確預測突變算子引入的行爲差異。爲了避免DL突變模型與其原始模型引入過多的行爲差異,我們提出了DL突變模型的質量控制程序。特別地,我們測量了每個突變體m0在T0上的錯誤率。如果m0的錯誤率對於T0來說太高,我們不認爲m0是一個好的突變候選因爲它引入了很大的行爲差異。我們從M0中排除了這樣的突變模型以供進一步分析。

我們定義了T0在每個變異模型mMm^{\prime} \in M^{\prime}上的平均錯誤率(AER),以衡量所有變異算子引入的整體行爲差異效應。
AveErrorRate(T,M)=mMErrorRate(T,m)M AveErrorRate \left(T^{\prime}, M^{\prime}\right)=\frac{\sum_{m^{\prime} \in M^{\prime}} \operatorname{ErrorRate}\left(T^{\prime}, m^{\prime}\right)}{\left|M^{\prime}\right|}
這兩個指標都是很簡單的

圖4顯示了用於二進制分類的DL模型的示例,其中具有原始模型的決策邊界和兩個變異模型的決策邊界。我們可以看到,突變模型更容易被綠色的數據殺死,綠色的數據位於原始DL模型的決策邊界附近。數據點越接近決策邊界,就越有可能殺死更多的變異模型,這反映在DL系統定義的變異分數和AER的增加上。一般而言,突變測試通過分析測試數據在多大程度上接近DNNs的決策邊界,便於評估測試集的有效性,因爲DNN的決策邊界更容易出現健壯性問題。

突變測試可以改變DL系統的行爲邊界,從而發現一些邊界錯誤

DL系統的模型級突變測試

(參見圖1)。通常,爲了提高突變測試的效率,許多傳統的突變測試技術被設計成在低級軟件表示(例如,字節碼[18]、[30]、二進制代碼[33]、[34])上工作,而不是在源代碼上工作,從而避免了程序編譯和轉換工作。在這一部分中,我們提出了DL系統的模型級突變測試,以便更有效地生成DL突變模型。

DL系統模型級突變測試工作流

圖5顯示了DL模型級別突變測試工作流的總體工作流。與修改原始訓練數據D和訓練程序P的源級突變測試不同,模型級突變測試直接從D和P改變通過訓練獲得的DL模型M。對於我們在表II中定義的模型級突變算子定義的每個DL突變模型M0∈M0,輸入測試數據集T在M上運行以過濾所有錯誤數據,並將通過的數據發送到運行每個M0。獲得的執行結果採用第III-C節中定義的相同突變度量進行分析和報告。

與源級突變測試類似,模型級突變測試也試圖評估測試數據集的有效性,並定位測試數據集的弱點,這有助於開發人員進一步增強測試數據,以練習被測DL模型的脆弱區域。由於DL模型的直接修改避免了訓練過程,因此,與傳統軟件的低級(例如,Java字節碼等中間代碼表示)突變測試技術類似,模型級突變測試有望更有效地生成DL突變模型。

DL系統的模型級變異算子

變異的訓練數據和訓練計劃最終會變異DL模型。然而,訓練過程可能很複雜,受各種參數(例如訓練週期數)的影響。爲了有效地引入可能的故障,我們進一步提出了模型級變異算子,直接對DL模型的結構和參數進行變異。表II總結了所提出的模型級變異算子,根據算子的應用範圍,這些算子的範圍從權重級別到層級。

  • 高斯模糊(GF):權重是DNN的基本元素,它描述神經元之間連接的重要性。權重對DNNs的決策邏輯有很大的貢獻。改變權重的一種自然方法是模糊化其值以更改其表示的連接重要性。GF運算符遵循高斯分佈N(w,σ2)\mathcal{N}\left(w, \sigma^{2}\right)以改變給定權重值w,其中σ是用戶可配置的標準偏差參數。GF運算符主要將權重模糊化到其附近的值範圍(即,模糊化值以99.7%的概率位於[w−3σ,w+3σ]中),但也允許以較小的機會將權重改變到更大的距離。
  • 權重混洗(WS):神經元的輸出通常由來自上一層的神經元決定,每一層神經元都與權重有關。WS操作符隨機選擇一個神經元,並將其連接到上一層的權重置亂。
  • 神經元效應阻塞(NEB):當測試數據點被讀取到DNN中時,它通過具有不同權重和神經元層的連接進行處理和傳播,直到產生最終結果。每個神經元根據其連接強度在一定程度上對DNN的最終決策做出貢獻。NEB算子阻止對下一層中所有連接神經元的神經元影響,這可以通過將其下一層的連接權重置爲零來實現。NEB消除了神經元對最終DNN決策的影響。
  • 神經元激活反轉(NAI):激活函數在創造DNNs的非線性行爲中起着關鍵作用。許多廣泛使用的激活函數(例如RELU[35]、Leaky
    REU[36])根據它們的激活狀態表現出相當不同的行爲。NAI操作符嘗試反轉神經元的激活狀態,這可以通過在應用神經元的激活函數之前改變其輸出值的符號來實現。這有助於創建更多的突變神經元激活模式,每個模式可以顯示DNNs的新的數學屬性(例如,線性屬性)[37]。
  • 神經元交換(NS):DNN層的神經元經常對下一層連接的神經元產生不同的影響。NS操作符在一層內切換兩個神經元,以交換它們對下一層的作用和影響。
  • 層停用(LD):DNN的每一層都轉換其上一層的輸出,並將其結果傳播到其後續層。LD運算符是一種層級突變運算符,它移除整個層的變換效果,就像從DNN中刪除一樣。但是,簡單地從訓練的DL模型中刪除一個層可能會破壞模型結構。我們將LD運算符限制爲輸入和輸出形狀一致的層。
  • 層添加(LAM):LAM運算符試圖通過向DNN添加一層來產生與LD運算符相反的效果。與LD運算符類似,LAM運算符在相同的條件下工作,以避免破壞原始DNN;此外,LAM運算符還包括在其原始層之後複製和插入複製的層,這也要求層輸入和輸出的形狀一致
  • 激活函數去除(AFRm):AFRm 操作符去除整層激活函數的影響。AFRM運算符與NAI運算符有兩個不同之處(1)AFRM在層級上工作,(2)AFRm算法去除了激活函數的影響,而NAI算子保留了激活函數,並試圖反轉神經元的激活狀態。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章