對AlexNet的論文解讀

csdn博客公式編輯不方便,雖然本文公式不過,不過有強迫症的,可以來看pdf版。點這裏

一、概述

ALexNet訓練了一個深度卷積神經網絡來鑑別120萬張高分辨率圖片,從而把這些圖片分成1000個不同的分類。在測試數據中,獲得了在Top-1分類和Top-5分類取得了很好成績,並且比state-of-the-art都要明顯好很多。

以前數據集小的時候,人們一般用數學的方法來解決問題,靠經驗去尋找模型,但是後來,機器學習的出現,讓很多模型變成了數據驅動,再後來,神經網絡的出現,讓數據變得更加重要。在很多簡單的分類問題上,比如mnist數據集。只要區分十個數字,這種問題,不需要很大的數據集,機器就可以做到很好,大名鼎鼎的LeNet[1]就是做了這個,很快就被應用到了銀行支票的號碼識別上。(不過,我試過,其實有些奇怪的寫法會讓結果沒有那麼好,見卷積網絡3D重現)。

可是現實中,很多問題是需要分超多類的。比如說現在一直想推的自動駕駛,如果不能很好判別每個物件,就很容易被一些奇怪的東西所幹擾。有個比賽叫ILSVRC,裏面的ImageNet,讓參賽者分1000類(說實話裏面很多東西我也分不清),這種多分類,就需要大量的數據,ImageNet有126萬左右的帶標籤數據,可以說很多了(不過其實還不夠,但是配合一些數據增益算法,堪堪夠用)AlexNet作爲CNN代表出山之作,很好的利用瞭如此大數據量的特性,AlexNet在那個時代還挺深的,足足有6000萬的參數和65萬神經元,訓練可以說是十分費時了。作者用兩個gtx580(那個時代好歹是頂級顯卡系列)跑了6天五夜,算法才收斂。

順帶說一句,作者提到了一個更大的ImageNet數據集[2],裏面要把數據分爲22000類,有1500萬帶標籤數據。

二、模型

Alexnet結構如下:


別看它有兩層,其實就是作者讓它跑在了兩個gpu上,這裏很神奇,需要解釋一下:

  • 我們看第一層,卷積層總共96個卷積核,大小是5*5,然後分給兩個gpu 處理,每層48個卷積核。這裏不需要gpu通信。
  • 然後做池化,再是一個卷積層,依舊不需要通信。
  • 但是第三層卷積層,就用到了之前所有的輸入,這裏是需要通信的。
  • 第四層卷積層,不需要通信。
  • 第五層,也不需要

作者爲什麼這麼做呢,其實很好理解,加快訓練速度,減少gpu之間通信時間。那麼,爲什麼有一層有通信呢,也很好理解,要是一層都不通信,特徵圖之間沒有交互,下一層的特徵圖不能整合之前所有的低級特徵。用巨象的說法來看的話,就是,提取了眼睛鼻子這種局部特徵,如果不整合在一起,怎麼能確定一個人長什麼樣呢。但是我單單在提取鼻子邊緣的時候,我是沒必要和眼睛的邊緣一起進行整合的。大概是這個意思,我的個人理解,畢竟現在大家對神經網絡的定性說法本就沒有,我也就說說我的一家之言了。

一些疑問:

作者給的結構,圖片大小是224。這裏涉及到一個圖像增益的問題。我一開始提到了,其實數據還是不夠,那咋整呢,數據增益就行。原來的圖像是256*256,然後,縮減成224(從256*256的圖片,只取224*224的部分,其它捨去),然後再對每一張新的圖片,做一個水平反轉,作爲另一個樣本,這樣我們人看起來圖片是一樣的,對計算機來說差別可就大了。最終圖片總數會增加到原來的2048倍。這裏我認爲作者算錯了,作者的2048其實就是32^2*2,但我覺得應該是(256-224+1)^2*2作者少了個加1呢。爲什麼要加這個1,可以參考一個簡單的情況,如果原來大小是225,現在減小到224,應該可以取出四張圖片,做水平反轉就是8張{8=(225-224+1)^2*2}。

除此之外,還有一個問題,那就是,這個224,用5*5的卷積核進行卷積,步長是4,怎麼就變成55的特徵圖大小了呢?來計算一下,(224-5)/4=54.75,而(227-5)/4=55,這是很奇怪的一件事情,然後,去看看caffe:


caffe的輸出日誌表示,明明是227!!

作者的一些Tricks

除了上述的gpu並行架構,作者還有一些其他的小技巧。

我們先來講講這個池化層,作者很有意思,用了一個Overlapping Pooling的技術。這個技術其實就是,和我們平時的池化相比,它的步長要小於池化大小。也就是說,有些像素點,會被多次(兩次)加入到池化的統計範圍裏。作者做池化的時候,用的是補充邊緣池化(在圖片兩邊補充0像素點,步長爲3補充的是2)。例如:(55+2*2-3)/2=28。

作者還提到他用了一個Local Response Normalization的技術,不好意思,這個技術其實沒什麼用,2015年的文章BN歸一化[3],效果更快,更好,應用面更廣。

現在大部分網絡的激活函數都是Relu,用這個,首先可以可以起到一定程度的防止梯度消失的問題,並且,求導快,計算快,也不容易過飽和(這個需要解釋嗎?簡單來說,導數趨於0),這個是Hinton最初提出使用的,不愧是Hinton大弟子,Alex 也用了老闆這一套,如果不用這個用sigmoid,訓練起來怕是十天十夜。

本文也用到了Dropout技術,這個技術現在已經很普遍了,Dropout隨機概率(0.5)去丟棄隱藏層數據,置爲0,然後這個部分就不參加反向傳播的訓練了。所以每一次有新的輸入,訓練的網絡都是不一樣的。(因爲訓練出很多個模型組合在一起可以很好地減小測試誤差)不過dropout以後,收斂慢了很多,但泛化能力變強了很多,不虧不虧。(我最近看的一個Shake Shake Regularization[4]也是一個在網絡中加入一些隨機因素,泛化能力變強了很多。所以說啊,神經網絡的訓練,隨機的一些因素其實很重要,畢竟這個世界本來就很隨機,人類的思想也是,有的時候,有的人就是會犯傻,幹出奇怪的事,但就是一些奇思妙想,才推動了人類不斷地進步,墨守成規是不會有什麼文明發展的)

三、定量分析

這裏進行一個定量的分析:


對左側結果進行分析:圖1可以看出,即使是邊緣位置的目標也能被識別。圖4說明預測的5個結果都是有道理的,只有貓科動物出現在了這套預測裏。但是圖5和7說明有些圖片確實有歧義性。

對右側結果進行分析:查看網絡的另一個方法是,考慮圖像最後導致的特徵激勵。如果兩個圖像的特徵激勵歐氏距離很近,那麼可以認爲它們很類似,圖4右邊,先是測試數據集中的5張圖片,然後從訓練集中找到和他們最相似的6張圖片。

從像素級別來說,它們其實都不相似。所以直接針對像素計算距離不現實,那麼考慮一下全連接層?不過全連接層的數據有4096個神經元,計算兩個4096維的數據的歐氏距離用實數向量效率極低,但是比可以把它編碼到一個很短的二進制代碼。這比起以前有人做的,直接對像素進行編碼要好得多。(沒錯,這個可以應用在度量學習裏,確實有人做過了[5],具體文章我沒來得及看,不知道他有沒有做編碼,我覺得做個rbm編碼效果應該不錯!等待實驗驗證)

其實文中還有個技術挺有意思的,作者用2011年的數據,一個fine-tune,遷移到了2012年的比賽上,也就是用別人訓練好的模型,固定前面的卷積層,重新訓練後面的全連接層(當然也有固定全連接層的)。說到底,一個是固定了特徵提取的方式,重新組合特徵,一個是固定了特徵組合的方式,重新提取特徵。

參考文獻:

\bibitem{R1} Lecun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.
\bibitem{R2} Deng J, Dong W, Socher R, et al. ImageNet: A large-scale hierarchical image database[C]. computer vision and pattern recognition, 2009: 248-255.
\bibitem{R3} Ioffe S, Szegedy C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift[J]. international conference on machine learning, 2015: 448-456.
\bibitem{R4} https://arxiv.org/abs/1705.07485
\bibitem{R5} Yi D, Lei Z, Liao S, et al. Deep Metric Learning for Person Re-identification[C]. international conference on pattern recognition, 2014: 34-39.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章