GoogleNet: Inception的演進

Ray Lin
學以廣才
Published in
4 min readJul 12, 2018

2014年GoogleNets被提出,它在ImageNet分類競賽打敗VGG。那時候的Inception Net稱為V1版本(2014)。相較於Alexnet或VGG,網絡深度設計不斷加深。Inception就是在廣度上增加,並使用不同的捲積核大小(3x3,5x5,1x1),來提取不同的特徵。但隨之而來參數量太大問題,就是使用了1x1的捲積降維了。所以在V1的特點就是:

  • 加寬網路廣度,使用多種的捲積核來提取不同的特徵
  • 引入 1x1 的捲積層降維(降低計算)
  • 後面的全連接層(FC)全部替換成全局平均池(Global Average Pooling)
  • 中間層使用輔助分類節點(auxiliary classifiers):
    目的是為了幫助網絡的收斂,這輔助單元的計算結果會乘以0.3當作補償,和最後的LOSS相加作後為最終損失函數來訓練網絡。從網路架構來看,是他有三個輸出。論文中解釋是為了避免梯度的消失,也可以視為做一個Ensemble 。

訓練細節
以DistBelief分佈式機器學習系統進行訓練,使用適量的模型和數據並行,並僅使用基於CPU的來實現,當時說是因為記憶體限制。作者訓練時採用非同步的SGD(with 0.9 momentum) ,固定 learning rate (decreasing the learning rate by 4% every 8 epochs)。使用 Polyak averaging 做最後的模型建立評估。 因使用了dropout與不同的學習率,因此難以提出具體訓練建議。

Inception V2 (2015)

它將5x5捲積核用兩個3x3代替,兩個3x1代替3x3卷積核。實驗證明這樣減少參數量,卻不會降低準確度。增加BN,減少Internal Covariate Shift(內部neuron的數據分佈發生變化)來穩定訓練。

Inception V3 (2015)

V3論文的主要的提出的論點有:

  • Filter分解
    將7x7分解成 1x7, 7x1 兩個一維捲積與 3x3 →1x3, 3x1,來加速計算,又將1個conv拆成2個conv來增加網絡的非線性。5x5則換成兩個3x3。
  • 優化auxiliary classifiers
    作者發現輔助分類節點在訓練初期的時候並不能加速收斂,只有訓練快結束時,它才會略微提高網絡精度。因此去掉第一個輔助分類節點,保留第二個並認為它有 regularizer 的作用。
  • 嘗試新的pooling層設計
  • 用RMSProp替代SGD,增加gradient clipping去穩定訓練
  • 使用Label Smoothing Regularization(LSR)
    LSR是一種通過在輸出y中添加noise,來降低模型過擬合(overfitting)程度的一種regularization方式。

訓練細節
在TensorFlow[使用SGD訓練了我們的網絡,使用了5050個副本,每個副本在一個NVidia Kepler GPU上運行,batch size為32,100個epoch。我們之前的實驗使用動量方法,衰減值為0.9。最好的模型是用RMSProp實現,衰減值為0.9,ϵ=1.0。我們使用0.045的學習率,每兩個epoch以0.94的指數速率衰減。此外,閾值為2.0的梯度裁剪,被發現對於穩定訓練是有用的。使用隨時間計算的運行參數的平均值來執行模型評估。

之後才出現Inception V4/Inception-ResNet (2016)

--

--

Ray Lin
學以廣才

善歌者,使人繼其聲;善教者,使人繼其志。其言也,約而達,微而臧,罕譬而喻,可謂繼志矣