本文截取自《PyTorch 模型训练实用教程》,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial

文章目录
一、pytorch中六种学习率调整方法
1.lr_scheduler.StepLR
2.lr_scheduler.MultiStepLR
3.lr_scheduler.ExponentialLR
4.lr_scheduler.CosineAnnealingLR
5.lr_scheduler.ReduceLROnPlateau
6.lr_scheduler.LambdaLR
二、学习率调整小结及step源码阅读
2.1 学习率调整小结

在模型训练的优化部分,调整最多的一个参数就是学习率,合理的学习率可以使优化器快速收敛。
一般在训练初期给予较大的学习率,随着训练的进行,学习率逐渐减小。学习率什么时候减小,减小多少,这就涉及到学习率调整方法。pytorch中提供了六种方法供大家使用,下面将一一介绍,最后对学习率调整方法进行总结。

一、pytorch中六种学习率调整方法

1. lr_scheduler.StepLR

class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

功能:
等间隔调整学习率,调整倍数为gamma倍,调整间隔为step_size。间隔单位是step。需要注意的是,step通常是指epoch,不要弄成iteration了。
参数:
step_size(int) - 学习率下降间隔数,若为30,则会在30、60、90…个step时,将学习率调整为lr*gamma。
gamma(float) - 学习率调整倍数,默认为0.1倍,即下降10倍。
last_epoch(int) - 上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整。当为-1时,学习率设置为初始值。

2.lr_scheduler.MultiStepLR

class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

功能:
按设定的间隔调整学习率。这个方法适合后期调试使用,观察loss曲线,为每个实验定制学习率调整时机。
参数:
milestones(list) - 一个list,每一个元素代表何时调整学习率,list元素必须是递增的。如 milestones=[30,80,120]
gamma(float) - 学习率调整倍数,默认为0.1倍,即下降10倍。
last_epoch(int) - 上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整。当为-1时,学习率设置为初始值。

3.lr_scheduler.ExponentialLR

class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)

功能:
按指数衰减调整学习率,调整公式: lr = lr * gammaepoch
参数:
gamma- 学习率调整倍数的底,指数为epoch,即 gammaepoch
last_epoch(int)- 上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整。当为-1时,学习率设置为初始值。

4.lr_scheduler.CosineAnnealingLR

class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)

功能:
以余弦函数为周期,并在每个周期最大值时重新设置学习率。具体如下图所示

详细请阅读论文《 SGDR: Stochastic Gradient Descent with Warm Restarts》(ICLR-2017):https://arxiv.org/abs/1608.03983
参数:
T_max(int) - 一次学习率周期的迭代次数,即T_max个epoch之后重新设置学习率。
eta_min(float) - 最小学习率,即在一个周期中,学习率最小会下降到eta_min,默认值为0。

学习率调整公式为:

可以看出是以初始学习率为最大学习率,以2*Tmax为周期,在一个周期内先下降,后上升。

实例:
T_max = 200, 初始学习率 = 0.001, eta_min = 0

5.lr_scheduler.ReduceLROnPlateau

class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’, factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode=‘rel’, cooldown=0, min_lr=0, eps=1e-08)

功能:
当某指标不再变化(下降或升高),调整学习率,这是非常实用的学习率调整策略。例如,当验证集的loss不再下降时,进行学习率调整;或者监测验证集的accuracy,当accuracy不再上升时,则调整学习率。

参数:
mode(str) - 模式选择,有 min和max两种模式,min表示当指标不再降低(如监测loss),max表示当指标不再升高(如监测accuracy)。
factor(float) - 学习率调整倍数(等同于其它方法的gamma),即学习率更新为 lr = lr * factor
patience(int) - 直译——“耐心”,即忍受该指标多少个step不变化,当忍无可忍时,调整学习率。注,可以不是连续5次。
verbose(bool) - 是否打印学习率信息, print(‘Epoch {:5d}: reducing learning rate’ ’ of group {} to {:.4e}.’.format(epoch, i, new_lr))
threshold(float) - Threshold for measuring the new optimum,配合threshold_mode使用,默认值1e-4。作用是用来控制当前指标与best指标的差异。
threshold_mode(str) - 选择判断指标是否达最优的模式,有两种模式,rel和abs。
当threshold_mode = rel,并且mode = max时,dynamic_threshold = best * ( 1 + threshold );
当threshold_mode = rel,并且mode = min时,dynamic_threshold = best * ( 1 - threshold );
当threshold_mode = abs,并且mode = max时,dynamic_threshold = best + threshold ;
当threshold_mode = rel,并且mode = max时,dynamic_threshold = best - threshold
cooldown(int) - “冷却时间“,当调整学习率之后,让学习率调整策略冷静一下,让模型再训练一段时间,再重启监测模式。
min_lr(float or list) - 学习率下限,可为float,或者list,当有多个参数组时,可用list进行设置。
eps(float) - 学习率衰减的最小值,当学习率变化小于eps时,则不调整学习率。

6.lr_scheduler.LambdaLR

class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)

功能:
为不同参数组设定不同学习率调整策略。调整规则为,lr = base_lr * lmbda(self.last_epoch) 。
参数:
lr_lambda(function or list) - 一个计算学习率调整倍数的函数,输入通常为step,当有多个参数组时,设为list。
last_epoch(int) - 上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整。当为-1时,学习率设置为初始值。

