2012年,Alex Krizhevsky、Ilya Sutskever在多倫多大學Geoff Hinton的實驗室設計出了一個深層的卷積神經網絡AlexNet,奪得了2012年ImageNet LSVRC的冠軍,且準確率遠超第二名(top5錯誤率為15.3%,第二名為26.2%),引起了很大的轟動。AlexNet可以說是具有歷史意義的一個網絡結構,在此之前,深度學習已經沉寂了很長時間,自2012年AlexNet誕生之後,後面的ImageNet冠軍都是用卷積神經網絡(CNN)來做的,並且層次越來越深,使得CNN成為在圖像識別分類的核心算法模型,帶來了深度學習的大爆發。
在本公眾號之前的文章中已經介紹過了卷積神經網絡(CNN)的技術原理(白話卷積神經網絡),也回顧過卷積神經網絡(CNN)的三個重要特點(白話CNN經典模型:LeNet),有興趣的同學可以打開連結重新回顧一下,在此就不再重複CNN基礎知識的介紹了。下面將先介紹AlexNet的特點,然後再逐層分解解析AlexNet網絡結構。
一、AlexNet模型的特點
AlexNet之所以能夠成功,跟這個模型設計的特點有關,主要有:
1、使用ReLU激活函數
傳統的神經網絡普遍使用Sigmoid或者tanh等非線性函數作為激勵函數,然而它們容易出現梯度彌散或梯度飽和的情況。以Sigmoid函數為例,當輸入的值非常大或者非常小的時候,這些神經元的梯度接近於0(梯度飽和現象),如果輸入的初始值很大的話,梯度在反向傳播時因為需要乘上一個Sigmoid導數,會造成梯度越來越小,導致網絡變的很難學習。(詳見本公眾號的文章:深度學習中常用的激勵函數)。
在AlexNet中,使用了ReLU (Rectified Linear Units)激勵函數,該函數的公式為:f(x)=max(0,x),當輸入信號<0時,輸出都是0,當輸入信號>0時,輸出等於輸入,如下圖所示:
使用ReLU替代Sigmoid/tanh,由於ReLU是線性的,且導數始終為1,計算量大大減少,收斂速度會比Sigmoid/tanh快很多,如下圖所示:
2、數據擴充(Data augmentation)
有一種觀點認為神經網絡是靠數據餵出來的,如果能夠增加訓練數據,提供海量數據進行訓練,則能夠有效提升算法的準確率,因為這樣可以避免過擬合,從而可以進一步增大、加深網絡結構。而當訓練數據有限時,可以通過一些變換從已有的訓練數據集中生成一些新的數據,以快速地擴充訓練數據。
其中,最簡單、通用的圖像數據變形的方式:水平翻轉圖像,從原始圖像中隨機裁剪、平移變換,顏色、光照變換,如下圖所示:
AlexNet在訓練時,在數據擴充(data augmentation)這樣處理:
(1)隨機裁剪,對256×256的圖片進行隨機裁剪到224×224,然後進行水平翻轉,相當於將樣本數量增加了((256-224)^2)×2=2048倍;
(2)測試的時候,對左上、右上、左下、右下、中間分別做了5次裁剪,然後翻轉,共10個裁剪,之後對結果求平均。作者說,如果不做隨機裁剪,大網絡基本上都過擬合;
(3)對RGB空間做PCA(主成分分析),然後對主成分做一個(0, 0.1)的高斯擾動,也就是對顏色、光照作變換,結果使錯誤率又下降了1%。
3、重疊池化 (Overlapping Pooling)
一般的池化(Pooling)是不重疊的,池化區域的窗口大小與步長相同,如下圖所示:
在AlexNet中使用的池化(Pooling)卻是可重疊的,也就是說,在池化的時候,每次移動的步長小於池化的窗口長度。AlexNet池化的大小為3×3的正方形,每次池化移動步長為2,這樣就會出現重疊。重疊池化可以避免過擬合,這個策略貢獻了0.3%的Top-5錯誤率。
4、局部歸一化(Local Response Normalization,簡稱LRN)
在神經生物學有一個概念叫做「側抑制」(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。歸一化(normalization)的目的是「抑制」,局部歸一化就是借鑑了「側抑制」的思想來實現局部抑制,尤其當使用ReLU時這種「側抑制」很管用,因為ReLU的響應結果是無界的(可以非常大),所以需要歸一化。使用局部歸一化的方案有助於增加泛化能力。
LRN的公式如下,核心思想就是利用臨近的數據做歸一化,這個策略貢獻了1.2%的Top-5錯誤率。
5、Dropout
引入Dropout主要是為了防止過擬合。在神經網絡中Dropout通過修改神經網絡本身結構來實現,對於某一層的神經元,通過定義的概率將神經元置為0,這個神經元就不參與前向和後向傳播,就如同在網絡中被刪除了一樣,同時保持輸入層與輸出層神經元的個數不變,然後按照神經網絡的學習方法進行參數更新。在下一次迭代中,又重新隨機刪除一些神經元(置為0),直至訓練結束。
Dropout應該算是AlexNet中一個很大的創新,以至於「神經網絡之父」Hinton在後來很長一段時間裡的演講中都拿Dropout說事。Dropout也可以看成是一種模型組合,每次生成的網絡結構都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓練時間即可實現模型組合(類似取平均)的效果,非常高效。
如下圖所示:
6、多GPU訓練
AlexNet當時使用了GTX580的GPU進行訓練,由於單個GTX 580 GPU只有3GB內存,這限制了在其上訓練的網絡的最大規模,因此他們在每個GPU中放置一半核(或神經元),將網絡分布在兩個GPU上進行並行計算,大大加快了AlexNet的訓練速度。
二、AlexNet網絡結構的逐層解析
下圖是AlexNet的網絡結構圖:
AlexNet網絡結構共有8層,前面5層是卷積層,後面3層是全連接層,最後一個全連接層的輸出傳遞給一個1000路的softmax層,對應1000個類標籤的分布。
由於AlexNet採用了兩個GPU進行訓練,因此,該網絡結構圖由上下兩部分組成,一個GPU運行圖上方的層,另一個運行圖下方的層,兩個GPU只在特定的層通信。例如第二、四、五層卷積層的核只和同一個GPU上的前一層的核特徵圖相連,第三層卷積層和第二層所有的核特徵圖相連接,全連接層中的神經元和前一層中的所有神經元相連接。
下面逐層解析AlexNet結構:
1、第一層(卷積層)
該層的處理流程為:卷積-->ReLU-->池化-->歸一化,流程圖如下:
(1)卷積
輸入的原始圖像大小為224×224×3(RGB圖像),在訓練時會經過預處理變為227×227×3。在本層使用96個11×11×3的卷積核進行卷積計算,生成新的像素。由於採用了兩個GPU並行運算,因此,網絡結構圖中上下兩部分分別承擔了48個卷積核的運算。
卷積核沿圖像按一定的步長往x軸方向、y軸方向移動計算卷積,然後生成新的特徵圖,其大小為:floor((img_size - filter_size)/stride) +1 = new_feture_size,其中floor表示向下取整,img_size為圖像大小,filter_size為核大小,stride為步長,new_feture_size為卷積後的特徵圖大小,這個公式表示圖像尺寸減去卷積核尺寸除以步長,再加上被減去的核大小像素對應生成的一個像素,結果就是卷積後特徵圖的大小。
AlexNet中本層的卷積移動步長是4個像素,卷積核經移動計算後生成的特徵圖大小為 (227-11)/4+1=55,即55×55。
(2)ReLU
卷積後的55×55像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為2組55×55×48的像素層數據。
(3)池化
RuLU後的像素層再經過池化運算,池化運算的尺寸為3×3,步長為2,則池化後圖像的尺寸為 (55-3)/2+1=27,即池化後像素的規模為27×27×96
(4)歸一化
池化後的像素層再進行歸一化處理,歸一化運算的尺寸為5×5,歸一化後的像素規模不變,仍為27×27×96,這96層像素層被分為兩組,每組48個像素層,分別在一個獨立的GPU上進行運算。
2、第二層(卷積層)
該層與第一層類似,處理流程為:卷積-->ReLU-->池化-->歸一化,流程圖如下:
(1)卷積
第二層的輸入數據為第一層輸出的27×27×96的像素層(被分成兩組27×27×48的像素層放在兩個不同GPU中進行運算),為方便後續處理,在這裡每幅像素層的上下左右邊緣都被填充了2個像素(填充0),即圖像的大小變為 (27+2+2) ×(27+2+2)。第二層的卷積核大小為5×5,移動步長為1個像素,跟第一層第(1)點的計算公式一樣,經卷積核計算後的像素層大小變為 (27+2+2-5)/1+1=27,即卷積後大小為27×27。
本層使用了256個5×5×48的卷積核,同樣也是被分成兩組,每組為128個,分給兩個GPU進行卷積運算,結果生成兩組27×27×128個卷積後的像素層。
(2)ReLU
這些像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為兩組27×27×128的像素層。
(3)池化
再經過池化運算的處理,池化運算的尺寸為3×3,步長為2,池化後圖像的尺寸為(57-3)/2+1=13,即池化後像素的規模為2組13×13×128的像素層
(4)歸一化
然後再經歸一化處理,歸一化運算的尺度為5×5,歸一化後的像素層的規模為2組13×13×128的像素層,分別由2個GPU進行運算。
3、第三層(卷積層)
第三層的處理流程為:卷積-->ReLU
(1)卷積
第三層輸入數據為第二層輸出的2組13×13×128的像素層,為便於後續處理,每幅像素層的上下左右邊緣都填充1個像素,填充後變為 (13+1+1)×(13+1+1)×128,分布在兩個GPU中進行運算。
這一層中每個GPU都有192個卷積核,每個卷積核的尺寸是3×3×256。因此,每個GPU中的卷積核都能對2組13×13×128的像素層的所有數據進行卷積運算。如該層的結構圖所示,兩個GPU有通過交叉的虛線連接,也就是說每個GPU要處理來自前一層的所有GPU的輸入。
本層卷積的步長是1個像素,經過卷積運算後的尺寸為 (13+1+1-3)/1+1=13,即每個GPU中共13×13×192個卷積核,2個GPU中共有13×13×384個卷積後的像素層。
(2)ReLU
卷積後的像素層經過ReLU單元的處理,生成激活像素層,尺寸仍為2組13×13×192的像素層,分配給兩組GPU處理。
4、第四層(卷積層)
與第三層類似,第四層的處理流程為:卷積-->ReLU
(1)卷積
第四層輸入數據為第三層輸出的2組13×13×192的像素層,類似於第三層,為便於後續處理,每幅像素層的上下左右邊緣都填充1個像素,填充後的尺寸變為 (13+1+1)×(13+1+1)×192,分布在兩個GPU中進行運算。
這一層中每個GPU都有192個卷積核,每個卷積核的尺寸是3×3×192(與第三層不同,第四層的GPU之間沒有虛線連接,也即GPU之間沒有通信)。卷積的移動步長是1個像素,經卷積運算後的尺寸為 (13+1+1-3)/1+1=13,每個GPU中有13×13×192個卷積核,2個GPU卷積後生成13×13×384的像素層。
(2)ReLU
卷積後的像素層經過ReLU單元處理,生成激活像素層,尺寸仍為2組13×13×192像素層,分配給兩個GPU處理。
5、第五層(卷積層)
第五層的處理流程為:卷積-->ReLU-->池化
(1)卷積
第五層輸入數據為第四層輸出的2組13×13×192的像素層,為便於後續處理,每幅像素層的上下左右邊緣都填充1個像素,填充後的尺寸變為 (13+1+1)×(13+1+1) ,2組像素層數據被送至2個不同的GPU中進行運算。
這一層中每個GPU都有128個卷積核,每個卷積核的尺寸是3×3×192,卷積的步長是1個像素,經卷積後的尺寸為 (13+1+1-3)/1+1=13,每個GPU中有13×13×128個卷積核,2個GPU卷積後生成13×13×256的像素層。
(2)ReLU
卷積後的像素層經過ReLU單元處理,生成激活像素層,尺寸仍為2組13×13×128像素層,由兩個GPU分別處理。
(3)池化
2組13×13×128像素層分別在2個不同GPU中進行池化運算處理,池化運算的尺寸為3×3,步長為2,池化後圖像的尺寸為 (13-3)/2+1=6,即池化後像素的規模為兩組6×6×128的像素層數據,共有6×6×256的像素層數據。
6、第六層(全連接層)
第六層的處理流程為:卷積(全連接)-->ReLU-->Dropout
(1)卷積(全連接)
第六層輸入數據是第五層的輸出,尺寸為6×6×256。本層共有4096個卷積核,每個卷積核的尺寸為6×6×256,由於卷積核的尺寸剛好與待處理特徵圖(輸入)的尺寸相同,即卷積核中的每個係數只與特徵圖(輸入)尺寸的一個像素值相乘,一一對應,因此,該層被稱為全連接層。由於卷積核與特徵圖的尺寸相同,卷積運算後只有一個值,因此,卷積後的像素層尺寸為4096×1×1,即有4096個神經元。
(2)ReLU
這4096個運算結果通過ReLU激活函數生成4096個值。
(3)Dropout
然後再通過Dropout運算,輸出4096個結果值。
7、第七層(全連接層)
第七層的處理流程為:全連接-->ReLU-->Dropout
第六層輸出的4096個數據與第七層的4096個神經元進行全連接,然後經ReLU進行處理後生成4096個數據,再經過Dropout處理後輸出4096個數據。
8、第八層(全連接層)
第八層的處理流程為:全連接
第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練後輸出1000個float型的值,這就是預測結果。
以上就是關於AlexNet網絡結構圖的逐層解析了,看起來挺複雜的,下面是一個簡圖,看起來就清爽很多啊
通過前面的介紹,可以看出AlexNet的特點和創新之處,主要如下:
牆裂建議
Alex等人在2012年發表了關於AlexNet的經典論文《ImageNet Classification with Deep Convolutional Neural Networks》(基於深度卷積神經網絡的 ImageNet 分類),整個過程都有詳細的介紹,建議閱讀這篇論文,進一步了解細節
想要閱讀 完整版本的《ImageNet Classification with Deep Convolutional Neural Networks》的論文內容,請關注本公眾號,然後回復「論文」關鍵字可在線閱讀這篇經典論文的內容。
1、長按識別二維碼關注本公眾號「大數據與人工智慧Lab」(BigdataAILab)
2、在公眾號的消息框裡面回復「論文」關鍵字,即可在線閱讀《ImageNet Classification with Deep Convolutional Neural Networks》論文的內容
推薦相關閱讀
搜索」大數據與人工智慧Lab「微信號(BigdataAILab),或掃描二維碼關注我們
你的每一份支持將是我們最大的動力,感謝你的支持,感謝你的讚賞