『Bag of Tricks for Image Classification with Convolutional Neural Networks』論文筆記

一 為什么讀這篇

doodle比賽剛結束品嚣,蛙神推薦的炕倘,論文在arxiv上才掛出來,第二天蛙神就分享了翰撑,佩服其信息獲取能力罩旋。正如題目講的,一包tricks眶诈,讀這篇相當于讀綜述涨醋,學習一下圖像分類問題里的技巧討論。

二 截止閱讀時這篇論文的引用次數(shù)

2018.12.9 0次逝撬。畢竟12月4號才出的

三 相關背景介紹

幾個作者全部都是來自AWS的華人浴骂,其他幾人不算很有名,不過最后一個作者是大名鼎鼎的百度少帥李沐宪潮。應該會安利不少MXNet溯警。

四 關鍵詞

Tricks

Large-batch

Linear scaling learning rate(線性縮放學習率)

Learning rate warmup(學習率熱身)

FP32 FP16

Cosine Learning Rate Decay(余弦學習率衰減)

Label Smoothing(標簽平滑)

Knowledge Distillation(知識蒸餾)

Mixup Training(混合訓練)

五 論文的主要貢獻

正如論文題目所說,提供一包tricks用于提升效果狡相。模型架構很重要梯轻,但是訓練技巧也不容忽視。

六 詳細解讀

1 介紹

(摘要)當前許多圖像分類的研究可歸功于訓練過程的改進尽棕,例如改進數(shù)據(jù)增強和優(yōu)化方法喳挑。然而在文獻中,許多改進僅僅在實現(xiàn)細節(jié)中有簡短的描述或在源碼中才會出現(xiàn)。本文通過模型簡化測試(ablation study)試驗了一系列這些改進并評估他們對最終模型準確率的影響伊诵。通過聯(lián)合這些改進策略单绑,能夠顯著的改善不同的CNN模型。用這些策略把原始ResNet-50在ImageNet上的準確率從75.3%提升到79.29%日戈。询张。

在ImageNet上的top-1準確率從62.5%(AlexNet)提升到82.7%(NASNet-A)。然而改進不單單來自模型架構浙炼,訓練過程中的改進也扮演了很重要的角色份氧,例如損失函數(shù),數(shù)據(jù)預處理弯屈,優(yōu)化方法等蜗帜。這些方法受到的注意相對少些。通過本文的實驗說明模型準確率的提升不僅僅是由計算復雜度的改變帶來的资厉。

此處安利GluonCV厅缺。

cnn_tricks-table1.png

2 訓練過程(baseline)

cnn_tricks-alg1.png

2.1 Baseline訓練過程

torch的做法來實現(xiàn)ResNet作為baseline。訓練和測試階段的預處理流水線是不同的宴偿,在訓練階段湘捎,采用如下做法:

https://github.com/dmlc/gluon-cv/blob/master/scripts/classification/imagenet/train_imagenet.py#L152

1 隨機采樣圖像,將其從[0,255]原始像素值解碼為32位浮點數(shù)窄刘。

2 隨機裁剪縱橫比在[3/4, 4/3]之間窥妇,面積在[8%, 100%]之間的矩形區(qū)域,然后將裁剪區(qū)域調(diào)整為224x224的方形圖像娩践。

3 用0.5的概率做水平翻轉活翩。

4 從[0.6, 1.4]之間均勻采樣系數(shù)來縮放色調(diào),飽和度翻伺,亮度材泄。

5 增加PCA噪聲,系數(shù)為正態(tài)分布N(0, 0.1)中的采樣吨岭。

6 歸一化RGB通道拉宗。分別減123.68, 116.779, 103.939,然后除58.393, 57.12, 57.375

測試階段辣辫,調(diào)整圖像的短邊為256簿废,同時保留其縱橫比。之后從中間裁剪出224x224络它,用訓練階段的方式歸一化RGB通道族檬,不做其他數(shù)據(jù)增強。

