干货|pytorch必须掌握的的4种学习率衰减策略

news/2024/7/7 20:02:00

点击上方“视学算法”,选择加"星标"或“置顶

重磅干货,第一时间送达

作者丨机器学习入坑者@知乎(已授权)

来源丨https://zhuanlan.zhihu.com/p/93624972

编辑丨极市平台

导读

 

本文介绍了四种衰减类型:指数衰减、固定步长的衰减、多步长衰、余弦退火衰减并逐一介绍其性质,及pytorch对应的使用方式。 

梯度下降算法需要我们指定一个学习率作为权重更新步幅的控制因子,常用的学习率有0.01、0.001以及0.0001等,学习率越大则权重更新。一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。下图展示了随着迭代的进行动态调整学习率的4种策略曲线:

上述4种策略为自己根据资料整理得到的衰减类型:指数衰减、固定步长的衰减、多步长衰、余弦退火衰减。下面逐一介绍其性质,及pytorch对应的使用方式,需要注意学习率衰减策略很大程度上是依赖于经验与具体问题的,不能照搬参数。

1、指数衰减

学习率按照指数的形式衰减是比较常用的策略,我们首先需要确定需要针对哪个优化器执行学习率动态调整策略,也就是首先定义一个优化器:

optimizer_ExpLR = torch.optim.SGD(net.parameters(), lr=0.1)

定义好优化器以后,就可以给这个优化器绑定一个指数衰减学习率控制器:

ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)

其中参数gamma表示衰减的底数,选择不同的gamma值可以获得幅度不同的衰减曲线,如下:

2、固定步长衰减

有时我们希望学习率每隔一定步数(或者epoch)就减少为原来的gamma分之一,使用固定步长衰减依旧先定义优化器,再给优化器绑定StepLR对象:

optimizer_StepLR = torch.optim.SGD(net.parameters(), lr=0.1)
StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)

其中gamma参数表示衰减的程度,step_size参数表示每隔多少个step进行一次学习率调整,下面对比了不同gamma值下的学习率变化情况:

3、多步长衰减

上述固定步长的衰减的虽然能够按照固定的区间长度进行学习率更新 但是有时我们希望不同的区间采用不同的更新频率,或者是有的区间更新学习率,有的区间不更新学习率,这就需要使用MultiStepLR来实现动态区间长度控制:

optimizer_MultiStepLR = torch.optim.SGD(net.parameters(), lr=0.1)
torch.optim.lr_scheduler.MultiStepLR(optimizer_MultiStepLR,milestones=[200, 300, 320, 340, 200], gamma=0.8)

其中milestones参数为表示学习率更新的起止区间,在区间[0. 200]内学习率不更新,而在[200, 300]、[300, 320].....[340, 400]的右侧值都进行一次更新;gamma参数表示学习率衰减为上次的gamma分之一。其图示如下:

从图中可以看出,学习率在区间[200, 400]内快速的下降,这就是milestones参数所控制的,在milestones以外的区间学习率始终保持不变。

4、余弦退火衰减

严格的说,余弦退火策略不应该算是学习率衰减策略,因为它使得学习率按照周期变化,其定义方式如下:

optimizer_CosineLR = torch.optim.SGD(net.parameters(), lr=0.1)
CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)

其包含的参数和余弦知识一致,参数T_max表示余弦函数周期;eta_min表示学习率的最小值,默认它是0表示学习率至少为正值。确定一个余弦函数需要知道最值和周期,其中周期就是T_max,最值是初试学习率。下图展示了不同周期下的余弦学习率更新曲线:

5、上述4种学习率动态更新策略的说明

4个负责学习率调整的类:StepLR、ExponentialLR、MultiStepLR和CosineAnnealingLR,其完整对学习率的更新都是在其step()函数被调用以后完成的,这个step表达的含义可以是一次迭代,当然更多情况下应该是一个epoch以后进行一次scheduler.step(),这根据具体问题来确定。此外,根据pytorch官网上给出的说明,scheduler.step()函数的调用应该在训练代码以后:

scheduler = ...
>>> for epoch in range(100):
>>>     train(...)
>>>     validate(...)
>>>     scheduler.step()

参考:

https://www.jianshu.com/p/125fe2ab085b

https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate

如果觉得有用,就请分享到朋友圈吧!

点个在看 paper不断!


http://lihuaxi.xjx100.cn/news/269563.html

相关文章

【转载】邻接表表示法

图的邻接表表示法 图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点v i ,该方法把所有邻接于v i 的顶点v j 链成一个带头 结点的单链表,这个单链表就称为顶点v i 的邻接表(Adjacency List)。 1. 邻接表的结点结构 &#xff08…

在机器学习项目中该如何选择优化器

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达导读几种流行的优化器的介绍以及优缺点分析,并给出了选择优化器的几点指南。本文概述了计算机视觉、自然语言处理和机器学习中常用的优化器。此外,…

pycharm中的terminal解释器和project 解释器不统一问题

pycharm中的terminal解释器和project 解释器不统一问题 【有时候在setting中切换环境,terminal中的local没有更新,把local窗口关闭重新打开试一下!】

WCF笔记

1、怎样在IIS部署WCF a、 建立虚拟目录并将路径定位到项目文件夹(提供服务的项目文件夹) b、 设置所属应用程序池 c、 设置asp.net版本 2、UriTemplate [WebGet(UriTemplate "{id}")] public void Get(); 访问地址不用加Get,直接…

微软推出智能语音评测服务,注重解决四大技术障碍

今年5月,在微软开发者大会上,他们宣布推出智能语音评测服务。基于Azure云的认知服务平台,该服务涵盖语音识别、语音合成等技术,主要应用于各种教师评估、作业练习和语言学习等教学场景。 通过市场调研和反馈,他们将语…

android设置为存储设备,我可以从格式化为内部存储器的Android SD卡或USB驱动器中恢复数据吗? | MOS86...

几年前,Android引入了使用外部存储作为内部存储的功能,但这将SD卡和手机联系在一起。 如果出现问题,您将可以取回卡上的所有数据。如果将SD卡或USB驱动器格式化为内部存储设备,则手机的原始存储设备和添加的存储设备将合并到一个巨…

计算机基础-计算机硬件

一 为何要学习计算机基础 python是编程语言,即python是语言 语言有英语、法语、葡萄牙语等,但凡是语言,都是用来沟通的介质。 程序员编程的本质就是让计算机去工作,而编程语言就是程序员与计算机沟通的介质 程序员要想让计算机工作…

华人小哥开发“黑话”数据集,AI:你连dbq都不知道,xswl!| NAACL 2021

点击上方“视学算法”,选择加"星标"或“置顶”重磅干货,第一时间送达子豪 发自 凹非寺量子位 报道 | 公众号 QbitAI提到“007”,你一定会想到詹姆斯邦德。这样具有隐藏含义的词,可以统称为Cant,包括暗语、隐…