pytorch必须掌握的的4种学习率衰减策略
原文:
pytorch必須掌握的的4種學(xué)習(xí)率衰減策略
- 1.指數(shù)衰減
- 2. 固定步長(zhǎng)衰減
- 3. 多步長(zhǎng)衰減
- 4. 余弦退火衰減
- 5. 上述4種學(xué)習(xí)率動(dòng)態(tài)更新策略的說(shuō)明
梯度下降算法需要我們指定一個(gè)學(xué)習(xí)率作為權(quán)重更新步幅的控制因子,常用的學(xué)習(xí)率有0.01、0.001以及0.0001等,學(xué)習(xí)率越大則權(quán)重更新。一般來(lái)說(shuō),我們希望在訓(xùn)練初期學(xué)習(xí)率大一些,使得網(wǎng)絡(luò)收斂迅速,在訓(xùn)練后期學(xué)習(xí)率小一些,使得網(wǎng)絡(luò)更好的收斂到最優(yōu)解。下圖展示了隨著迭代的進(jìn)行動(dòng)態(tài)調(diào)整學(xué)習(xí)率的4種策略曲線:
上述4種策略為自己根據(jù)資料整理得到的衰減類型:指數(shù)衰減、固定步長(zhǎng)的衰減、多步長(zhǎng)衰、余弦退火衰減。下面逐一介紹其性質(zhì),及pytorch對(duì)應(yīng)的使用方式,需要注意學(xué)習(xí)率衰減策略很大程度上是依賴于經(jīng)驗(yàn)與具體問(wèn)題的,不能照搬參數(shù)。
1.指數(shù)衰減
學(xué)習(xí)率按照指數(shù)的形式衰減是比較常用的策略,我們首先需要確定需要針對(duì)哪個(gè)優(yōu)化器執(zhí)行學(xué)習(xí)率動(dòng)態(tài)調(diào)整策略,也就是首先定義一個(gè)優(yōu)化器:
optimizer_ExpLR = torch.optim.SGD(net.parameters(), lr=0.1)定義好優(yōu)化器以后,就可以給這個(gè)優(yōu)化器綁定一個(gè)指數(shù)衰減學(xué)習(xí)率控制器:
ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)其中參數(shù)gamma表示衰減的底數(shù),選擇不同的gamma值可以獲得幅度不同的衰減曲線,如下:
2. 固定步長(zhǎng)衰減
有時(shí)我們希望學(xué)習(xí)率每隔一定步數(shù)(或者epoch)就減少為原來(lái)的gamma分之一,使用固定步長(zhǎng)衰減依舊先定義優(yōu)化器,再給優(yōu)化器綁定StepLR對(duì)象:
optimizer_StepLR = torch.optim.SGD(net.parameters(), lr=0.1) StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)其中g(shù)amma參數(shù)表示衰減的程度,step_size參數(shù)表示每隔多少個(gè)step進(jìn)行一次學(xué)習(xí)率調(diào)整,下面對(duì)比了不同gamma值下的學(xué)習(xí)率變化情況:
3. 多步長(zhǎng)衰減
上述固定步長(zhǎng)的衰減的雖然能夠按照固定的區(qū)間長(zhǎng)度進(jìn)行學(xué)習(xí)率更新,但是有時(shí)我們希望不同的區(qū)間采用不同的更新頻率,或者是有的區(qū)間更新學(xué)習(xí)率,有的區(qū)間不更新學(xué)習(xí)率,這就需要使用MultiStepLR來(lái)實(shí)現(xiàn)動(dòng)態(tài)區(qū)間長(zhǎng)度控制:
optimizer_MultiStepLR = torch.optim.SGD(net.parameters(), lr=0.1) torch.optim.lr_scheduler.MultiStepLR(optimizer_MultiStepLR,milestones=[200, 300, 320, 340, 200], gamma=0.8)其中milestones參數(shù)為表示學(xué)習(xí)率更新的起止區(qū)間,在區(qū)間[0. 200]內(nèi)學(xué)習(xí)率不更新,而在[200, 300]、[300, 320]…[340, 400]的右側(cè)值都進(jìn)行一次更新;gamma參數(shù)表示學(xué)習(xí)率衰減為上次的gamma分之一。其圖示如下:
從圖中可以看出,學(xué)習(xí)率在區(qū)間[200, 400]內(nèi)快速的下降,這就是milestones參數(shù)所控制的,在milestones以外的區(qū)間學(xué)習(xí)率始終保持不變。
4. 余弦退火衰減
嚴(yán)格的說(shuō),余弦退火策略不應(yīng)該算是學(xué)習(xí)率衰減策略,因?yàn)樗沟脤W(xué)習(xí)率按照周期變化,其定義方式如下:
optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1) CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)其包含的參數(shù)和余弦知識(shí)一致,參數(shù)T_max表示余弦函數(shù)周期;eta_min表示學(xué)習(xí)率的最小值,默認(rèn)它是0表示學(xué)習(xí)率至少為正值。確定一個(gè)余弦函數(shù)需要知道最值和周期,其中周期就是T_max,最值是初試學(xué)習(xí)率。下圖展示了不同周期下的余弦學(xué)習(xí)率更新曲線:
5. 上述4種學(xué)習(xí)率動(dòng)態(tài)更新策略的說(shuō)明
4個(gè)負(fù)責(zé)學(xué)習(xí)率調(diào)整的類:StepLR、ExponentialLR、MultiStepLR和CosineAnnealingLR,其完整對(duì)學(xué)習(xí)率的更新都是在其step()函數(shù)被調(diào)用以后完成的,這個(gè)step表達(dá)的含義可以是一次迭代,當(dāng)然更多情況下應(yīng)該是一個(gè)epoch以后進(jìn)行一次scheduler.step(),這根據(jù)具體問(wèn)題來(lái)確定。此外,根據(jù)pytorch官網(wǎng)上給出的說(shuō)明,scheduler.step()函數(shù)的調(diào)用應(yīng)該在訓(xùn)練代碼以后:
>>> scheduler = ... >>> for epoch in range(100): >>> train(...) >>> validate(...) >>> scheduler.step()總結(jié)
以上是生活随笔為你收集整理的pytorch必须掌握的的4种学习率衰减策略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [题解] LuoguP4091 [HEO
- 下一篇: Non-local Neural Net