咨询电话: 020-88888888
pytorch优化器学习率调整策略以及正确用法!
发布于 2024-03-11 13:11 阅读()
optimzier优化器的作用:优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用。
从优化器的作用出发,要使得优化器能够起作用,需要主要两个东西:
- 优化器需要知道当前的网络或者别的什么模型的参数空间,这也就是为什么在训练文件中,正式开始训练之前需要将网络的参数放到优化器里面。
- 参数
那么优化器如何进行更新呢?
我们来看一下.step源码
从上面的代码可以看到step这个函数使用的是参数空间(param_groups)中的grad,也就是当前参数空间对应的梯度,这也就解释了为什么optimzier使用之前需要zero清零一下,因为如果不清零,那么使用的这个grad就得同上一个mini-batch有关,这不是我们需要的结果。再回过头来看,我们知道optimizer更新参数空间需要基于反向梯度,因此,当调用optimizer.step()的时候应当是loss.backward()的时候。
那么为什么optimizer.step()需要放在每一个batch训练中,而不是epoch训练中,这是因为现在的mini-batch训练模式是假定每一个训练集就只有mini-batch这样大,因此实际上可以将每一次mini-batch看做是一次训练,一次训练更新一次参数空间,因而optimizer.step()放在这里。
scheduler.step()按照Pytorch的定义是用来更新优化器的学习率的,一般是按照epoch为单位进行更换,即多少个epoch后更换一次学习率,因而scheduler.step()放在epoch这个大循环下。
PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现。PyTorch提供的学习率调整策略分为三大类,分别是
-
有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing。
-
自适应调整:自适应调整学习率 ReduceLROnPlateau。
-
自定义调整:自定义调整学习率 LambdaLR。
-
等间隔调整学习率 StepLR
等间隔调整学习率,调整倍数为 gamma 倍,调整间隔为 step_size。间隔单位是step。需要注意的是, step 通常是指 epoch,不要弄成 iteration 了。
- 按需调整学习率 MultiStepLR
按设定的间隔调整学习率。这个方法适合后期调试使用,观察 loss 曲线,为每个实验定制学习率调整时机。
- 指数衰减调整学习率 ExponentialLR
按指数衰减调整学习率,调整公式: lr=l?gammaepoch
- 余弦退火调整学习率 CosineAnnealingLR
以余弦函数为周期,并在每个周期最大值时重新设置学习率。以初始学习率为最大学习率,以 2?Tmax
2?Tmax 为周期,在一个周期内先下降,后上升。
- 自适应调整学习率 ReduceLROnPlateau
当某指标不再变化(下降或升高),调整学习率,这是非常实用的学习率调整策略。
例如,当验证集的 loss 不再下降时,进行学习率调整;或者监测验证集的 accuracy,当accuracy 不再上升时,则调整学习率。
- 自定义调整学习率 LambdaLR
为不同参数组设定不同学习率调整策略。调整规则为,
lr=base_lr?lmbda(self.last_epoch)
lr=base_lr?lmbda(self.last_epoch)
fine-tune 中十分有用,我们不仅可为不同的层设定不同的学习率,还可以为其设定不同的学习率调整策略。
- 自定义调整学习率
通过optimizer.param_groups中[‘lr’] 直接按需进行更改,更加灵活
?
参考:
新闻资讯
-
强化业绩补偿监管,支持环保企业 05-15
-
利率大幅单边上行可能性不大 05-15
-
商标注册的八大作用 05-11
-
10月19日湖人vs勇士数据统 07-01
-
加快经济结构优化升级 07-01
-
上海市卫健委:标准化是推动中医 07-01
-
ai画画生成器哪个好用?这几款 07-01
-
NBA2022-2023赛季常 07-01