實(shí)踐指南 | 深度學(xué)習(xí)中常用的tricks
作者 | 我要鼓勵(lì)娜扎@知乎(已授權(quán))?編輯 | 極市平臺(tái)
大家好,我是DASOU;
圖片分類(lèi)是非常常見(jiàn)的一個(gè)工作任務(wù),但是要想做好不是容易的事情;本文匯集了11種圖像分類(lèi)的常用技巧,希望對(duì)大家有所幫助;
1 Warmup
學(xué)習(xí)率是神經(jīng)網(wǎng)絡(luò)訓(xùn)練中最重要的超參數(shù)之一,針對(duì)學(xué)習(xí)率的技巧有很多。Warmup是在ResNet中提到的一種學(xué)習(xí)率預(yù)熱的方法。由于剛開(kāi)始訓(xùn)練時(shí)模型的權(quán)重(weights)是隨機(jī)初始化的,此時(shí)選擇一個(gè)較大的學(xué)習(xí)率,可能會(huì)帶來(lái)模型的不穩(wěn)定。
學(xué)習(xí)率預(yù)熱就是在剛開(kāi)始訓(xùn)練的時(shí)候先使用一個(gè)較小的學(xué)習(xí)率,訓(xùn)練一些epoches或iterations,等模型穩(wěn)定時(shí)再修改為預(yù)先設(shè)置的學(xué)習(xí)率進(jìn)行訓(xùn)練。ResNet論文中使用一個(gè)110層的ResNet在cifar10上訓(xùn)練時(shí),先用0.01的學(xué)習(xí)率訓(xùn)練直到訓(xùn)練誤差低于80%(大概訓(xùn)練了400個(gè)iterations),然后使用0.1的學(xué)習(xí)率進(jìn)行訓(xùn)練。
上述的方法是constant warmup,18年Facebook又針對(duì)上面的warmup進(jìn)行了改進(jìn),因?yàn)?strong style="color: black;">從一個(gè)很小的學(xué)習(xí)率一下變?yōu)楸容^大的學(xué)習(xí)率可能會(huì)導(dǎo)致訓(xùn)練誤差突然增大。論文提出了gradual warmup來(lái)解決這個(gè)問(wèn)題,即從最開(kāi)始的小學(xué)習(xí)率開(kāi)始,每個(gè)iteration增大一點(diǎn),直到最初設(shè)置的比較大的學(xué)習(xí)率。
2 Linear scaling learning rate
在凸優(yōu)化問(wèn)題中,隨著批量的增加,收斂速度會(huì)降低,神經(jīng)網(wǎng)絡(luò)也有類(lèi)似的實(shí)證結(jié)果。隨著batch size的增大,處理相同數(shù)據(jù)量的速度會(huì)越來(lái)越快,但是達(dá)到相同精度所需要的epoch數(shù)量越來(lái)越多。也就是說(shuō),使用相同的epoch時(shí),大batch size訓(xùn)練的模型與小batch size訓(xùn)練的模型相比,驗(yàn)證準(zhǔn)確率會(huì)減小。
上面提到的gradual warmup是解決此問(wèn)題的方法之一。另外,linear scaling learning rate也是一種有效的方法。在mini-batch SGD訓(xùn)練時(shí),梯度下降的值是隨機(jī)的,因?yàn)槊恳粋€(gè)batch的數(shù)據(jù)是隨機(jī)選擇的。增大batch size不會(huì)改變梯度的期望,但是會(huì)降低它的方差。也就是說(shuō),大batch size會(huì)降低梯度中的噪聲,所以我們可以增大學(xué)習(xí)率來(lái)加快收斂。
具體做法很簡(jiǎn)單,比如ResNet原論文]中,batch size為256時(shí)選擇的學(xué)習(xí)率是0.1,當(dāng)我們把batch size變?yōu)橐粋€(gè)較大的數(shù)b時(shí),學(xué)習(xí)率應(yīng)該變?yōu)?0.1 × b/256。
3 Cosine learning rate decay
在warmup之后的訓(xùn)練過(guò)程中,學(xué)習(xí)率不斷衰減是一個(gè)提高精度的好方法。其中有step decay和cosine decay等,前者是隨著epoch增大學(xué)習(xí)率不斷減去一個(gè)小的數(shù),后者是讓學(xué)習(xí)率隨著訓(xùn)練過(guò)程曲線下降。對(duì)于cosine decay,假設(shè)總共有T個(gè)batch(不考慮warmup階段),在第t個(gè)batch時(shí),學(xué)習(xí)率η_t為:

這里,η代表初始設(shè)置的學(xué)習(xí)率。這種學(xué)習(xí)率遞減的方式稱(chēng)之為cosine decay。
下面是帶有warmup的學(xué)習(xí)率衰減的可視化圖[4]。其中,圖(a)是學(xué)習(xí)率隨epoch增大而下降的圖,可以看出cosine decay比step decay更加平滑一點(diǎn)。圖(b)是準(zhǔn)確率隨epoch的變化圖,兩者最終的準(zhǔn)確率沒(méi)有太大差別,不過(guò)cosine decay的學(xué)習(xí)過(guò)程更加平滑。

4 Label-smoothing
在分類(lèi)問(wèn)題中,我們的最后一層一般是全連接層,然后對(duì)應(yīng)標(biāo)簽的one-hot編碼,即把對(duì)應(yīng)類(lèi)別的值編碼為1,其他為0。這種編碼方式和通過(guò)降低交叉熵?fù)p失來(lái)調(diào)整參數(shù)的方式結(jié)合起來(lái),會(huì)有一些問(wèn)題。這種方式會(huì)鼓勵(lì)模型對(duì)不同類(lèi)別的輸出分?jǐn)?shù)差異非常大,或者說(shuō),模型過(guò)分相信它的判斷。但是,對(duì)于一個(gè)由多人標(biāo)注的數(shù)據(jù)集,不同人標(biāo)注的準(zhǔn)則可能不同,每個(gè)人的標(biāo)注也可能會(huì)有一些錯(cuò)誤。模型對(duì)標(biāo)簽的過(guò)分相信會(huì)導(dǎo)致過(guò)擬合。
標(biāo)簽平滑(Label-smoothing regularization,LSR)是應(yīng)對(duì)該問(wèn)題的有效方法之一,它的具體思想是降低我們對(duì)于標(biāo)簽的信任,例如我們可以將損失的目標(biāo)值從1稍微降到0.9,或者將從0稍微升到0.1。標(biāo)簽平滑最早在inception-v2中被提出,它將真實(shí)的概率改造為:

其中,ε是一個(gè)小的常數(shù),K是類(lèi)別的數(shù)目,y是圖片的真正的標(biāo)簽,i代表第i個(gè)類(lèi)別,q_i是圖片為第i類(lèi)的概率。
總的來(lái)說(shuō),LSR是一種通過(guò)在標(biāo)簽y中加入噪聲,實(shí)現(xiàn)對(duì)模型約束,降低模型過(guò)擬合程度的一種正則化方法。
5 Random image cropping and patching
Random image cropping and patching 方法隨機(jī)裁剪四個(gè)圖片的中部分,然后把它們拼接為一個(gè)圖片,同時(shí)混合這四個(gè)圖片的標(biāo)簽。RICAP在caifar10上達(dá)到了2.19%的錯(cuò)誤率。

如下圖所示,Ix, Iy是原始圖片的寬和高。w和h稱(chēng)為boundary position,它決定了四個(gè)裁剪得到的小圖片的尺寸。w和h從beta分布Beta(β, β)中隨機(jī)生成,β也是RICAP的超參數(shù)。最終拼接的圖片尺寸和原圖片尺寸保持一致。

6 Knowledge Distillation
提高幾乎所有機(jī)器學(xué)習(xí)算法性能的一種非常簡(jiǎn)單的方法是在相同的數(shù)據(jù)上訓(xùn)練許多不同的模型,然后對(duì)它們的預(yù)測(cè)進(jìn)行平均。但是使用所有的模型集成進(jìn)行預(yù)測(cè)是比較麻煩的,并且可能計(jì)算量太大而無(wú)法部署到大量用戶(hù)。Knowledge Distillation(知識(shí)蒸餾)方法就是應(yīng)對(duì)這種問(wèn)題的有效方法之一。
**在知識(shí)蒸餾方法中,我們使用一個(gè)教師模型來(lái)幫助當(dāng)前的模型(學(xué)生模型)訓(xùn)練。**教師模型是一個(gè)較高準(zhǔn)確率的預(yù)訓(xùn)練模型,因此學(xué)生模型可以在保持模型復(fù)雜度不變的情況下提升準(zhǔn)確率。比如,可以使用ResNet-152作為教師模型來(lái)幫助學(xué)生模型ResNet-50訓(xùn)練。在訓(xùn)練過(guò)程中,我們會(huì)加一個(gè)蒸餾損失來(lái)懲罰學(xué)生模型和教師模型的輸出之間的差異。
給定輸入,假定p是真正的概率分布,z和r分別是學(xué)生模型和教師模型最后一個(gè)全連接層的輸出。之前我們會(huì)用交叉熵?fù)p失l(p,softmax(z))來(lái)度量p和z之間的差異,這里的蒸餾損失同樣用交叉熵。所以,使用知識(shí)蒸餾方法總的損失函數(shù)是

