當前位置:
首頁 > 新聞 > Ian Goodfellow 最新論文:神經網路也能 Debug

Ian Goodfellow 最新論文:神經網路也能 Debug

如今,神經網路對人們生活產生的影響日漸深刻,應用領域日漸廣泛,包括醫療診斷、自動交通、公司決策、電網控制……神經網路有潛力去改變社會和日常生活中很多應用,拯救生命,為人們提供比人工更多的福利。然而,在這些福利到達之前,我們首先要確保神經網路足夠可靠擔此重任。

然而,機器學習的模型是出了名的難調試,對於神經網路更是如此,因此檢查神經網路運行中可能出現的錯誤一直是個棘手的問題。不過近日該領域又取得了新的進展——谷歌大腦的研究人員將自動軟體測試技術引入神經網路測試,並發現這種方法非常適合發現那些由罕見輸入引起的錯誤。

為此,來自 Google Brain 的Augustus Odena 以及 Ian Goodfellow 開發了專門針對神經網路的 CGF(coverge-guided fuzzing, 覆蓋引導模糊測試)方法,並通過實驗證明了它的有效性和強大的能力,並開發了名為 Tensorfuzz 的工具。

機器學習模型難以被理解和調試的原因是多方面的。首先,在概念上就很難確定用戶究竟想了解模型的哪一方面;其次,對於特定問題答案的統計和計算都十分困難。這些屬性也就導致了最近機器學習領域的「再現性危機」,難以通過調試得到可靠的結論困擾著人們。

而在機器學習模型中,神經網路更加難以調試。即使是針對結構簡單的神經網路模型的最直接的問題,計算代價也是十分巨大的。因為實際使用的神經網路模型和理論模型可能存在很大差異。

覆蓋引導模糊測試是一種軟體測試方法,用來檢查軟體中嚴重的漏洞。目前最常用的兩種覆蓋引導模糊測試方法是 AFL 和 libFuzzer。在測試過程中,一個模糊過程維護一個滿足特定條件的輸入語料庫。一些變異程序會對這些輸入進行隨機的改變,當它們行使了新的「覆蓋」時,就被保存到語料庫中。而什麼是覆蓋呢?這取決於模糊測試的種類和想要達到的目標。一個常見的衡量標準是依據已經被執行的代碼集合。如果新輸入在 if 條件語句中以不同於先前的方式分支,則覆蓋範圍增加。

這種方法在傳統軟體的測試中大獲成功,將其應用到神經網路中的想法就會自然而然地產生。傳統的覆蓋矩陣指標追蹤的是哪些代碼、哪些分支被覆蓋。而就最基本的形式來說,神經網路是一系列的矩陣運算和元素運算。這些運算的底層可能也包含很多分支,但這都將由矩陣的大小和神經網路的體系結構來決定。因此執行哪些分支取決於神經網路的輸入。而即使輸入不同,神經網路也通常執行相同的代碼行並採用相同的分支,但卻會由於輸入和輸出值的變化而產生有趣的行為。因此,現有的 CGF 工具難以發現這些有趣的行為。而在這項工作中,研究者選擇快速近似最近鄰演算法來確定兩組神經網路「激活」是否存在有意義的區別,即使神經網路的底層軟體實現沒有使用更多的分支。

這並非是第一次在該方面的探索。前人也曾提出一些覆蓋度量方法,但這些方法往往計算代價極大,難以在不同結構的神經網路上遷移。而研究者們在該工作中提出的度量方法則十分簡單,計算代價小,且可以非常容易地在各種結構的神經網路中應用。開源的工具 TensorFuzz 更加適合與神經網路的調試,因為其將輸入提供給任意的 TensorFlow 圖,不通過查看基本塊和控制流的變化,而是通過計算圖的激活率來衡量覆蓋率。

圖一:模糊測試主流程的粗略描述。左側為模糊測試的流程,並標示出了數據流;右側為模糊測試主流程的演算法表示。

以下為 CGF 的大致過程:

輸入的選擇:在任何時間,模糊控制器都要從語料庫中選擇輸入進行變異。最優的選擇取決於問題本身,通過特定的啟發式演算法進行搜索。

變異器:當選擇器選擇了語料庫的一個元素時,變異器將對其進行變異。對於圖像輸入,研究者實現了兩種不同類型的突變。第一種方法是將符合用戶可配置方差的白雜訊添加到輸入中。第二種是添加白雜訊,但是要限制變異元素與原始元素之間的差異。對於文本輸入,不能直接向字元串添加統一的雜訊,因此隨機執行以下操作:刪除隨機位置的字元;在隨機位置添加隨機字元;在隨機位置替換隨機字元。

目標函數:我們希望模型某種狀態,一般來說是錯誤的狀態。目標函數正是用來評估是否已經達到這種狀態。當輸入進入計算圖時,覆蓋數組和元數據數據都作為輸出返回。目標函數作用於元數據數組,標示那些滿足要求的輸入。

覆蓋分析器:覆蓋率分析器負責在 TensorFlow 運行時從中讀取數組,將其轉換為標示覆蓋的 python 對象,並檢查這些覆蓋是否是新的。

研究者將該方法應用到實踐之中,證明了其迅速發現錯誤的有效性。

首先,CGF 可以高效地檢查訓練好的神經網路中出現的數值錯誤,比如 NaN(Not a number 非數值類型)。這類錯誤可能只會由一小部分輸入產生,因此很難去調試。而在實踐中一旦出現這樣的情況,系統就可能會產生非常危險的行為。

圖二:研究者訓練了一個 MNIST 手寫數據集分類器,在訓練過程中進行了一些不安全的數值操作。接下來研究者在其上運行了 10 次模糊測試器,每一次都發現了一個不符合限定的數據元素,而隨機搜索則一個也沒有發現。左圖:運行 10 次時模糊語料庫的大小;右圖:模糊測試器發現的符合要求的圖像。

量化是神經網路的參數被存儲起來,由較少位的數值表示在計算機的存儲單元中進行計算的過程。這是一種常見的減少計算代價的方式,常被應用於智能手機客戶端的機器學習模型運行。但這種方式會在一定程度上損失計算精度。而這種損失導致的錯誤很難在已有的數據上發現,CGF 則可以在迅速的在其上找到許多錯誤。

圖三:研究者利用 32bit 浮點數訓練 MNIST 分類器,再將與之相關的 TensorFlow 圖截取為 16 位浮點數。原本的模型和截取後的在 MNIST 測試集的 10000 個元素上都做出了相同的預測。但 fuzzer 卻能夠發現他們之間的不同。左圖:運行 10 次時模糊語料庫的大小,一直向右延伸的線對應失敗的 fuzzer 運行;右圖:由 fuzzer 發現的圖像,它被 32 位和 16 位神經網路分到了不同的類別。

此外,CGF 還可以有效地檢測字元級語言模型中的不良行為。研究者已經開源了名為 TensorFuzz 的軟體庫,希望幫助更多研究人員和開發人員在他們的實際工作中應用這一方法。


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

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


請您繼續閱讀更多來自 DeepTech深科技 的精彩文章:

谷歌下一代 7 納米TPU驚爆棄台積電,轉單三星!
又一葯企出事:高血壓葯含致癌物,美歐兩大葯監局啟動緊急召回

TAG:DeepTech深科技 |