大話CNN經典模型:AlexNet

—— 原文發佈於本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),歡迎關注。算法

 

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網絡結構。微信

1、AlexNet模型的特色
AlexNet之因此可以成功,跟這個模型設計的特色有關,主要有:網絡

  • 使用了非線性激活函數:ReLU
  • 防止過擬合的方法:Dropout,數據擴充(Data augmentation)
  • 其餘:多GPU實現,LRN歸一化層的使用

一、使用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快不少,以下圖所示:
 
二、數據擴充(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%。app

三、重疊池化 (Overlapping Pooling)
通常的池化(Pooling)是不重疊的,池化區域的窗口大小與步長相同,以下圖所示:
 
在AlexNet中使用的池化(Pooling)倒是可重疊的,也就是說,在池化的時候,每次移動的步長小於池化的窗口長度。AlexNet池化的大小爲3×3的正方形,每次池化移動步長爲2,這樣就會出現重疊。重疊池化能夠避免過擬合,這個策略貢獻了0.3%的Top-5錯誤率。分佈式

四、局部歸一化(Local Response Normalization,簡稱LRN)
在神經生物學有一個概念叫作「側抑制」(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。歸一化(normalization)的目的是「抑制」,局部歸一化就是借鑑了「側抑制」的思想來實現局部抑制,尤爲當使用ReLU時這種「側抑制」很管用,由於ReLU的響應結果是無界的(能夠很是大),因此須要歸一化。使用局部歸一化的方案有助於增長泛化能力。
LRN的公式以下,核心思想就是利用臨近的數據作歸一化,這個策略貢獻了1.2%的Top-5錯誤率。
 
五、Dropout
引入Dropout主要是爲了防止過擬合。在神經網絡中Dropout經過修改神經網絡自己結構來實現,對於某一層的神經元,經過定義的機率將神經元置爲0,這個神經元就不參與前向和後向傳播,就如同在網絡中被刪除了同樣,同時保持輸入層與輸出層神經元的個數不變,而後按照神經網絡的學習方法進行參數更新。在下一次迭代中,又從新隨機刪除一些神經元(置爲0),直至訓練結束。
Dropout應該算是AlexNet中一個很大的創新,以致於「神經網絡之父」Hinton在後來很長一段時間裏的演講中都拿Dropout說事。Dropout也能夠當作是一種模型組合,每次生成的網絡結構都不同,經過組合多個模型的方式可以有效地減小過擬合,Dropout只須要兩倍的訓練時間便可實現模型組合(相似取平均)的效果,很是高效。
以下圖所示:
 
六、多GPU訓練
AlexNet當時使用了GTX580的GPU進行訓練,因爲單個GTX 580 GPU只有3GB內存,這限制了在其上訓練的網絡的最大規模,所以他們在每一個GPU中放置一半核(或神經元),將網絡分佈在兩個GPU上進行並行計算,大大加快了AlexNet的訓練速度。ide

2、AlexNet網絡結構的逐層解析
下圖是AlexNet的網絡結構圖:
 
AlexNet網絡結構共有8層,前面5層是卷積層,後面3層是全鏈接層,最後一個全鏈接層的輸出傳遞給一個1000路的softmax層,對應1000個類標籤的分佈。
因爲AlexNet採用了兩個GPU進行訓練,所以,該網絡結構圖由上下兩部分組成,一個GPU運行圖上方的層,另外一個運行圖下方的層,兩個GPU只在特定的層通訊。例如第2、4、五層卷積層的核只和同一個GPU上的前一層的核特徵圖相連,第三層卷積層和第二層全部的核特徵圖相鏈接,全鏈接層中的神經元和前一層中的全部神經元相鏈接。函數

下面逐層解析AlexNet結構:
一、第一層(卷積層)
 
該層的處理流程爲:卷積-->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上進行運算。oop

二、第二層(卷積層)
 
該層與第一層相似,處理流程爲:卷積-->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進行運算。學習

三、第三層(卷積層)
 
第三層的處理流程爲:卷積-->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處理。測試

四、第四層(卷積層)
 
與第三層相似,第四層的處理流程爲:卷積-->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處理。

五、第五層(卷積層)
 
第五層的處理流程爲:卷積-->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的像素層數據。

六、第六層(全鏈接層)
 
第六層的處理流程爲:卷積(全鏈接)-->ReLU-->Dropout
 
(1)卷積(全鏈接)
第六層輸入數據是第五層的輸出,尺寸爲6×6×256。本層共有4096個卷積核,每一個卷積核的尺寸爲6×6×256,因爲卷積核的尺寸恰好與待處理特徵圖(輸入)的尺寸相同,即卷積核中的每一個係數只與特徵圖(輸入)尺寸的一個像素值相乘,一一對應,所以,該層被稱爲全鏈接層。因爲卷積核與特徵圖的尺寸相同,卷積運算後只有一個值,所以,卷積後的像素層尺寸爲4096×1×1,即有4096個神經元。
(2)ReLU
這4096個運算結果經過ReLU激活函數生成4096個值。
(3)Dropout
而後再經過Dropout運算,輸出4096個結果值。

七、第七層(全鏈接層)
 
第七層的處理流程爲:全鏈接-->ReLU-->Dropout
 
第六層輸出的4096個數據與第七層的4096個神經元進行全鏈接,而後經ReLU進行處理後生成4096個數據,再通過Dropout處理後輸出4096個數據。

八、第八層(全鏈接層)
 
第八層的處理流程爲:全鏈接
 
第七層輸出的4096個數據與第八層的1000個神經元進行全鏈接,通過訓練後輸出1000個float型的值,這就是預測結果。


以上就是關於AlexNet網絡結構圖的逐層解析了,看起來挺複雜的,下面是一個簡圖,看起來就清爽不少啊


經過前面的介紹,能夠看出AlexNet的特色和創新之處,主要以下:

牆裂建議

Alex等人在2012年發表了關於AlexNet的經典論文《ImageNet Classification with Deep Convolutional Neural Networks》(基於深度卷積神經網絡的 ImageNet 分類),整個過程都有詳細的介紹,建議閱讀這篇論文,進一步瞭解細節。

掃描如下二維碼關注本人公衆號「大數據與人工智能Lab」(BigdataAILab),而後回覆「論文」關鍵字可在線閱讀這篇經典論文的內容。

 

推薦相關閱讀

相關文章
相關標籤/搜索