
論文名: Bag of Tricks for Image Classification with Convolution Neural Networks
論文地址: http://arxiv.org/pdf/1812.01187v2.pdf
這篇文章是亞馬遜李沐團(tuán)隊(duì)的一篇技巧(tricks)文章,被CVPR2019收錄了。雖然題目是講的Image Classification,但是作者也說(shuō)了,在目標(biāo)檢測(cè),實(shí)例分類等問(wèn)題上也是有一定的作用的。在此做下筆記,有理解不對(duì)的地方還請(qǐng)大佬們勿噴。
摘要
先看看這篇文章的摘要部分:

翻譯一下:
【 摘要 】 圖像分類研究最近取得的許多進(jìn)展可以歸因于訓(xùn)練過(guò)程的改進(jìn),例如 數(shù)據(jù)增強(qiáng) 和 優(yōu)化方法的改變。然而,大多數(shù)改進(jìn)要么只是作為實(shí)現(xiàn)細(xì)節(jié)被簡(jiǎn)要地提到,要么 只在源代碼中可見(jiàn) 。在本文中,我們將 研究這些改進(jìn)的一系列集合 ,并通過(guò) ablation study 評(píng)估它們對(duì)最終模型精度的影響。我們將證明,通過(guò)將這些改進(jìn)組合在一起,我們能夠顯著改進(jìn)各種 CNN 模型。例如,我們將 ResNet-50 在 ImageNet 上的 top-1 驗(yàn)證精度從 75.3% 提高到 79.29% 。 我們還將證明,圖像分類準(zhǔn)確性的提高,可以在目標(biāo)檢測(cè)和語(yǔ)義分割等其他應(yīng)用領(lǐng)域帶來(lái)更好的遷移學(xué)習(xí)性能。
結(jié)論
先上結(jié)論:

論文概要
1.第 2 節(jié),建立了一個(gè) BaseLine 訓(xùn)練過(guò)程,
2.第 3 節(jié),討論了一些有效訓(xùn)練的技巧。
3.第 4 節(jié),回顧了 ResNet 的三個(gè)小型模型體系結(jié)構(gòu)調(diào)整,并提出了一個(gè)新的改進(jìn)。
4.第 5 節(jié),討論另外四個(gè)訓(xùn)練過(guò)程的改進(jìn)。
5.最后,在第六節(jié)中研究這些更準(zhǔn)確的模型是否有助于遷移學(xué)習(xí)。
BaseLine訓(xùn)練過(guò)程
不是文章重點(diǎn),就不細(xì)說(shuō)了。
作者基于MXnet框架復(fù)現(xiàn)了幾個(gè)網(wǎng)絡(luò)結(jié)構(gòu),具體指標(biāo)如下:

tricks結(jié)構(gòu)
論文中的tricks部分將從以下幾個(gè)部分展開(kāi):

也即:訓(xùn)練速度,網(wǎng)絡(luò)結(jié)構(gòu),訓(xùn)練過(guò)程優(yōu)化,遷移學(xué)習(xí)。
Efficient Training 高效訓(xùn)練
"硬件,尤其是GPU,近年來(lái)發(fā)展迅速。因此,許多與性能相關(guān)的權(quán)衡的最佳選擇已經(jīng)改變。例如,現(xiàn)在在訓(xùn)練期間使用更低的數(shù)值精度和更大的批量大小更有效。在本節(jié)中,我們將介紹各種能夠?qū)崿F(xiàn)低精度和大批量訓(xùn)練的技術(shù),而不會(huì)犧牲模型的準(zhǔn)確性。有些技術(shù)甚至可以提高準(zhǔn)確性和訓(xùn)練速度。"
2017年,谷歌大腦發(fā)布了一篇論文,從論文的名字,我們就可以看出論文是想干嘛。(谷歌爸爸取名字還真是簡(jiǎn)單粗暴?。?/p>

論文中指出,越大的batchsize,能帶來(lái)越好的結(jié)果。
實(shí)驗(yàn)結(jié)果(b)進(jìn)一步顯示增大 Batch Size 的好處,觀察損失值與參數(shù)更新次數(shù)的關(guān)系。

其中:
藍(lán)線代表常見(jiàn)的保持 Batch Size,逐步衰減學(xué)習(xí)率的方法;
紅線代表與之相反的,保持學(xué)習(xí)率,相應(yīng)的上升 Batch Size 的策略;
綠線模擬真實(shí)條件下,上升 Batch Size 達(dá)到顯存上限的時(shí)候,再開(kāi)始下降學(xué)習(xí)率的策略。
顯然,增大 Batch Size 的方法中參數(shù)更新的次數(shù)遠(yuǎn)少于衰減學(xué)習(xí)率的策略。
我們?cè)倏匆粡垐D:

