【論文筆記】CNN圖像分類Tricks合集

paper:Bag of Tricks for Image Classification with Convolutional Neural Networks
author: Tong He, Zhi Zhang, Hang Zhang, Zhongyue Zhang, Junyuan Xie, Mu Li (Amazon Web Services)
code:https://github.com/dmlc/gluon-cv

1. Introduction

自2012年AlexNet的問世以來,深度神經網絡已經成爲了圖像分類領域的主流方法,很多新的結構被提出,例如VGG,NiN,Inception,ResNet,DenseNet,NasNet等。同時我們看到了模型精度的穩步提升,比如在ImageNet上top1的validation acc已經從AlexNet的62.5%提升到了NASNet-A的82.7%。
不過這些精度的提升不單單是因爲模型結構的改進。訓練過程的改進,包括損失函數的改變、數據預處理和優化方法也發揮了重要作用。 在過去幾年中已經提出了大量這樣的改進,但是受到的關注相對較少。在文獻中,大多數只是作爲實現細節簡要提及,而其他只能在源代碼中找到。
本文將驗證不同的訓練過程優化和模型結構優化的tricks對提升精度的影響。其中很多tricks都是很微小的改進,例如調整某一個卷積層的stride,或調整學習率等。但總的來說,這些小的改變累加起來會達到一個很大的提升。論文將在不同的網絡結構和數據集上評估這些tricks,並報告它們對最終模型精度的影響。
文章中的實證評估表明,一些特定的技巧可以顯著提高模型的準確度,將它們組合在一起可以進一步提高模型的精度。在應用所有技巧之後,如表1所示,ResNet- 50在ImageNet上的top-1驗證準確率從75.3%提高到79.29%,這一結果超越了其他更新和改進的網絡架構,如SE-ResNeXt-50。此外,文章將提出的方法推廣到其他網絡(Inception V3[1]和MobileNet[11])和數據集(Place365[32]),以及其他應用領域(如目標檢測和語義分割)中,同樣可以帶來良好的性能。
在這裏插入圖片描述

2. 訓練過程

2.1 Baseline訓練過程

通常訓練一個神經網絡會採用mini-batch SGD,如Algorithm 1所示。每個iter隨機採樣b張圖片計算梯度然後更新網絡參數。
在這裏插入圖片描述
關於超參和各函數有很多種實現方式,我們首先明確在我們的baseline中是如何實現的。
我們按照廣泛使用的ResNet的實現作爲baseline,訓練過程主要分爲以下六個步驟:

  1. 隨機採樣一張圖片,將其解碼成 32 位的原始像素浮點值,每一個像素值的取值範圍爲 [0, 255]。
  2. 隨機以 [3/4, 4/3] 爲長寬比、[8%, 100%] 爲面積比,裁減矩形區域,然後再縮放爲 224*224 的方圖。
  3. 以 0.5 的概率隨機水平翻轉圖像。3.以 0.5 的概率隨機水平翻轉圖像。
  4. 從均勻分佈 [0.6, 1.4] 中採樣係數,用於縮放hue, saturation, and brightness等。
  5. 從正態分佈 N\mathcal{N}(0, 0.1) 中採樣係數,用於添加 PCA 噪聲。
  6. 圖像歸一化,RGB通道分別減去(123.68, 116.779, 103.939)再除以(58.393, 57.12, 57.375)。

驗證階段將每張圖片的短邊resize到256,保持其長寬比,然後在其中心位置裁剪224*224的區域,並做歸一化(同訓練)。在驗證階段沒有做任何隨機數據增強。
conv和fc層的參數都通過Xavier進行初始化,參數隨機採樣自均勻分佈[-a,a],其中a=6/(din+dout)\sqrt{6/(d_{in}+d_{out})},這裏dind_{in}doutd_{out}分別表示輸入輸出channel的維度。所有bias初始化爲0。對於bn層,γ\gamma初始化爲全1,β\beta初始化爲全0。
訓練時採用Nesterov Accelerated Gradient(NAG)。每個模型訓練120個epoch,使用8 V100訓練,batchsize=256。初始lr=0.1,lr_steps=[30,60,90],分別下降爲1/10。

2.2 實驗結果

我們訓練了3個模型:ResNet-50,Inception-V3和MobileNet。所用數據集是ILSVRC2012,包含1000類的130萬訓練圖片。baseline的訓練效果如表2所示,ResNet-50比reference稍好,Inception-V3和MobileNet比reference稍差因爲訓練過程不同。
在這裏插入圖片描述

3. 高效訓練

3.1 大批量訓練

