动态调整学习率Lr

news2025/3/10 5:46:49

动态调整学习率Lr

  • 0 引入
  • 1 代码例程
    • 1.1 工作方式解释
  • 2 动态调整学习率的几种方法
    • 2.1 lr_scheduler.LambdaLR
    • 2.2 lr_scheduler.StepLR
    • 2.3 lr_scheduler.MultiStepLR
    • 2.4 lr_scheduler.ExponentialLR
    • 2.2.5 lr_scheduler.CosineAnnealingLR
    • 2.6 lr_scheduler.ReduceLROnPlateau
    • 2.7 lr_scheduler.CyclicLR
  • 参考

0 引入

在训练深度学习模型时,不可避免的要调整超参,而学习率首当其冲是大家最先想要调整的一个超参。而且学习率对于模型训练效果来说也相当重要。
然鹅,学习率过低会导致学习速度太慢,学习率过高又容易导致难以收敛。
因此,很多炼丹师都会采用动态调整学习率的方法。刚开始训练时,学习率大一点,以加快学习速度;之后逐渐减小来寻找最优解。
那么在Pytorch中,如何**在训练过程里动态调整学习率呢?**本文将带你深入理解优化器和学习率调整策略。

1 代码例程

1.1 工作方式解释

自定义学习率调度器:torch.optim.lr_scheduler.LambdaLR

torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda = lr_lambda)
  • optimizer:优化器对象,表示需要调整学习率的优化器。
  • Ir_lambda:一个函数,接受一个整数参数epoch,并返回一个浮点数值,表示当前epoch下的学习率变化系数。

每个epoch 更新一次lr:
image.png

每个batch 更新一次学习率:
image.png

举例子: 新的学习率 = 原始学习率 * 学习率因子
image.png

学习率调度器:

image.png

2 动态调整学习率的几种方法

一般地,模型训练和人刻意练习一项技能一样,需要反复地学习才能加固认知。模型也是一样,需要反复学习多次给定的数据集,即要训练多个epoch。在Pytorch中,给我们提供了很多种动态调整学习率的策略,这些调整策略多是基于epoch进行的。下面一一进行讲解。

2.1 lr_scheduler.LambdaLR

目的:将每个参数组的学习率设置为初始 lr 乘以给定的Lambda函数根据epoch计算出来的值。

CLASS torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)

参数详情
optimizer (Optimizer):关联的优化器
lr_lambda (function or list):给定当前epoch计算乘法因子的函数,如果是函数列表,则每一个函数对应一个参数组,这样就可以为不同的参数组设置不同的学习率。
last_epoch (int):最后一个epoch的索引,默认值为-1.
verbose(bool):如果为True,为每次更新打印输出,默认值False

举例子: 线性递减的lr

# 假设优化器有两个参数组.
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()

2.2 lr_scheduler.StepLR

目的:每step_size个epochs通过γ降低每个参数组的学习率。

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

参数详情

optimizer (Optimizer):关联的优化器
step_size (int):学习率更新的周期,每step_size个epochs更新一次
gamma (float):降低学习率的乘法因子,默认值0.1
last_epoch(int):最后一个epoch的索引,默认值-1
verbose(bool):如果为True,为每次更新打印输出,默认值False

举例子

# 假设所有参数组的初始学习率为0.05,γ为0.1
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 60
# lr = 0.0005   if 60 <= epoch < 90
# ...
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()

2.3 lr_scheduler.MultiStepLR

目的:当epoch到达设定的标志位时,通过γ降低每个参数组的学习率。请注意,这种衰减可能与此调度程序外部对学习率的其他更改同时发生。

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

参数详情
optimizer (Optimizer):关联的优化器
milestones (list):epoch索引的列表,必须是升序的,因为epoch是越来越大的
gamma (float):降低学习率的乘法因子,默认值0.1
last_epoch(int):最后一个epoch的索引,默认值-1
verbose(bool):如果为True,为每次更新打印输出,默认值False

