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:最后接上預測輸出模塊

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

  • input stem改!

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

image.png

  • stage中的down sampling部分的Path A和Path B都可以改:
    • Path A:將stride=2從原來的1*1卷積核部分改到了3*3卷積核內
      image.png
    • Path B:該條路徑只有一個卷積操作,沒法像上面那樣,所以加入了一個池化層。
      image.png

實驗結果:

Model #params FLOPs Top-1 Top-5
ResNet-50 25 M 3.8 G 76.21 92.97
ResNet-50-B 25 M 4.1 G 76.66 93.28
ResNet-50-C 25 M 4.3 G 76.87 93.48
ResNet-50-D 25 M 4.3 G 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\)是初始化學習率。

示意圖如下:

image.png

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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM