400-123-4657

咨询热线

400-123-4657
地址:广东省广州市天河区88号
QQ:1234567890
传真:+86-123-4567
邮箱:admin@youweb.com

行业资讯

当前位置: 首页 > 蓝狮动态 > 行业资讯

PyTorch中的optimizer和scheduler

发布时间:2024-08-12 点击量:54
  • 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学习率的变化情况。

平台注册入口