例子

# 假设所有参数组的初始学习率为0.05,γ为0.1
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 80
# lr = 0.0005   if epoch >= 80
scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()

2.4 lr_scheduler.ExponentialLR

目的:对于每个epoch,使用γ降低每个参数组的学习率。以 gama 为底,epoch为指数,
在这里插入图片描述

参数详情
optimizer (Optimizer):关联的优化器
gamma (float):降低学习率的乘法因子,默认值0.1
last_epoch(int):最后一个epoch的索引,默认值-1
verbose(bool):如果为True,为每次更新打印输出,默认值False

2.2.5 lr_scheduler.CosineAnnealingLR

目的:使用余弦退火策略动态调整每个epoch的学习率。

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

参数详情:
optimizer (Optimizer):关联的优化器
T_max (int):最大的迭代次数
eta_min(float):最小的学习率,默认值0
last_epoch(int):最后一个epoch的索引,默认值-1
verbose(bool):如果为True,为每次更新打印输出,默认值False

计算公式如下:
image.png
其中,\eta_{t}表示更新后的学习率,ηmin 表示最小的学习率,ηmax表示最大的学习率,Tcur表示当前epoch的索引,Tmax表示最大epoch的索引。

2.6 lr_scheduler.ReduceLROnPlateau

目的:当指标停止改进时便开始降低学习率。一旦学习停滞,将学习率降低 2-10 倍之后,模型通常会继续学习。 该调度程序读取一个指标数量,如果一定数量的 epoch 后仍没有改善,则学习率会降低。

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

参数详情
optimizer (Optimizer):关联的优化器
mode(str):有min和max两种可选。在min模式下,当模型指标停止下降时开始调整学习率;在max模式下,当模型指标停止上升时开始调整学习率
factor (float):降低学习率的乘法因子.lr_new = lr ∗ factor
patience(int):耐心值,不是指标停止改变后立马就调整学习率,而是patience个epoch之后指标仍没有改变,便开始调整学习率,即该策略对指标的变化有一定的容忍度。默认值10
threshold(float):衡量新的最佳阈值,只关注重大变化。默认值:1e-4
cooldown(int):在 lr 减少后恢复正常操作之前要等待的 epoch 数
min_lr (float or list):每个参数组设定的最小学习率
eps (float):如果调整之后的学习率和调整之前的学习率差距小于eps,则忽略此次调整
verbose(bool):如果为True,为每次更新打印输出,默认值False

例子

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'min')
for epoch in range(10):
    train(...)
    val_loss = validate(...)
    # Note that step should be called after validate()
    scheduler.step(val_loss)

2.7 lr_scheduler.CyclicLR

目的:根据周期性学习率策略调整每个参数组的学习率。该策略以恒定频率在两个边界之间循环调整学习率,详见论文 Cyclical Learning Rates for Training Neural Networks。 两个边界之间的距离可以在每次迭代或每个周期的基础上进行缩放。循环学习率策略在每个Batch之后改变学习率。 step()方法应该在一个Batch用于训练后调用。

该方法有三种循环策略:
triangular“:没有幅度缩放的基本三角循环
”triangular2“:一个基本的三角循环,每个循环将初始幅度缩放一半
”exp_range“:每个循环之后,将初始幅度按照 \gamma^{cycle-iterations}进行降低

例子

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
data_loader = torch.utils.data.DataLoader(...)
for epoch in range(10):
    for batch in data_loader:
        train_batch(...)
        scheduler.step()

参考

深度学习学习率调整方案如何选择? - Summer Clover的回答 - 知乎
https://www.zhihu.com/question/315772308/answer/1636730368

[]深度学习学习率调整方案如何选择?
https://www.zhihu.com/question/315772308

[pytorch 动态调整学习率,学习率自动下降,根据loss下降]
https://blog.csdn.net/qq_41554005/article/details/119879911

