論文地址: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:
-
- 隨機採樣圖像並將其解碼爲[0,255]中的32位浮點原始像素值;
-
- 隨機裁剪長寬比以[3/4,4/3]隨機採樣的矩形區域,以[8%,100%]隨機採樣的區域,然後將裁剪的區域調整爲224 x 224的正方形圖像;
-
- 以0.5的概率水平翻轉;
-
- 比例色相,飽和度和亮度,其係數均由[0.6,1.4]統一得出;
-
- 加上從正態分佈N(0,0.1)採樣的係數的PCA噪聲;
-
- 通過分別減去123.68、116.779、103.939併除以58.393、57.12、57.375來標準化RGB通道。
驗證期間,將每張圖片的較短邊緣調整爲256個像素,同時保持其寬高比。接下來,我們裁剪中心的224 x 224區域並標準化類似於訓練的RGB通道。驗證期間,我們不會執行任何隨機擴充。
卷積層和完全連接層的權重均使用Xavier算法[6]進行初始化。特別是,我們將參數設置爲從均勻得出的隨機值,其中。此處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作爲初始學習率,然後當更改爲更大的批量時,我們會將初始學習率提高到
學習率warmup
在訓練開始時,所有參數通常都是隨機值,因此遠離最終解。使用太大的學習率可能會導致數值不穩定。在warmp-up方法中,在開始時使用小的學習率,然後在訓練過程穩定時切換回初始學習率。warmup將學習率從0線性增加到初始學習率。換句話說,假設將使用前m個批次(例如5個數據epoch)進行預熱,並且初始學習速率爲,則在第i批次,,我們將學習速率設爲。
部分γ置0
ResNet網絡由多個殘差塊組成,每個塊由幾個卷積層組成。給定輸入,假定block(x)是該塊中最後一層的輸出,則此剩餘塊將輸出。注意,塊的最後一層可以是批歸一化(BN)層。BN層首先標準化其輸入,用表示,然後執行比例變換。γ和β都是可學習的參數,其元素分別初始化爲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計算爲:
爲原始學習率。使用cosine學習率衰減的效果如下圖:
2、Label Smoothing
通常分類任務中,都是將網絡的輸出經過全連接層之後使用softmax將輸出變成概率。假設該圖像的真實標籤爲,則可以將的真概率分佈構造爲,否則將其構造爲0。在訓練期間,最小化負交叉熵損失以更新模型參數,以使這兩個概率分佈彼此相似。特別是,通過構造的方式,一個。最優解是使得足夠小。換句話說,它鼓勵輸出得分顯着獨特,這可能導致過度擬合。最初提出標籤平滑的思想是訓練Inception-v2,它將真實概率的構造更改爲
其中是一個很小的數那麼現在優化的目標就變成:
其中α可以是任意實數。這鼓勵從全連接層層中有限輸出,並且可以更好地推廣。
當ε= 0時,間隙爲∞,並且隨着ε的增加,間隙減小。具體來說,當時,所有最佳都相同。下圖顯示了給定ImageNet數據集的K = 1000時,間隙隨着我們移動ε的變化。
3、Knowledge Distillation
我們使用教師模型來幫助訓練當前模型,即學生模型。教師模型通常是具有較高準確性的預訓練模型,因此,通過模仿,學生模型可以提高自己的準確性,同時保持模型複雜性不變。一個示例是使用ResNet-152作爲教師模型來幫助培訓ResNet-50。
在訓練過程中,我們增加了蒸餾損失,以懲罰教師模型和學習者模型的softmax輸出之間的差異。給定輸入,假設p是真實的概率分佈,z和r分別是學生模型和教師模型的最後一個完全連接層的輸出。請記住,之前我們使用負交叉熵損失‘來測量p和z之間的差,這裏我們再次使用相同的損失進行蒸餾。因此,損失更改爲
其中T是使hypermax輸出更加平滑的溫度超參數,因此可以從老師的預測中提取標籤分配的知識。
4、Mixup Training
在Mixup中將兩個樣本合併爲一個新的類別:
是一個隨機的beta分佈的數字,訓練期間只使用
5、實驗結果
訓練期間設置,mixup中使用分佈爲Beta(0.2,0.2),分別在不同任務上進行測試: