Bag of Tricks for Convolutional Neural Networks

https://zhuanlan.zhihu.com/p/51870052

剛剛看了Bag of Tricks for Image Classification with Convolutional Neural Networks,一篇乾貨滿滿的文章,同時也可以認爲是GluonCV 0.3: 超越經典的說明書,通過這個說明書,我們也擁有了超越經典的工具箱。

我們都知道trick在CNNs中的重要性,但是很少有文章詳細講解他們使用的trick,更少有文章對比各個trick對最後效果影響,這篇文章把CNNs裏幾種重要的trick做了詳細對比,可以認爲是一篇在CNNs中使用trick的cookbook。

這篇文章雖然題目是“for Image Classification”,但是這裏面提到的trick和結論,我認爲也適用於其他計算機視覺任務,比如目標檢測、語義分割、實例分割等等,特別地,我專門看了GluonCV裏Yolov3的實現,裏面有使用label smoothing和mixup。

這篇文章的trick有五個方面:model architecture, data augmentation, loss function, learning rate schedule,optimization。總結一句話就是,網絡input stem和downsample模塊、mixup、label smoothing、cosine learning rate decay、lr warmup、zero γ對網絡影響都不小

model architecture

這一部分主要討論ResNet-50結構的一些微調,包括input stem和downsample module的細微改變。ResNet-50原始結構,和基於原始結構的一些微調如下圖所示。

原始ResNet-50

ResNet-50網絡結構的幾個變體

結果對比如下:

網絡結構微調的對比

可以看出,這些小修改對計算量的影響很小,但是對最後的accuracy提升效果不小。我在設計目標檢測網絡的時候,也有類似的結論。多說一句,ResNet-50-C這種修改,雖然對計算量影響不大,不過根據我的經驗,對速度的影響應該會比較大。

data augmentation

mixup對模型提升較大,具體對比如下。

mixup對模型效果影響

data augmentation對模型效果影響蠻大的,不說mixup,單說resize的範圍就能對模型效果有着不小的影響,有時候好好調調data augmentation裏的參數,帶來的效果提升比對網絡結構的改進要還要大。數據和模型是一個硬幣的兩面,雖然改進數據沒有改進模型聽起來高大上,而且也更髒,但是我認爲對數據的理解纔是一個算法工程師的核心競爭力

loss function

label smoothing對模型效果影響如下。

label smoothing對模型效果的影響

optimization

optimization涉及到lr warmup、zero γ、no bias decay、cosine decay。前三者對效果影響如下圖所示,可以看出lr warmup和zero γ比較重要。

lr warmup、zero γ、no bias decay對模型效果的影響

cosine learning rate decay中對模型效果影響見下圖,對比的是step learning rate decay。

cosine learning rate decay對模型效果影響

一個有意思的細節

文章對比了自己復現的baseline和reference模型效果,具體如下。可以看出復現的basline和reference在三個模型結構下各有優劣,差距在0.5%到1%之間。我最近在用Yolov2和Yolov3,也有類似的經歷,各個深度學習框架之間本身會有一些細微的差別,自己實現的代碼,也可能帶來一些細微差別,這些差別可能都細小到我們注意不到,然而最後卻能對模型效果帶來一個點左右的影響。

1. 基本pipeline

1.1 預處理(訓練)

a) Random sample image

b) 隨機剪裁原圖,面積比是[0.08, 1.00], 長寬比是[3/4, 4/3], 最終縮放到224*224

c) 以0.5概率水平翻轉

d) Scale 色相、飽和度、亮度

e) 添加PCA噪聲

f) 歸一化均值、方差

1.2 預處理(測試)

a) 縮放圖像較短邊到256

b) 在圖像中心剪裁出224*224大小圖像

c) 歸一化

1.3 權重初始化

Xavier algorithm 初始化所有卷積層、全連層。

1.4 優化器

NAG

可以從實驗結果看到,resnet-50結果略好

2. 一些有效的訓練方法(提高訓練速度)

2.1 Large-batch training。

觀察表明:比較大的batch size 會造成模型在驗證集的精度下降(模型收斂?)。爲了解決這的問題可以選擇一個一個較大的初始學習率(0.1)

a) Learning rate warm-up。在訓練的開始階段,參數都是隨機的,使用大的學習率在會時訓練不穩定。所以可以在訓練的前 m 個batch線性增加學習率至初始學習率(0.1)

b) Zero gamma. Res-net 是由residual block 組成。 每個block 由pathA和pathB組成。 假設pathA 中含有BN層, 所以把gamma初始化0可以在模型訓練的初始降低模型複雜度。

c) No bias decay, 只對全卷積核、全連接層做 regularization(據說可以避免過擬合)

2.2 low-precision training

相比32位浮點數訓練,使用16位浮點數訓練可以帶來兩到三倍訓練速度提升。 這裏的做法是用16位存儲參數和計算梯度, 用32位更新梯度。最後在loss上乘了一個常數。

所有trick加到一塊的performance最後都略好與baseline, 但是從每個trick的疊加試驗來看, No bias decay 其實是造成精度下降的。

3. ResNet 結構優化

初始Resnet block

這裏的優化是PathA的大小爲1步長爲2的卷積核會丟失信息,所以步長改成1。PathB也有這個問題, 改成平均池化加步長爲1的卷積。 同時,初始輸入中的7*7卷積改成了3個3*3卷積。如下,在輕微的計算量提升的基礎上驗證集精度提升約0.9

優化結構

4. 訓練優化

4.1 Cosine learning rate decay

相比於step decay 的方式, 不用手動去設置decay step. 可以有一個相對平滑的學習率下降曲線的同時, 學習率在開始時緩慢下降,在中段線性下降, 最後又是緩慢下降。

4.2 Label smoothing

在經過softmax操作和交叉熵計算後,目標函數最優解變成了具體類別對應的輸出無限大,其他神經元輸出儘可能小,這樣會帶來潛在的過擬合(arXiv上的cross entropy公式寫錯了)。所以可以選擇可以修改標籤的概率分佈爲1-keci

4.3 knowledge Distillation

在訓練較小的模型時(數據量大可能不太好收斂?),所以可以使用一個較大的模型作爲teacher model 用來指導小模型的訓練,具體做法時把兩個模型的輸出層的差作爲loss的一部分,teacher model 一般是預訓練好的。

4.4 Mixup training

對圖像和標籤之間同時做融合(fusion),但是這會要求更長的訓練時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章