[深度学习之动态调整学习率LR]
https://blog.csdn.net/Just_do_myself/article/details/123751148

[pytorch优化器与学习率设置详解]
https://zhuanlan.zhihu.com/p/435669796

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

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

相关文章

ASK、PSK、FSK的调制与解调

ASK、PSK、FSK的调制与解调 本文主要涉及数字信号的调制与解调&#xff0c;内容包括&#xff1a;2ASK、2PSK、2FSK的调制与解调以及频谱分析 关于通信原理还有其他文章可参考&#xff1a; 1、信息量、码元、比特、码元速率、信息速率详细解析——实例分析 2、模拟系统的AM信号的…

2023最新版JavaSE教程——第6天:面向对象编程(基础)

目录 一、面向对象编程概述(了解)1.1 程序设计的思路1.2 由实际问题考虑如何设计程序1.3 如何掌握这种思想&#xff1f; 二、Java语言的基本元素&#xff1a;类和对象2.1 引入2.2 类和对象概述2.3 类的成员概述2.4 面向对象完成功能的三步骤(重要)2.4.1 步骤1&#xff1a;类的定…

数据分类分级方法及典型应用场景

1 2021-09-29 来源&#xff1a;数据学堂 [打印本稿][字号 大 中小] 《数据安全法》的第二十一条明确规定了由国家建立数据分类分级保护制度&#xff0c;根据数据在经济社会发展中的重要程度&#xff0c;以及一旦遭到篡改、破坏、泄露或者非法获取、非法利用&#xff0c;对国…

Flutter实践二:repository模式

1.repository 几乎所有的APP&#xff0c;从简单的到最复杂的&#xff0c;在它们的架构里几乎都包括状态管理和数据源这两部分。状态管理常见的有Bloc、Cubit、Provider、ViewModel等&#xff0c;数据源则是一些直接和数据库或者网络客户端进行交互&#xff0c;取得相应的数据&…

【开源】基于Vue和SpringBoot的智能停车场管理系统

项目编号&#xff1a; S 005 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S005&#xff0c;文末获取源码。} 项目编号&#xff1a;S005&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…

智能井盖传感器具有什么效果?

智能井盖传感器与智慧城市之间有着密切的关联&#xff0c;两者之间属于相辅相成的状态&#xff0c;对于城市的现代化和城市生命线建设有助力作用。智能井盖传感器是其中一个重要的组成环节&#xff0c;它们帮助城市改变原有的生活和生态环境&#xff0c;为政府部门完善城市基础…

Linux(命令)——结合实际场景的命令 查找Java安装位置命令

前言 在内卷的时代&#xff0c;作为开发的程序员也需要懂一些Linux相关命令。 本篇博客结合实际应用常见&#xff0c;记录Linux命令相关的使用&#xff0c;持续更新&#xff0c;希望对你有帮助。 目录 前言引出一、查找Java安装位置命令1、使用which命令2、使用find命令3、查…

从0到0.01入门React | 006.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

ESP32 Arduino引脚分配参考:您应该使用哪些 GPIO 引脚?

ESP32 芯片有 48 个引脚&#xff0c;具有多种功能。并非所有 ESP32 开发板中的所有引脚都暴露出来&#xff0c;有些引脚无法使用。 关于如何使用 ESP32 GPIO 有很多问题。您应该使用什么引脚&#xff1f;您应该避免在项目中使用哪些引脚&#xff1f;这篇文章旨在成为 ESP32 GP…

【机器学习】 朴素贝叶斯算法:原理、实例应用(文档分类预测)

1. 算法原理 1.1 朴素贝叶斯方法 朴素贝叶斯方法涉及一些概率论知识&#xff0c;我们先来复习一下。 联合概率&#xff1a;包含多个条件&#xff0c;并且所有的条件同时成立的概率&#xff0c;公式为&#xff1a; 条件概率&#xff1a;事件A在另一个事件B已经发生的前提下发…

