一 為什么讀這篇
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厅缺。
2 訓練過程(baseline)
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)分布中的采樣吨岭。
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層埋凯,向量初始化為1,向量初始化為0扫尖。
用NAG(Nesterov Accelerated Gradient)做梯度下降白对。每個模型訓練120個epoch,batch_size為256换怖,在8卡的V100上甩恼。學習率初始為0.1,在30th, 60th, 90th epoch的時候分別除10沉颂。
2.2 實驗結果
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用于熱身抱虐,初始學習率定義為,那么每個batch 饥脑,將學習率設置為恳邀。
Zero
ResNet的殘差塊的最后一層為BN時,BN層首先標準化其輸入灶轰,定義為谣沸,然后執(zhí)行縮放變換。當令時笋颤,縮小了網(wǎng)絡的層數(shù)乳附,因此在初始階段更容易訓練。(?赋除?阱缓?)
No bias decay
在"14分鐘訓練imagenet"提出的策略是weight decay只用于卷積層和FC的weights,biases和BN層的和都不用举农。
因為本文提出的是限制在單機上訓練的方法荆针,所以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。
盡管有性能上的提升起惕,減少精度也有可能因為其數(shù)值范圍的縮小導致訓練出錯涡贱。mixed precision方法用于解決這個問題。存儲所有的參數(shù)和激活用FP16惹想,并用FP16計算梯度问词,同時存儲所有參數(shù)的FP32用于參數(shù)更新。另外實踐上嘀粱,也經(jīng)常乘一個標量給loss用于更好的對齊梯度為FP16激挪。
3.3 實驗結果
見表3和表4。不過加上No bias decay锋叨,明顯是效果下降了垄分,不知道為什么沒提及這點。
4 模型調(diào)整
對網(wǎng)絡架構的輕微調(diào)整通常不會改變計算復雜性娃磺,但可能對模型精度產(chǎn)生不可忽視的影響
4.1 ResNet架構
參考原作的圖
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的卷積瞻赶。藍色的地方是做了修改的赛糟。
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 實驗結果
實驗是基于第三部分的設置,即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。
其中是總batch數(shù)荧呐,是當前batch索引汉形,是初始學習率纸镊。
從上圖可以看出,起初余弦衰減的學習率緩慢下降概疆,在中間部分幾乎是線性下降逗威,在最后又緩慢下降。(不過從最后的準確率來看岔冀,余弦衰減似乎并無優(yōu)勢凯旭,也沒有加速收斂?)
5.2 Label Smoothing(標簽平滑)
softmax公式使套,其中為標簽個數(shù)罐呼,為預測類別的分數(shù),為softmax操作的輸出侦高。
負交叉熵損失公式嫉柴,其中為真實概率分布,當對了為1奉呛,不對為0计螺。(原文這里的公式好像寫錯了,p和q的地方放反了)
訓練期間侧馅,通過最小化該損失來更新模型參數(shù)從而讓兩個概率分布彼此近似危尿。特別地,說一下如何構造馁痴,我們知道谊娇。優(yōu)化解是,同時保持其他值很小罗晕。換句話說济欢,這樣做也鼓勵輸出的分數(shù)有顯著區(qū)別,從而可能導致過擬合(通過softmax學到的模型太自信了)小渊。
標簽平滑的思路來自2015年提出的Inception-v2法褥。它將構造的真實分布改為
其中為一個很小的常量。現(xiàn)在優(yōu)化解變?yōu)?br>
其中為任意實數(shù)酬屉。這鼓勵FC層為有限輸出半等,從而泛化的更好。
從上圖可以看出標簽平滑的分布中心更接近理論值同時其極值更少呐萨。
插播一個知乎:神經(jīng)網(wǎng)絡中的label smooth為什么沒有火杀饵?
5.3 Knowledge Distillation(知識蒸餾)
Hinton在2015年提出的。用老師模型幫助當前的模型(學生模型)谬擦。老師模型通常是有很高準確率的預訓練模型切距,通過模仿,學生模型能提升自己的準確率同時保持其模型復雜度惨远。
在訓練期間谜悟,增加一個蒸餾損失來懲罰老師模型和學生模型的softmax輸出之間的差異话肖。給定一個輸入,定義為真實概率分布葡幸,和分別為學生模型和老師模型最后FC層的輸出最筒。
之前用損失來衡量和之間的差異,這里使用同樣的損失用于蒸餾礼患。此時是钥,損失改為
其中為一個稱為溫度的超參,來使softmax的輸出更平滑缅叠。
5.4 Mixup Training(混合訓練)
2017年提出的mixup悄泥。每次隨機選兩個樣本對和。然后通過權重線性插值合成一個新的樣本對肤粱。
其中是取自分布的隨機數(shù)弹囚。在mixup訓練中,只用新樣本领曼。
這里有一作在知乎的回答鸥鹉。
5.5 實驗結果
設置用于標簽平滑,用于模型蒸餾庶骄,具體來說用加上余弦衰減和標簽平滑的預訓練的ResNet-152-D模型作為老師毁渗。在mixup訓練中,選擇作為Beta分布单刁,同時增加epoch個數(shù)從120到200灸异,因為混合樣本需要更久的訓練才能閉合。當用mixup訓練知識蒸餾時羔飞,老師模型也用mixup肺樟。
效果如預期一樣在ResNet-50-D,Inception-V3逻淌,MobileNet3個模型上都有提升么伯,但是蒸餾只在ResNet上有效,事后給出的解釋是老師模型和學生不是一個家族的卡儒,因此對于預測有不一樣的分布田柔,所以反而給模型帶來負面影響。骨望。
6 遷移學習
6.1 目標檢測
把Faster-RCNN的VGG-19基模型用前面提到的各種預訓練模型替換硬爆,其他設置保持一致。mAP在VOC2007上最終有4%的提升锦募。
6.2 語義分割
用的FCN摆屯,這里是負面效果邻遏。除了余弦退火策略顯著提升效果外糠亩,其他效果都不好虐骑。給出的解釋是語義分割預測的是像素級別,而用標簽平滑赎线,蒸餾和mixup有利于軟化標簽廷没,模糊的像素級信息可能會模糊并降低整體的像素級準確率。
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的森瘪。。
八 補充
看這篇票堵,也是講技巧的