PyTorch的六个学习率调整
本文截取自《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提供了六种学习率调整方法,可分为三大类,分别是
- 有序调整;
- 自适应调整;
- 自定义调整。
第一类,依一定规律有序进行调整,这一类是最常用的,分别是等间隔下降(Step),按需设定下降间隔(MultiStep),指数下降(Exponential)和CosineAnnealing。这四种方法的调整时机都是人为可控的,也是训练时常用到的。
第二类,依训练状况伺机调整,这就是ReduceLROnPlateau方法。该法通过监测某一指标的变化情况,当该指标不再怎么变化的时候,就是调整学习率的时机,因而属于自适应的调整。
第三类,自定义调整,Lambda。Lambda方法提供的调整策略十分灵活,我们可以为不同的层设定不同的学习率调整方法,这在fine-tune中十分有用,我们不仅可为不同的层设定不同的学习率,还可以为其设定不同的学习率调整策略,简直不能更棒!
PyTorch的六个学习率调整相关推荐
- PyTorch学习之六个学习率调整策略
PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 a. 有序调整:等间隔调整(Step),按需调整学习率( ...
- 【深度学习】图解 9 种PyTorch中常用的学习率调整策略
learning rate scheduling 学习率调整策略 01 LAMBDA LR 将每个参数组的学习率设置为初始lr乘以给定函数.当last_epoch=-1时,将初始lr设置为初始值. t ...
- 【PyTorch】crnn-finetune模型学习率调整策略
1. 网络模型 2.不同层设置不同学习率 这里以adam优化器为例 #不同层设置不同的学习率 train_params = list(map(id,crnn.rnn.parameters())) #2 ...
- 【PyTorch】lr_scheduler.StepLR==>调整学习率的方法
lr_scheduler.StepLR class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoc ...
- 【详解】模型优化技巧之优化器和学习率调整
目录 PyTorch十大优化器 1 torch.optim.SGD 2 torch.optim.ASGD 3 torch.optim.Rprop 4 torch.optim.Adagrad 5 tor ...
- PyTorch框架学习十四——学习率调整策略
PyTorch框架学习十四--学习率调整策略 一._LRScheduler类 二.六种常见的学习率调整策略 1.StepLR 2.MultiStepLR 3.ExponentialLR 4.Cosin ...
- Pytorch —— 学习率调整策略
1.为什么要调整学习率 学习率控制梯度更新的快慢,在训练中,开始时的学习率比较大,梯度更新步伐比较大,后期时学习率比较小,梯度更新步伐比较小. 梯度下降:wi+1=wi−g(wi)w_{i+1}=w_ ...
- pytorch 学习率代码_DL知识拾贝(Pytorch)(五):如何调整学习率
知识导图 学习率对于深度学习是一个重要的超参数,它控制着基于损失梯度调整神经网络权值的速度,大多数优化算法(SGD.RMSprop.Adam)对其都有所涉及.学习率过下,收敛的太慢,网络学习的也太慢: ...
- pytorch优化器学习率调整策略以及正确用法
优化器 optimzier优化器的作用:优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用. 从优化器的作用出发,要使得优化器能够起作用,需要主要两个东西: ...
最新文章
- java 2维数据便利_计算机等级考试二级java数组辅导
- 装完Ubuntu后要干的事-安装常用软件
- hdu1847(博弈论:sg函数)
- Android四大组件之——Activity的生命周期(图文详解)
- 安徽关节式焊接机器人_机器人自动焊接技术的优势及应用介绍
- 从网络到分布式-负载均衡
- BZOJ 2049: [Sdoi2008]Cave 洞穴勘测——LCT
- 布比Code Review赏金计划正式启动 让区块链回归代码本身
- iOS 10 的一个重要更新-线程竞态检测工具 Thread Sanitizer
- 静态路由配置《计算机网络》实验六,思科路由器静态路由配置实验案例详解
- 手机android系统界面,Android 4.0系统,界面很原生
- 清华大学梁宸计算机系,2015年自主招生--五大联赛银牌争夺战
- Kesci“魔镜杯”风控算法大赛复赛解决方案(转载)
- 程序集引用里面的“Culture=neutral”是什么意思?
- 每日一面 - 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
- 苹果电脑系统太卡如何彻底清理内存?
- Tomcat配置数据库连接池
- OKHTTP系列(九)---http请求头(header)作用
- C# 获取IP地址、主机信息(Host)、浏览器信息
- StopWatch简单使用
热门文章
- java 并发编程实例_Java并发编程案例解读
- Shell 编程进阶笔记
- VTK:vtkCompositePolyDataMapper2用法实战
- boost::program_options模块实现使用命令行和配置文件的测试程序
- boost::mpl模块AUX_ASSERT_IS_SEQ的测试程序
- boost::mp11::tuple_for_each相关用法的测试程序
- boost::log模块测试get_attributes()这个const方法可以获取线程模型内部的互斥锁
- boost::log::string_literal用法的测试程序
- boost::hana::detail::create用法的测试程序
- boost::gregorian模块实现以天为单位显示到新年的时间量的测试程序