零代码搭建:无需编程基础,轻松搭建数据自己的能源监测管理平台

零代码搭建能源管理平台&#xff0c;其核心是通过使用图形用户界面和可视化建模工具&#xff0c;来减少编写代码的工作量以及技能要求。平台拥有丰富的预定义组件&#xff0c;可以帮助管理人员快速构建应用程序。并可自定义区域框架&#xff0c;在搭建自己区域时&#xff0c;能…

视频监控系统EasyCVR平台播放告警录像时,播放器显示不全是什么原因?

防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防…

解密.devos病毒:如何守护你的数据免受.devos病毒威胁?

引言&#xff1a; 近来&#xff0c;网络安全威胁再次升级&#xff0c;其中一个备受关注的恶意软件就是.devos病毒。这种病毒通过加密你的数据文件&#xff0c;然后勒索赎金&#xff0c;给用户带来了巨大的威胁。本文将介绍如何应对被.devos病毒加密的数据文件&#xff0c;以及…

【CSS】伪元素与伪类

CSS 伪元素和伪类 1.为什么要引入伪元素和伪类&#xff1f; 在 CSS 的官方文档中&#xff0c;是这样描述的&#xff1a; CSS introduces the concepts of pseudo-elements and pseudo-classes to permit formatting based on information that lies outside the document tre…

Splashtop 如何维护 GDPR 合规性

2018年&#xff0c;欧盟颁布了一项新法律&#xff0c;以保护欧洲公民的个人数据免遭任何收集数据的人不当处理。这可能意味着企业和组织&#xff0c;包括面对面和虚拟形式。这项开创性的法律为其他立法铺平了道路&#xff0c;例如加利福尼亚州的《加州消费者隐私法》&#xff0…

基于LangChain+ChatGLM2-6B+embedding构建行业知识库

目的&#xff1a;最近在探索大模型本地化部署知识库实现行业解决方案&#xff0c;安装过程记录&#xff0c;分享给需要的同学&#xff0c;安装前确定好各组件的版本非常重要&#xff0c;避免重复安装走老路。 经过查阅大量资料&#xff0c;目前可以分为以下两种方案 方案一&am…

Radmin局域网远程软件

Radmin是一个快速且安全的远程控制和远程访问软件&#xff0c;通过它可以就像坐在远程计算机前一样&#xff0c;在远程计算机上工作&#xff0c;并可以从多个位置访问远程计算机。&#xff08;本例使用的版本是Radmin 3.5&#xff09; 下载Radmin 3.5安装包。 注意&#xff1…

Cesium深入浅出之自定义材质

引子 做为一名技术宅却没有能拿得出手的技术无疑是最可悲的事情。三年前&#xff0c;当我第一次接触Cesium的时候就被它强大和炫丽所折服&#xff0c;最关键的是它还是开源的。以前我一直是机械地敲着业务代码&#xff0c;好像计算机程序就只能干这点事情一样&#xff0c;而 C…

【Spring Boot】034-Spring Boot 整合 JUnit

【Spring Boot】034-Spring Boot 整合 JUnit 文章目录 【Spring Boot】034-Spring Boot 整合 JUnit一、单元测试1、什么是单元2、什么是单元测试3、为什么要单元测试 二、JUnit1、概述简介特点 2、JUnit4概述基本用法 3、JUnit5概述组成 4、JUnit5 与 JUnit4 的常用注解对比 三…

JVM及其垃圾回收机制(GC)

目录 一.JVM内存区域划分 二.JVM类加载机制 类加载过程 类加载的时机 双亲委派模型 三.JVM垃圾回收机制&#xff08;GC) GC工作过程 1.找到垃圾/判断垃圾 &#xff08;1&#xff09;引用计数【python/PHP】 &#xff08;2&#xff09;可达性分析【Java】 2.对象释放…