CVPR之分類(圖像分類算法優化技巧)

Bag of Tricks for Image Classification with Convolutional Neural Networks
作者:Tong He, Zhi Zhang, Hang Zhang, Zhongyue Zhang, Junyuan Xie, Mu Li
論文鏈接:https://arxiv.org/abs/1812.01187
源碼鏈接:https://github.com/dmlc/gluon-cv
論文解讀:圖像分類技巧:Bag of Tricks for Image Classification with Convolutional Neural Networks

閱讀摘要:本文主要介紹CNN網絡調優的細節,許多實驗是在圖像分類算法做的,比如ResNet,作者不僅復現出原論文的結果,在許多網絡結構上甚至超出原論文的效果,而且對於目標檢測、圖像分割算法同樣有提升作用。

一、加快模型訓練部分:

1、增大學習率,因爲更大的batch size意味着基於每個batch數據計算得到的梯度更加貼近整個數據集(數學上來講就是方差更小),因此當更新方向更加準確後,邁的步子也可以更大了,一般而言將batch size修改爲原來的幾倍,那麼初始學習率也需要修改爲原來的幾倍。

2、用一個小的學習率先訓幾個epoch(warmup),因爲網絡的參數是隨機初始化的,假如一開始就採用較大的學習率容易出現數值不穩定,這是使用warmup的原因。等到訓練過程基本穩定了就可以使用原先設定的初始學習率進行訓練了。作者在實現warmup的過程中採用線性增加的策略,舉例而言,假設warmup階段的初始學習率是0,warmup階段共需要訓練m個batch的數據(實現中m個batch共5個epoch),假設訓練階段的初始學習率是L,那麼在batch i的學習率就設置爲i*L/m。

3、每個殘差塊的最後一個BN層的γ參數初始化爲0,我們知道BN層的γ、β參數是用來對標準化後的輸入做線性變換的,也就是γx^+β,一般γ參數都會初始化爲1,作者認爲初始化爲0更有利於模型的訓練。

4、不對bias參數執行weight decay操作,weight decay主要的作用就是通過對網絡層的參數(包括weight和bias)做約束(L2正則化會使得網絡層的參數更加平滑)達到減少模型過擬合的效果。

採用低精度(16位浮點型)訓練是從數值層面來做加速。一般而言現在大部分的深度學習網絡的輸入、網絡參數、網絡輸出都採用32位浮點型,現在隨着GPU的迭代更新(比如V100支持16爲浮點型的模型訓練),如果能使用16位浮點型參數進行訓練,就可以大大加快模型的訓練速度,這是作者加速訓練最主要的措施,不過目前來看應該只有V100才能支持這樣的訓練。

 二、優化網絡結構部分:

優化是以ResNet爲例,Figure1是ResNet網絡的結構示意圖

關於residual block的改進可以參考Figure2,主要有3點。

1、ResNet-B,改進部分就是將stage中做downsample的residual block的downsample操作從第一個11卷積層換成第二個33卷積層,如果downsample操作放在stride爲2的11卷積層,那麼就會丟失較多特徵信息(默認是縮減爲1/4),可以理解爲有3/4的特徵點都沒有參與計算,而將downsample操作放在33卷積層則能夠減少這種損失,因爲即便stride設置爲2,但是卷積核尺寸夠大,因此可以覆蓋特徵圖上幾乎所有的位置。

2、ResNet-C,改進部分就是將Figure1中input stem部分的77卷積層用3個33卷積層替換。這部分借鑑了Inception v2的思想,主要的考慮是計算量,畢竟大尺寸卷積核帶來的計算量要比小尺寸卷積核多不少,不過讀者如果仔細計算下會發現ResNet-C中3個33卷積層的計算量並不比原來的少,這也是Table5中ResNet-C的FLOPs反而增加的原因。

3、ResNet-D,改進部分是將stage部分做downsample的residual block的支路從stride爲2的11卷積層換成stride爲1的卷積層,並在前面添加一個池化層用來做downsample。這部分我個人理解是雖然池化層也會丟失信息,但至少是經過選擇(比如這裏是均值操作)後再丟失冗餘信息,相比stride設置爲2的1*1卷積層要好一些。

三、模型訓練調優部分

作者提到了4個調優技巧:

1、學習率衰減策略採用cosine函數

2、採用label smoothing,這部分是將原來常用的one-hot類型標籤做軟化,這樣在計算損失值時能夠在一定程度上減少過擬合。

3、知識蒸餾(knowledge distillation),這部分其實是模型加速壓縮領域的一個重要分支,表示用一個效果更好的teacher model訓練student model,使得student model在模型結構不改變的情況下提升效果。作者採用ResNet-152作爲teacher model,用ResNet-50作爲student model,代碼上通過在ResNet網絡後添加一個蒸餾損失函數實現,這個損失函數用來評價teacher model輸出和student model輸出的差異,因此整體的損失函數原損失函數和蒸餾損失函數的結合:

其中p表示真實標籤,z表示student model的全連接層輸出,r表示teacher model的全連接層輸出,T是超參數,用來平滑softmax函數的輸出。

4、引入mixup,mixup其實也是一種數據增強方式,假如採用mixup訓練方式,那麼每次讀取2張輸入圖像,假設用(xi,yi)和(xj,yj)表示,那麼通過下面這兩個式子就可以合成得到一張新的圖像(x,y),然後用這張新圖像進行訓練,需要注意的是採用這種方式訓練模型時要訓更多epoch。式子中的λ是一個超參數,用來調節合成的比重,取值範圍是[0,1]。

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