當前位置:
首頁 > 知識 > 谷歌大腦提出TensorFuzz,用機器學習debug神經網路

谷歌大腦提出TensorFuzz,用機器學習debug神經網路

選自arXiv

作者Augustus Odena、Ian Goodfellow

機器之心編譯

機器學習尤其是深度學習很難調試與修正,而最近谷歌大腦 Ian Goodfellow 等研究者發布了一個名為 TensorFuzz 的神經網路 Debug 開源庫。他們將傳統軟體工程中由覆蓋性引導的模糊方法引入到神經網路,並藉助機器學習方法實現 Debug 過程。

神經網路正逐漸影響人類生活環境,包括醫學診斷、自動駕駛、企業和司法決策過程、空中交通管制、以及電網控制。這些人類可以做到的事,神經網路也有可能做到。它可以拯救生命、為更多的人提供幫助。然而,在實現這些應用之前,我們首先需要確定神經網路到底是不是可靠的,因此它的修正和調試方法恰恰是我們現在所缺失的。

眾所周知,由於各種原因,機器學習模型難以調試或解釋,一是從概念上難以說明用戶想要了解的模型信息,而且通過統計和計算也難以獲得指定問題的答案。這個特性導致最近的機器學習出現「復現危機」,因為我們很難對不好調試的技術做出可靠的實驗結論。

即使是與神經網路直接相關的簡單問題也可能會有巨大的計算量,而且使用深度學習框架實現的神經網路也可能和理論模型相去甚遠,所以神經網路非常難以調試。例如,ReluPlex 可以形式上地驗證神經網路的一些特性,但由於計算成本太高,無法擴展到實際模型中。此外,ReluPlex 通過將 ReLU 網路描述為一個分段線性函數來進行分析,它使用一個矩陣乘法都為線性的理論模型。但實際上,由於浮點演算法的存在,計算機上的矩陣乘法並非線性的,機器學習演算法可以學習利用這種特性進行非線性運算。這並不是要批評 ReluPlex,而是想說明應該需要更多與軟體直接交互地測試演算法,以便更客觀地測試因為深度學習框架而偏離理論的模型。

在 Ian Goodfellow 等人的這項研究中,他們使用傳統軟體工程已有的技術,即由覆蓋性引導的模糊方法(coverage-guided fuzzing,CGF),並修正這種技術以用來測試神經網路。根據 Goodfellow 等研究者在原論文中所述,該項工作的主要貢獻有以下幾點:

為神經網路引入 CGF 概念,並描述了快速近似最近鄰演算法如何以通用的方式檢查覆蓋性。

為 CGF 技術構建了一個名為 TensorFuzz 的開源庫。

使用 TensorFuzz 可在已訓練神經網路搜索數值問題、在神經網路和對應經量化處理的網路間生成不一致性度量、在字元級語言模型中表現的不良行為。

下圖描述了整體的 Fuzzer 過程,它與普通計算機程序的 CGF 結構非常相似,只不過它不與經檢測的計算機程序交互,而是與 TensorFlow 的靜態計算圖進行交互。

如上左圖所示,Fuzzer 由 Seed 語料庫開始,它為計算圖提供至少一組輸入。研究者將這些輸入限制為有效的網路輸入,例如對於圖像輸入,研究者可以限制輸入數據有正確的圖像尺寸和 RGB 通道數。在給定 Seed 語料庫後,輸入選擇器將從輸入語料庫中選擇不同的元素,例如輸入選擇器可以是以隨機的方法選擇輸入。

給定有效的輸入,Mutator 會對輸入做一些修改,這種修改可能只是簡單地翻轉圖像像素,同樣也可以是在修改總量的某些約束下對圖像進行修改。Mutator 輸出的修改數據隨後可以輸入到神經網路中,TensorFuzz 需要從神經網路抽取出兩種信息,即抽取一組元數據數組以計算目標函數,抽取一組覆蓋性數組以計算實際覆蓋性。計算覆蓋性後,如果 Mutator 修改的數據需要執行覆蓋,則將它添加到輸入語料庫中,如果計算的目標函數滿足條件,則可以添加到測試案例列表中。

如上右圖為 Fuzzer 主體過程的偽代碼,在滿足迭代數的情況下,從輸入語料庫中抽取樣本為 parent,並使用 Mutate() 函數對該樣本做修改以產生新的樣本 data。樣本 data 隨後輸入到神經網路,並通過 Fetch() 函數從該神經網路抽取覆蓋性 cov 和元數據 meta 兩個向量。接下來只需要通過 IsNewCoverage() 和 Objective() 兩個函數判斷 cov 和 meta 兩個向量是不是滿足條件,滿足的話就能分別將 data 樣本加入到輸入語料庫和測試案例列表。

以上只是 Fuzzer 主體過程的一般描述,Chooser、Mutator 以及 Fetcher 的具體結構與演算法讀者可詳細查閱原論文。

論文:TensorFuzz: Debugging Neural Networks with Coverage-Guided Fuzzing

論文地址:https://arxiv.org/pdf/1807.10875.pdf

眾所周知,機器學習模型的解釋和調試非常困難,神經網路更是如此。在本文中,我們為神經網路引入了自動化軟體測試技術,該技術非常適合發掘僅在少量輸入下出現的錯誤。具體而言,我們為神經網路開發了由覆蓋引導的模糊(coverage-guided fuzzing,CGF)方法。在 CGF 中,神經網路輸入的隨機變化由覆蓋性度量(coverage metric)引導,以滿足用戶指定的約束。我們描述了快速近似最近鄰演算法如何為神經網路提供這種覆蓋性度量方法,並討論了 CGF 在以下目標中的應用:在已訓練神經網路中搜索數值誤差、在神經網路和對應經量化處理的網路間生成不一致性度量、在字元級語言模型中表現不良行為。最後,我們發布了一個名為 TensorFuzz 的開源庫,它實現了本論文所描述的技術。