二、学习率调整小结及step源码阅读

2.1 学习率调整小结

Pytorch提供了六种学习率调整方法,可分为三大类,分别是

  1. 有序调整;
  2. 自适应调整;
  3. 自定义调整。
    第一类,依一定规律有序进行调整,这一类是最常用的,分别是等间隔下降(Step),按需设定下降间隔(MultiStep),指数下降(Exponential)和CosineAnnealing。这四种方法的调整时机都是人为可控的,也是训练时常用到的。
    第二类,依训练状况伺机调整,这就是ReduceLROnPlateau方法。该法通过监测某一指标的变化情况,当该指标不再怎么变化的时候,就是调整学习率的时机,因而属于自适应的调整。
    第三类,自定义调整,Lambda。Lambda方法提供的调整策略十分灵活,我们可以为不同的层设定不同的学习率调整方法,这在fine-tune中十分有用,我们不仅可为不同的层设定不同的学习率,还可以为其设定不同的学习率调整策略,简直不能更棒!

PyTorch的六个学习率调整相关推荐

  1. PyTorch学习之六个学习率调整策略

    PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 a. 有序调整:等间隔调整(Step),按需调整学习率( ...

  2. 【深度学习】图解 9 种PyTorch中常用的学习率调整策略

    learning rate scheduling 学习率调整策略 01 LAMBDA LR 将每个参数组的学习率设置为初始lr乘以给定函数.当last_epoch=-1时,将初始lr设置为初始值. t ...

  3. 【PyTorch】crnn-finetune模型学习率调整策略

    1. 网络模型 2.不同层设置不同学习率 这里以adam优化器为例 #不同层设置不同的学习率 train_params = list(map(id,crnn.rnn.parameters())) #2 ...

  4. 【PyTorch】lr_scheduler.StepLR==>调整学习率的方法

    lr_scheduler.StepLR class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoc ...

  5. 【详解】模型优化技巧之优化器和学习率调整

    目录 PyTorch十大优化器 1 torch.optim.SGD 2 torch.optim.ASGD 3 torch.optim.Rprop 4 torch.optim.Adagrad 5 tor ...

  6. PyTorch框架学习十四——学习率调整策略

    PyTorch框架学习十四--学习率调整策略 一._LRScheduler类 二.六种常见的学习率调整策略 1.StepLR 2.MultiStepLR 3.ExponentialLR 4.Cosin ...

  7. Pytorch —— 学习率调整策略

    1.为什么要调整学习率 学习率控制梯度更新的快慢,在训练中,开始时的学习率比较大,梯度更新步伐比较大,后期时学习率比较小,梯度更新步伐比较小. 梯度下降:wi+1=wi−g(wi)w_{i+1}=w_ ...

  8. pytorch 学习率代码_DL知识拾贝(Pytorch)(五):如何调整学习率

    知识导图 学习率对于深度学习是一个重要的超参数,它控制着基于损失梯度调整神经网络权值的速度,大多数优化算法(SGD.RMSprop.Adam)对其都有所涉及.学习率过下,收敛的太慢,网络学习的也太慢: ...

  9. pytorch优化器学习率调整策略以及正确用法

    优化器 optimzier优化器的作用:优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用. 从优化器的作用出发,要使得优化器能够起作用,需要主要两个东西: ...

最新文章

  1. java 2维数据便利_计算机等级考试二级java数组辅导
  2. 装完Ubuntu后要干的事-安装常用软件
  3. hdu1847(博弈论:sg函数)
  4. Android四大组件之——Activity的生命周期(图文详解)
  5. 安徽关节式焊接机器人_机器人自动焊接技术的优势及应用介绍
  6. 从网络到分布式-负载均衡
  7. BZOJ 2049: [Sdoi2008]Cave 洞穴勘测——LCT
  8. 布比Code Review赏金计划正式启动 让区块链回归代码本身
  9. iOS 10 的一个重要更新-线程竞态检测工具 Thread Sanitizer
  10. 静态路由配置《计算机网络》实验六,思科路由器静态路由配置实验案例详解
  11. 手机android系统界面,Android 4.0系统,界面很原生
  12. 清华大学梁宸计算机系,2015年自主招生--五大联赛银牌争夺战
  13. Kesci“魔镜杯”风控算法大赛复赛解决方案(转载)
  14. 程序集引用里面的“Culture=neutral”是什么意思?
  15. 每日一面 - 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
  16. 苹果电脑系统太卡如何彻底清理内存?
  17. Tomcat配置数据库连接池
  18. OKHTTP系列(九)---http请求头(header)作用
  19. C# 获取IP地址、主机信息(Host)、浏览器信息
  20. StopWatch简单使用

热门文章

  1. java 并发编程实例_Java并发编程案例解读
  2. Shell 编程进阶笔记
  3. VTK:vtkCompositePolyDataMapper2用法实战
  4. boost::program_options模块实现使用命令行和配置文件的测试程序
  5. boost::mpl模块AUX_ASSERT_IS_SEQ的测试程序
  6. boost::mp11::tuple_for_each相关用法的测试程序
  7. boost::log模块测试get_attributes()这个const方法可以获取线程模型内部的互斥锁
  8. boost::log::string_literal用法的测试程序
  9. boost::hana::detail::create用法的测试程序
  10. boost::gregorian模块实现以天为单位显示到新年的时间量的测试程序