卷積和FC層用Xavier的方式初始化化戳。偏置都初始化為0单料。對于BN層埋凯,\gamma向量初始化為1,\beta向量初始化為0扫尖。

用NAG(Nesterov Accelerated Gradient)做梯度下降白对。每個模型訓練120個epoch,batch_size為256换怖,在8卡的V100上甩恼。學習率初始為0.1,在30th, 60th, 90th epoch的時候分別除10沉颂。

2.2 實驗結果

cnn_tricks-table2.png

3 更有效的訓練

當前由于硬件的發(fā)展可以用更大的batch条摸,更低的數(shù)值精度來訓練。一些技術甚至能同時提高準確率和訓練速度铸屉。

3.1 Large-batch 訓練

對于同樣個數(shù)的epoch钉蒲,大的batch_size效果不如小的batch_size〕固常可以用以下啟發(fā)式方法來解決這個問題顷啼。

Linear scaling learning rate(線性縮放學習率)

增加batch_size并不能改變樣本選擇的隨機性,但是能減小方差昌屉,也就是說更大的batch_size能夠減少梯度的噪聲钙蒙。如果初始學習率為0.1,batch_size為256间驮,我們的batch_size定義為b仪搔,那么學習率可以增加為0.1 * b/256

Learning rate warmup(學習率熱身)

訓練剛開始時所有參數(shù)都是隨機值蜻牢,離最終方案還很遠。使用太大的學習率也許會導致數(shù)值不穩(wěn)定偏陪。用熱身策略抢呆,可以在剛開始用小的學習率當訓練穩(wěn)定后再切換為初始學習率。"1小時訓練imagenet"提出的策略是從0開始線性增加學習率直到初始學習率笛谦。

假設用前m個(如5個epoch)batch用于熱身抱虐,初始學習率定義為\eta,那么每個batch i, 1 \leq i \leq m饥脑,將學習率設置為i\eta/m恳邀。

Zero \gamma

ResNet的殘差塊的最后一層為BN時,BN層首先標準化其輸入灶轰,定義為\hat {x}谣沸,然后執(zhí)行縮放變換\gamma \hat { x } + \beta。當令\gamma=0時笋颤,縮小了網(wǎng)絡的層數(shù)乳附,因此在初始階段更容易訓練。(?赋除?阱缓?)

No bias decay

在"14分鐘訓練imagenet"提出的策略是weight decay只用于卷積層和FC的weights,biases和BN層的\gamma\beta都不用举农。

因為本文提出的是限制在單機上訓練的方法荆针,所以batch_size不會超過2k。

3.2 Low-precision 訓練

通常神經(jīng)網(wǎng)絡都是用32位浮點型(FP32)精度訓練颁糟,也就是說存儲和運算都是用FP32航背。然而當前的新硬件支持更低精度的數(shù)據(jù)類型。比如V100用FP32能提供14TFLOPS滚停,但是用FP16能提供100TFLOPS沃粗。。键畴。表3說明FP16比FP32有2到3倍的加速最盅。不過準確率提升不是因為FP16。

cnn_tricks-table3.png

盡管有性能上的提升起惕,減少精度也有可能因為其數(shù)值范圍的縮小導致訓練出錯涡贱。mixed precision方法用于解決這個問題。存儲所有的參數(shù)和激活用FP16惹想,并用FP16計算梯度问词,同時存儲所有參數(shù)的FP32用于參數(shù)更新。另外實踐上嘀粱,也經(jīng)常乘一個標量給loss用于更好的對齊梯度為FP16激挪。

3.3 實驗結果

見表3和表4。不過加上No bias decay锋叨,明顯是效果下降了垄分,不知道為什么沒提及這點。

cnn_tricks-table4.png

4 模型調(diào)整

對網(wǎng)絡架構的輕微調(diào)整通常不會改變計算復雜性娃磺,但可能對模型精度產(chǎn)生不可忽視的影響