這張圖可以清晰的看到,更多的一些細(xì)節(jié):
- Batch_size太小的話,模型在200個(gè)epoch內(nèi)并不會(huì)收斂。
- 隨著B(niǎo)atch_size增大,處理相同數(shù)據(jù)量的速度會(huì)越來(lái)越快。
- 隨著B(niǎo)atch_size 增大 ,達(dá)到相同精度所需要的epoch數(shù)量越來(lái)越多。
以上的觀點(diǎn)有一點(diǎn)的矛盾,因?yàn)?,Batch_size增大到某一時(shí)刻,會(huì)達(dá)到時(shí)間上的最優(yōu)。由于最終精度會(huì)陷入不同的局部極值,因此Batch_size在增大到某個(gè)時(shí)刻,達(dá)到最終收斂精度上的最后。
在訓(xùn)練的時(shí)候,我們都知道要將Batch_size參數(shù)設(shè)置的大一些。但是我們也知道,過(guò)大的Batch_size會(huì)造成如下的缺點(diǎn):1.模型收斂過(guò)慢。2.占用更大的顯存。3.訓(xùn)練結(jié)果反而會(huì)比較小的Batch_size訓(xùn)練結(jié)果更差。那我們有沒(méi)有什么辦法在增大Batch_size的同時(shí)又避免這些缺點(diǎn)呢?
答案當(dāng)然是有的!
作者整理了以下方法:

Large-batch training 大批量訓(xùn)練
盲目增大批大小其實(shí)無(wú)益于提升訓(xùn)練效果,但卻有各種小技巧。 為了能進(jìn)行大Batch_size的訓(xùn)練,作者對(duì)比了四種啟發(fā)式方法(什么是啟發(fā)式方法?)
Linear scaling learning rate 等比例增大學(xué)習(xí)率
在小批量SGD中,梯度下降是隨機(jī)過(guò)程,因?yàn)樵诿總€(gè)批次中樣本都是隨機(jī)選擇的。 增加批量大小不會(huì)改變隨機(jī)梯度的期望,但會(huì)降低其方差。 換句話說(shuō),大批量會(huì)降低梯度中的噪聲,因此我們可以提高學(xué)習(xí)率,以便進(jìn)行調(diào)整。換句話說(shuō)就是, 等比例增大學(xué)習(xí)率是有用的,Accurate, large minibatch SGD: training imagenet in 1 hour.論文中提到,隨著批量大小線性增加學(xué)習(xí)率地 訓(xùn)練 ResNet-50 。
例如:作者按照何愷明的resnet論文中的內(nèi)容,選擇0.1作為Batch_size為256的初始學(xué)習(xí)率。當(dāng)?shù)赽個(gè)batch時(shí),學(xué)習(xí)率線性增加到0.1×b/256。
Learning rate warmup 學(xué)習(xí)率預(yù)熱
這一個(gè)技巧是facebook所提出。