4 實驗結果

我們簡要展示了 CGF 技術的一些應用以證實它的通用性質。

4.1 CGF 可以高效地找到已訓練神經網路的數值錯誤

由於神經網路使用浮點數運算,它們對於訓練期間及評估過程中的數值錯誤很敏感。眾所周知,這些問題是很難調試的,部分原因是它們可能僅由一小部分很少遇到的輸入所觸發。這正是 CGF 能發揮作用的一個案例。我們專註於尋找導致非數(not-a-number,NaN)值的輸入。並總結出如下結論:

找出數值錯誤很重要。數值錯誤,尤其是那些導致 NaN 的數值錯誤,假如在現實應用中首次遇到這些錯誤,重要系統將做出嚴重的危險行為。CGF 可以用於在部署系統之前找到大量的錯誤,並減少錯誤在危險環境中造成的風險。

CGF 可以快速找到數值錯誤。通過 CGF,我們可以簡單地添加檢查數值選項到元數據中,並運行我們的 fuzzer。為了測試這個假設,我們訓練了一個全連接神經網路來分類 MNIST[26] 數字。我們故意使用了一個實現效果比較差的交叉熵損失函數,以增加數值錯誤出現的可能性。我們用 100 的 mini-batch 大小訓練了 35000 個迭代步,直到達到 98% 的驗證準確率。然後我們檢查到,不存在導致數值錯誤的 MNIST 數據集元素。儘管如此,TensorFuzz 卻在多個隨機初始化中快速找到了 NaN,如圖 2 所示。

基於梯度的搜索技術可能無法幫助尋找數值錯誤。CGF 的一個潛在缺陷是,基於梯度的搜索技術可能比隨機搜索技術更加高效。然而,我們並不清楚如何明確基於梯度搜索的目標。目前不存在度量模型的真值輸出和 NaN 值相似性的直接方法。

隨機搜索在尋找某些數值錯誤方面是極度低效的。為了證實隨機搜索不夠高效且覆蓋引導對於提高效率很有必要,我們對比了隨機搜索方法。我們實現了一個基線隨機搜索演算法,並用 10 個不同的隨機初始化在語料庫的 10 萬個樣本上運行了該演算法。基線演算法在所有實驗中未找到一個非限定元素。

圖 2:我們訓練了一個包含某些不穩定數值運算的 MNIST 分類器。然後我們在 MNIST 數據集的隨機種子上運行 fuzzer10 次。fuzzer 在每次運行中都找到了一個非限定元素。而隨機搜索未能找到一個非限定元素。左圖:運行過程中(共運行 10 次)fuzzer 的累積語料庫大小。右圖:由 fuzzer 找到的滿足條件的圖像示例。

4.2 CGF 解決模型和量化版本不一致的問題

量化(quantization)[18] 是一種神經網路權重被保存,且在執行神經網路計算的時候使用更少計算內存位數來表示數值的過程。量化常被用來減少神經網路的計算成本或大小。它還被廣泛用於在手機的安卓神經網路 API 或 TFLite 上,以及在自定製機器學習硬體(例如谷歌的 Tensor Processing Unit[20])上運行神經網路推理。

尋找由量化導致的錯誤非常重要:當然,如果量化顯著減少了模型準確率,那量化就沒有什麼意義了。給定一個量化模型,如果能檢查出多少量化減少了準確率最好。

僅檢查已有的數據只能找到很少的錯誤:作為基線實驗,我們訓練了一個使用 32 位浮點數的 MNIST 分類器(這一次沒有故意引入數值錯誤)。然後把所有權重和激活值修剪為 16 位。之後,我們對比了 32 位和 16 位模型在 MNIST 測試集上的預測,沒有找到任何不一致性。

CGF 可以快速在數據周圍的小區域中找到很多錯誤:然後運行 fuzzer,變化限制在種子圖像周圍的半徑為 0.4 的無限範數球中,其中僅使用了 32 位模型作為覆蓋的激活值。我們將輸入限制在種子圖像附近,因為這些輸入幾乎都有明確的類別語義。模型的兩個版本在域外的垃圾數據(沒有真實類別)上出現不一致性並沒有什麼意義。通過這些設置,fuzzer 可以生成 70% 樣本的不一致性。因此,CGF 允許我們尋找在測試時出現的真實錯誤,如圖 3 所示。

隨機搜索在給定和 CGF 相同的變化數量下無法找到新的錯誤:如 4.1 節所述,我們試驗了一個基線隨機搜索方法以表明覆蓋引導在這種設置下特別有用。隨機搜索基線在給定和 fuzzer 相同的變化數量下無法找到新的任何不一致性。

圖 3:我們訓練了一個 32 位浮點數的 MNIST 分類器,然後將對應的 TensorFlow 圖修剪為 16 位浮點數圖,原始的和修剪後的圖都在 MNIST 測試集的全部 10000 個元素上執行相同的預測,但 fuzzer 可以找到大約 70% 的測試圖像中半徑為 0.4 的無窮範數球中的不一致性。左圖:fuzzer 的累積語料庫大小隨運行次數(共 10 次)的變化。那些一路朝右的曲線對應失敗的模糊化(fuzzing)運行。右圖:由 fuzzer 找到的被 32 位和 16 位神經網路分類為不同類別的圖像。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

Feature Tools:可自動構造機器學習特徵的Python庫
華為麒麟AI性能是高通的3.5倍?這是所有手機運行神經網路的能力

TAG:機器之心 |