Bag of Tricks for Image Classification with Convolutional Neural Networks 論文講解


論文地址:戳我

1. baseline

1.1 baseline template

在這裏插入圖片描述
在這裏插入圖片描述

1.2 Training preprocessing pipelines

在training階段會一步一步執行如下預處理:
在這裏插入圖片描述
在這裏插入圖片描述

1.3 Test preprocessing pipelines

在這裏插入圖片描述

2. Efficient Training

2.1 Large batch training

作者先說了雖然batch可以減少計算代價但在同樣的epoch下大的batch_size比小的batch_size泛化能力更差,現在很多學者提出了啓發式訓練來解決這個問題,作者也進行了闡述:

2.1.1 Linear scaling learning rate

增大batch_size不會改變隨機梯度的期望但是會減少他的誤差,換句話說隨機梯度會減少梯度的噪音,所以我們可以增大學習率,沿着梯度的反方向“更大”的學習。對resnet-50在imagenet來說,有的學者提出線性伸縮學習率,即: lr0.1對batch_size256,如果現在有一個batch_size=b,那麼學習率初始化可以爲:0.1b2560.1 * \frac{b}{256}

2.1.2 Learning rate warmup.

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

2.1.3 Zero γ\gamma

每個殘差塊的最後一個BN層的γ參數初始化爲0,我們知道BN層的γ、β參數是用來對標準化後的輸入做線性變換的,也就是γx^+β,一般γ參數都會初始化爲1,作者認爲初始化爲0更有利於模型的訓練,這樣所有的block直接返回他們的輸入,這樣layers的數量比較少,也可以在initial stage更好的訓練。

2.1.4 No bias decay.

不對bias參數執行weight decay操作,weight decay主要的作用就是通過對網絡層的參數(包括weight和bias)做約束(L2正則化會使得網絡層的參數更加平滑)達到減少模型過擬合的效果,同時其他參數包括γ\gammaβ\beta也都不參與正則化。

2.2 Low precision training

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

2.3 results

那麼這二者的優化效果如何?Table3是採用更大的batch size和16位浮點型進行訓練的結果,可以看出和原來的baseline相比訓練速度提升還是比較明顯的,效果上也有一定提升,尤其是MobileNet。
在這裏插入圖片描述
詳細的對比實驗可以參考Table4。
在這裏插入圖片描述

3. Model Tweaks

這部分的優化是以ResNet爲例的,Figure1是ResNet網絡的結構示意圖,簡單而言是一個input stem結構、4個stage和1個output部分,input stem和每個stage的內容在第二列展示,每個residual block的結構在第三列展示,整體而言這個圖畫得非常清晰了。
在這裏插入圖片描述
關於residual block的改進可以參考Figure2,主要有3點。
1、ResNet-B,改進部分就是將stage中做downsample的residual block的downsample操作從第一個1x1卷積層換成第二個3x3卷積層,如果downsample操作放在stride爲2的1x1卷積層,那麼就會丟失較多特徵信息(默認是縮減爲1/4),可以理解爲有3/4的特徵點都沒有參與計算,而將downsample操作放在3x3卷積層則能夠減少這種損失,因爲即便stride設置爲2,但是卷積核尺寸夠大,因此可以覆蓋特徵圖上幾乎所有的位置。
2、ResNet-C,改進部分就是將Figure1中input stem部分的7x7卷積層用3個3x3卷積層替換。這部分借鑑了Inception v2的思想,主要的考慮是計算量,畢竟大尺寸卷積核帶來的計算量要比小尺寸卷積核多不少,不過讀者如果仔細計算下會發現ResNet-C中3個3x3卷積層的計算量並不比原來的少,這也是Table5中ResNet-C的FLOPs反而增加的原因。
3、ResNet-D,改進部分是將stage部分做downsample的residual block的支路從stride爲2的1x1卷積層換成stride爲1的卷積層,並在前面添加一個池化層用來做downsample。這部分我個人理解是雖然池化層也會丟失信息,但至少是經過選擇(比如這裏是均值操作)後再丟失冗餘信息,相比stride設置爲2的1*1卷積層要好一些。
在這裏插入圖片描述

最終關於網絡結構改進的效果如Table5所示,可以看出在效果提升方面還是比較明顯的。
在這裏插入圖片描述

4. Training Refinements

4.1 Cosine Learning Rate Decay

一般exponential decay是最常用的,KaiMing He的step decay也比較常用,這裏介紹的是Cosine Learning Rate Decay,他的公式如下:
在這裏插入圖片描述
與step decay的對比圖如下:
在這裏插入圖片描述
可以發現:cosine decay一開始下降的很慢,中間下降的很快,幾乎是線性的,最後又開始緩慢下降,最後學習率變到0,值得注意的是這個對於分割網絡的性能提升很大。

4.2 Laybel smoothing

這部分是將原來常用的one-hot類型標籤做軟化,這樣在計算損失值時能夠在一定程度上減少過擬合。從交叉熵損失函數可以看出,只有真實標籤對應的類別概率纔會對損失值計算有所幫助,因此label smoothing相當於減少真實標籤的類別概率在計算損失值時的權重,同時增加其他類別的預測概率在最終損失函數中的權重。這樣真實類別概率和其他類別的概率均值之間的gap(倍數)就會下降一些,還是看一下原論文,瞭解詳細一點。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
對比曲線
在這裏插入圖片描述

4.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.4 Mixup Training

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

4.5 result

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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