對於凸優化問題,隨着批量的增加,收斂速度會降低。也就是說,在相同的epoch數目下,用大的batchsize訓練一個模型,比用小的batchsize訓練模型的validation acc要低。
因此有很多工作致力於解決這個問題:

線性縮放學習率: 在mini-batch SGD中,梯度下降是一個隨機的過程,因爲每個batch中的樣本是隨機採樣得到的。增加batchsize由於樣本數增多了,會使得隨機性有所降低,即較大的batchsize會減少梯度的噪聲,這時可以通過增大學習率來加快收斂。按照[9],初始學習率設爲0.1,batchsize=256,如果我們使用更大的batchsize b,則將初始學習率調整爲0.1*b/256。

學習率預熱: 初始使用較小的學習率,然後在訓練過程變得穩定時換回初始學習率。按照[7],使用漸進的warmup策略,假設我們使用m個batch(e.g. 5 epochs)進行預熱,初始學習率爲η\eta,則在第i個batch所使用的學習率爲 iη/mi*\eta/m

Zero γ\gamma 一個ResNet網絡包含好多個residual blocks。每個block包括幾個卷積層。給定輸入x,假設block(x)爲該block最後一層的輸出,則整個residual block最終輸出x+block(x)。注意,block的最後一層可以是BN層。BN層的操作爲首先標準化其輸入x得到x^\hat{x},然後做尺度變換 γx^+β\gamma\hat{x}+\beta,通常初始化爲γ=1β=0\gamma=1,\beta=0在 zero γ\gamma的方法中,我們對所有處於residual block最後的BN 層初始化 γ=0\gamma=0。這樣所有的residual block初始時的輸出等於輸入,這相當於網絡擁有更少的層,在初始階段更容易訓練。

No bias decay: weight decay作用於所有可學參數(包括權重和bias),相當於對所有參數做了L2正則化,使其趨近於0防止模型過擬合。但按照[14]建議,weight decay只作用於權重項即可避免過擬合。No bias decay方法僅將權重衰減應用在卷積層和全連接層的權重上,其它如bias,BN 中的 γ\gammaβ\beta等都不進行衰減。

3.2 低精度訓練

神經網絡通常使用32bit浮點數進行訓練,即所有的數字都以FP32進行報錯,所有OP的輸入輸出也都是FP32。然而,新的硬件可能對較低精度的數據類型具有更好的運算能力,例如V100對於FP32只能提供14TFLOPS,而對於FP16可以提供100TFLOPS,如表3所示在V100上將FP32換成FP16可使訓練速度提升2-3倍。
儘管具備速度優勢,降低精度使得取值範圍變窄,因此更有可能出現超出取值範圍的情況從而擾亂訓練進度。[19]中提出將所有參數存儲成FP16並用FP16進行梯度計算,同時所有參數也有一份拷貝在FP32上用於參數的更新。另外,loss乘上一個標量使其和梯度的FP16範圍更加對齊也是一種解決方案。

3.3 實驗結果

如表3所示,ResNet-50 的baseline(batchsize=256,FP32)訓練時間爲13.3min/epoch,而採用batchsize=1024, FP16訓練時間爲4.4min/epoch,並且top-1 acc還有0.5%的提升。
在這裏插入圖片描述
上述各tricks的ablation study如表4所示。從batchsize=256到batchsize=1024,僅僅使用線性縮放學習率,會導致精度有0.7%的下降,加上其他的幾個tricks能夠彌補這個精度差。
在這裏插入圖片描述

4. 模型變體

本文中的模型變體是指對網絡結構進行微小的改變,例如改變某個卷積層的stride等。這種改變基本不影響訓練的複雜度,但可以對模型的精度有不可忽視的提升。本文主要以ResNet結構爲基礎進行變形。

4.1 ResNet結構

ResNet網絡由一個輸入主幹(input stem)、四個stage和一個最終輸出層組成,如圖 1 所示。輸入主幹包括一個7×7卷積層,輸出通道爲64,stride=2,接着是 3×3 max pooling層,stride=2。這一輸入主幹將輸入寬度和高度減小 4 倍,通道數增加到64。
從stage 2 開始,每個階段從一個downsample block開始,然後是幾個residual block。在downsample block中,存在路徑 A 和路徑 B。路徑 A由三個卷積組成,其卷積核大小分別爲 1×1、3×3 和 1×1。第一個卷積strde=2,以將輸入長度和寬度減半,最後一個卷積的輸出通道比前兩個大 4 倍,稱爲bottleneck結構。路徑 B 使用stride=2 的 1×1 卷積將輸入形狀變換爲路徑 A 的輸出形狀,這樣我們可以對兩個路徑的輸出求和以獲得downsample block的輸出。residual block類似於downsample block,除了僅使用stride=1的卷積。
我們可以改變每個stage中residual block的數量以獲得不同的 ResNet 模型,例如 ResNet-50 和 ResNet-152,其中的數字表示網絡中卷積層的數量。
在這裏插入圖片描述

