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

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

2018-08-01

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


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


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


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


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


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

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

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


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

微信圖片_20180801154022.jpg


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


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


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


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

微信圖片_20180801154049.jpg

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



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


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


4 實(shí)驗(yàn)結(jié)果


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


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


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


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


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


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


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

微信圖片_20180801154114.jpg

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


4.2 CGF 解決模型和量化版本不一致的問(wèn)題


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


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


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

微信圖片_20180801154146.jpg

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


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


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



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