淺談對AlexNet的理解

注意:分析之前先介紹一下卷積之後圖像的尺寸變化:

先定義幾個參數

  • 輸入圖片大小 W×W
  • Filter大小 F×F
  • 步長 S
  • padding的像素數 P

於是我們可以得出
N = (W − F + 2P )/S+1
輸出圖片大小爲 N×N

 

 

AlexNet的篇文章《ImageNet Classification with Deep Convolutional Neural Networks》當中,我們可以主要從五個大方面去講:ReLU,LPN,Overlapping Pooling,總體架構,減少過度擬合。重點介紹總體結構減少過度擬合

1. ReLU Nonlinearity

一般神經元的激活函數會選擇sigmoid函數或者tanh函數,然而Alex發現在訓練時間的梯度衰減方面,這些非線性飽和函數要比非線性非飽和函數慢很多。在AlexNet中用的非線性非飽和函數是f=max(0,x),即ReLU。實驗結果表明,要將深度網絡訓練至training error rate達到25%的話,ReLU只需5個epochs的迭代,但tanh單元需要35個epochs的迭代,用ReLU比tanh快6倍。

2. 雙GPU並行運行

爲提高運行速度和提高網絡運行規模,作者採用雙GPU的設計模式。並且規定GPU只能在特定的層進行通信交流。其實就是每一個GPU負責一半的運算處理。作者的實驗數據表示,two-GPU方案會比只用one-GPU跑半個上面大小網絡的方案,在準確度上提高了1.7%的top-1和1.2%的top-5。值得注意的是,雖然one-GPU網絡規模只有two-GPU的一半,但其實這兩個網絡其實並非等價的。

3. LRN局部響應歸一化

ReLU本來是不需要對輸入進行標準化,但本文發現進行局部標準化能提高性能。

其中a代表在feature map中第i個卷積核(x,y)座標經過了ReLU激活函數的輸出,n表示相鄰的幾個卷積核。N表示這一層總的卷積核數量。k, n, α和β是hyper-parameters,他們的值是在驗證集上實驗得到的,其中k = 2,n = 5,α = 0.0001,β = 0.75。

這種歸一化操作實現了某種形式的橫向抑制,這也是受真實神經元的某種行爲啓發。

卷積核矩陣的排序是隨機任意,並且在訓練之前就已經決定好順序。這種LPN形成了一種橫向抑制機制。

4. Overlapping Pooling

池層是相同卷積核領域周圍神經元的輸出。池層被認爲是由空間距離s個像素的池單元網格的組成。也可以理解成以大小爲步長對前面卷積層的結果進行分塊,對塊大小爲的卷積映射結果做總結,這時有。然而,Alex說還有的情況,也就是帶交疊的Pooling,顧名思義這指Pooling單元在總結提取特徵的時候,其輸入會受到相鄰pooling單元的輸入影響,也就是提取出來的結果可能是有重複的(對max pooling而言)。而且,實驗表示使用 帶交疊的Pooling的效果比的傳統要好,在top-1和top-5上分別提高了0.4%和0.3%,在訓練階段有避免過擬合的作用。

5. 總體結構

如果說前面的ReLU、LRN、Overlapping Pooling是鋪墊的話,那麼它們一定是爲這部分服務的。

因爲這纔是全文的重點!!!理解這裏纔是把握住這篇的論文的精華!

首先總體概述下

AlexNet爲8層結構,其中前5層爲卷積層,後面3層爲全連接層;學習參數有6千萬個,神經元有650,000個
AlexNet在兩個GPU上運行;
AlexNet在第2,4,5層均是前一層自己GPU內連接,第3層是與前面兩層全連接,全連接是2個GPU全連接;
RPN層第1,2個卷積層後;
Max pooling層在RPN層以及第5個卷積層後。
ReLU在每個卷積層以及全連接層後。
卷積核大小數量:
conv1:96 11*11*3(個數/長/寬/深度)

conv2:256 5*5*48

conv3:384 3*3*256

conv4: 384 3*3*192

conv5: 256 3*3*192

ReLU、雙GPU運算:提高訓練速度。(應用於所有卷積層和全連接層)

重疊pool池化層:提高精度,不容易產生過度擬合。(應用在第一層,第二層,第五層後面)

局部響應歸一化層(LRN):提高精度。(應用在第一層和第二層後面)

Dropout:減少過度擬合。(應用在前兩個全連接層)

第1層分析:

conv1:96 11*11*3(個數/長/寬/深度)