4.1 ResNet架構

cnn_tricks-fig1.png

參考原作的圖

resnet-table1.png

4.2 ResNet調(diào)整

ResNet-B

改的是圖1的Down sampling部分薄湿。該調(diào)整最早在torch的實現(xiàn)中出現(xiàn),后來也被1hour偷卧,se-net豺瘤,resnext采用。修改點是ResNet的下采樣塊听诸。如圖坐求,因為原作使用1x1,stride=2的卷積導致path A忽略了3/4的輸入特征圖晌梨,所以把stride=2往后挪到3x3的卷積瞻赶。藍色的地方是做了修改的赛糟。

cnn_tricks-fig2.png
ResNet-C

改的是圖1的Input stem部分。該調(diào)整最早由Inception-v2提出砸逊,后來也在SENet璧南,PSPNet,DeepLabV3和ShuffleNetV2中使用师逸。觀察結果是卷積的計算成本是內(nèi)核寬度或高度的二次方司倚。7x7卷積比3x3卷積代價高5.4倍(49/9)。所做的修改是把7x7卷積用3個3x3卷積代替篓像。前兩個輸出通道為32动知,第三個輸出通道為64。

ResNet-D

這是由本文提出的员辩。受ResNet-B的啟發(fā)盒粮,發(fā)現(xiàn)下采樣塊中path B的1x1卷積也忽略了3/4的特征圖,所以改它奠滑。在1x1卷積前加一個2x2的avgpool丹皱,stride=2,原來1x1卷積的stride從2改為1宋税。這樣的修改效果不錯且只影響一點計算代價摊崭。

4.3 實驗結果

cnn_tricks-table5.png

實驗是基于第三部分的設置,即batch_size為1024杰赛,用FP16呢簸。相比原始ResNet-50,最后的ResNet-D提升了接近1%乏屯。不過在實踐中根时,發(fā)現(xiàn)比原來慢3%。(差0.5G就慢這么多辰晕。蛤迎。)

5 訓練改進

5.1 Cosine Learning Rate Decay(余弦學習率衰減)

學習率的調(diào)整對訓練至關重要。在用warmup策略后伞芹,通常會穩(wěn)步降低初始學習率的值。被廣泛使用的是指數(shù)衰減學習率蝉娜。ResNet中用的是每30個epoch降低0.1唱较,我們稱之為『step decay』。Inception中用的是每2個epoch降低0.94召川。

余弦退火策略是2016年提出來的南缓,簡化版本是把學習率從初始值降低到0。
\eta _ { t } = \frac { 1 } { 2 } \left( 1 + \cos \left( \frac { t \pi } { T } \right) \right) \eta
其中T是總batch數(shù)荧呐,t是當前batch索引汉形,\eta是初始學習率纸镊。

cnn_tricks-fig3.png

從上圖可以看出,起初余弦衰減的學習率緩慢下降概疆,在中間部分幾乎是線性下降逗威,在最后又緩慢下降。(不過從最后的準確率來看岔冀,余弦衰減似乎并無優(yōu)勢凯旭,也沒有加速收斂?)

5.2 Label Smoothing(標簽平滑)

softmax公式使套,其中K為標簽個數(shù)罐呼,z_{i}為預測類別i的分數(shù),q為softmax操作的輸出侦高。
q _ { i } = \frac { \exp \left( z _ { i } \right) } { \sum _ { j = 1 } ^ { K } \exp \left( z _ { j } \right) }
負交叉熵損失公式嫉柴,其中p_{i}為真實概率分布,當對了為1奉呛,不對為0计螺。(原文這里的公式好像寫錯了,p和q的地方放反了)
\ell ( p , q ) = - \sum _ { i = 1 } ^ { K } q _ { i } \log p _ { i }
訓練期間侧馅,通過最小化該損失來更新模型參數(shù)從而讓兩個概率分布彼此近似危尿。特別地,說一下如何構造p馁痴,我們知道\ell ( p , q ) = - \log p _ { y } = - z _ { y } + \log \left( \sum _ { i = 1 } ^ { K } \exp \left( z _ { i } \right) \right)谊娇。優(yōu)化解是z _ { y } ^ { * } = inf,同時保持其他值很小罗晕。換句話說济欢,這樣做也鼓勵輸出的分數(shù)有顯著區(qū)別,從而可能導致過擬合(通過softmax學到的模型太自信了)小渊。

