《Bag of Tricks for Image Classification with Convolutional Neural Networks》論文閱讀筆記

  論文地址:Bag of Tricks for Image Classification with Convolutional Neural Networks

一、簡介

  這篇文章旨在對當下深度學習方面不同網絡不同測tricks對最終在ImageNet上的性能上的影響進行對比。當前使用的是ResNet-50網絡,當然會對不同的網絡進行對比,但是不同的tricks會使用相同的網絡進行ResNet-50。下圖爲最終的網絡結果:
在這裏插入圖片描述

二、實驗設置

  爲了控制變量,能夠更有效地看到不同tricks的具體效用,因此有必要設置一些baseline進行對比試驗。

1、Baseline

1)、Baseline設置

  訓練採用的基本算法如下,就是普通的批量隨機梯度下降算法:
在這裏插入圖片描述
  實驗採用的基本模型爲ResNet,在實驗中會按如下方式一步步添加tricks:

    1. 隨機採樣圖像並將其解碼爲[0,255]中的32位浮點原始像素值;
    1. 隨機裁剪長寬比以[3/4,4/3]隨機採樣的矩形區域,以[8%,100%]隨機採樣的區域,然後將裁剪的區域調整爲224 x 224的正方形圖像;
    1. 以0.5的概率水平翻轉;
    1. 比例色相,飽和度和亮度,其係數均由[0.6,1.4]統一得出;
    1. 加上從正態分佈N(0,0.1)採樣的係數的PCA噪聲;
    1. 通過分別減去123.68、116.779、103.939併除以58.393、57.12、57.375來標準化RGB通道。

  驗證期間,將每張圖片的較短邊緣調整爲256個像素,同時保持其寬高比。接下來,我們裁剪中心的224 x 224區域並標準化類似於訓練的RGB通道。驗證期間,我們不會執行任何隨機擴充。
  卷積層和完全連接層的權重均使用Xavier算法[6]進行初始化。特別是,我們將參數設置爲從[aa][-a,a]均勻得出的隨機值,其中a=6/din+douta=\sqrt{6 /(d_{in} + d_{out})}。此處d_{in}和d_{out}分別是輸入和輸出通道的大小。所有bias都初始化爲0。對於批歸一化層,γ向量初始化爲1,β向量初始化爲0。
  Nesterov加速梯度(NAG)下降[20]用於訓練。每個模型在8個Nvidia V100 GPU上進行了120個epoch的訓練,batch size爲256。學習率被初始化爲0.1,並在第30、60和90個epoch除以10。

2)、Baseline實驗結果

  ResNet-50,Inception-V3,MobileNet在ImageNet上的結果如下圖:
在這裏插入圖片描述

2、加速訓練的方式

1)、大批量訓練

  通常認爲打的batch size會導致單詞訓練時間過長,網絡性能下降等缺陷,但是小批量會導致local bathc的數據分佈和原始數據差距過大而影響性能,因此這裏提到的方式是爲了在單機上保證網絡的性能的同時提高batch size。

線性縮放學習率

  在小批量SGD中,梯度下降是一個隨機過程,因爲在每個批次中都是隨機選擇示例。增加批次大小不會改變隨機梯度的期望,但會減小其方差。換句話說,大批量可以減少梯度中的噪聲,因此我們可以提高學習率,從而沿着梯度方向的相反方向獲得更大的進展。對於ResNet-50訓練,根據批次大小線性增加學習率是有效的。baseline批量大小256選擇0.1作爲初始學習率,然後當更改爲更大的批量bb時,我們會將初始學習率提高到0.1×b/2560.1×b / 256

學習率warmup

  在訓練開始時,所有參數通常都是隨機值,因此遠離最終解。使用太大的學習率可能會導致數值不穩定。在warmp-up方法中,在開始時使用小的學習率,然後在訓練過程穩定時切換回初始學習率。warmup將學習率從0線性增加到初始學習率。換句話說,假設將使用前m個批次(例如5個數據epoch)進行預熱,並且初始學習速率爲ηη,則在第i批次,1im1≤i≤m,我們將學習速率設爲iη/miη/ m

