1. 程式人生 > >< AlexNet - 論文研讀系列(1) 個人筆記 >

< 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個廣義全連線層。
    • 廣義的卷積層:包含了卷積層、池化層、ReLULRN 層等。

    • 廣義全連線層:包含了全連線層、ReLUDropout 層等

  • 網路具體結構如下所示:
    • 輸入層會將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)

    • 啟用函式作用:啟用函式是用來加入非線性因素的,提高神經網路對模型的表達能力,解決線性模型所不能解決的問題。

  • 優點:
    1. ReLU解決了梯度消失的問題,至少x在正區間內,神經元不會飽和。
    2. 由於ReLU線性、非飽和的形式,在SGD(隨機梯度下降)中能夠快速收斂。
    3. 計算速度要快很多。ReLU函式只有線性關係,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoidtanh快。
  • 缺點:
    1. ReLU的輸出不是“零為中心”(Notzero-centered output)
    2. 隨著訓練的進行,可能會出現神經元死亡,權重無法更新的情況。這種神經元的死亡是不可逆轉的死亡。
  • 具體解釋參考:不同啟用函式對比以及梯度消失、爆炸、神經元節點死亡的解釋

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

  • 在神經網路中,我們用啟用函式將神經元的輸出做一個非線性對映,但是tanhsigmoid這些傳統的啟用函式的值域都是有範圍的,但是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 相連。

  • 第三層卷積層的核和前一層所有 GPUfeature 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}-{\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