PyTorch动态调整学习率
深度学习中长久以来一直存在一个令人困扰的问题,那就是如何选择适当的学习率。如果学习速率设置得过小,会导致模型收敛速度缓慢,训练时间延长;而如果学习率设置得太大,可能会导致参数在最优解附近来回波动。然而,即使我们选定了一个合适的学习率,在经过多轮训练后,仍可能出现准确率的震荡或损失不再下降等情况,这表明当前的学习率已经不能满足模型调优的需求。在这种情况下,我们可以采用适当的学习率衰减策略来改善模型的性能,从而提高精度。这种策略在PyTorch中被称为调度器(scheduler)。
1.使用官方scheduler
PyTorch已经封装了一些动态调整学习率的方法,这些方法位于torch.optim.lr_scheduler
模块中,下面列出了其中一些常用的scheduler:
lr_scheduler.LambdaLR
lr_scheduler.MultiplicativeLR
lr_scheduler.StepLR
lr_scheduler.MultiStepLR
lr_scheduler.ExponentialLR
lr_scheduler.CosineAnnealingLR
lr_scheduler.ReduceLROnPlateau
lr_scheduler.CyclicLR
lr_scheduler.OneCycleLR
lr_scheduler.CosineAnnealingWarmRestarts
lr_scheduler.ConstantLR
lr_scheduler.LinearLR
lr_scheduler.PolynomialLR
lr_scheduler.ChainedScheduler
lr_scheduler.SequentialLR
这些 scheduler 都是继承自_LRScheduler
类。可以通过help(torch.optim.lr_scheduler)
来查看这些类的具体使用方法,也可以通过help(torch.optim.lr_scheduler._LRScheduler)
来查看_LRScheduler
类的具体使用方法。
# 选择一种优化器
optimizer = torch.optim.Adam(...)
# 选择上面提到的一种或多种动态调整学习率的方法
scheduler1 = torch.optim.lr_scheduler...
scheduler2 = torch.optim.lr_scheduler...
...
schedulern = torch.optim.lr_scheduler...
# 进行训练
for epoch in range(100):
train(...)
validate(...)
optimizer.step()
# 需要在优化器参数更新之后再动态调整学习率
# scheduler的优化是在每一轮后面进行的
scheduler1.step()
...
schedulern.step()
注:在使用官方给出的torch.optim.lr_scheduler
时,需要将scheduler.step()
放在optimizer.step()
后面进行使用。
2.自定义scheduler
自定义 scheduler 方法是:自定义函数adjust_learning_rate
来改变param_group
中lr
的值。
假设现在正在做实验,需要学习率每30轮下降为原来的1/10,假设已有的官方API中没有符合我们需求的,那就需要自定义函数来实现学习率的改变。
def adjust_learning_rate(optimizer, epoch):
lr = args.lr * (0.1 ** (epoch // 30))
for param_group in optimizer.param_groups:
param_group['lr'] = lr
有了adjust_learning_rate
函数的定义,在训练的过程就可以调用adjust_learning_rate
函数来实现学习率的动态变化。
optimizer = torch.optim.SGD(model.parameters(),lr = args.lr,momentum = 0.9)
for epoch in range(100):
train(...)
validate(...)
adjust_learning_rate(optimizer,epoch)
参考
😃😃😃