眾所周知,神經(jīng)網(wǎng)絡(luò)難以debug。谷歌大腦的Augustus Odena和Ian Goodfellow提出了一種新方法,能夠自動(dòng)Debug神經(jīng)網(wǎng)絡(luò)。Goodfellow表示,希望這將成為涉及ML的復(fù)雜軟件回歸測(cè)試的基礎(chǔ),例如,在推出新版本的網(wǎng)絡(luò)之前,使用fuzz來(lái)搜索新舊版本之間的差異。
眾所周知,由于各種原因,機(jī)器學(xué)習(xí)模型難以調(diào)試(debug)或解釋。這造成了最近機(jī)器學(xué)習(xí)的“可重復(fù)性危機(jī)”(reproducibility crisis)——對(duì)難以調(diào)試的技術(shù)做出可靠的實(shí)驗(yàn)結(jié)論是很棘手的。
神經(jīng)網(wǎng)絡(luò)又特別難以debug,因?yàn)榧词故窍鄬?duì)直接的關(guān)于神經(jīng)網(wǎng)絡(luò)的形式問(wèn)題,解決的計(jì)算成本也很高,而且神經(jīng)網(wǎng)絡(luò)的軟件實(shí)現(xiàn)可能與理論模型有很大的差異。
在這項(xiàng)工作中,我們利用傳統(tǒng)軟件工程中的一種技術(shù)——覆蓋引導(dǎo)模糊測(cè)試(coverage guided fuzzing,CGF),并將其應(yīng)用于神經(jīng)網(wǎng)絡(luò)的測(cè)試。
具體來(lái)說(shuō),這項(xiàng)工作有以下貢獻(xiàn):
我們對(duì)神經(jīng)網(wǎng)絡(luò)引入了CGF的概念,并描述了如何用快速近似最近鄰算法( fast approximate nearest neighbors algorithms)以通用的方式檢查覆蓋率。
我們開源了一個(gè)名為TensorFuzz的CGF軟件庫(kù)。
我們使用TensorFuzz在已訓(xùn)練的神經(jīng)網(wǎng)絡(luò)中查找數(shù)值問(wèn)題,在神經(jīng)網(wǎng)絡(luò)及其量化版本之間查找分歧,以及在字符級(jí)語(yǔ)言模型中查找不良行為。
圖1:fuzzing主循環(huán)的簡(jiǎn)略描述。左:模糊測(cè)試程序圖,表示數(shù)據(jù)的flow。右:用算法的形式描述了模糊測(cè)試過(guò)程的主循環(huán)。
覆蓋引導(dǎo)模糊測(cè)試(Coverage-guided fuzzing)
在實(shí)際的軟件測(cè)試中,覆蓋引導(dǎo)模糊測(cè)試(Coverage-guided fuzzing)被用來(lái)查找許多嚴(yán)重的bug。最常用的兩種coverage-guided模糊測(cè)試器是AFL和libFuzzer。這些模糊測(cè)試器已經(jīng)以各種方式被擴(kuò)展,以使它們更快、或增加代碼中特定部分可以被定位的范圍。
在CGF的過(guò)程中,模糊測(cè)試過(guò)程維護(hù)一個(gè)輸入語(yǔ)料庫(kù),其中包含正在考慮的程序的輸入。根據(jù)一些突變程序?qū)@些輸入進(jìn)行隨機(jī)變化,并且當(dāng)它們行使新的“覆蓋”時(shí),突變輸入( mutated inputs)被保存在語(yǔ)料庫(kù)中。
“覆蓋率”(coverage)是什么呢?這取決于模糊器的類型和當(dāng)前的目標(biāo)。一種常見的衡量標(biāo)準(zhǔn)是已經(jīng)執(zhí)行的代碼部分的集合。在這種度量下,如果一個(gè)新的輸入導(dǎo)致代碼在if語(yǔ)句中以不同于先前的方式分支,那么覆蓋率就會(huì)增加。
CGF在識(shí)別傳統(tǒng)軟件中的缺陷方面非常成功,因此我們很自然地會(huì)問(wèn),CGF是否可以應(yīng)用于神經(jīng)網(wǎng)絡(luò)?
傳統(tǒng)的覆蓋率度量標(biāo)準(zhǔn)要跟蹤哪些代碼行已經(jīng)執(zhí)行。在最基本的形式中,神經(jīng)網(wǎng)絡(luò)被實(shí)現(xiàn)為一系列的矩陣乘法,然后是元素運(yùn)算。這些操作的底層軟件實(shí)現(xiàn)可能包含許多分支語(yǔ)句,但其中大多都是基于矩陣的大小,或基于神經(jīng)網(wǎng)絡(luò)的架構(gòu)。因此,分支行為大多獨(dú)立于神經(jīng)網(wǎng)絡(luò)輸入的特定值。在幾個(gè)不同的輸入上運(yùn)行的神經(jīng)網(wǎng)絡(luò)通常會(huì)執(zhí)行相同的代碼行,并使用相同的分支,但是由于輸入和輸出值的變化,會(huì)產(chǎn)生一些有趣的行為變化。因此,使用現(xiàn)有的CGF工具(如AFL)可能不會(huì)發(fā)現(xiàn)神經(jīng)網(wǎng)絡(luò)的這些行為。
在這項(xiàng)工作中,我們選擇使用快速近似最近鄰算法來(lái)確定兩組神經(jīng)網(wǎng)絡(luò)的“激活”是否有意義上的不同。這提供了一個(gè)覆蓋率的度量(coverage metric),即使神經(jīng)網(wǎng)絡(luò)的底層軟件實(shí)現(xiàn)沒(méi)有使用很多依賴于數(shù)據(jù)的分支,也能為神經(jīng)網(wǎng)絡(luò)生成有用的結(jié)果。
TensorFuzz庫(kù)
從前面描述的模糊測(cè)試器中獲得靈感,我們做了一個(gè)工具,稱之為TensorFuzz。它的工作方式與其他模糊測(cè)試器類似,但它更適合神經(jīng)網(wǎng)絡(luò)的測(cè)試。
TensorFuzz不是用C或C++編寫的,而是向任意的TensorFlow graph提供輸入。TensorFuzz也不是通過(guò)查看基本的blocks或控制流中的變化來(lái)測(cè)量覆蓋率,而是通過(guò)查看計(jì)算圖的“激活”。我們?cè)谡撐闹性敿?xì)討論了模糊測(cè)試器的總體架構(gòu),包括數(shù)據(jù)流和基本構(gòu)建塊,以及語(yǔ)料庫(kù)如何抽樣,如何執(zhí)行突變,如何評(píng)估覆蓋率和目標(biāo)函數(shù)等,具體請(qǐng)閱讀原論文。
實(shí)驗(yàn)結(jié)果
我們簡(jiǎn)要介紹了CGF技術(shù)的各種應(yīng)用,證明它在一般設(shè)置中是有用的。
CGF可以有效地發(fā)現(xiàn)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)中的數(shù)值誤差
由于神經(jīng)網(wǎng)絡(luò)使用浮點(diǎn)數(shù)學(xué),因此無(wú)論是在訓(xùn)練期間還是在評(píng)估期間,它們都容易受到數(shù)值問(wèn)題的影響。眾所周知,這些問(wèn)題很難debug,部分原因是它們可能只由一小部分很少遇到的輸入觸發(fā)。這是CGF可以提供幫助的一個(gè)例子。我們專注于查找導(dǎo)致非數(shù)(NaN)值的輸入。
CGF可以快速地找到數(shù)值誤差(numerical errors):使用CGF,我們應(yīng)該能夠簡(jiǎn)單地將檢查數(shù)值運(yùn)算添加到元數(shù)據(jù)并運(yùn)行模糊測(cè)試器(fuzzer)。為了驗(yàn)證這一假設(shè),我們訓(xùn)練了一個(gè)完全連接的神經(jīng)網(wǎng)絡(luò)來(lái)對(duì)MNIST數(shù)據(jù)集里的數(shù)字進(jìn)行分類。我們故意用了一個(gè)很糟糕的交叉熵?fù)p失,這樣就有可能出現(xiàn)數(shù)值誤差。我們對(duì)模型進(jìn)行了35000步的訓(xùn)練, mini-batch size為100,驗(yàn)證精度為98%。然后檢查MNIST數(shù)據(jù)集中是否有導(dǎo)致數(shù)值誤差的元素。
如圖2所示,TensorFuzz在多個(gè)隨機(jī)初始化過(guò)程中快速發(fā)現(xiàn)了NaN。
圖2:我們使用一些不安全的數(shù)值運(yùn)算訓(xùn)練了一個(gè)MNIST分類器。然后,對(duì)來(lái)自MNIST數(shù)據(jù)集的隨機(jī)種子運(yùn)行10次fuzzer。fuzzer每次運(yùn)行都發(fā)現(xiàn)了一個(gè)non-finite元素,而隨機(jī)搜索從未發(fā)現(xiàn)過(guò)non-finite元素。左:fuzzer運(yùn)行時(shí)的累計(jì)語(yǔ)料庫(kù)大小,運(yùn)行10次。右:fuzzer找到一個(gè)滿意的圖像。
其他發(fā)現(xiàn):
基于梯度的搜索技術(shù)可能無(wú)助于查找數(shù)值誤差
隨機(jī)搜索對(duì)于查找數(shù)值誤差來(lái)說(shuō)效率極低
CGF反映了模型與其量化版本之間的分歧
量化(Quantization)是一個(gè)存儲(chǔ)神經(jīng)網(wǎng)絡(luò)權(quán)重的過(guò)程,并使用由較少內(nèi)存位組成的數(shù)值表示來(lái)執(zhí)行神經(jīng)網(wǎng)絡(luò)計(jì)算。量化是降低神經(jīng)網(wǎng)絡(luò)計(jì)算成本或減小網(wǎng)絡(luò)尺寸的流行方法,并廣泛用于在手機(jī)上運(yùn)行神經(jīng)網(wǎng)絡(luò)推理,例如 Android Neural Networks API或TFLite,以及在自定義機(jī)器學(xué)習(xí)硬件中運(yùn)行推理,例如谷歌的TPU或NVIDIA的TensorRT。
找到量化產(chǎn)生的誤差很重要:當(dāng)然,如果量化顯著地降低了模型的準(zhǔn)確性,那么量化就沒(méi)有多大用處。給定一個(gè)量化模型,檢查量化在多大程度上降低了精度是有用的。
通過(guò)檢查現(xiàn)有數(shù)據(jù)幾乎找不到錯(cuò)誤:作為基線實(shí)驗(yàn),我們使用32位浮點(diǎn)數(shù)訓(xùn)練了一個(gè)MNIST分類器(這次沒(méi)有故意引入數(shù)值問(wèn)題)。 然后,將所有權(quán)重和激活截?cái)酁?6-bits,我們?cè)贛NIST測(cè)試集上比較了32-bit和16-bit模型的預(yù)測(cè)精度,沒(méi)有發(fā)現(xiàn)不一致。
但是,CGF可以快速地在數(shù)據(jù)周圍的小區(qū)域找到許多錯(cuò)誤,如圖3所示。
圖3:我們訓(xùn)練了一個(gè)32-bit浮點(diǎn)數(shù)的MNIST分類器,然后將相關(guān)的TensorFlow graph截為16-bit 浮點(diǎn)數(shù)。左:fuzzer運(yùn)行時(shí)的累計(jì)語(yǔ)料庫(kù)大小,運(yùn)行10次。右:fuzzer找到了16-bit 和32-bit 的神經(jīng)網(wǎng)絡(luò)分類不同的圖像
結(jié)果顯示,fuzzer在我們嘗試的70%的示例中產(chǎn)生了分歧。也就是說(shuō),CGF可以找到在測(cè)試時(shí)可能發(fā)生的真正錯(cuò)誤。
在給定與CGF相同數(shù)量的突變的情況下,隨機(jī)搜索未能找到新的錯(cuò)誤。
結(jié)論
我們提出了神經(jīng)網(wǎng)絡(luò)的覆蓋引導(dǎo)模糊測(cè)試的概念,并描述了如何在這種情況下構(gòu)建一個(gè)有用的覆蓋率檢查器。我們已經(jīng)通過(guò)使用TensorFuzz查找數(shù)值誤差、發(fā)現(xiàn)神經(jīng)網(wǎng)絡(luò)和它們的量化版本之間的分歧、以及在RNN中找到不良行為等試驗(yàn),證明了TensorFuzz的實(shí)用性。最后,我們將同時(shí)發(fā)布TensorFuzz的實(shí)現(xiàn),以便其他研究人員既可以在我們的工作基礎(chǔ)上進(jìn)行研究,也可以使用fuzzer來(lái)查找實(shí)際的問(wèn)題。
-
谷歌
+關(guān)注
關(guān)注
27文章
6231瀏覽量
108103 -
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4814瀏覽量
103550
原文標(biāo)題:谷歌大腦開源TensorFuzz,自動(dòng)Debug神經(jīng)網(wǎng)絡(luò)!
文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于LabVIEW8.2提取ECG特征點(diǎn)的新方法
人工神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)方法有哪些?
神經(jīng)網(wǎng)絡(luò)移植到STM32的方法
卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用
提高傳感器精度的神經(jīng)網(wǎng)絡(luò)方法
神經(jīng)網(wǎng)絡(luò)電力電子裝置故障診斷技術(shù)
基于神經(jīng)網(wǎng)絡(luò)的傳感器故障監(jiān)測(cè)與診斷方法研究
基于神經(jīng)網(wǎng)絡(luò)的傳感器故障監(jiān)測(cè)與診斷方法研究
提高傳感器精度的神經(jīng)網(wǎng)絡(luò)方法
傳感器故障檢測(cè)的Powell神經(jīng)網(wǎng)絡(luò)方法
神經(jīng)網(wǎng)絡(luò)在電磁場(chǎng)數(shù)值問(wèn)題中的應(yīng)用

基于GA優(yōu)化T_S模糊神經(jīng)網(wǎng)絡(luò)的小電流接地故障選線新方法_王磊
DENSER是一種用進(jìn)化算法自動(dòng)設(shè)計(jì)人工神經(jīng)網(wǎng)絡(luò)(ANNs)的新方法

一種基于深度神經(jīng)網(wǎng)絡(luò)的迭代6D姿態(tài)匹配的新方法
人工神經(jīng)網(wǎng)絡(luò)的原理和多種神經(jīng)網(wǎng)絡(luò)架構(gòu)方法

評(píng)論