Pytorch的学习率调整方法
1. lr_scheduler.StepLR
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
Function:
等间隔调整学习率,调整倍数是gamma倍,调整间隔为step_size。间隔单位是step。需要注意的是,step通常是指epoch, 不要指定为batch 了。
Args:
-
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)
Function:
按照设定的间隔调整学习率。这个方法适合后期调试使用,观察loss曲线,为每个实验定制学习率调整时机。
Args:
-
milestones (list) : 传入一个列表变量,每个元素代表何时调整学习率,其中元素必须是递增的,如 [30, 45, 60]
-
gamma (float):学习率调整倍数,模型为0.1倍,即下降10倍。
-
last_epoch (int): 上一个epoch数,这个参数用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整。当设为-1时,学习率设置为初始值
3. lr_scheduler.ExponentiaLR
class torch.optim.lr_scheduler.ExponentiaLR(optimizer, gamma=0.1, last_epoch=-1)
Function:
按照指数衰减调整学习率,调整公式为: \(lr = lr * gamma ^e\)
Args:
-
gamma (float):学习率调整倍数,模型为0.1倍,即下降10倍。
-
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)
Function:
以余弦函数为周期,并在每个周期最大值时重新设置学习率。论文《SGDR: Stochastic Gradient Descent with Warm Restarts》(ICLR-2017)
Args:
- T_max (int): 一次学习率周期的迭代次数,即T_max 个epoch后重新设置学习率
- eta_min (float): 最小学习率,即一个周期中,学习率最小会下降到 eta_min,默认值为0
- last_epoch (int): 上一个epoch数,这个参数用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整。当设为-1时,学习率设置为初始值。
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)
Function:
当某个指标不再变化(升高或降低),调整学习率。这是非常实用的学习率调整策略。
Args:
- mode (str): 模式选择,有min 和max两种模式, min表示当指标不再降低,max表示指标不再升高
- factor(float):学习率调整倍数,等同于上述方法中的gamma
- patience(int): 即忍受该指标多少个step不变化,调整学习率。
- min_lr (float or list): 学习率下限
- eps(float): 学习率衰减的最小值。
学习率调整小结
Pytorch提供了六种学习率调整方法,可分为三大类,分别是:
- 有序调整
- 自适应调整
- 自定义调整
第一类,依一定规律有序进行调整,这一类是最常用的,分别是等间隔下降(Step), 按需设定下降间隔(MultiStep),指数下降(Exponential)和 CosineAnnealing。这四种方 法的调整时机都是人为可控的,也是训练时常用到的。
第二类,依训练状况伺机调整,这就是 ReduceLROnPlateau 方法。该法通过监测某一指标的变化情况,当该指标不再怎么变化的时候,就是调整学习率的时机,因而属于自适 应的调整。
第三类,自定义调整,Lambda。Lambda 方法提供的调整策略十分灵活,我们可以为不同的层设定不同的学习率调整方法,这在 fine-tune 中十分有用,我们不仅可为不同的层 设定不同的学习率,还可以为其设定不同的学习率调整策略,简直不能更棒!