Pytorch的学习率调整策略通过torch.optim.lr_scheduler实现。
1. 等间隔调整学习率StepLR
等间隔调整学习率,通过设定调整间隔和倍率,阶段调整学习率
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
optimizer:优化器
step_size (int) : 学习率的调整间隔,如设为50,学习率就会在50、100、150个epoch时调整学习率
gamme (float) :学习率的调整倍率,默认为0.1倍,即到达调整间隔时,学习率会变为原来的0.1倍
last_epoch (int) : 上一次训练到多少个epoch,如设定为20,调整间隔为30,则会在本次训练的第10个epoch调整学习率,不使用可设为-1
2. 设定间隔调整学习率MultiStepLR
按照设定的间隔调整学习率,[50, 100, 150]
torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
optimizer:优化器
milestones (list) : 学习率的调整间隔,[50, 100, 150] list
gamme (float) :学习率的调整倍率,默认为0.1倍,即到达调整间隔时,学习率会变为原来的0.1倍
last_epoch (int) : 上一次训练到多少个epoch,如设定为20,调整间隔为30,则会在本次训练的第10个epoch调整学习率,不使用可设为-1 int
3. 指数衰减调整学习率ExponentialLR
按照指数衰减调整学习率,调整公式 lr = lr * gamma ** epoch
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.1, last_epoch=-1)
optimizer:优化器
gamme (float) : 学习率调整的底数
last_epoch (int) : 上一次训练到多少个epoch,如设定为20,调整间隔为30,则会在本次训练的第10个epoch调整学习率,不使用可设为-1 int
4. 余弦退火调整学习率CosineAnnealingLR
以余弦函数为周期,在每个周期最大值时重新设置学习率。以初始学习率为最大学习率,以2*Tmax为周期,在一个周期内先下降后上升
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
optimizer:优化器
T_max: 一次学习率周期的迭代次数,即T_max个epoch之后重新设置学习率
eta_min (float) : 最小学习率,即在一个周期内,学习率最小会下降到eta_min,默认为值为0
last_epoch (int) : 上一次训练到多少个epoch,如设定为20,调整间隔为30,则会在本次训练的第10个epoch调整学习率,不使用可设为-1
5. 自适应调整学习率ReduceLROnPlateau
当某个指标不再变化(下降或升高)时,调整学习率,非常实用的调整学习率策略
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)
optimizer:优化器
mode: 模式选择,有 min 和 max两种模式,min表示选定指标不再降低,max表示选定指标不再升高
factor (float) : 学习率的调整倍率,等同于其他调整方式中的gamma
patience (int) : 忍受选定的指标多少个epoch不再上升或下降,达到上限时,调整学习率
verbose (bool) : 是否打印学习率信息,print(‘Epoch {:5d}: reducing learning rate of group {} to {:.4e}.’.format(epoch, i, new_lr))
threshold_mode:选择判断指标是否达到最优的模式,有两种模式,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 == abs、mode == min时,dynamic_threshold = best - threshold
threshold (float) : 配合threshold_mode使用
cooldown: 冷却时间,当调整学习率后,让学习率调整策略冷静一下,让模型再训练一段时间,再重启监测模式
min_lr (float) : 学习率的下限,可为float,也可为list,当有多个参数组时,可用list进行设置
eps (float) :学习率衰减的最小值,当学习率变化小于eps时,则不再调整学习率
6. 自定义调整学习率LambdaLR
为不同的参数组设定不同学习率调整策略,一般fine-tune时使用,可以为不同的层设定不同的学习率,也可以为其设定不同的学习率调整策略
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, lr_lambda, last_epoch=-1)
optimizer:优化器
lr_lambda (function or list) : 一个计算学习率调整倍率的函数,输入通常为step,当有多个参数组时,设为list
last_epoch (int) : 上一次训练到多少个epoch,如设定为20,调整间隔为30,则会在本次训练的第10个epoch调整学习率,不使用可设为-1