4.2 ResNet變體

我們首先回顧兩個已有的流行的ResNet的變體,記爲ResNet-B和ResNet-C。在此基礎上我們提出一個新的變體ResNet-D。
ResNet-B。這個版本一開始出現在Torch的實現裏。它改變了ResNet的downsample block。在原始的ResNet的downsample模塊中,路徑A使用1×1卷積stride=2,使得輸入feature map一下子就丟失了3/4。ResNet-B於是改變了一下stride=2的卷積的位置,將其放在第二個卷積上,這樣沒有信息被丟失。
ResNet-C。這種變形首先由Inception-v2提出,然後在很多其他模型如SENet,PSPNet,DeepLabV3,ShuffleNetV2等中被使用。由於卷積的計算量和kernel的長寬是二次的關係,因此7×7的卷積計算量是3×3卷積計算量的5.4倍。ResNet-C變體在輸入主幹中將7×7卷積替換成3個3×3卷積,其中第1和第2個卷積輸出channel數爲32,stride=2,第3個卷積輸出channel數爲64。
ResNet-D。受ResNet-B的啓發,我們發現downsample block路徑B中的1×1卷積也丟失了3/4的feature map。我們希望修改它使得信息沒有被丟失。我們發現在卷積層前加1個2×2 avg pooling層,stride=2,同時將卷積層的stride變爲1,在實際中表現良好。
在這裏插入圖片描述

4.3 實驗結果

ResNet-D在主幹網絡上沿用ResNet-C的結構,在downsample block的路徑A沿用ResNet-B的結構,同時在路徑B做了改進,各個改動的acc提升如表5所示。
在這裏插入圖片描述

5. 訓練方法改進

5.1 餘弦學習率衰減

學習率調整對於訓練來說很重要,除了在3.1節提到的學習率預熱的策略外,我們通常希望初始學習率的降低平滑一些。廣泛使用的是指數衰減,例如He et al.[9]中每隔30個epoch學習率衰減爲原來的0.1,Szegedy et al.[26]每兩個epoch學習率衰減爲原來的0.94。
和指數衰減不同,Loshchilov et al[18] 提出餘弦退火策略,其簡化版本是按照餘弦函數將學習率從初始值降到 0。假設批次總數爲T(忽略預熱階段),那麼在批次 t,學習率 ηt\eta_t 計算如下:
ηt=12(1+cos(tπT))η\eta_t=\frac{1}{2}(1+cos(\frac{t\pi}{T}))\eta

我們將這種學習率衰減的策略稱爲餘弦衰減。
餘弦衰減和指數衰減的比較如圖3a,可以看出餘弦衰減在開始階段降學習率降得比較慢,然後在中間階段接近於線性下降,最後結束階段又慢了下來。不同於指數衰減,餘弦衰減一開始降得比較慢,指數衰減可能都降爲原來的1/10了餘弦衰減的學習率還是很高,這有可能能夠提升訓練的進度。
在這裏插入圖片描述

5.2 標籤平滑

圖像分類網絡的最後一層通常是全連接層,channel數等於類別數(記爲K),輸出的是每個類別的置信度(對於類別i的置信度記爲ziz_i),這些置信度可以通過softmax將其歸一化成概率值,即q=softmax(z)q=softmax(z),其中每個每個類別的概率計算公式爲:
qi=exp(zi)j=1Kexp(zj)q_i=\frac{exp(z_i)}{ \sum_{j=1}^Kexp(z_j)}
可以看出 qi>0q_i>0j=1Kqi=1\sum_{j=1}^Kq_i=1
另一方面,圖片的真實類別記爲y,真實的概率分佈(記爲pip_i)爲:
在這裏插入圖片描述
訓練時損失函數是交叉熵loss(注意這裏原文中的公式寫錯了):
L(p,q)=i=1Kpilog(qi)\mathcal{L}(p,q)=-\sum\limits_{i=1}^{K}p_ilog(q_i)
由於pip_i僅在i=yi=y時有值,loss可以進一步寫成:L(p,q)=log(qy)=zy+log(j=1Kexp(zj))\mathcal{L}(p,q)=-log(q_y)=-z_y+log(\sum\limits_{j=1}^Kexp(z_j))
則理想狀態下zyz_y^*=inf 且其他ziz_i很小。也就是說它希望輸出的置信度非常具有區分度,這可能會導致過擬合。
標籤平滑的想法首先被提出用於訓練 Inception-v2 [26]。它將真實概率的構造改成:
在這裏插入圖片描述
其中ϵ\epsilon是一個小的常數。這時理想的解爲:
在這裏插入圖片描述
其中α\alpha可以是任意實數。這個解使得fc層的輸出是有限的,更容易進行泛化。當ϵ=0\epsilon=0時,gap(指真實類別的預測概率和其他類別的預測概率之間的倍數)log((K1)(1ϵ)/ϵ)log((K-1)(1-\epsilon)/\epsilon)將等於無窮,當ϵ\epsilon增大時,gap減小。特別地當ϵ=(K1)/K\epsilon=(K-1)/K時,所有ziz_i^*的值相等。圖4a顯示了當我們改變ϵ=0\epsilon=0時gap的變化,給定K=1000。就是說在ϵ=0\epsilon=0時gap爲正無窮,ϵ=1\epsilon=1時(確切的值是ϵ=(K1)/K\epsilon=(K-1)/K)gap爲0。
我們比較了兩個分別帶標籤平滑和不帶標籤平滑的ResNet-50-D模型的輸出值,gap=輸出的最大預測概率/其他預測概率的均值。圖4b顯示了兩個模型的gap分佈,帶標籤平滑取ϵ=0.1\epsilon=0.1,K=1000,此時gap在9.1左右。很明顯帶標籤平滑的gap小於不帶標籤平滑的,並且極端值的情況變少了。
在這裏插入圖片描述

