忽悠神經網絡指南:教你如何把深度學習模型騙得七葷八素

知己知彼,無論你是想成爲黑客(最好不要!)或防範未來黑客的入侵,都有必要來了解一下如何騙過由海量數據訓練出來的深度學習模型。
只要有程序員還在編程,黑客們就會不遺餘力地找尋利用這些程序的方法。惡意黑客更是會利用程序中最爲微小的漏洞來侵入系統,竊取數據,對系統造成嚴重破壞。

但由深度學習算法驅動的系統應該是能夠避免人爲干擾的,對吧? 一個黑客怎麼能夠突破被TB(兆兆字節)級數據訓練的神經網絡呢?

然而事實證明,即使是最先進的深層神經網絡也是很容易被欺騙的。只需要使用一些小技巧,你就可以迫使模型預測出你想要的任何結果:

image


我們可以修改上面這幅喵星人照片好讓它被模型識別爲烤麪包機。

因此,在你將啓用由深層神經網絡驅動的新系統之前,讓我們詳細瞭解一下如何去破壞系統以及如何保護自己的系統免受黑客的攻擊。


神經網絡幫助人們保護網絡安全

現在我們假設自己經營着一個像Ebay這樣的拍賣網站。在我們的網站上,我們想防止人們出售違禁物品——比如活的動物。

但是假如你有數百萬的用戶,執行這些規則將是非常困難的。我們可以聘請上百人去手動審查每一個拍賣清單,但這無疑將非常昂貴。相反,我們可以使用深度學習去自動檢查拍賣照片是否屬於違禁物品,並對那些違禁品照片進行標記。

這是一個典型的圖像分類問題。爲了搭建這個模型,我們將訓練一個深層卷積神經網絡來從合規物品中識別出違禁物品,之後將識別模型運行於網站上的所有照片。

首先,我們需要一個基於歷史拍賣列表的含有成千上萬個拍賣圖片的數據集。 數據集需要既有合規物品圖片又有違禁物品圖片,以便於我們訓練神經網絡來區別他們:


image


然後着手開始訓練神經網絡,這裏我們使用標準的反向傳播算法。這個算法的原理是,我們通過一個訓練圖片,傳遞該圖片的預期結果,然後回到神經網絡中的每一層去輕微地調節他們的權重,從而使模型更好地產生該圖片的正確輸出:


image


我們使用數千張照片重複上述過程上千次,直到模型以可接受的準確性穩定地輸出正確結果爲止。

最終我們將得到一個可以穩定地將圖像分類的神經網絡模型:


image

但事情往往並不如他們看起來的那麼可靠…

卷積神經網絡在對圖像進行整體識別和分類上是非常強大的。他們在識別複雜形狀和圖案時並不受其在畫面中所處位置的影響。在許多圖像識別任務中,它們的表現可以媲美甚至於擊敗人類的表現。

對於這樣高端的模型,如果將圖像中的一些像素加黑或者變亮,對最終的預測結果不應該有很大的影響,對吧?是的,它有可能會輕微改變預測結果的可能性概率,但不會將圖像的預測結果從“違禁品”改判爲“合規品”。

image

我們期望的是:輸入照片的微小變化只會對最終預測結果造成微小的變化。

然而,2013年的著名論文《神經網絡的有趣特性》發現了這並不總是真的。如果你確切地知道了要更改哪些像素點以及要對其做出多大的改變,你就可以有意地強制神經網絡對於給定圖像做出錯誤預測,而不需要對圖像外觀做出大的改動。

這意味着我們可以故意製作一張明顯是違禁物品的照片,但使它完全騙過我們的神經網絡模型。

image


怎麼會這樣?機器學習分類器的工作原理就是找到意圖區分事物之間的分界線。 以下圖示是一個簡單的二維分類器,它學習的目標是將綠球(合規)與紅球(違規)區分開來:


image


現在,分類器的精度達到100%。它找到了一條可以將所有的綠球與紅球完美分開的區隔線。

但是,如果我們想要調整一下模型使得一個紅球被故意區分成綠球呢?我們最少要將紅球移動多少纔會使得它被推到綠球的判定區域呢?

如果我們把分界線旁邊那個紅球的Y值少量增加,那麼我們就幾乎可以把它推到綠球的判定區域了:


image


所以要想欺騙一個分類器,我們只需要知道從哪個方向來推動這個點可以使它越過區隔線即可。如果我們不想使這個錯誤過於明顯,理想情況下我們會使這個移動儘可能的小,以至於其看起來就像是一個無心之過。

