PyTorch的六个学习率调整
本文截取自《PyTorch 模型訓練實用教程》,獲取全文pdf請點擊:https://github.com/tensor-yu/PyTorch_Tutorial
文章目錄
一、pytorch中六種學習率調整方法
1.lr_scheduler.StepLR
2.lr_scheduler.MultiStepLR
3.lr_scheduler.ExponentialLR
4.lr_scheduler.CosineAnnealingLR
5.lr_scheduler.ReduceLROnPlateau
6.lr_scheduler.LambdaLR
二、學習率調整小結及step源碼閱讀
2.1 學習率調整小結
在模型訓練的優化部分,調整最多的一個參數就是學習率,合理的學習率可以使優化器快速收斂。
一般在訓練初期給予較大的學習率,隨著訓練的進行,學習率逐漸減小。學習率什么時候減小,減小多少,這就涉及到學習率調整方法。pytorch中提供了六種方法供大家使用,下面將一一介紹,最后對學習率調整方法進行總結。
一、pytorch中六種學習率調整方法
1. lr_scheduler.StepLR
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)功能:
等間隔調整學習率,調整倍數為gamma倍,調整間隔為step_size。間隔單位是step。需要注意的是,step通常是指epoch,不要弄成iteration了。
參數:
step_size(int) - 學習率下降間隔數,若為30,則會在30、60、90…個step時,將學習率調整為lr*gamma。
gamma(float) - 學習率調整倍數,默認為0.1倍,即下降10倍。
last_epoch(int) - 上一個epoch數,這個變量用來指示學習率是否需要調整。當last_epoch符合設定的間隔時,就會對學習率進行調整。當為-1時,學習率設置為初始值。
2.lr_scheduler.MultiStepLR
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)功能:
按設定的間隔調整學習率。這個方法適合后期調試使用,觀察loss曲線,為每個實驗定制學習率調整時機。
參數:
milestones(list) - 一個list,每一個元素代表何時調整學習率,list元素必須是遞增的。如 milestones=[30,80,120]
gamma(float) - 學習率調整倍數,默認為0.1倍,即下降10倍。
last_epoch(int) - 上一個epoch數,這個變量用來指示學習率是否需要調整。當last_epoch符合設定的間隔時,就會對學習率進行調整。當為-1時,學習率設置為初始值。
3.lr_scheduler.ExponentialLR
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)功能:
按指數衰減調整學習率,調整公式: lr = lr * gammaepoch
參數:
gamma- 學習率調整倍數的底,指數為epoch,即 gammaepoch
last_epoch(int)- 上一個epoch數,這個變量用來指示學習率是否需要調整。當last_epoch符合設定的間隔時,就會對學習率進行調整。當為-1時,學習率設置為初始值。
4.lr_scheduler.CosineAnnealingLR
class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)功能:
以余弦函數為周期,并在每個周期最大值時重新設置學習率。具體如下圖所示
詳細請閱讀論文《 SGDR: Stochastic Gradient Descent with Warm Restarts》(ICLR-2017):https://arxiv.org/abs/1608.03983
參數:
T_max(int) - 一次學習率周期的迭代次數,即T_max個epoch之后重新設置學習率。
eta_min(float) - 最小學習率,即在一個周期中,學習率最小會下降到eta_min,默認值為0。
學習率調整公式為:
可以看出是以初始學習率為最大學習率,以2*Tmax為周期,在一個周期內先下降,后上升。
實例:
T_max = 200, 初始學習率 = 0.001, eta_min = 0
5.lr_scheduler.ReduceLROnPlateau
class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’, factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode=‘rel’, cooldown=0, min_lr=0, eps=1e-08)功能:
當某指標不再變化(下降或升高),調整學習率,這是非常實用的學習率調整策略。例如,當驗證集的loss不再下降時,進行學習率調整;或者監測驗證集的accuracy,當accuracy不再上升時,則調整學習率。
參數:
mode(str) - 模式選擇,有 min和max兩種模式,min表示當指標不再降低(如監測loss),max表示當指標不再升高(如監測accuracy)。
factor(float) - 學習率調整倍數(等同于其它方法的gamma),即學習率更新為 lr = lr * factor
patience(int) - 直譯——“耐心”,即忍受該指標多少個step不變化,當忍無可忍時,調整學習率。注,可以不是連續5次。
verbose(bool) - 是否打印學習率信息, print(‘Epoch {:5d}: reducing learning rate’ ’ of group {} to {:.4e}.’.format(epoch, i, new_lr))
threshold(float) - Threshold for measuring the new optimum,配合threshold_mode使用,默認值1e-4。作用是用來控制當前指標與best指標的差異。
threshold_mode(str) - 選擇判斷指標是否達最優的模式,有兩種模式,rel和abs。
當threshold_mode = rel,并且mode = max時,dynamic_threshold = best * ( 1 + threshold );
當threshold_mode = rel,并且mode = min時,dynamic_threshold = best * ( 1 - threshold );
當threshold_mode = abs,并且mode = max時,dynamic_threshold = best + threshold ;
當threshold_mode = rel,并且mode = max時,dynamic_threshold = best - threshold
cooldown(int) - “冷卻時間“,當調整學習率之后,讓學習率調整策略冷靜一下,讓模型再訓練一段時間,再重啟監測模式。
min_lr(float or list) - 學習率下限,可為float,或者list,當有多個參數組時,可用list進行設置。
eps(float) - 學習率衰減的最小值,當學習率變化小于eps時,則不調整學習率。
6.lr_scheduler.LambdaLR
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)功能:
為不同參數組設定不同學習率調整策略。調整規則為,lr = base_lr * lmbda(self.last_epoch) 。
參數:
lr_lambda(function or list) - 一個計算學習率調整倍數的函數,輸入通常為step,當有多個參數組時,設為list。
last_epoch(int) - 上一個epoch數,這個變量用來指示學習率是否需要調整。當last_epoch符合設定的間隔時,就會對學習率進行調整。當為-1時,學習率設置為初始值。
二、學習率調整小結及step源碼閱讀
2.1 學習率調整小結
Pytorch提供了六種學習率調整方法,可分為三大類,分別是
第一類,依一定規律有序進行調整,這一類是最常用的,分別是等間隔下降(Step),按需設定下降間隔(MultiStep),指數下降(Exponential)和CosineAnnealing。這四種方法的調整時機都是人為可控的,也是訓練時常用到的。
第二類,依訓練狀況伺機調整,這就是ReduceLROnPlateau方法。該法通過監測某一指標的變化情況,當該指標不再怎么變化的時候,就是調整學習率的時機,因而屬于自適應的調整。
第三類,自定義調整,Lambda。Lambda方法提供的調整策略十分靈活,我們可以為不同的層設定不同的學習率調整方法,這在fine-tune中十分有用,我們不僅可為不同的層設定不同的學習率,還可以為其設定不同的學習率調整策略,簡直不能更棒!
總結
以上是生活随笔為你收集整理的PyTorch的六个学习率调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytroch 数据增量 transf
- 下一篇: 男生为什么不能喝豆浆?