梯度下降算法需要我们指定一个学习率作为权重更新步幅的控制因子,常用的学习率有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()

参考:

polyrate使用方法_pytorch必须掌握的的4种学习率衰减策略相关推荐

  1. captura录屏发生了一个错误_录屏教程的方法有哪些?学会这两种轻松搞定

    录屏教程的方法有哪些?在日常的工作以及生活当作,录屏教程的需求是经常需要做的.比方说:工作的时候,需要录屏新产品操作教程.生活中需要录屏学习基础教程等等.所以,对于录屏教程能够找到一个好用的方法是非常 ...

  2. python下载方法-python实现下载文件的三种方法_python

    本篇文章主要介绍了python实现下载文件的三种方法,最常用的方法就是通过Http利用urllib或者urllib2模块还有requests,有兴趣的可以了解一下. Python开发中时长遇到要下载文 ...

  3. oracle的多线程怎么实现,创建线程的两个方法(Oracle官网说两种,所以我们就别说什么三种四种了)...

    一.有多少种实现多线程的方法? 1.不同的角度有不同的答案 2.典型的答案有两种,分别是实现Runnable接口和继承Thread类 3.但是看原理,其实Thread类实现了Runnable接口,并且 ...

  4. pytorch两种常用的学习率衰减方法

    阶梯式衰减 torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1) 每个训练step_size个 ...

  5. 怎样判断计算机硬盘损坏,检测硬盘是否损坏的方法来了,这里有四种判断方法!...

    原标题:检测硬盘是否损坏的方法来了,这里有四种判断方法! 大家对硬盘都不陌生,硬盘分固态硬盘与机械硬盘,它们的读取速度与容量都有很大的区别,不过都是可以用来存储系统与重要文件数据的.硬盘损坏是电脑的硬 ...

  6. 击穿线程池面试题:3大方法,7大参数,4种拒绝策略

    前言:多线程知识是Java面试中必考的点.本文详细介绍--线程池.在实际开发过程里,很多IT从业者使用率不高,也只是了解个理论知识,和背诵各种八股文,没有深入理解到脑海里,导致面试完就忘.--码农 = ...

  7. 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你

    在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...

  8. Pytorch 学习率衰减方法

    Pytorch 学习率衰减方法 1.什么是学习率衰减 2.使用库函数进行调整 2.1.有序调整 2.1.1等间隔调整学习率 2.1.2.多间隔调整学习率 2.1.3.指数衰减调整学习率 Exponen ...

  9. Java理解误区——方法的重载是多态性的一种体现?

    理解误区 学习的第一门语言就是Java了,还记得在初学Java的时候,还是遇到了很多的困难,很多的知识点还不能理解.提到Java的面向对象,相信很多人都会印象深刻吧,但是对于初学者来说,理解起来确实还 ...

最新文章

  1. htc820+android+l,首款高通64位八核 HTC Desire 820评测
  2. 4g ecgi 编码_4G学习之IMSI附着
  3. RUNOOB python练习题5
  4. C++ 类访问控制(public/protected/private)
  5. 8数据提供什么掩膜产品_博硕能为你提供什么产品?
  6. web.xml中 /和/*的区别
  7. linux Memcached服务
  8. 微软高性能计算服务器pdf,微软高性能计算HPCserver2008技术概览.pdf
  9. 利用python进行数据分析—七、绘图与可视化—matplotlib与seaborn
  10. 邮件服务器超级用户,Postfix邮件服务器的安装与配置方法
  11. ListView嵌套viewpager 头部图片轮换,listview 进行下拉刷新
  12. 深度学习之 人脸识别(2) 模型
  13. 大江大河——通信设备商们的2019年
  14. android 获得ram大小,Android中获取(RAM)总运存大小和可用运存大小
  15. 搜索引擎的爬虫技术研究
  16. 【笔记】OpenSSL 使用
  17. 一种分布式自治物流信息系统构架
  18. linux 系统删除 3天以前的 指定的进程
  19. 在项目中使用 Discuz!NT的上传头像功能
  20. Android 解决U盘文件或目录损坏

热门文章

  1. maven打包war,导入本地jar包
  2. “超级”容易用错的几个Airtest和Poco的API,看看你有没有遇到过
  3. Python的零基础超详细讲解(第三天)-Python的基础语法
  4. sql中还在傻傻的手动添加创建人、创建时间?高级开发工程师不得不知的一个通用技巧!
  5. signature=066eaf4ada3cc7a99cb8d41fb298a3d4,Video Fusion Display Systems
  6. 关于计算机设计的论文,计算机的设计论文.doc
  7. 查处的数据如何乱序_老司机总结常用镜像方法,让镜像数据更加可靠
  8. vue 保存全局变量_Vue+Typescript起手式
  9. PTA 基础编程题目集 6-8 简单阶乘计算 C语言
  10. vue+mint-ui地址三级or四级联动