部分γ置0

  ResNet網絡由多個殘差塊組成,每個塊由幾個卷積層組成。給定輸入xx,假定block(x)是該塊中最後一層的輸出,則此剩餘塊將輸出x+blockxx + block(x)。注意,塊的最後一層可以是批歸一化(BN)層。BN層首先標準化其輸入,用x^\hat{x}表示,然後執行比例變換γx^+βγ\hat{x} +β。γ和β都是可學習的參數,其元素分別初始化爲1s和0s。在零γ初始化試探法中,對位於殘差塊末尾的所有BN層初始化γ= 0。因此,所有殘差塊僅返回其輸入,模擬了具有較少層數且在初始階段更易於訓練的網絡。

無bias衰減

  權重衰減通常應用於所有可學習的參數,包括權重和偏差。等同於對所有參數應用L2正則化,以將其值逼近0。但是有文章表示建議僅對權重應用正則化,以避免過擬合。無偏差衰減試探法遵循此建議,它僅將權重衰減應用於卷積層和完全連接層中的權重。其他參數,包括BN層中的bias以及γ和β,均未調整。
  注意,LARS提供了分層的自適應學習率,據報道對於非常大的批處理大小(超過16K)有效。雖然在文中,限於適用於單機培訓的方法,但在這種情況下,不超過2K的批量通常會帶來良好的系統效率。

2)、低精度訓練

  神經網絡通常以32位浮點(FP32)精度進行訓練。也就是說,所有數字都以FP32格式存儲,算術運算的輸入和輸出也都是FP32數字。但是,新硬件可能具有用於較低精度數據類型的增強型算術邏輯單元。例如,先前提到的Nvidia V100在FP32中提供14 TFLOPS,但在FP16中提供100 TFLOPS。如表3所示,從V100上的FP32切換到FP16後,總體訓練速度提高了2到3倍。
  儘管有性能上的好處,但降低的精度會導致範圍變窄,從而使結果更可能超出範圍,進而干擾訓練進度。Micikevicius等,提出將所有參數和激活存儲在FP16中,並使用FP16計算梯度。同時,所有參數在FP32中都有一個副本,用於參數更新。另外,將標量乘以損耗以更好地將梯度範圍對準FP16也是一種可行的解決方案。

3)、實驗結果

  加速之後性能上並未下降但是速度上基本上是原來的2-3倍。
在這裏插入圖片描述
在這裏插入圖片描述

三、模型調整

  模型調整是對網絡體系結構的微小調整,例如更改特定卷積層的跨度。這種調整通常幾乎不會改變計算的複雜性,但對模型準確性的影響卻不可忽略。在本節中,將以ResNet爲例研究模型調整的效果。

1、ResNet網絡架構

  ResNet的網絡結構如下所示,網絡的機構不做過多的說明結構很明顯主要是四個stage組成,每個stage第一個是一個下采樣的殘差塊,後面緊跟多個殘差。:
在這裏插入圖片描述

2、ResNet網絡調整

在這裏插入圖片描述

1)、ResNet-B

  ResNet-B更改了ResNet的下采樣塊。路徑A中的卷積忽略了輸入特徵圖的四分之三,因爲它使用的內核大小爲1×1,步幅爲2。ResNet-B切換路徑A中前兩個卷積的步幅大小,如圖所示,因此不會忽略任何信息。由於第二次卷積的核大小爲3×3,因此路徑A的輸出形狀保持不變

2)、ResNet-C

  此調整最初是在Inception-v2中提出的,實際上應該是VGG。觀察發現,卷積的計算成本是核寬度或高度的平方。7×7卷積比3×3卷積貴5.4倍。因此,此調整用三個保守的3×3卷積代替了輸入主幹中的7×7卷積,如圖2b所示,第一個和第二個卷積的輸出通道爲32,步幅爲2,最後一個爲2卷積使用64輸出通道。

3)、ResNet-D

  受ResNet-B的啓發,我們注意到下采樣塊路徑B中的1×1卷積也忽略了3/4個輸入特徵圖,想對其進行修改,因此不會忽略任何信息。根據經驗,發現在卷積之前添加一個跨度爲2的2×2平均池化層(其跨度更改爲1)在實踐中效果很好,並且對計算成本的影響很小。

3、實驗結果

在這裏插入圖片描述

四、訓練細化