在使用深層神經網絡進行圖像分類時,我們分類的每個“點”其實是由成千上萬個像素組成的完整圖像。這就給了我們成千上萬個可以通過微調來使預測結果跨過決策線的可能值。如果我們可以確保自己對圖像中像素點的調整不是肉眼可見般的明顯,我們就可以做到在愚弄分類器的同時又不會使圖像看起來是被人爲篡改過的。

換句話說,我們可以選取一張真實物品的圖像,通過對特定像素點做出非常輕微地修改使得圖像被神經網絡完全識別爲另一件物品—而且我們可以精準地控制這個替代品是什麼:


image

把一隻貓變成烤麪包機。圖像檢測結果來自與Keras.js的Web演示:https://transcranial.github.io/keras-js/#/inception-v3


如何欺騙神經網絡

我們之前已經討論了訓練神經網絡以分類照片的基本過程:

1.添加一張訓練用圖片;

2.查看神經網絡的預測結果,看看其距離正確答案有多遠;

3.使用反向傳播算法來調整神經網絡中每一層的權重,使預測結果更接近於正確答案。

4.在數千張不同的訓練照片上重複步驟1-3。

那麼相比於調整神經網絡每一層的權重,如果我們直接修改輸入圖像本身直到得到我們想要的答案爲止呢?

所以我們選用了已經訓練好的神經網絡,並再次“訓練”它,不過這次我們將使用反向傳播算法來直接調整輸入圖像而不是神經網絡層的權重:

image


所以這裏是新的算法:

1.添加一張我們想要“黑”的照片。

2.檢查神經網絡的預測結果,看看其距離我們想要的答案有多遠。

3.使用反向傳播算法來調整照片本身,使預測結果更接近於我們想要的答案。

4.使用相同的照片重複步驟1-3上千次,直到神經網絡輸出結果爲我們想要的答案爲止。

在此之後,我們將會得到一張可以欺騙神經網絡的圖片,同時並不改變神經網絡本身。

唯一的問題是,由於算法在調整上沒有任何限制,允許以任何尺度來調整任何像素點,所以圖像的最終更改結果可能會大到顯而易見:他們會出現變色光斑或者變形波浪區域


image


一張被“黑”過的照片,由於沒有對像素點可被調整的尺度做約束,你可以看到貓周圍有了綠色光斑和白色牆壁上出現的波浪形圖案。

爲了防止這些明顯的圖形失真,我們可以將算法加上一個簡單的限定條件。我們限定篡改的圖片中每一個像素在原始的基礎上的變化幅度取一個微量值,譬如0.01%。這就使算法在微調圖片的時候仍然能夠騙過神經網絡卻不會與原始圖片差別太大。

在加入限定後重新生成的圖片如下:


image

在每個像素只能在一定範圍內變化的限制條件下生成的被“黑”的圖片。

即使這張圖對人眼來說篡改後沒有區別,卻可以騙過神經網絡!


現在讓我們來碼代碼

首先我們需要一個事先訓練過的神經網絡用來欺騙。我們不用重新開始訓練,而是使用谷歌創建的神經網絡。。

Keras是一個著名的深度學習框架,裏面有幾個預先訓練過的神經網絡。我們會使用其中的谷歌Inception v3 深度學習神經網絡的拷貝。這個神經網絡有過訓練,曾經檢測過超過一千種不同的物體。

下面是Keras中用此神經網絡負責圖像識別的基本代碼。(文本代碼詳見鏈接)https://gist.github.com/ageitgey/8a010ee99f55fe2ef93cae7d02e170e8#file-predict-py

在繼續下去之前確保你預先安裝了Python 3和Keras:

image


我們運行之後,它正確檢測到了我們的圖片是一隻波斯貓:


image

現在我們微微篡改一下圖片直到能夠騙過這個神經網絡讓它認爲圖片是一個烤麪包機。

Keras沒有內置的可以通過輸入圖片訓練的方法只有訓練神經網絡層,所以我只能提高技巧手動編寫訓練步驟的代碼。

下面是我的代碼:(文本代碼詳見鏈接)https://gist.github.com/ageitgey/873e74b7f3a75b435dcab1dcf4a88131#file-generated_hacked_image-py

image
image
image
image


運行後,最終我們可以得到能夠騙過神經網絡的圖片。


image