第一層輸入數據爲原始圖像的227*227*3的圖像(最開始是224*224*3,爲後續處理方便必須進行調整),這個圖像被11*11*3(3代表深度,例如RGB的3通道)的卷積核進行卷積運算,卷積覈對原始圖像的每次卷積都會生成一個新的像素。卷積核的步長爲4個像素,朝着橫向和縱向這兩個方向進行卷積。由此,會生成新的像素;(227-11)/4+1=55個像素(227個像素減去11,正好是54,即生成54個像素,再加上被減去的11也對應生成一個像素),由於第一層有96個卷積核,所以就會形成55*55*96個像素層,系統是採用雙GPU處理,因此分爲2組數據:55*55*48的像素層數據。

重疊pool池化層:這些像素層還需要經過pool運算(池化運算)的處理,池化運算的尺度由預先設定爲3*3,運算的步長爲2,則池化後的圖像的尺寸爲:(55-3)/2+1=27。即經過池化處理過的規模爲27*27*96.

局部響應歸一化層(LRN):最後經過局部響應歸一化處理,歸一化運算的尺度爲5*5;第一層卷積層結束後形成的圖像層的規模爲27*27*96.分別由96個卷積覈對應生成,這96層數據氛圍2組,每組48個像素層,每組在獨立的GPU下運算。

第2層分析:

conv2:256 5*5*48

第二層輸入數據爲第一層輸出的27*27*96的像素層(爲方便後續處理,這對每幅像素層進行像素填充,即P=2),分爲2組像素數據,兩組像素數據分別在兩個不同的GPU中進行運算。每組像素數據被5*5*48的卷積核進行卷積運算,同理按照第一層的方式進行:(27-5+2*2)/1+1=27個像素,一共有256個卷積核,這樣也就有了27*27*128兩組像素層。

重疊pool池化層:同樣經過池化運算,池化後的圖像尺寸爲(27-3)/2+1=13,即池化後像素的規模爲2組13*13*128的像素層。

局部響應歸一化層(LRN):最後經過歸一化處理,分別對應2組128個卷積核所運算形成。每組在一個GPU上進行運算。即共256個卷積核,共2個GPU進行運算。

第3層分析:

conv3:384 3*3*256

第三層輸入數據爲第二層輸出的兩組13*13*128的像素層(爲方便後續處理,這對每幅像素層進行像素填充),分爲2組像素數據,兩組像素數據分別在兩個不同的GPU中進行運算。每組像素數據被3*3*128的卷積核(兩組,一共也就有3*3*256)進行卷積運算,同理按照第一層的方式進行:(13-3+1*2)/1+1=13個像素,一共有384個卷積核,這樣也就有了13*13*192兩組像素層。

第4層分析:

conv4: 384 3*3*192

第四層輸入數據爲第三層輸出的兩組13*13*192的像素層(爲方便後續處理,這對每幅像素層進行像素填充),分爲2組像素數據,兩組像素數據分別在兩個不同的GPU中進行運算。每組像素數據被3*3*192的卷積核進行卷積運算,同理按照第一層的方式進行:(13-3+1*2)/1+1=13個像素,一共有384個卷積核,這樣也就有了13*13*192兩組像素層。


第5層分析:

conv5: 256 3*3*192

第五層輸入數據爲第四層輸出的兩組13*13*192的像素層(爲方便後續處理,這對每幅像素層進行像素填充),分爲2組像素數據,兩組像素數據分別在兩個不同的GPU中進行運算。每組像素數據被3*3*192的卷積核進行卷積運算,同理按照第一層的方式進行:(13-3+1*2)/1+1=13個像素,一共有256個卷積核,這樣也就有了13*13*128兩組像素層。

重疊pool池化層:進過池化運算,池化後像素的尺寸爲(13-3)/2+1=6,即池化後像素的規模變成了兩組6*6*128的像素層,共6*6*256規模的像素層。

第6層分析:

第6層輸入數據的尺寸是6*6*256,採用6*6*256尺寸的濾波器對第六層的輸入數據進行卷積運算;每個6*6*256尺寸的濾波器對第六層的輸入數據進行卷積運算生成一個運算結果,通過一個神經元輸出這個運算結果;共有4096個6*6*256尺寸的濾波器對輸入數據進行卷積,通過4096個神經元的輸出運算結果;然後通過ReLU激活函數以及dropout運算輸出4096個本層的輸出結果值。

很明顯在第6層中,採用的濾波器的尺寸(6*6*256)和待處理的feature map的尺寸(6*6*256)相同,即濾波器中的每個係數只與feature map中的一個像素值相乘;而採用的濾波器的尺寸和待處理的feature map的尺寸不相同,每個濾波器的係數都會與多個feature map中像素相乘。因此第6層被稱爲全連接層

第7層分析:

第6層輸出的4096個數據與第7層的4096個神經元進行全連接,然後經由ReLU和Dropout進行處理後生成4096個數據。

第8層分析:

第7層輸入的4096個數據與第8層的1000個神經元進行全連接,經過訓練後輸出被訓練的數值。

