1. 程式人生 > >【論文閱讀】Bag of Tricks for Image Classification with Convolutional Neural Networks

【論文閱讀】Bag of Tricks for Image Classification with Convolutional Neural Networks

Bag of Tricks for Image Classification with Convolutional Neural Networks

論文:https://arxiv.org/pdf/1812.01187.pdf

本文作者總結了模型訓練過程中可以提高準確率的方法,如題,作者說 bag of tricks,閱讀了一遍文章,有用的內容挺多,為了比賽上分,可以一試,總結如下。文中提到的方法在GLuonCV 0.3中有實現,可以參考這個原始碼

文中提到技巧不僅可以應用於影象分類任務中,還可以應用於影象識別和語義分割任務中。

有效訓練

利用更大的batch size 進行訓練,但利用更大的batch size使得驗證集上的準確率降低,為解決這個問題,文中提出了四種解決方法,分別為:Linear scaling learning rate, Learning rate warmup, Zero γ

\gamma ,No bias decay。具體可參考文中說明,實驗結果如下,對準確率幾乎無提升。

在這裡插入圖片描述

利用16位進行訓練可有效的減少模型的訓練時間,結果如下:

在這裡插入圖片描述

模型優化

在ResNet的結構基礎上調整了模型中間部分結構,下圖為ResNet-50網路結構:

在這裡插入圖片描述

​ 修改上圖中的Down Sampling結構為下圖中的ResNet-D,其中下圖中的(a)是之前修改使用的模型,(b)是將輸入部分的7x7卷積核換成了3x3卷積核,Inception-v2網路中有使用。

在這裡插入圖片描述

實驗結果為下表,從表中可以看出修改模型後的準確率有較明顯的提升。

在這裡插入圖片描述

訓練過程優化

1) cos學習率衰減

常用的學習率衰減方法為“step decay”,如每過30個epochs,學習率乘以0.1,cos學習率衰減公式如下:
η t = 1 2

( 1 + cos ( t π T ) ) η \eta _ { t } = \frac { 1 } { 2 } \left( 1 + \cos \left( \frac { t \pi } { T } \right) \right) \eta
其中, T T 為總的batches數,t為第幾個batch, η \eta 為初始學習率,實驗過程學習率變化如下圖,cos學習率衰減方法在起始階段,學習率衰減較慢,中間階段趨於線性衰減,後序階段衰減較快,認為該衰減方法有效的原因是cos衰減在訓練沒過多久學習率很大,而step方法的學習率降低很多,而起始階段的高學習率可以加速訓練過程。

在這裡插入圖片描述

2) label 平滑

這個label平滑大致意思就是正常情況下真值是1,非真值是0,平滑處理後真值不等於1,變換方法如下:
q i = { 1 ε  if  i = y ε / ( K 1 )  otherwise  q _ { i } = \left\{ \begin{array} { l l } { 1 - \varepsilon } & { \text { if } i = y } \\ { \varepsilon / ( K - 1 ) } & { \text { otherwise } } \end{array} \right.

3) 知識蒸餾

利用教師模型來指導學生模型訓練,教師模型是指對同一個任務準確率高的模型,例如,利用ResNet-152作為教師模型,ResNet-50作為學生模型,引入蒸餾損失函式來進行優化,公式如下:
( p ,  softmax  ( z ) ) + T 2 (  softmax  ( r / T ) ,  softmax  ( z / T ) ) \ell ( p , \text { softmax } ( z ) ) + T ^ { 2 } \ell ( \text { softmax } ( r / T ) , \text { softmax } ( z / T ) )
p p 表示真實值, z z 表示學生模型預測輸出, r r 表示老師模型預測輸出, T T 為超引數, ( p , softmax ( z ) ) \ell(p,\text{softmax}(z)) 表示交叉熵損失函式;

4) 混合訓練

混合的意思是給定兩個值,根據給定的兩個值獲得一個新的值,利用如下公式:
x ^ = λ x i + ( 1 λ ) x j y ^ = λ y i + ( 1 λ ) y j \begin{array} { l } { \hat { x } = \lambda x _ { i } + ( 1 - \lambda ) x _ { j } } \\ { \hat { y } = \lambda y _ { i } + ( 1 - \lambda ) y _ { j } } \end{array}
上述4個方法的實驗結果如下,提到的方法對模型的準確率提升都有影響,而知識蒸餾方法對Inception-V3和MobileNet沒有提升,文中的解釋是使用Resnet-152作為教師模型,而和後兩個模型屬於不同的模型家族,預測結果的分佈也不同,因此對後兩個模型到來的負面的影響。

在這裡插入圖片描述

總結

本文從模型優化,學習率衰減,label平滑,知識蒸餾,混合訓練等方面總結了一些模型訓練技巧,對準確率提升有較好的作用。

參考

https://github.com/kmkolasinski/deep-learning-notes/tree/master/seminars/2018-12-Improving-DL-with-tricks
https://zhuanlan.zhihu.com/p/51870052