注意:如果你沒有GPU,這可能需要幾個小時的時間運行。如果你有並且配置了Keras和CUDA,應該花不了幾分鐘。

現在我們將篡改後的圖片放入原始模型中重新運行來測試其是否成功。


image


我們成功了!神經網絡被我們欺騙了,把貓當成烤麪包機了!


我們用被“黑”了的圖片可以幹什麼?

這種被“黑”圖片的操作被稱爲“創造對抗性的例子”。我們很有針對性的做出了讓機器學習模型產生錯誤的一些數據。這個操作很巧妙,但在實際生活中有什麼用呢?

研究者發現這些篡改圖片有一些很令人驚喜的性質:

當被“黑”圖片被打印出來後居然仍然可以欺騙神經網絡!因此你可以用這些特殊的圖片欺騙鏡頭和掃描儀,而不僅僅是電腦裏上傳圖片的那種系統。

當神經網絡被欺騙之後,如果其它的神經網絡也是用類似的數據來訓練的,即使設計完全不同,也能被這種特殊的圖片欺騙。

因此我們可以用這些篡改圖片做許多事情!

但是關於我們如何創造出這些特殊圖片還具有很多限制——我們的操作需要能夠直接進入神經網絡的權限。因爲我們實際上是“訓練”神經網絡來欺騙自身,我們需要它的拷貝版。在實際生活中,沒有公司會讓你下載的到他們受過訓練的神經網絡的代碼,這也就意味着我們無法來進行這個攻擊性的操作了……對嗎?

並沒有!研究者近日發現,我們可以利用探測另外一個神經網絡的動向來鏡像同步自己網絡的方法,訓練自己的替代性的神經網絡。

然後你就可以用替代性的神經網絡來生成被“黑”圖片,這依然可以騙過原來的網絡!這招叫做黑箱攻擊。

這種攻擊的範圍沒有限制,後果可以很可怕!下面是一些黑客能夠做到的例子:

欺騙自動駕駛汽車使其認爲看到的“停車”路標是一個綠燈——這可以引起車禍!

欺騙內容過濾系統使其無法識別出具有攻擊性的和非法的信息。

欺騙ATM支票掃描系統使其錯誤的識別支票上面的實際金額信息。(如果你被抓到的話還可以很合理的推卸掉自己的罪責!)

這些攻擊方法不僅限於圖片篡改。你可以用同樣的方式去欺騙處理其他種類數據的分類器。譬如,你可以欺騙病毒掃描儀將你的病毒錯誤地識別爲安全的!


我們如何防止這樣的攻擊?

現在我們知道了神經網絡是可以被欺騙的(包括其他的機器學習模型),我們如何防止呢?

簡單來說,還沒有人是能完完全全保證安全的。防止這類攻擊的方法仍然在研究中。要始終緊跟最新的研究進展,最好的方式是跟進Ian Goodfellow和Nicolas Papernot寫的cleverhans博客,他們倆是這一領域裏最具有影響力的研究者。

但是我們目前已經知道的一些事情是:

如果你只是簡單的創造很多被“黑”的圖片,並將這些納入到你之後的訓練數據中,這會使你的神經網絡更容易抵抗這些攻擊。我們稱之爲對抗性訓練,這也許是目前最可以考慮的一種防禦手段。

有另外一種有效果的方法叫做防禦性蒸餾法,這種方法是訓練另一個模型來模仿你原有的模型。但這是一種新的方法並且相當複雜,所以除非有特殊的需求,我還不想繼續研究這個方法。

目前爲止,研究人員嘗試了其他所有能想到的防禦這些攻擊的方法,都失敗了。

既然我們還沒有最後的定論,我建議你在使用神經網絡的時候考慮一下這種攻擊會對你的工作帶來什麼樣的損失,至少可以降低一些風險。

譬如,如果你只有一個單一的機器學習模型作爲鑑別保密信息源的唯一安全防線,即使它不會被欺騙,也並不是一個好主意。但是假如你只是用機器學習作爲一箇中間處理過程,還是有人工鑑別的操作,也許就會沒事。

換句話說,將機器學習模型和其他手段一樣看成不是完全可靠的技術。想一想如果某個用戶故意黑進你的系統欺騙你的網絡,這會帶來什麼樣的後果,你需要怎麼樣處理來降低這種風險。


原文發佈時間爲:2017-09-05
原作者:Adam Geitgey

發佈了107 篇原創文章 · 獲贊 322 · 訪問量 110萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章