6. 減少過度擬合

6.1 數據增益

增強圖片數據集最簡單和最常用的方法是在不改變圖片核心元素(即不改變圖片的分類)的前提下對圖片進行一定的變換,比如在垂直和水平方向進行一定的唯一,翻轉等。

AlexNet用到的第一種數據增益的方法:是原圖片大小爲256*256中隨機的提取224*224的圖片,以及他們水平方向的映像。

第二種數據增益的方法就是在圖像中每個像素的R、G、B值上分別加上一個數,用到 方法爲PCA。對於圖像每個像素,增加以下量 :

p是主成分,lamda是特徵值,alpha是N(0,0.1)高斯分佈中採樣得到的隨機值。此方案名義上得到自然圖像的重要特性,也就是說,目標是不隨着光照強度和顏色而改變的。此方法降低top-1錯誤率1%。

6.2 Dropout

結合多個模型的預測值是減少錯誤的有效方法,但是對於訓練時間用好幾天的大型神經網絡太耗費時間。Dropout是有效的模型集成學習方法,具有0.5的概率講隱藏神經元設置輸出爲0。運用了這種機制的神經元不會干擾前向傳遞也不影響後續操作。因此當有輸入的時候,神經網絡採樣不用的結構,但是這些結構都共享一個權重。這就減少了神經元適應的複雜性。測試時,用0.5的概率隨機失活神經元。dropout減少了過擬合,也使收斂迭代次數增加一倍。

7. 學習細節

AlexNet訓練採用的是隨機梯度下降 (stochastic gradient descent),每批圖像大小爲128,動力爲0.9,權重衰減爲0.005,(Alexnet認爲權重衰減非常重要,但是沒有講爲什麼)

權重值的更新規則如下:

其中i是迭代指數,v是動力變量,ε是學習率,是目標關於w、對求值的導數在第i批樣例上的平均值。我們用一個均值爲0、標準差爲0.01的高斯分佈初始化了每一層的權重。我們用常數1初始化了第二、第四和第五個卷積層以及全連接隱層的神經元偏差。該初始化通過提供帶正輸入的ReLU來加速學習的初級階段。我們在其餘層用常數0初始化神經元偏差。
    對於所有層都使用了相等的學習率,這是在整個訓練過程中手動調整的。我們遵循的啓發式是,當驗證誤差率在當前學習率下不再提高時,就將學習率除以10。學習率初始化爲0.01,在終止前降低三次。作者訓練該網絡時大致將這120萬張圖像的訓練集循環了90次,在兩個NVIDIA GTX 580 3GB GPU上花了五到六天。

8. 實驗結果

ILSVRC2010比賽冠軍方法是Sparse coding,這之後(AlexNet前)報道最好方法是SIFT+FVs。CNN方法橫空出世,遠超傳統方法。 

ILSVRC-2012,Alex參加比賽,獲得冠軍,遠超第二名SIFT+FVs。

定量分析:

圖3顯示了卷積層學到的有頻率和方向選擇性的卷積核,和顏色斑點(color blob)。GPU 1 (color-agnostic)和GPU 2(color-specific)學習到的卷積核並不一樣。不一樣的原因是3.5中的受限連接(restricted connectivity)。

圖4顯示,即使目標偏離中心,也可以被識別出來,比如mite。top-5預測結果是reasonable的,比如leopard的預測的可能結果是其他類型的貓科動物。但是也存在對intended focus的模糊問題,就是網絡不知道我們到底想識別圖片中的什麼物體,比如cherry,分類結果是dalmatian,網絡顯然關注的是dog。

網絡最後4096-d隱藏層產生的是feature activations是另一個重要指標。如果兩張圖像產生歐氏距離相近的feature activation vectors,那麼網絡的higher levels就認爲他們是相似的。使用此度量,可以實現較好的圖像檢索。

通過歐氏距離計算兩個4096維度效率太低,可以使用自動編碼壓縮向量成二進制碼。這比直接在原始像素上使用自動編碼效果更好。因爲在raw pixels上使用quto-encoder,沒用到標籤數據,只是檢索有相似邊緣模式(similar patterns of edges)的圖像,卻不管他們語義(semantically)上是否相似。
9.探討

深度很重要,去掉任一層,性能都會降低。

爲了簡化實驗,沒有使用非監督預訓練。但是當有足夠計算能力擴大網絡結構,而沒增加相應數據時,非監督預訓練可能會有所幫助。


雖然通過增大網絡結構和增加訓練時長可以改善網絡,但是我們與達到人類視覺系統的時空推理能力(infero-temporal pathway of the human visual system)還相距甚遠。所以,最終希望能將CNN用到視頻序列分析中,視頻相對靜態圖像有很多有用的時間結構信息。

AlexNet的論文下載地址:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章