在訓(xùn)練的開(kāi)始時(shí)期,所有的參數(shù)都是一個(gè)隨機(jī)值,這樣離最終結(jié)果差的比較大。使用大的學(xué)習(xí)率會(huì)導(dǎo)致數(shù)值的不穩(wěn)定??梢韵炔捎靡粋€(gè)手段使得訓(xùn)練過(guò)程穩(wěn)定下來(lái)。這個(gè)手段就是“學(xué)習(xí)率預(yù)熱”,那么什么是學(xué)習(xí)率預(yù)熱?就是在訓(xùn)練最開(kāi)始的時(shí)候,先使用一個(gè)小的學(xué)習(xí)率訓(xùn)練,當(dāng)訓(xùn)練穩(wěn)定下來(lái)后,再換回原來(lái)設(shè)定的學(xué)習(xí)率。

facebook則提出一種預(yù)熱策略,就是從0到設(shè)定學(xué)習(xí)率之間采用線性關(guān)系形式。
m個(gè)batches是用來(lái)warmup的,我們?cè)O(shè)置的初始lr為η,那么當(dāng)?shù)趇(1≤i≤m)個(gè)batch時(shí),lr為i×η /m。
Zero γ 零γ初始化
這一技巧是針對(duì)resne所提出,也是Facebook的成果。

我們首先回顧一下resnet的結(jié)構(gòu)。我們知道resnet網(wǎng)絡(luò)由多個(gè)殘差塊組成,每個(gè)殘差塊由幾個(gè)卷積網(wǎng)絡(luò)組成。給定輸入x,假設(shè)block(x)是塊中最后一層的輸出,則該殘余塊輸出block(x)+x。

block塊中的最后一層就是一個(gè)BN層,具體操作如下:1.求均值。2.求方差。3.歸一化。4.縮放和偏移。
第4步將normalize后的數(shù)據(jù)再擴(kuò)展和平移。是為了讓神經(jīng)網(wǎng)絡(luò)自己去學(xué)著使用和修改這個(gè)擴(kuò)展參數(shù)γ,和平移參數(shù)β, 這樣神經(jīng)網(wǎng)絡(luò)就能自己慢慢琢磨出前面的normalization操作到底有沒(méi)有起到優(yōu)化的作用, 如果沒(méi)有起到作用, 就使用γ和β來(lái)抵消一些normalization的操作。

其中,γ和β都是可訓(xùn)練的參數(shù)。通常的做法是在初始化時(shí),將β設(shè)為0,但是作者提出在初始化時(shí)可以將γ也設(shè)為0,也就是上圖中的block在初始化時(shí)輸出為0。這樣一來(lái),輸出就只有shortcut結(jié)構(gòu)的輸出了,也即輸出等于輸入。
這樣的好處:將所有殘差塊中的最后一個(gè)BN中的初始化設(shè)置成0,也即殘差塊的輸出等于輸入,相當(dāng)于 模型的網(wǎng)絡(luò)層數(shù)較少, 可以使得模型在初始化階段更容易訓(xùn)練。

No bias decay 無(wú)偏置衰減
這一技巧來(lái)自騰訊機(jī)智團(tuán)隊(duì)。

Weight Decay是用來(lái)解決過(guò)擬合問(wèn)題。 但是一般來(lái)說(shuō),會(huì)對(duì)可學(xué)習(xí)的參數(shù)如 weight 和 bias 都會(huì)做 decay,通常的做法是使用L2正則化來(lái)做。機(jī)智團(tuán)隊(duì)提出只對(duì)卷積層和全連接層的weight做L2中正則化,不對(duì)bias,BN層的γ和β進(jìn)行正則化衰減。
題外話
說(shuō)個(gè)題外話:大家看到之前的幾篇文章的標(biāo)題,很是唬人。什么1小時(shí)訓(xùn)練完ImageNet、4分鐘訓(xùn)練完ImageNet。那么問(wèn)題來(lái)了,目前最快訓(xùn)練完ImageNet的是誰(shuí)?

