PyTorch中学习率调度器可视化介绍

news2024/11/19 23:25:47

神经网络有许多影响模型性能的超参数。一个最基本的超参数是学习率(LR),它决定了在训练步骤之间模型权重的变化程度。在最简单的情况下,LR值是0到1之间的固定值。

选择正确的LR值是具有挑战性。一方面较大的学习率有助于算法快速收敛,但它也会导致算法在最小值附近跳跃而没有达到它,甚至在它太大时跳过它。另一方面,较小的学习率可以更好地收敛到最小值,但是如果优化器太小,可能需要太长时间才能收敛,或者陷入停滞。

什么是学习率调度器?

一种帮助算法快速收敛到最优的解决方案是使用学习率调度器。学习率调度器在训练过程中根据预先定义的时间表调整学习率。

通常,学习率在训练开始时设置为比较高的值,允许更快的收敛。随着训练的进行,学习率会降低,使收敛到最优,获得更好的性能。在训练过程中降低学习率也称为退火或衰减。

学习率调度器有很多个,并且我们还可以自定义调度器。本文将介绍PyTorch中不同的预定义学习率调度器如何在训练期间调整学习率

学习率调度器

对于本文,我们使用PyTorch 1.13.0版本。你可以在PyTorch文档中关于学习率调度器的细节。

 import torch

在本文末尾的附录中会包含用于可视化PyTorch学习率调度器的Python代码。

1、StepLR

在每个预定义的训练步骤数之后,StepLR通过乘法因子降低学习率。

 from torch.optim.lr_scheduler import StepLR
 
 scheduler = StepLR(optimizer, 
                    step_size = 4, # Period of learning rate decay
                    gamma = 0.5) # Multiplicative factor of learning rate decay

2、MultiStepLR

MultiStepLR -类似于StepLR -也通过乘法因子降低了学习率,但在可以自定义修改学习率的时间节点。

 from torch.optim.lr_scheduler import MultiStepLR
 
 scheduler = MultiStepLR(optimizer, 
                         milestones=[8, 24, 28], # List of epoch indices
                         gamma =0.5) # Multiplicative factor of learning rate decay

3、ConstantLR

ConstantLR通过乘法因子降低学习率,直到训练达到预定义步数。

 from torch.optim.lr_scheduler import ConstantLR
 
 scheduler = ConstantLR(optimizer, 
                        factor = 0.5, # The number we multiply learning rate until the milestone.
                        total_iters = 8) # The number of steps that the scheduler decays the learning rate

如果起始因子小于1,那么学习率调度器在训练过程中会提高学习率,而不是降低学习率。

4、LinearLR

LinearLR -类似于ConstantLR -在训练开始时通过乘法因子降低了学习率。但是它会在一定数量的训练步骤中线性地改变学习率,直到它达到最初设定的学习率。

 from torch.optim.lr_scheduler import LinearLR
 
 scheduler = LinearLR(optimizer, 
                      start_factor = 0.5, # The number we multiply learning rate in the first epoch
                      total_iters = 8) # The number of iterations that multiplicative factor reaches to 1

5、ExponentialLR

ExponentialLR在每个训练步骤中通过乘法因子降低学习率。

 rom torch.optim.lr_scheduler import ExponentialLR
 
 scheduler = ExponentialLR(optimizer, 
                           gamma = 0.5) # Multiplicative factor of learning rate decay.

6、PolynomialLR

PolynomialLR通过对定义的步骤数使用多项式函数来降低学习率。

 from torch.optim.lr_scheduler import PolynomialLR
 
 scheduler = PolynomialLR(optimizer, 
                          total_iters = 8, # The number of steps that the scheduler decays the learning rate.
                          power = 1) # The power of the polynomial.

下图为power= 1时的学习率衰减结果。

power= 2时,学习率衰减如下所示。

7、CosineAnnealingLR

CosineAnnealingLR通过余弦函数降低学习率。

可以从技术上安排学习率调整以跟随多个周期,但他的思想是在半个周期内衰减学习率以获得最大的迭代次数。

 from torch.optim.lr_scheduler import CosineAnnealingLR
 
 scheduler = CosineAnnealingLR(optimizer,
                               T_max = 32, # Maximum number of iterations.
                              eta_min = 1e-4) # Minimum learning rate.

两位Kaggle大赛大师Philipp Singer和Yauhen Babakhin建议使用余弦衰减作为深度迁移学习[2]的学习率调度器。

8、CosineAnnealingWarmRestartsLR

CosineAnnealingWarmRestartsLR类似于CosineAnnealingLR。但是它允许在(例如,每个轮次中)使用初始LR重新启动LR计划。

 from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts
 scheduler = CosineAnnealingWarmRestarts(optimizer, 
                                         T_0 = 8,# Number of iterations for the first restart
                                         T_mult = 1, # A factor increases TiTi after a restart
                                         eta_min = 1e-4) # Minimum learning rate

这个计划调度于2017年[1]推出。虽然增加LR会导致模型发散但是这种有意的分歧使模型能够逃避局部最小值,并找到更好的全局最小值。

9、CyclicLR

CyclicLR根据循环学习率策略调整学习率,该策略基于我们在前一节中讨论过的重启的概念。在PyTorch中有三个内置策略。

 from torch.optim.lr_scheduler import CyclicLR
 
 scheduler = CyclicLR(optimizer, 
                      base_lr = 0.0001, # Initial learning rate which is the lower boundary in the cycle for each parameter group
                      max_lr = 1e-3, # Upper learning rate boundaries in the cycle for each parameter group
                      step_size_up = 4, # Number of training iterations in the increasing half of a cycle
                      mode = "triangular")

当mode = " triangle "时,学习率衰减将遵循一个基本的三角形循环,没有振幅缩放,如下图所示。

对于mode = " triangar2 ",所得到的学习率衰减将遵循一个基本的三角形循环,每个循环将初始振幅缩放一半,如下图所示。

使用mode = “exp_range”,得到的学习率衰减将如下所示。

10、OneCycleLR

OneCycleLR根据1cycle学习率策略降低学习率,该策略在2017年[3]的一篇论文中提出。

与许多其他学习率调度器相比,学习率不仅在训练过程中下降。相反,学习率从初始学习率增加到某个最大学习率,然后再次下降。

 from torch.optim.lr_scheduler import OneCycleLR
 
 
 scheduler = OneCycleLR(optimizer, 
                        max_lr = 1e-3, # Upper learning rate boundaries in the cycle for each parameter group
                        steps_per_epoch = 8, # The number of steps per epoch to train for.
                        epochs = 4, # The number of epochs to train for.
                        anneal_strategy = 'cos') # Specifies the annealing strategy

使用anneal_strategy = "cos"得到的学习率衰减将如下所示。

使用anneal_strategy = “linear”,得到的学习率衰减将如下所示。

11、ReduceLROnPlateauLR

当指标度量停止改进时,ReduceLROnPlateau会降低学习率。这很难可视化,因为学习率降低时间取决于您的模型、数据和超参数。

12、自定义学习率调度器

如果内置的学习率调度器不能满足需求,我们可以使用lambda函数定义一个调度器。lambda函数是一个返回基于epoch值的乘法因子的函数。

LambdaLR通过将lambda函数的乘法因子应用到初始LR来调整学习速率。

 lr_epoch[t] = lr_initial * lambda(epoch)

MultiplicativeLR通过将lambda函数的乘法因子应用到前一个epoch的LR来调整学习速率。

 lr_epoch[t] = lr_epoch[t-1] * lambda(epoch)

这些学习率调度器也有点难以可视化,因为它们高度依赖于已定义的lambda函数。

可视化汇总

以上就是PyTorch内置的学习率调度器,应该为深度学习项目选择哪种学习率调度器呢?

答案并不那么容易,ReduceLROnPlateau是一个流行的学习率调度器。而现在其他的方法如CosineAnnealingLR和OneCycleLR或像cosineannealingwarmrestart和CyclicLR这样的热重启方法已经越来越受欢迎。

