尋找CNN的弱點
本文收錄在無痛的機器學習第一季。
CNN是現在十分火熱的模型,在很多圖像檢索問題上,CNN模型的效果在以往的基礎上有了很大的提高,但是CNN畢竟沒有把這些問題完全解決,CNN還是有它自己的弱點的。這個弱點也不能算作是它獨有的問題,但是由於它的效果實在太好了,很多人甚至對它產生了迷信,因此這盆冷水就潑到它身上了。
大神們看到了CNN模型的強大,但忍不住提出一個問題:CNN有沒有什麼搞不定的地方?比方說我們用CNN構建了一個人臉識別的模型,在訓練數據集和測試數據集上表現良好,但是會不會有一些用例是它會誤判的,而且我們可以找到規律生成這些用例?
我們可以想像,如果我們對之前識別正確的數據做輕微的改動,那麼它還是有可能識別正確的。於是我們就有了一個方案,我們每將圖像做一點改動,就把圖像傳入CNN做一下測試,然後看看CNN的預測結果有沒有發生改變,如果沒有發生改變,我們就保存這個圖像,接著我們再進行下一輪的改動,經過若干輪的改動後,我們把生成的圖像輸出出來看看圖像會變成什麼樣子。
這裡我們將採用MNIST為例,以下的就是我們的改動方案:
- 利用MNIST的訓練集訓練一個CNN的模型,我們的CNN模型結構是:conv32*3*3->relu->maxpool2*2->conv64*3*6->relu->maxpool2*2->fc256->dropout0.5->fc10。
- 找到一個訓練數據,將其數據範圍限定在0到1之間,我們對每一個像素點隨機增減-0.1到0.1之間的一個數,這樣得到64個隨機的圖像,然後經過CNN模型預測得到這64個圖像的預測label,從中選擇一個和原始label相同的圖像。經過若干輪迭代後,我們就可以看看這個隨機改變的數字變成了什麼樣子。
我們選擇了一個數字0:
經過50輪迭代,我們得到了這樣的圖像:
經過100輪迭代,我們得到了這樣的圖像:
經過150輪迭代,我們得到了這樣的圖像:
經過200輪迭代,我們得到了這樣的圖像:
到此為止,可以看出這個數字還是隱約可見,但是實際上圖像已經變得模糊不清,大量的雜亂信息混入其中,已經和原始的數字完全不同。
這個套路被稱作「fool CNN」,用東北話說就是忽悠。繼續迭代下去,我們還能生成出更精彩的圖像。當然這也只是忽悠CNN模型的一種辦法,我們還有其他的辦法來生成圖像。其他的辦法這裡就不再介紹了。關於這種忽悠,大神們也給出了和機器學習有關的解釋:
CNN的模型說到底還是個判別式模型,如果我們把圖像設為X,label設為y,CNN的模型就相當於求p(y|X)的值。判別式模型相當於描述「什麼樣的圖像是這個label的圖像」,而滿足了這些條件的圖像有時並不是具有真實label的那個圖像。而上面的忽悠套路就是利用了這個漏洞。
上面的例子中,我們用這種fool的方法讓一張模糊不清的圖像保持了原來的label,同時我們也可以讓一張不算模糊的圖像被CNN錯認成另外一個label。
比方說下面這張經過40輪迭代的圖像被認成了6:
這些套路的出現都讓我們對CNN有了一些警惕,如果想讓CNN對手寫數字完全hold住,我們還需要其他的方法輔助,不然的話這種意外總會發生。
那麼有沒有什麼方法能解決這樣的問題呢?
廣告時間
更多精彩盡在《深度學習輕鬆學:核心演算法與視覺實踐》!
推薦閱讀:
※人類首次!機器人宇航員將乘俄聯邦號飛船登月
※如何通過machine learning的手法預測 Google 下一個要關閉的服務是什麼?
※如何評價rcnn、fast-rcnn和faster-rcnn這一系列方法?
TAG:机器学习 | 深度学习DeepLearning |