上式中,第一項(xiàng)還是原來(lái)的損失函數(shù),第二項(xiàng)是添加的用來(lái)懲罰學(xué)生模型和教師模型輸出差異的蒸餾損失。其中,T是一個(gè)溫度超參數(shù),用來(lái)使softmax的輸出更加平滑的。實(shí)驗(yàn)證明,用ResNet-152作為教師模型來(lái)訓(xùn)練ResNet-50,可以提高后者的準(zhǔn)確率。
7 Cutout
Cutout是一種新的正則化方法。原理是在訓(xùn)練時(shí)隨機(jī)把圖片的一部分減掉,這樣能提高模型的魯棒性。它的來(lái)源是計(jì)算機(jī)視覺(jué)任務(wù)中經(jīng)常遇到的物體遮擋問(wèn)題。通過(guò)cutout生成一些類(lèi)似被遮擋的物體,不僅可以讓模型在遇到遮擋問(wèn)題時(shí)表現(xiàn)更好,還能讓模型在做決定時(shí)更多地考慮環(huán)境(context)。
效果如下圖,每個(gè)圖片的一小部分被cutout了。

8 Random erasing
Random erasing其實(shí)和cutout非常類(lèi)似,也是一種模擬物體遮擋情況的數(shù)據(jù)增強(qiáng)方法。區(qū)別在于,cutout是把圖片中隨機(jī)抽中的矩形區(qū)域的像素值置為0,相當(dāng)于裁剪掉,random erasing是用隨機(jī)數(shù)或者數(shù)據(jù)集中像素的平均值替換原來(lái)的像素值。而且,cutout每次裁剪掉的區(qū)域大小是固定的,Random erasing替換掉的區(qū)域大小是隨機(jī)的。

9 Mixup training
Mixup是一種新的數(shù)據(jù)增強(qiáng)的方法。Mixup training,就是每次取出2張圖片,然后將它們線性組合,得到新的圖片,以此來(lái)作為新的訓(xùn)練樣本,進(jìn)行網(wǎng)絡(luò)的訓(xùn)練,如下公式,其中x代表圖像數(shù)據(jù),y代表標(biāo)簽,則得到的新的xhat, yhat。

其中,λ是從Beta(α, α)隨機(jī)采樣的數(shù),在[0,1]之間。在訓(xùn)練過(guò)程中,僅使用(xhat, yhat)。
Mixup方法主要增強(qiáng)了訓(xùn)練樣本之間的線性表達(dá),增強(qiáng)網(wǎng)絡(luò)的泛化能力,不過(guò)mixup方法需要較長(zhǎng)的時(shí)間才能收斂得比較好。
10 AdaBound
AdaBound,按照作者的說(shuō)法,會(huì)讓你的訓(xùn)練過(guò)程像adam一樣快,并且像SGD一樣好。

如下圖所示,使用AdaBound會(huì)收斂速度更快,過(guò)程更平滑,結(jié)果更好。
另外,這種方法相對(duì)于SGD對(duì)超參數(shù)的變化不是那么敏感,也就是說(shuō)魯棒性更好。但是,針對(duì)不同的問(wèn)題還是需要調(diào)節(jié)超參數(shù)的,只是所用的時(shí)間可能變少了。
當(dāng)然,AdaBound還沒(méi)有經(jīng)過(guò)普遍的檢驗(yàn),也有可能只是對(duì)于某些問(wèn)題效果好。
11 ?AutoAugment
數(shù)據(jù)增強(qiáng)在圖像分類(lèi)問(wèn)題上有很重要的作用,但是增強(qiáng)的方法有很多,并非一股腦地用上所有的方法就是最好的。那么,如何選擇最佳的數(shù)據(jù)增強(qiáng)方法呢?AutoAugment就是一種搜索適合當(dāng)前問(wèn)題的數(shù)據(jù)增強(qiáng)方法的方法。該方法創(chuàng)建一個(gè)數(shù)據(jù)增強(qiáng)策略的搜索空間,利用搜索算法選取適合特定數(shù)據(jù)集的數(shù)據(jù)增強(qiáng)策略。此外,從一個(gè)數(shù)據(jù)集中學(xué)到的策略能夠很好地遷移到其它相似的數(shù)據(jù)集上。