截止到2019年3月,最快訓(xùn)練完ImageNet的是日本公司Fujitsu。值得注意的一點(diǎn)是使用的也是MXNet框架。 在 MXNet 中將很多的 tricks 默認(rèn)嵌入到了框架之中。這次的訓(xùn)練也采用了很多的這篇文章所提到的一些技巧:
0.大batch size
1.由于更新數(shù)量較小,研究人員需要采用較高的學(xué)習(xí)率來(lái)加速訓(xùn)練。但是,較高的學(xué)習(xí)率會(huì)導(dǎo)致模型在早期階段訓(xùn)練不穩(wěn)定。因此,研究人員采用能夠逐步提升學(xué)習(xí)率的預(yù)熱技術(shù)來(lái)穩(wěn)定(SGD。)
2.之后會(huì)提到的標(biāo)簽平滑(label smoothing)
Low-precision training 低精度訓(xùn)練
首先是三種精度的介紹和比較。 神經(jīng)網(wǎng)絡(luò)的訓(xùn)練常常使用 32 位 float 類型( FP32 )對(duì)所有的數(shù)據(jù)和參數(shù)進(jìn)行 存儲(chǔ)和計(jì)算。

從TegraX1開(kāi)始, NVIDIA 的 GPU 將支持原生的 FP16 計(jì)算指令,理論上可以獲得兩倍于FP32的性能,適用于大規(guī)模的神經(jīng)網(wǎng)絡(luò)或者計(jì)算機(jī)視覺(jué)相關(guān)的應(yīng)用。而從 CUDA 7.5 開(kāi)始,開(kāi)發(fā)者可以很容易的 直接使用內(nèi)置的half以及half2 將原有的 FP32 的代碼移植為 FP16。

最近幾年,nvidia為了加速訓(xùn)練過(guò)程,在最新的架構(gòu)中還增加了特殊的fp16矩陣運(yùn)算(邏輯)單元,專門用于較低精度的數(shù)據(jù)類型。2017年5月11日發(fā)布的英偉達(dá)特斯拉V100,增加了特殊的fp16矩陣運(yùn)算(邏輯)單元,專門用于較低精度的數(shù)據(jù)類型。使得新的計(jì)算設(shè)備提供了低精度的16位float類型(FP16)的計(jì)算能力,于是就有了拿FP16來(lái)進(jìn)行計(jì)算的方式。

于是有人提出能不能全部使用FP16來(lái)進(jìn)行網(wǎng)絡(luò)的訓(xùn)練,可以是可以,雖然會(huì)讓訓(xùn)練速度提升,但是結(jié)果的精度也會(huì)下降呀。

百度研究院提出混合精度訓(xùn)練。

在整個(gè)訓(xùn)練過(guò)程中,用FP16來(lái)存儲(chǔ)參數(shù)、計(jì)算梯度,同時(shí)留一個(gè)32位精度的參數(shù)的備份,用于更新參數(shù)。

在V100上從FP32切換到FP16后,整體訓(xùn)練速度加快了2到3倍。
結(jié)果
以上五種做法對(duì)實(shí)驗(yàn)結(jié)果的影響如下:

可以看到Zero γ這個(gè)技巧是提升比較大的。
本篇文章主要介紹了論文的概要,大批量訓(xùn)練的一些tricks以及快速訓(xùn)練所使用的低精度訓(xùn)練方法。第二三篇將介紹模型微調(diào),訓(xùn)練調(diào)整等技巧。
參考文獻(xiàn)
論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks
[深度學(xué)習(xí)] Image Classification圖像分類之Bag of Tricks for Image Classification with Convolutional Neural Net
Amazon深度學(xué)習(xí)工程師總結(jié)的分類模型煉丹技巧總結(jié)
Accurate, large minibatch SGD: training imagenet in 1 hour
Deep residual learn ing for image recognition
Highly scalable deep learning training system with mixed-precision: Training imagenet in four minutes
Mixed precision training
談?wù)勆疃葘W(xué)習(xí)中的 Batch_Size
2048塊GPU再次加速SGD:富士通74.7秒完成ResNet-50 訓(xùn)練