尋找CNN的弱點,小心MNIST中的“套路”
CNN是現(xiàn)在十分火熱的模型,在很多圖像檢索問題上,CNN模型的效果在以往的基礎上有了很大的提高,但是CNN畢竟沒有把這些問題完全解決,CNN還是有它自己的弱點的。這個弱點也不能算作是它獨有的問題,但是由于它的效果實在太好了,很多人甚至對它產生了迷信,因此這盆冷水就潑到它身上了。
大神們看到了CNN模型的強大,但忍不住提出一個問題:CNN有沒有什么搞不定的地方?比方說我們用CNN構建了一個人臉識別的模型,在訓練數(shù)據(jù)集和測試數(shù)據(jù)集上表現(xiàn)良好,但是會不會有一些用例是它會誤判的,而且我們可以找到規(guī)律生成這些用例?
我們可以想象,如果我們對之前識別正確的數(shù)據(jù)做輕微的改動,那么它還是有可能識別正確的。于是我們就有了一個方案,我們每將圖像做一點改動,就把圖像傳入CNN做一下測試,然后看看CNN的預測結果有沒有發(fā)生改變,如果沒有發(fā)生改變,我們就保存這個圖像,接著我們再進行下一輪的改動,經(jīng)過若干輪的改動后,我們把生成的圖像輸出出來看看圖像會變成什么樣子。
這里我們將采用MNIST為例,以下的就是我們的改動方案:
- 利用MNIST的訓練集訓練一個CNN的模型,我們的CNN模型結構是:conv32*3*3->relu->maxpool2*2->conv64*3*6->relu->maxpool2*2->fc256->dropout0.5->fc10。
- 找到一個訓練數(shù)據(jù),將其數(shù)據(jù)范圍限定在0到1之間,我們對每一個像素點隨機增減-0.1到0.1之間的一個數(shù),這樣得到64個隨機的圖像,然后經(jīng)過CNN模型預測得到這64個圖像的預測label,從中選擇一個和原始label相同的圖像。經(jīng)過若干輪迭代后,我們就可以看看這個隨機改變的數(shù)字變成了什么樣子。
我們選擇了一個數(shù)字0:
經(jīng)過50輪迭代,我們得到了這樣的圖像:
經(jīng)過100輪迭代,我們得到了這樣的圖像:
經(jīng)過150輪迭代,我們得到了這樣的圖像:
經(jīng)過200輪迭代,我們得到了這樣的圖像:
到此為止,可以看出這個數(shù)字還是隱約可見,但是實際上圖像已經(jīng)變得模糊不清,大量的雜亂信息混入其中,已經(jīng)和原始的數(shù)字完全不同。
這個套路被稱作“fool CNN”,用東北話說就是忽悠。繼續(xù)迭代下去,我們還能生成出更精彩的圖像。當然這也只是忽悠CNN模型的一種辦法,我們還有其他的辦法來生成圖像。其他的辦法這里就不再介紹了。關于這種忽悠,大神們也給出了和機器學習有關的解釋:
CNN的模型說到底還是個判別式模型,如果我們把圖像設為X,label設為y,CNN的模型就相當于求p(y|X)的值。判別式模型相當于描述“什么樣的圖像是這個label的圖像”,而滿足了這些條件的圖像有時并不是具有真實label的那個圖像。而上面的忽悠套路就是利用了這個漏洞。
上面的例子中,我們用這種fool的方法讓一張模糊不清的圖像保持了原來的label,同時我們也可以讓一張不算模糊的圖像被CNN錯認成另外一個label。
比方說下面這張經(jīng)過40輪迭代的圖像被認成了6:
這些套路的出現(xiàn)都讓我們對CNN有了一些警惕,如果想讓CNN對手寫數(shù)字完全hold住,我們還需要其他的方法輔助,不然的話這種意外總會發(fā)生。
那么有沒有什么方法能解決這樣的問題呢?