標簽平滑的思路來自2015年提出的Inception-v2法褥。它將構造的真實分布改為
q _ { i } = \left\{ \begin{array} { l l } { 1 - \varepsilon } & { \text { if } i = y } \\ { \varepsilon / ( K - 1 ) } & { \text { otherwise } } \end{array} \right.
其中\varepsilon為一個很小的常量。現(xiàn)在優(yōu)化解變?yōu)?br> z _ { i } ^ { * } = \left\{ \begin{array} { l l } { \log ( ( K - 1 ) ( 1 - \varepsilon ) / \varepsilon ) + \alpha } & { \text { if } i = y } \\ { \alpha } & { \text { otherwise } } \end{array} \right.
其中\alpha為任意實數(shù)酬屉。這鼓勵FC層為有限輸出半等,從而泛化的更好。

cnn_tricks-fig4.png

從上圖可以看出標簽平滑的分布中心更接近理論值同時其極值更少呐萨。

插播一個知乎:神經(jīng)網(wǎng)絡中的label smooth為什么沒有火杀饵?

5.3 Knowledge Distillation(知識蒸餾)

Hinton在2015年提出的。用老師模型幫助當前的模型(學生模型)谬擦。老師模型通常是有很高準確率的預訓練模型切距,通過模仿,學生模型能提升自己的準確率同時保持其模型復雜度惨远。

在訓練期間谜悟,增加一個蒸餾損失來懲罰老師模型和學生模型的softmax輸出之間的差異话肖。給定一個輸入,定義p為真實概率分布葡幸,zr分別為學生模型和老師模型最后FC層的輸出最筒。

之前用損失\ell ( p , \text { softmax } ( z ) )來衡量pz之間的差異,這里使用同樣的損失用于蒸餾礼患。此時是钥,損失改為
\ell ( p , \text { softmax } ( z ) ) + T ^ { 2 } \ell ( \operatorname { softmax } ( r / T ) , \operatorname { softmax } ( z / T ) )
其中T為一個稱為溫度的超參,來使softmax的輸出更平滑缅叠。

5.4 Mixup Training(混合訓練)

2017年提出的mixup悄泥。每次隨機選兩個樣本對\left( x _ { i } , y _ { i } \right)\left( x _ { j } , y _ { j } \right)。然后通過權重線性插值合成一個新的樣本對肤粱。
\begin{aligned} \hat { x } & = \lambda x _ { i } + ( 1 - \lambda ) x _ { j } \\ \hat { y } & = \lambda y _ { i } + ( 1 - \lambda ) y _ { j } \end{aligned}
其中\lambda \in [ 0,1 ]是取自\operatorname { Beta } ( \alpha , \alpha )分布的隨機數(shù)弹囚。在mixup訓練中,只用新樣本领曼。

這里有一作在知乎的回答鸥鹉。

5.5 實驗結果

設置\varepsilon = 0.1用于標簽平滑,T = 20用于模型蒸餾庶骄,具體來說用加上余弦衰減和標簽平滑的預訓練的ResNet-152-D模型作為老師毁渗。在mixup訓練中,選擇\alpha = 0.2作為Beta分布单刁,同時增加epoch個數(shù)從120到200灸异,因為混合樣本需要更久的訓練才能閉合。當用mixup訓練知識蒸餾時羔飞,老師模型也用mixup肺樟。

效果如預期一樣在ResNet-50-D,Inception-V3逻淌,MobileNet3個模型上都有提升么伯,但是蒸餾只在ResNet上有效,事后給出的解釋是老師模型和學生不是一個家族的卡儒,因此對于預測有不一樣的分布田柔,所以反而給模型帶來負面影響。骨望。

cnn_tricks-table6.png

6 遷移學習

6.1 目標檢測

把Faster-RCNN的VGG-19基模型用前面提到的各種預訓練模型替換硬爆,其他設置保持一致。mAP在VOC2007上最終有4%的提升锦募。

cnn_tricks-table8.png

6.2 語義分割

用的FCN摆屯,這里是負面效果邻遏。除了余弦退火策略顯著提升效果外糠亩,其他效果都不好虐骑。給出的解釋是語義分割預測的是像素級別,而用標簽平滑赎线,蒸餾和mixup有利于軟化標簽廷没,模糊的像素級信息可能會模糊并降低整體的像素級準確率。

cnn_tricks-table9.png

7 總結

介紹的這些技巧對模型架構垂寥,數(shù)據(jù)預處理颠黎,損失函數(shù)和學習率調(diào)度做了輕微的修改。用ResNet-50滞项,Inception-V3狭归,MobileNet做實驗后效果都得到了提升,而且加在一起用能明顯的提升準確率文判。另外过椎,遷移到目標檢測和語義分割效果也有提升。

七 讀后感

并不一定要拿當前最新最好的模型作為改進對象戏仓,用經(jīng)典的也行疚宇。本文的分類網(wǎng)絡用的就是ResNet-50,目標檢測用的是Faster-RCNN赏殃,語義分割用的是FCN敷待,三者都是15年的模型。

各種黑科技的作用不容小覷仁热,累加著用總能提升榜揖,不過有的很明顯,有的作用就沒那么大股耽。作為對比根盒,mixup的效果就碉堡了,而知識蒸餾的提升則沒那么明顯(hinton掛一作也沒用物蝙。炎滞。。)

另外诬乞,本文好像沒有什么創(chuàng)新的地方(除了修改模型變?yōu)镽esNet-D那一點)册赛,看來,實驗做好震嫉,也是可以發(fā)paper的森瘪。。