所以我们需要运行一些实验来确定哪种学习率调度器最适合要解决问题。但是可以说的是使用任何学习调度器都会影响到模型性能。

下面是PyTorch中讨论过的学习率调度器的可视化总结。

引用和附录

[1] Loshchilov, I., & Hutter, F. (2016). Sgdr: Stochastic gradient descent with warm restarts. arXiv preprint arXiv:1608.03983.

[2] Singer, P. & Babakhin, Y. (2022) Practical Tips for Deep Transfer Learning. In: Kaggle Days Paris 2022.

[3] Smith, L. N., & Topin, N. (2019). Super-convergence: Very fast training of neural networks using large learning rates. In Artificial intelligence and machine learning for multi-domain operations applications (Vol. 11006, pp. 369–386). SPIE.

下面是来可视化学习率调度器的代码:

 import torch
 from torch.optim.lr_scheduler import StepLR # Import your choice of scheduler here
 
 import matplotlib.pyplot as plt
 from matplotlib.ticker import MultipleLocator
 
 LEARNING_RATE = 1e-3
 EPOCHS = 4
 STEPS_IN_EPOCH = 8
 
 # Set model and optimizer
 model = torch.nn.Linear(2, 1)
 optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_RATE)
 
 # Define your scheduler here as described above
 # ...
 
 # Get learning rates as each training step
 learning_rates = []
 
 for i in range(EPOCHS*STEPS_IN_EPOCH):
     optimizer.step()
     learning_rates.append(optimizer.param_groups[0]["lr"])
     scheduler.step()
 
 # Visualize learinig rate scheduler
 fig, ax = plt.subplots(1,1, figsize=(10,5))
 ax.plot(range(EPOCHS*STEPS_IN_EPOCH), 
         learning_rates,
         marker='o', 
         color='black')
 ax.set_xlim([0, EPOCHS*STEPS_IN_EPOCH])
 ax.set_ylim([0, LEARNING_RATE + 0.0001])
 ax.set_xlabel('Steps')
 ax.set_ylabel('Learning Rate')
 ax.spines['top'].set_visible(False)
 ax.spines['right'].set_visible(False)
 ax.xaxis.set_major_locator(MultipleLocator(STEPS_IN_EPOCH))
 ax.xaxis.set_minor_locator(MultipleLocator(1))
 plt.show()

https://avoid.overfit.cn/post/9987b70f3d1e47d5b6a0b5ff70d8133f

作者:Leonie Monigatti

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【车载开发系列】UDS诊断---输入输出控制($0x2F)

【车载开发系列】UDS诊断—输入输出控制($0x2F) UDS诊断---输入输出控制($0x2F)【车载开发系列】UDS诊断---输入输出控制($0x2F)一.概念定义1)与0x31例程控制服务的关系2)与0x22读取…

数据传送类指令(PUSH,POP,LEA)

目录 数据传送类指令 堆栈的概念: 进栈指令 (PUSH) 出栈指令(POP) 练习 LEA取偏移地址(有效地址EA)指令(去括号) LEA和OFFSET区别: 用法注意 LEA和MO…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.6 热点参数限流

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.6 热点参数限流31.6.1 热点参数限流31.6.2 案例31 限流规则 31.6 热点参数限流 3…

【代码审计-.NET】基于.NET框架开发的基本特征

目录 一、.NET基本架构 1、基本构成 2、可支持语言 3、封装 4、文件 5、指向解析 6、安全认证 二、工具 1、ILSpyi 2、dnSpy 3、Reflector (网上找的一张图谱) 本博客只面向讲安全相关内容 一、.NET基本架构 1、基本构成 可支持语言&#xf…

web shell控制目标

文章目录一、封神台五1、为什么提权2、如何寻找exp3、使用exp提权一、封神台五 1、为什么提权 进入目标机器后权限可能不够导致无法执行高权限操作 右键地址进入终端 发现没有操作权限 提权原理:借助高权限的进程执行我们的指令 2、如何寻找exp 什么是exp&a…

【MOSMA】基于粘菌算法求解多目标优化问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

【Java版oj】day02倒置字符串

