咨询热线
400-123-4657QQ:1234567890
传真:+86-123-4567
邮箱:admin@youweb.com
PyTorch中的optimizer和scheduler
- optimizer
其作用在于根据选用不同的优化器以及设置的lr、momentum等(超参数)对网络模型的参数进行更新,更新的方法是optimizer.step()。 - scheduler
其作用在于对optimizer中的学习率进行更新、调整,更新的方法是scheduler.step()。
通常而言,在一个batch_size内先进行optimizer.step()完成权重参数的更新过程,然后再进行scheduler.step()完成对学习率参数的更新过程。
引用一篇文章的内容,scheduler.step()放的位置不同,结果也略有差异。
在scheduler的step_size表示scheduler.step()每调用step_size次,对应的学习率就会按照策略调整一次。所以如果scheduler.step()是放在mini-batch里面,那么step_size指的是经过这么多次迭代,学习率改变一次。
也就是说,scheduler控制的学习率是每step调整一次还是每epoch调整一次。
属性(default、state、params_group)
在构造一个optimizer实例后,该实例含有default、state、params_group三个属性。其中default中包含了该实例在初始化时的学习率,动量等超参数;state用于保存参数更新过程中的一些中间变量,params_groups中含有优化器需要更新的参数,以及default中的内容。下面链接是有关optimizer中对last_epoch的解释。
What is the param `last_epoch` on Pytorch Optimizer's Schedulers is for?方法(zero_grad()、step())
当网络进行前向传播并计算出损失值,准备进行反向传播时,一定要进行optimizer.zero_grad()完成梯度清零,否则每次的反向传播都会包含有上次运算后的梯度,使计算过程不准。
step()方法即优化器完成参数的更新过程。
该实例的作用即根据想要模型在训练过程中学习率如何变化而设置,PyTorch中已经集成了很多现有的方法。可以参考Kaggle中的一篇文章。
Guide to Pytorch Learning Rate Scheduling当然也可以根据自身要求编写相关的类实现个性化需求,具体可参考下面这篇文章。
Writing Your Own Optimizers in PyTorch需要注意的是,在实现个性化的scheduler类中,需要重写__init__()以及step()方法,其中__init__()用于初始化这个类,而step()函数来完成optimizer实例中学习率的更新,如果没有scheduler中的step方法,也就无法对optimizer中的学习率进行调整 ,那也就无法根据自己的想法修改训练过程中optimizer学习率的变化情况。