《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > 開源 | 谷歌大腦提出TensorFuzz,用機器學習debug神經(jīng)網(wǎng)絡(luò)

開源 | 谷歌大腦提出TensorFuzz,用機器學習debug神經(jīng)網(wǎng)絡(luò)

2018-08-01

機器學習尤其是深度學習很難調(diào)試與修正,而最近谷歌大腦 Ian Goodfellow 等研究者發(fā)布了一個名為 TensorFuzz 的神經(jīng)網(wǎng)絡(luò) Debug 開源庫。他們將傳統(tǒng)軟件工程中由覆蓋性引導(dǎo)的模糊方法引入到神經(jīng)網(wǎng)絡(luò),并借助機器學習方法實現(xiàn) Debug 過程。


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


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


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


在 Ian Goodfellow 等人的這項研究中,他們使用傳統(tǒng)軟件工程已有的技術(shù),即由覆蓋性引導(dǎo)的模糊方法(coverage-guided fuzzing,CGF),并修正這種技術(shù)以用來測試神經(jīng)網(wǎng)絡(luò)。根據(jù) Goodfellow 等研究者在原論文中所述,該項工作的主要貢獻有以下幾點:


為神經(jīng)網(wǎng)絡(luò)引入 CGF 概念,并描述了快速近似最近鄰算法如何以通用的方式檢查覆蓋性。

為 CGF 技術(shù)構(gòu)建了一個名為 TensorFuzz 的開源庫。

使用 TensorFuzz 可在已訓(xùn)練神經(jīng)網(wǎng)絡(luò)搜索數(shù)值問題、在神經(jīng)網(wǎng)絡(luò)和對應(yīng)經(jīng)量化處理的網(wǎng)絡(luò)間生成不一致性度量、在字符級語言模型中表現(xiàn)的不良行為。


下圖描述了整體的 Fuzzer 過程,它與普通計算機程序的 CGF 結(jié)構(gòu)非常相似,只不過它不與經(jīng)檢測的計算機程序交互,而是與 TensorFlow 的靜態(tài)計算圖進行交互。

微信圖片_20180801154022.jpg


如上左圖所示,F(xiàn)uzzer 由 Seed 語料庫開始,它為計算圖提供至少一組輸入。研究者將這些輸入限制為有效的網(wǎng)絡(luò)輸入,例如對于圖像輸入,研究者可以限制輸入數(shù)據(jù)有正確的圖像尺寸和 RGB 通道數(shù)。在給定 Seed 語料庫后,輸入選擇器將從輸入語料庫中選擇不同的元素,例如輸入選擇器可以是以隨機的方法選擇輸入。


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


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


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

微信圖片_20180801154049.jpg

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



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


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


4 實驗結(jié)果


我們簡要展示了 CGF 技術(shù)的一些應(yīng)用以證實它的通用性質(zhì)。


4.1 CGF 可以高效地找到已訓(xùn)練神經(jīng)網(wǎng)絡(luò)的數(shù)值錯誤


由于神經(jīng)網(wǎng)絡(luò)使用浮點數(shù)運算,它們對于訓(xùn)練期間及評估過程中的數(shù)值錯誤很敏感。眾所周知,這些問題是很難調(diào)試的,部分原因是它們可能僅由一小部分很少遇到的輸入所觸發(fā)。這正是 CGF 能發(fā)揮作用的一個案例。我們專注于尋找導(dǎo)致非數(shù)(not-a-number,NaN)值的輸入。并總結(jié)出如下結(jié)論:


找出數(shù)值錯誤很重要。數(shù)值錯誤,尤其是那些導(dǎo)致 NaN 的數(shù)值錯誤,假如在現(xiàn)實應(yīng)用中首次遇到這些錯誤,重要系統(tǒng)將做出嚴重的危險行為。CGF 可以用于在部署系統(tǒng)之前找到大量的錯誤,并減少錯誤在危險環(huán)境中造成的風險。


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


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


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

微信圖片_20180801154114.jpg

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


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


量化(quantization)[18] 是一種神經(jīng)網(wǎng)絡(luò)權(quán)重被保存,且在執(zhí)行神經(jīng)網(wǎng)絡(luò)計算的時候使用更少計算內(nèi)存位數(shù)來表示數(shù)值的過程。量化常被用來減少神經(jīng)網(wǎng)絡(luò)的計算成本或大小。它還被廣泛用于在手機的安卓神經(jīng)網(wǎng)絡(luò) API 或 TFLite 上,以及在自定制機器學習硬件(例如谷歌的 Tensor Processing Unit[20])上運行神經(jīng)網(wǎng)絡(luò)推理。


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


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

微信圖片_20180801154146.jpg

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


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


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



本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。