1、Cosine Learning Rate Decay

  一個簡化的版本通過遵循餘弦函數將學習率從初始值降低到0。假設批次總數爲T(忽略預熱階段),則在批次t處,學習率ηt計算爲:
ηt=12(1+cos(tπT))η \eta_t=\frac{1}{2}(1+cos(\frac{t\pi}{T}))\eta
  η\eta爲原始學習率。使用cosine學習率衰減的效果如下圖:
在這裏插入圖片描述

2、Label Smoothing

  通常分類任務中,都是將網絡的輸出經過全連接層之後使用softmax將輸出變成概率。假設該圖像的真實標籤爲yy,則可以將i=yi = y的真概率分佈構造爲pi=1p_i = 1,否則將其構造爲0。在訓練期間,最小化負交叉熵損失以更新模型參數,以使這兩個概率分佈彼此相似。特別是,通過構造pp的方式,一個(p,q)=logpy=zy+log(i=1Kexp(zi))\ell(p,q)=-logp_y=-z_y+log(\sum_{i=1}^{K}exp(z_i))。最優解是使得zy=infz_y^{*}=inf足夠小。換句話說,它鼓勵輸出得分顯着獨特,這可能導致過度擬合。最初提出標籤平滑的思想是訓練Inception-v2,它將真實概率的構造更改爲
qi={1ϵ,i=y,ϵ/(K1),otherwise q_i=\left\{\begin{array}{ll}1-\epsilon,如果 i=y,\\ \epsilon /(K-1), otherwise\end{array}\right.
  其中ϵ\epsilon是一個很小的數那麼現在優化的目標就變成:
zi={log((K1)(1ϵ)/ϵ),i=y,α,otherwise z_i^{*}=\left\{\begin{array}{ll}log((K-1)(1-\epsilon)/\epsilon),如果 i=y,\\ \alpha, otherwise\end{array}\right.
  其中α可以是任意實數。這鼓勵從全連接層層中有限輸出,並且可以更好地推廣。
當ε= 0時,間隙log((K1)(1ϵ)/ϵ)log((K-1)(1-\epsilon)/\epsilon)爲∞,並且隨着ε的增加,間隙減小。具體來說,當ε=K1/Kε=(K − 1)/ K時,所有最佳ziz_i^{*}都相同。下圖顯示了給定ImageNet數據集的K = 1000時,間隙隨着我們移動ε的變化。
在這裏插入圖片描述

3、Knowledge Distillation

  我們使用教師模型來幫助訓練當前模型,即學生模型。教師模型通常是具有較高準確性的預訓練模型,因此,通過模仿,學生模型可以提高自己的準確性,同時保持模型複雜性不變。一個示例是使用ResNet-152作爲教師模型來幫助培訓ResNet-50。
在訓練過程中,我們增加了蒸餾損失,以懲罰教師模型和學習者模型的softmax輸出之間的差異。給定輸入,假設p是真實的概率分佈,z和r分別是學生模型和教師模型的最後一個完全連接層的輸出。請記住,之前我們使用負交叉熵損失‘(psoftmax(z))(p,softmax(z))來測量p和z之間的差,這裏我們再次使用相同的損失進行蒸餾。因此,損失更改爲
(p,softmax(z))+T2(softmax(rT),softmax(zT)) \ell(p,softmax(z))+T^2\ell(softmax(\frac{r}{T}),softmax(\frac{z}{T}))
  其中T是使hypermax輸出更加平滑的溫度超參數,因此可以從老師的預測中提取標籤分配的知識。

4、Mixup Training

  在Mixup中將兩個樣本(xi,yi)(xj,yj)(x_i,y_i)和(x_j,y_j)合併爲一個新的類別:
x^=λxi+(1λ)xjy^=λyi+(1λ)yj \begin{aligned} \hat{x}=\lambda x_i+(1-\lambda)x_j \\ \hat{y}=\lambda y_i+(1-\lambda)y_j \end{aligned}
  λ[0,1]\lambda \in [0,1]是一個隨機的beta分佈的數字,訓練期間只使用(x^,y^)(\hat{x}, \hat{y})

5、實驗結果

  訓練期間設置ϵ=0.1,T=20\epsilon=0.1,T=20,mixup中使用分佈爲Beta(0.2,0.2),分別在不同任務上進行測試:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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