天天看點

Bag of Tricks for Image Classification with Convolutional Neural Networks筆記

以下内容摘自《Bag of Tricks for Image Classification with Convolutional Neural Networks》。

1 高效訓練

1.1 大batch訓練

當我們有一定資源後,當然希望能充分利用起來,是以通常會增加batch size來達到加速訓練的效果。但是,有不少實驗結果表明增大batch size可能降低收斂率,是以為了解決這一問題有人以下方法可供選擇:

1.1.1 線性增加學習率

一句話概括就是batch size增加多少倍,學習率也增加多少倍。

例如最開始batch size=256時, lr=0.1。後面batch size變成b後,lr=\(0.1\times \frac{b}{256}\)

1.1.2 學習率warmup

在訓練最開始,所有的參數都是随機初始化的,是以離最終的解還需要很多次疊代才能到達。一開始使用一個太大的學習率會導緻不穩定,是以可以在最開始使用一個很小的學習率,然後逐漸切換到預設的初始學習率。

例如我們可以設定在前面100個batch學習率由0線性增加到預設初始值0.1,也就是說每個batch學習率增加0.001

1.1.3 \(\gamma=0\) for BN layer

現在很多網絡結構中都會用到BatchNorm層,而我們知道BN層會對資料作如下操作:

1.标準化輸入: \(\hat{x_1}=\text{standardize}(x)\)

2.伸縮變換(scale transformation): \(\hat{x_2}=\gamma\hat{x_1}+\beta\)

上面步驟中的\(\gamma,\beta\)都是可學習的參數,分别初始化為0,1。

原文解釋這樣做的好處如下(沒太懂什麼意思,懂得麻煩解釋一下):

Therefore, all residual blocks just return their inputs, mimics network that has less number of layers and is easier to train at the initial stage.

1.1.4 No bias decay

意思就是我們可以weight decay,但是不用做bias decay。

1.2 低精度訓練

P. Micikevicius,et al. Mixed precision training.中提出将所有的參數和激活值用FP16存儲,并且使用FP16來計算梯度。另外,所有的參數都需要一份FP32的拷貝用來做參數更新。另外将loss乘上一個标量以便求得的梯度範圍可以與FP16對齊。

2. 模型設計Trick

下面以ResNet為例進行介紹有哪些模型設計的Trick。

下圖示何凱明提出的ResNet的示意圖,可以看到主要由三部分組成:

  • input stem:主要是先用一個7*7的卷積核,後接一個最大池化
  • stage2-4:每個stage最開始是先用下采樣子產品對輸入資料次元做減半操作,注意不是直接使用池化,而是通過設定卷積stride=2實作的。下采樣之後後接若幹個殘差子產品。
  • output:最後接上預測輸出子產品
Bag of Tricks for Image Classification with Convolutional Neural Networks筆記

下面介紹一下可以對上面的ResNet做哪些魔改:

  • input stem改!

可以看到主要将7*7的卷積核改成了3個3*3的卷積核,這樣效果類似,而且參數更少。

Bag of Tricks for Image Classification with Convolutional Neural Networks筆記
  • stage中的down sampling部分的Path A和Path B都可以改:
    • Path A:将stride=2從原來的1*1卷積核部分改到了3*3卷積核内
      Bag of Tricks for Image Classification with Convolutional Neural Networks筆記
    • Path B:該條路徑隻有一個卷積操作,沒法像上面那樣,是以加入了一個池化層。
      Bag of Tricks for Image Classification with Convolutional Neural Networks筆記

實驗結果:

Model #params FLOPs Top-1 Top-5
ResNet-50 25 M 3.8 G 76.21 92.97
ResNet-50-B 4.1 G 76.66 93.28
ResNet-50-C 4.3 G 76.87 93.48
ResNet-50-D 77.16 93.52

3. 訓練Trick

3.1 Cosine learning rate decay

計算公式如下:

\[\eta_{t}=\frac{1}{2}\left(1+\cos \left(\frac{t \pi}{T}\right)\right) \eta

\]

其中\(\eta\)是初始化學習率。

示意圖如下:

Bag of Tricks for Image Classification with Convolutional Neural Networks筆記

3.2 label smoothing

這個方法我在之前的一個項目中用過,但是感覺沒什麼效果,是以各種Trick還是得視情況而定,并不是萬能的。

通常分類任務中每張圖檔的标簽是one hot形式的,也就是說一個向量在其對應類别索引上設定為1,其他位置為0,形如[0,0,0,1,0,0]。

label smoothing就是将類别分布變得平滑一點,即

\[q_{i}=\left\{\begin{array}{ll}{1-\varepsilon} & {\text { if } i=y} \\ {\varepsilon /(K-1)} & {\text { otherwise }}\end{array}\right.

其中\(q_{i}\)就代表某一類的ground truth,例如如果\(i==y\),那麼其最終真實值就是\(1-\varepsilon\),其它位置設定為\(\varepsilon /(K-1)\),而不再是。這裡的\(\varepsilon\)是一個很小的常數。

3.3 Mixup

方法如下:

每次随機抽取兩個樣本進行權重求和得到新的樣本,标簽同樣做權重操作。公式中的\(\lambda\in[0,1]\)是一個随機數,服從\(\text{Beta}(\alpha,\alpha)\)分布。

\[\begin{aligned} \hat{x} &=\lambda x_{i}+(1-\lambda) x_{j} \\ \hat{y} &=\lambda y_{i}+(1-\lambda) y_{j} \end{aligned}

MARSGGBO ♥原創 2019-9-4

上一篇: 繼承
下一篇: 多态

繼續閱讀