< AlexNet - 論文研讀系列(1) 個人筆記 >
Alexnet - 論文研讀系列(1) 個人筆記
論文基本資訊
- 論文題目:
- ImageNet Classification with Deep Convolutional Neural Networks
作者:
- Krizhevsky, A., Sutskever, I., and Hinton, G. E.
論文原文:
- https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
一、論文架構
摘要:
- 簡要說明了獲得成績、網路架構、技巧特點
1、introduction
- 領域方向概述
- 前人模型成績
- 本文具體貢獻
- 2、The Dataset
- 資料集來源,訓練資料進行的一些預處理
3、The Architecture
- 網路模型大體組成
- ReLU
- Training on Multiple GPUs
- LRN (Local Response Normalization)
- Overlapping Pooling
- 網路模型整個具體架構
4、Reducing Overfitting
- Data Augmentation 資料擴充/資料增強
- Dropout
5、Details of learning
- 帶動量的隨機梯度下降
6、Results
- 測試集錯誤率
- 質量評估 - 具體圖片分析,評估模型學到了什麼
7、Discussion
二、網路結構
- AlexNet 有5個廣義卷積層和3個廣義全連線層。
廣義的卷積層:包含了卷積層、池化層、
ReLU
、LRN
層等。廣義全連線層:包含了全連線層、
ReLU
、Dropout
層等
- 網路具體結構如下所示:
- 輸入層會將
3@224x224
的三維圖片預處理變成3@227x227
的三維圖片- 為了使後續計算出來是整數
- 第二層廣義卷積層、第四層廣義卷積層、第五層廣義卷積層都是分組卷積,僅採用本GPU內的通道資料進行計算
- 多GPU的設定完全是利用多GPU來提高運算的效率,下表給出都是如果只用單GPU情況下輸入輸出尺寸
第一層廣義卷積層、第三層廣義卷積層、第六層連線層、第七層連線層、第八層連線層執行的是全部通道資料的計算
- 第二層廣義卷積層的卷積、第三層廣義卷積層的卷積、第四層廣義卷積層的卷積、第五層廣義卷積層的卷積均採用
same
填充(即:填充0,pad由核大小決定 - 卷積的三種模式:full, same, valid
)當卷積的步長為1,核大小為3x3 時,如果不填充0,則
feature map
的寬/高都會縮減 2 。因此這裡填充0,使得輸出feature map
的寬/高保持不變。第一層廣義卷積層的卷積,以及所有的池化都是
valid
填充(即:不填充 0,pad = 0 )
第六層廣義連線層的卷積之後,會將
feature map
展平為長度為 4096 的一維向量(這一層實際上看是卷積,使得向量展開成一維)
- 輸入層會將
編號 | 網路層 | 子層 | 核/池大小 | 核數量 | 步長 | 啟用函式 | 輸入尺寸 | 輸出尺寸 |
---|---|---|---|---|---|---|---|---|
第0層 | 輸入層 | - | - | - | - | - | - | 3@224x224 |
第1層 | 廣義卷積層 | 卷積 | 11x11 | 96 | 4 | ReLU | 3@227x227 | 96@55x55 |
第1層 | 廣義卷積層 | LRN | - | - | - | - | 96@55x55 | 96@55x55 |
第1層 | 廣義卷積層 | 池化 | 3x3 | - | 2 | - | 96@55x55 | 96@27x27 |
第2層 | 廣義卷積層 | 卷積 | 5x5 | 256 | 1 | ReLU | 96@27x27 | 256@27x27 |
第2層 | 廣義卷積層 | LRN | - | - | - | - | 256@27x27 | 256@27x27 |
第2層 | 廣義卷積層 | 池化 | 3x3 | - | 2 | - | 256@27x27 | 256@13x13 |
第3層 | 廣義卷積層 | 卷積 | 3x3 | 384 | 1 | ReLU | 256@13x13 | 384@13x13 |
第4層 | 廣義卷積層 | 卷積 | 3x3 | 384 | 1 | ReLU | 384@13x13 | 384@13x13 |
第5層 | 廣義卷積層 | 卷積 | 3x3 | 256 | 1 | ReLU | 384@13x13 | 256@13x13 |
第5層 | 廣義卷積層 | 池化 | 3x3 | - | 2 | - | 256@13x13 | 256@6x6 |
第6層 | 廣義連線層 | 卷積 | 6x6 | 4096 | 1 | ReLU | 256@6x6 | 4096@1x1 |
第6層 | 廣義連線層 | Dropout | - | - | - | - | 4096@1x1 | 4096@1x1 |
第7層 | 廣義連線層 | 全連線 | - | - | - | ReLU | 4096 | 4096 |
第7層 | 廣義連線層 | Dropout | - | - | - | - | 4096 | 4096 |
第8層 | 廣義連線層 | 全連線 | - | - | - | - | 4096 | 1000 |
網路計算與引數數量
第一層:卷積層1,輸入為
3@224x224
的影象,卷積核的數量為96,論文中兩片GPU分別計算48個核; 卷積核的大小為3@11x11
; stride = 4, stride表示的是步長, pad = 0, 表示不擴充邊緣;
wide = (227 + 2 x padding - kernel_size) / stride + 1 = 55
height = (227 + 2 x padding - kernel_size) / stride + 1 = 55
dimention = 96
然後進行 (Local Response Normalized), 後面跟著池化pool_size = (3, 3), stride = 2, pad = 0 最終獲得第一層卷積的feature map
最終第一層卷積的輸出為96@55x55
第二層:卷積層2, 輸入為上一層卷積的feature map, 卷積的個數為256個,論文中的兩個GPU分別有128個卷積核。卷積核的大小為:
48@5×5
; pad = 2, stride = 1; 然後做 LRN, 最後 max_pooling, pool_size = (3, 3), stride = 2。後續計算基本類似- 網路總引數總計約 6237萬。
第6層廣義連線層的卷積的引數數量最多,約3770萬,佔整體六千萬引數的 60%。
原因是該子層的卷積核較大、輸入通道數量較大、輸出通道數量太多。該卷積需要的引數數量為:
255x6x6x4096 = 37,748,736
編號 | 網路層 | 子層 | 輸出 Tensor size | 權重個數 | 偏置個數 | 引數數量 |
---|---|---|---|---|---|---|
第0層 | 輸入層 | - | 227x227x3 | 0 | 0 | 0 |
第1層 | 廣義卷積層 | 卷積 | 55x55x96 | 34848 | 96 | 34944 |
第1層 | 廣義卷積層 | 池化 | 27x27x96 | 0 | 0 | 0 |
第1層 | 廣義卷積層 | LRN | 27x27x96 | 0 | 0 | 0 |
第2層 | 廣義卷積層 | 卷積 | 27x27x256 | 614400 | 256 | 614656 |
第2層 | 廣義卷積層 | 池化 | 13x13x256 | 0 | 0 | 0 |
第2層 | 廣義卷積層 | LRN | 13x13x256 | 0 | 0 | 0 |
第3層 | 廣義卷積層 | 卷積 | 13x13x384 | 884736 | 384 | 885120 |
第4層 | 廣義卷積層 | 卷積 | 13x13x384 | 1327104 | 384 | 1327488 |
第5層 | 廣義卷積層 | 卷積 | 13x13x256 | 884736 | 256 | 884992 |
第5層 | 廣義卷積層 | 池化 | 6x6x256 | 0 | 0 | 0 |
第6層 | 廣義連線層 | 卷積 | 4096×1 | 37748736 | 4096 | 37752832 |
第6層 | 廣義連線層 | dropout | 4096×1 | 0 | 0 | 0 |
第7層 | 廣義連線層 | 全連線 | 4096×1 | 16777216 | 4096 | 16781312 |
第7層 | 廣義連線層 | dropout | 4096×1 | 0 | 0 | 0 |
第8層 | 廣義連線層 | 全連線 | 1000×1 | 4096000 | 1000 | 4097000 |
總計 | - | - | - | - | - | 62,378,344 |
三、設計技巧與創新點
- AlexNet 成功的主要原因在於:
- 使用
ReLU
啟用函式 - 使用
dropout
、資料集增強 、重疊池化等防止過擬合的方法 - 使用百萬級的大資料集來訓練
- 使用
GPU
訓練,以及的LRN
使用 - 使用帶動量的
mini batch
隨機梯度下降來訓練
- 使用
3.1 ReLU啟用函式
- Rectified Linear Unit:一種線性且不飽和的啟用函式,在該論文中首次提出
f(x)=max(0,x)
啟用函式作用:啟用函式是用來加入非線性因素的,提高神經網路對模型的表達能力,解決線性模型所不能解決的問題。
- 優點:
ReLU
解決了梯度消失的問題,至少x
在正區間內,神經元不會飽和。- 由於
ReLU
線性、非飽和的形式,在SGD
(隨機梯度下降)中能夠快速收斂。 - 計算速度要快很多。
ReLU
函式只有線性關係,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid
和tanh
快。
- 缺點:
ReLU
的輸出不是“零為中心”(Notzero-centered output)
。- 隨著訓練的進行,可能會出現神經元死亡,權重無法更新的情況。這種神經元的死亡是不可逆轉的死亡。
- 具體解釋參考:不同啟用函式對比以及梯度消失、爆炸、神經元節點死亡的解釋
3.2 資料集增強
AlexNet
中使用的資料集增強手段:- 隨機裁剪、隨機水平翻轉:原始圖片的尺寸為
256x256
,裁剪大小為224x224
。訓練階段每一個
epoch
中,對同一張圖片進行隨機性的裁剪,然後隨機性的水平翻轉。理論上相當於擴充了資料集(256-244)²x2=2048
倍。預測階段不是隨機裁剪,而是固定裁剪圖片四個角、一箇中心位置,再加上水平翻轉,一共獲得 10 張圖片。
用這10張圖片的預測結果的均值作為原始圖片的預測結果。
PCA
降噪:對RGB
空間做PCA
變換來完成去噪功能。同時在特徵值上放大一個隨機性的因子倍數(單位1
加上一個N(0,0.1)
的高斯繞動),也就是對顏色、光照作變換,從而保證影象的多樣性。每一個epoch 重新生成一個隨機因子。
該操作使得錯誤率下降1% 。
- 隨機裁剪、隨機水平翻轉:原始圖片的尺寸為
AlexNet
的預測方法存在兩個問題:- 這種固定裁剪四個角、一箇中心的方式,把圖片的很多區域都給忽略掉了。很有可能一些重要的資訊就被裁剪掉。
裁剪視窗重疊,這會引起很多冗餘的計算。
改進的思路是:
執行所有可能的裁剪方式,對所有裁剪後的圖片進行預測。將所有預測結果取平均,即可得到原始測試圖片的預測結果。
減少裁剪視窗重疊部分的冗餘計算。
具體做法為:將全連線層用等效的卷積層替代,然後直接使用原始大小的測試圖片進行預測。將輸出的各位置處的概率值按每一類取平均(或者取最大),則得到原始測試影象的輸出類別概率。
3.3 區域性響應規範化 - LRN
在神經網路中,我們用啟用函式將神經元的輸出做一個非線性對映,但是
tanh
和sigmoid
這些傳統的啟用函式的值域都是有範圍的,但是ReLU
啟用函式得到的值域沒有一個區間,所以要對ReLU
得到的結果進行歸一化。- 區域性響應規範層
LRN
:目的是為了進行一個橫向抑制,使得不同的卷積核所獲得的響應產生競爭。LRN
層現在很少使用,因為效果不是很明顯,而且增加了記憶體消耗和計算時間。- 在
AlexNet
中,該策略貢獻了1.2%
的貢獻率。
LRN
的思想:輸出通道i
在位置(x,y)
處的輸出會受到相鄰通道在相同位置輸出的影響。
為了刻畫這種影響,將輸出通道i
的原始值除以一個歸一化因子。公式為:
\[ {b^{i}_x,_y}={a^{i}_x,_y}/(k+\alpha \sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}({a^{j}_x,_y}^{2}))^{\beta } ,i=0,1...N-1 \]- 其中:\({a^{i}_x,_y}\)為輸出通道
i
在位置(x,y)
處的原始值,\({b^{i}_x,_y}\)為歸一化之後的值。n
為影響第i
通道的通道數量(分別從左側、右側n/2
個通道考慮)。\(\alpha\),\(\beta\),\(k\)為超引數。
一般而言,k=2 , n=5 , α=10^−4 , β=0.75
功能類似於最大最小歸一化:\[x_{i}=x_{i}/(x_{max}-x_{min})\]
3.4 多GPU訓練
AlexNet
使用兩個GPU
訓練。網路結構圖由上、下兩部分組成:一個GPU執行圖上方的通道資料,一個GPU
執行圖下方的通道資料,兩個GPU
只在特定的網路層通訊。即:執行分組卷積。第二、四、五層卷積層的核只和同一個
GPU
上的前一層的feature map
相連。第三層卷積層的核和前一層所有
GPU
的feature map
相連。全連線層中的神經元和前一層中的所有神經元相連。
3.5 Overlapping Pooling - 重疊池化
一般的池化是不重疊的,池化區域的大小與步長相同。
Alexnet
中,池化是可重疊的,即:步長小於池化區域的大小。- 重疊池化可以緩解過擬合,該策略貢獻了
0.4%
的錯誤率。- 為什麼重疊池化會減少過擬合,很難用數學甚至直觀上的觀點來解答。一個稍微合理的解釋是:重疊池化會帶來更多的特徵,這些特徵很可能會有利於提高模型的泛化能力。
3.6 優化演算法
AlexNet
使用了帶動量的mini-batch
隨機梯度下降法。- 標準的帶動量的
mini-batch
隨機梯度下降法為:- \[
v_t=-\eta \partial w+v_{t-1}\cdot momentum
\]
- \[
{w=w+v_t}
\]
- 具體細節見參考:隨機梯度下降與動量詳解
- \[
v_t=-\eta \partial w+v_{t-1}\cdot momentum
\]
- 而論文中,作者使用了修正:
- \[ {v_t={-\eta \partial w}-{\beta\cdot \eta w}+{v_{t-1}\cdot momentum}} \]
- \[
{w=w+v_t}
\]
其中
momentum=0.9 , β=0.75 , η為學習率
\({-\beta\cdot \eta w }\)為權重衰減。論文指出:權重衰減對於模型訓練非常重要,不僅可以起到正則化效果,還可以減少訓練誤差。
3.7 Dropout
引入Dropout主要是為了防止過擬合。在神經網路中Dropout通過修改神經網路本身結構來實現,對於某一層的神經元,通過定義的概率將神經元置為0,這個神經元就不參與前向和後向傳播,就如同在網路中被刪除了一樣,同時保持輸入層與輸出層神經元的個數不變,然後按照神經網路的學習方法進行引數更新。在下一次迭代中,又重新隨機刪除一些神經元(置為0),直至訓練結束。
Dropout應該算是AlexNet中一個很大的創新,現在神經網路中的必備結構之一。Dropout也可以看成是一種模型組合,每次生成的網路結構都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓練時間即可實現模型組合(類似取平均)的效果,非常高效。
具體細節見參考:理解Dropout