前言
關(guān)于學(xué)習(xí)率調(diào)整與權(quán)重衰減,是機(jī)器學(xué)習(xí)中模型優(yōu)化的重要部分篡帕。一些經(jīng)典的方法在各類(lèi)數(shù)據(jù)集取得了令人矚目的成績(jī)殖侵,如SGD、學(xué)習(xí)率衰減赂苗、預(yù)熱愉耙、周期性學(xué)習(xí)率調(diào)整、AdaGrad拌滋、RMSprop、Adam猜谚,此外败砂,一些小眾的、同樣有效的技巧也層出不窮魏铅,如LR Range Test昌犹、AdamW等。在接下來(lái)的一段時(shí)間里览芳,本專(zhuān)欄將分期逐步對(duì)這些方法進(jìn)行收錄斜姥、總結(jié)。
1 LR Range Test(學(xué)習(xí)率范圍測(cè)試)與Cyclical LR(周期性學(xué)習(xí)率調(diào)整)
部分知識(shí)轉(zhuǎn)自知乎專(zhuān)欄 :https://zhuanlan.zhihu.com/p/52084949?utm_source=wechat_timeline
代碼參考:https://github.com/anandsaha/pytorch.cyclic.learning.rate/blob/master/cls.py
2015年,Leslie N. Smith提出了該技術(shù)铸敏。其核心是將模型進(jìn)行幾次迭代缚忧,在最初的時(shí)候,將學(xué)習(xí)率設(shè)置的足夠小杈笔,然后闪水,隨著迭代次數(shù)的增加,逐漸增加學(xué)習(xí)率蒙具,記錄下每個(gè)學(xué)習(xí)率對(duì)應(yīng)的損失球榆,并繪圖:
LR Range Test 圖應(yīng)該包括三個(gè)區(qū)域持钉,第一個(gè)區(qū)域中學(xué)習(xí)率太小以至于損失幾乎沒(méi)有減少,第二個(gè)區(qū)域里損失收斂很快篱昔,最后一個(gè)區(qū)域中學(xué)習(xí)率太大以至于損失開(kāi)始發(fā)散每强。因此,第二個(gè)區(qū)域中的學(xué)習(xí)率范圍就是我們?cè)谟?xùn)練時(shí)應(yīng)該采用的旱爆。
在一些經(jīng)典方法中舀射,學(xué)習(xí)率總是逐步下降的,從而保證模型能夠穩(wěn)定收斂怀伦,但Leslie Smith對(duì)此提出了質(zhì)疑脆烟,Leslie Smith認(rèn)為讓學(xué)習(xí)率在合理的范圍內(nèi)周期性變化(即Cyclical LR)是更合理的方法,能夠以更小的步驟提高模型準(zhǔn)確率房待。
如上圖所示邢羔,max_lr 與 lr 可以通過(guò) LR Range test 確定,作者認(rèn)為:最優(yōu)學(xué)習(xí)率將在處于這個(gè)范圍內(nèi)桑孩,所以如果學(xué)習(xí)率在這歌區(qū)間變化拜鹤,大多數(shù)情況下你將得到一個(gè)接近最優(yōu)學(xué)習(xí)率的學(xué)習(xí)率。
總結(jié):
(1)Cyclical LR是一種有效避開(kāi)鞍點(diǎn)的方法流椒,因?yàn)樵诎包c(diǎn)附近梯度較小敏簿,通過(guò)增加學(xué)習(xí)率可以讓模型走出困境。
(2)Cyclical LR能夠加速模型訓(xùn)練過(guò)程
(3)Cyclical LR在一定程度上可以提高模型的泛化能力(將模型帶入平坦最小值區(qū)域)
2 The 1cycle policy(一周期策略)
參考鏈接:https://sgugger.github.io/the-1cycle-policy.html
在Cyclical LR和LR Range Test的基礎(chǔ)上宣虾,Leslie 繼續(xù)改進(jìn)惯裕,提出了The 1cycle policy。即周期性學(xué)習(xí)率調(diào)整中绣硝,周期被設(shè)置為1蜻势。在一周期策略中,最大學(xué)習(xí)率被設(shè)置為 LR Range test 中可以找到的最高值鹉胖,最小學(xué)習(xí)率比最大學(xué)習(xí)率小幾個(gè)數(shù)量級(jí)(比如設(shè)為最大值的0.1倍)握玛。
如上圖够傍,一整個(gè)訓(xùn)練周期約400個(gè)iter,前175個(gè)iter用來(lái)warm-up挠铲,中間175個(gè)iter用來(lái)退火到初始學(xué)習(xí)率冕屯,最后幾十個(gè)iter學(xué)習(xí)率進(jìn)行進(jìn)一步衰減。我們將上述三個(gè)過(guò)程稱(chēng)為三個(gè)階段市殷。
- 第一階段:線性warm-up愕撰,其效果與一般的warm-up效果類(lèi)似,防止冷啟動(dòng)導(dǎo)致的一些問(wèn)題醋寝。
- 第二階段:線性下降至初始學(xué)習(xí)率搞挣。由于第一、第二階段中有相當(dāng)大的時(shí)間模型處于較高的學(xué)習(xí)率音羞,作者認(rèn)為囱桨,這將起到一定的正則化作用,防止模型在陡峭最小值駐留嗅绰,從而更傾向于尋找平坦的局部最小值舍肠。
- 第三階段:學(xué)習(xí)率衰減至0,將使得模型在一個(gè)‘平坦’區(qū)域內(nèi)收斂至一個(gè)較為‘陡峭’的局部最小值窘面。
上圖展示了一周期策略訓(xùn)練時(shí)翠语,模型在訓(xùn)練集和驗(yàn)證集上的損失變化,可見(jiàn)财边,在學(xué)習(xí)率較大時(shí)肌括,驗(yàn)證集損失變得不穩(wěn)定,但平均來(lái)看酣难,驗(yàn)證集損失與訓(xùn)練集損失的差值沒(méi)有變化太多谍夭,說(shuō)明這個(gè)階段模型學(xué)習(xí)到的知識(shí)具有較好的泛化能力(即大學(xué)習(xí)率一定程度上起到了正則化的作用)玉控。而在訓(xùn)練末期夺艰,學(xué)習(xí)率不斷衰減,這時(shí)訓(xùn)練集損失有明顯下降区赵,而驗(yàn)證集損失沒(méi)有明顯下降菜谣,兩者的差值擴(kuò)大了珠漂,因此,在訓(xùn)練末期尾膊,模型開(kāi)始產(chǎn)生了一定的過(guò)擬合(個(gè)人理解:某種意義上講甘磨,這種過(guò)擬合是使得模型能夠穩(wěn)定地停留在平坦最小值區(qū)域的一種手段)。
3 AdamW算法
參考鏈接:https://blog.csdn.net/yinyu19950811/article/details/90476956#161_Adamw_89
2014年提出的Adam算法有很多優(yōu)點(diǎn)眯停,它集合了動(dòng)量與RMSprop兩種方式的優(yōu)點(diǎn)。但是在實(shí)際應(yīng)用過(guò)程中卿泽,卻經(jīng)歷了過(guò)山車(chē)一般的發(fā)展歷程:一經(jīng)提出莺债,非匙叹酰火熱,但是后來(lái)卻受到很多質(zhì)疑齐邦,質(zhì)疑者認(rèn)為在訓(xùn)練時(shí)椎侠,簡(jiǎn)單的SGD+動(dòng)量能夠取得更好的效果,直到AdamW提出后措拇,Adam才又煥發(fā)活力我纪。
AdamW的作者認(rèn)為,Adam存在以下問(wèn)題:
- 1) L2正則化在Adam中并不等價(jià)于權(quán)重衰減:這里需要講一下丐吓,在使用L2正則化的時(shí)候浅悉,我們想要達(dá)到的目的是控制權(quán)重的大小,防止過(guò)擬合券犁,從而將L2正則加入到損失函數(shù)中术健,即
final_loss = loss + L2 = loss + 0.5*sum(w^2)
,對(duì)上述函數(shù)求導(dǎo)時(shí)粘衬,可以看到導(dǎo)數(shù)為loss的導(dǎo)數(shù) + w
荞估,因此參數(shù)進(jìn)行梯度更新時(shí),就會(huì)在原來(lái)的基礎(chǔ)上減去一個(gè)w
稚新,因此我們說(shuō)L2正則化是權(quán)重衰減勘伺。但是權(quán)重衰減與L2正則等價(jià)僅僅是在采用SGD的情況下,當(dāng)使用Adam時(shí)褂删,減去w
這一項(xiàng)會(huì)變得很復(fù)雜(大家可以自己推到一下)飞醉。 - 2)使用Adam優(yōu)化帶L2正則的損失并不有效,如果引入L2正則化項(xiàng)笤妙,在計(jì)算梯度的時(shí)候會(huì)加上正則項(xiàng)求梯度的結(jié)果冒掌。正常的權(quán)重衰減是對(duì)所有的權(quán)重都采用相同的系數(shù)進(jìn)行更新,本身比較大的一些權(quán)重對(duì)應(yīng)的梯度也會(huì)比較大蹲盘,懲罰也越大股毫。但由于Adam計(jì)算步驟中減去項(xiàng)會(huì)有除以梯度平方的累積,使得梯度大的減去項(xiàng)偏小召衔,從而具有大梯度的權(quán)重不會(huì)像解耦權(quán)重衰減那樣得到正則化铃诬。 這導(dǎo)致自適應(yīng)梯度算法的L2和解耦權(quán)重衰減正則化的不等價(jià)。
因此苍凛,權(quán)重衰減和L2正則這兩件事要分開(kāi)來(lái)看趣席,我們使用L2正則的目的是為了在所有參數(shù)上進(jìn)行相同尺度的懲罰(權(quán)重衰減),但是由于Adam獨(dú)特的計(jì)算公式醇蝴,使得不同參數(shù)懲罰的尺度不一樣了宣肚,這也就是AdamW的改進(jìn)點(diǎn),即先進(jìn)行損失計(jì)算(不包含)悠栓,然后算進(jìn)行Adam中的動(dòng)量和RMSprop項(xiàng)目霉涨,然后在最后參數(shù)更新的時(shí)候進(jìn)行權(quán)重衰減按价,看圖:
如果是SGD笙瑟,L2正則化項(xiàng)和梯度衰減是等同的楼镐。但是由于Adam加入了一階動(dòng)量和二階動(dòng)量,基于包含L2正則化項(xiàng)的梯度來(lái)計(jì)算一階動(dòng)量和二階動(dòng)量往枷,使得參數(shù)的更新系數(shù)就會(huì)變化框产,與單純的權(quán)重衰減就會(huì)變得不同。
另外错洁,在fastAI的一篇文章中(https://www.fast.ai/2018/07/02/adam-weight-decay/)指出秉宿,即使是原始的Adam也是有效的,前提是超參數(shù)設(shè)置正確墓臭。