目录 一、原题再现 二、问题分析 三、完整代码 一、原题再现 倒置字符串_牛客题霸_牛客网 描述 将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I 输入描述: 每个测试输入包含1个测试用例&#x…

web前端期末大作业 html+css+javascript+jquery+bootstarp响应式鲜花售卖网站16页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

最新最全面的Java面试题及答案(212道)

文章目录一. Java 基础1. JDK 和 JRE 有什么区别?2. 和 equals 的区别是什么?3. 两个对象的 hashCode() 相同,则equals() 也一定为true,对吗?4. final 在 Java 中有什么作用?5. Java 中的 Math. round(-1.…

【图像分割】基于Kmean聚类 分水岭、oust、粒子群算法优化脂肪肝图像分割附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

OPT(奥普特)工控机新品上市,产品矩阵再扩大

近日,OPT(奥普特)发布工控机新品,进一步扩展产品矩阵,为制造业数字化转型提供更为全面的机器视觉产品和服务。 OPT(奥普特)上市的工控机共有两大系列,分别是3U桌面式和4U上架式的设…

【金猿人物展】映盛中国CEO谭运猛博士:数字化逆向重构将会占据行业红利成为新宠...

‍谭运猛本文由映盛中国创始人兼CEO谭运猛撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业2022年伴随着新冠疫情的反复和经济下行的持续影响,各行各业都面临着数字化转型的行…

【每日小技巧】如果Tomcat的端口被占用,怎么处理该报错

苦恼的问题:当我们在用Tomcat时,发现我们要用的端口被其他程序占用了,如图: 解决办法: ①winR,输入cmd,打开命令行 输入命令netstat -ano,列出所有的端口号使用情况 ②查看PID&#…

矩阵理论复习(四)

2003年试题 向量二范数也具有酉不变性 Schur定理的应用 向量范数的判定 向量范数的比较 酉矩阵的M-P广义逆就为该矩阵的转置 列满秩矩阵的左逆 一个矩阵乘以其逆矩阵等于单位矩阵,单位矩阵的算子范数均为1,算子范数的相容性 正规矩阵的性质 …

嵌入式:ARM的工作模式与寄存器组织

文章目录特权模式处理器启动时的模式转换图ARM的寄存器组织ARM寄存器组成概述ARM状态下的寄存器组织Thumb状态下的寄存器组织CPSR(当前程序状态寄存器)的低5位用于定义当前操作模式 , 如图示特权模式 除用户模式外的其他6种模式称为特权模式。 特权模式…

nodejs基于vue技术的小饰品购物商城网站

开发语言:nodejs 框架:Express 数据库:mysql 数据库工具:Navicat11 开发软件:VS code/HBuilder X 浏览器:谷歌浏览器 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本…

【C++常用容器】STL基础语法学习queue容器

目录 ●queue的基本概念 ●queue常用接口 ●构造函数 ●赋值操作 ●数据存取 ●大小操作 ●queue的基本概念 简要介绍:queue是一种先进先出的的数据结构,它有两个出口。队列容器允许从一端新增元素,从另一端移除元素。队列中只有队…

如何批量查询谷歌PR权重是多少?谷歌PR权重怎么批量查询

权重是就是网站在搜索引擎心目中的位置,如果一个网站在搜索引擎心目中的位置高的话,当然容易获得较好的排名,今天不是来跟大家聊如何提升网站权重的,而是教大家如何去看一个网站的权重,做网站的朋友都要知道要做关键词…

RadSystems Studio构建CRUD操作程序

RadSystems Studio构建CRUD操作程序 RadSystems Studio是一个快节奏的开发环境,不需要专门的编程。该软件提供了数字解决方案和组件,以尽快在API和UI中构建程序,只需少量代码,甚至无需编写。该软件减少了编写时间并改进了开发过程…

win10 安装配置nvm

第一步:下载安装包 链接:https://pan.baidu.com/s/1B_gc9DnM8s3utcd_DB1H4Q?pwdxm03 提取码:xm03 第二步:安装nvm 第三步:配置nvm setting文件加上淘宝镜像 node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.or…