八 補充

看這篇票堵,也是講技巧的

A disciplined approach to neural network hyper-parameters: Part 1 -- learning rate, batch size, momentum, and weight decay

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扼睬,一起剝皮案震驚了整個濱河市雹拄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吹截,老刑警劉巖侦另,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異军俊,居然都是意外死亡侥加,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門粪躬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來担败,“玉大人,你說我怎么就攤上這事镰官√崆埃” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵泳唠,是天一觀的道長岖研。 經(jīng)常有香客問我,道長警检,這世上最難降的妖魔是什么孙援? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮扇雕,結果婚禮上拓售,老公的妹妹穿的比我還像新娘。我一直安慰自己镶奉,他們只是感情好础淤,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哨苛,像睡著了一般鸽凶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上建峭,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天玻侥,我揣著相機與錄音,去河邊找鬼亿蒸。 笑死凑兰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的边锁。 我是一名探鬼主播姑食,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茅坛!你這毒婦竟也來了音半?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曹鸠,沒想到半個月后隔躲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡物延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仅父。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叛薯。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笙纤,靈堂內(nèi)的尸體忽然破棺而出耗溜,到底是詐尸還是另有隱情,我是刑警寧澤省容,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布抖拴,位于F島的核電站,受9級特大地震影響腥椒,放射性物質(zhì)發(fā)生泄漏阿宅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一笼蛛、第九天 我趴在偏房一處隱蔽的房頂上張望洒放。 院中可真熱鬧,春花似錦滨砍、人聲如沸往湿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽领追。三九已至,卻和暖如春响逢,著一層夾襖步出監(jiān)牢的瞬間绒窑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工舔亭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留回论,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓分歇,卻偏偏與公主長得像傀蓉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子职抡,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容