5.3 知識蒸餾

在知識蒸餾[10] 中,我們使用教師模型來幫助訓練當前模型(稱爲學生模型)。教師模型通常是具有更高準確率的預訓練模型,通過模仿,學生模型能夠在保持模型複雜性相同的同時提高其自身的準確率。一個例子是使用 ResNet-152 作爲教師模型來幫助訓練 ResNet-50。
在訓練時,增加一個蒸餾loss用於懲罰學生模型和教師模型softmax輸出的不一致。給定輸入,假設 pp 是groundtruth的概率分佈,zzrr 分別是學生模型和教師模型最後一層fc層的輸出,則loss變爲:
在這裏插入圖片描述
其中T是一個溫度超參,用於控制輸出的softmax更平滑,這樣可以幫助從教師模型的預測中蒸餾出類別分佈的知識。

5.4 mixup訓練

在混合訓練(mixup)中,每次我們隨機抽樣兩個樣本 (xi,yix_i,y_i) 和 (xj,yjx_j,y_j)。然後通過這兩個樣本的加權線性插值構建一個新的樣本:
在這裏插入圖片描述
其中λ\lambda是從Beta分佈中隨機採樣的一個數。在混合訓練中,我們只使用新的樣本 (x^,y^\hat{x}, \hat{y})。

5.5 實驗結果

驗證上述4種改進的訓練方法的有效性。對於標籤平滑,我們參照[26]設置 η=0.1\eta=0.1。對於知識蒸餾,設置T=20T=20,另外教師模型是一個預訓練的ResNet-152-D模型,使用餘弦衰減和標籤平滑。對於mixup,Beta分佈的 α=0.2\alpha=0.2,另外將訓練的eopch數從120調整到200,因爲混合的數據需要更長的訓練時間來收斂地更好。當結合mixup和知識蒸餾時,我們在訓教師模型時也用上mixup。
我們認爲這些訓練方法不止對ResNet結構有效或只對ImageNet數據集有效。首先我們用這些訓練方法在ImageNet上訓練了ResNet-50-D,Inception-V3和MobileNet。val acc如表6所示。通過餘弦衰減,標籤平滑和mixup,我們對ResNet,Inception,MobileNet有穩定的提升。知識蒸餾對於ResNet效果很好,但對於Inception和MobileNet效果不好,我們認爲可能的原因是教師模型和學生模型所屬的模型結構不一樣,因此在預測時有不同的分佈,不適合進行教學。
另外我們在MIT Places365數據集上也訓練了一個ResNet-50-D模型,用於證明我們的tricks可以用在別的數據集上,結果如表7。
在這裏插入圖片描述

6.遷移學習

6.1 目標檢測

把Faster-RCNN的VGG-19 Backbone模型替換成前面提到的各種預訓練模型,其他設置保持一致。mAP在VOC2007上最終有4%的提升。
在這裏插入圖片描述

6.2 語義分割

使用FCN在ADE20K數據集上進行訓練和測試。餘弦退火策略能夠比較好地提升精度,而其他tricks效果都不好。可能的解釋是語義分割預測的是像素級別,而用標籤平滑,知識蒸餾和mixup有利於軟化標籤,模糊的像素級信息可能會更模糊,從而降低整體的像素級準確率。
在這裏插入圖片描述

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