【深度学习】(9)--调整学习率

news2024/11/17 17:38:19

文章目录

  • 调整学习率
    • 一、学习率的定义
    • 二、学习率的作用
    • 三、实现调整学习率
      • 1. 使用库函数进行调整
      • 2. 手动调整学习率
  • 总结

调整学习率

调整学习率的目的是:通过调整学习率,优化训练速度、提高训练稳定性、适应不同的训练阶段以及改善模型性能。那么,学习率是如何影响模型的呢?我们又该如何调整学习率呢?

一、学习率的定义

学习率(Learning Rate),也称为步长,是深度学习中控制参数更新步长的一个超参数。在每一次迭代中,学习率决定了基于损失函数梯度的参数更新幅度。它决定了模型在优化过程中向损失函数最优解移动的步长大小。

二、学习率的作用

  1. 控制参数更新的步长:学习率直接决定了在每次迭代中,参数根据梯度调整的幅度。过大的学习率可能导致参数更新幅度过大,从而在最优解附近震荡甚至发散;而过小的学习率则可能导致收敛速度过慢。
  2. 平衡速度与稳定性:合理的学习率需要在保证模型稳定收敛的同时,尽可能提高训练速度。过高的学习率可能导致模型训练不稳定,而过低的学习率则可能使训练过程过于缓慢。

由上可知,学习率是深度学习中的一个关键参数,它直接影响到模型的训练效果和收敛速度。选择合适的学习率对于训练一个高性能的深度学习模型至关重要。过高的学习率可能导致模型发散或震荡,而过低的学习率则可能使训练过程过于缓慢甚至无法收敛到最优解

所以,我们要对学习率进行调整。

三、实现调整学习率

调整学习率有两种方法:1.使用库函数进行调整;2.手动调整学习率

1. 使用库函数进行调整

Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。并提供3种调整方法:有序调整、自适应调整以及自定义调整。

  • (1)有序调整:等间隔调整(Step),多间隔调整(MultiStep),指数衰减(Exponential),余弦退火(CosineAnnealing);

如下图所示:x轴为迭代次数,y轴表示学习率

在这里插入图片描述

  1. 等间隔调整(Step)

等间隔调整学习率是一种简单直接的方法,它按照预定的间隔(通常是epoch数)来调整学习率。每次调整时,学习率会乘以一个预设的衰减因子(gamma)。这种方法适合于训练过程较为稳定,且需要逐步减小学习率以避免过拟合的场景。

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1)
参数:
optimizer: 神经网络训练中使用的优化器,如optimizer=torch.optim.Adam()
step_size(int): 学习率下降间隔数,单位是epoch,而不是iteration.
gamma(float):学习率调整倍数,默认为0.1
每训练step_size个epoch,学习率调整为lr=lr*gamma.

代码体现:

注意:在每个epochs迭代训练时,使用**scheduler.step()**语句进行学习率更新。

optimizer = torch.optim.Adam(model.parameters(),lr=0.001,weight_decay=0.0001)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer,step_size=5,gamma=0.5)

epochs = 80
train_dataloader = DataLoader(training_data,batch_size=64,shuffle=True)
test_dataloader = DataLoader(test_data,batch_size=64,shuffle=True)
for t in range(epochs):
    print(f"Epoch {t+1} \n-------------------------")
    train(train_dataloader,model,loss_fn,optimizer)
    test(test_dataloader,model,loss_fn)
    scheduler.step()
  1. 多间隔调整(MultiStep):

与Step方法类似,但可以在多个预设的epoch点进行学习率衰减,每个点可以有不同的衰减比例。这种方法提供了更多的灵活性来适应复杂的训练过程。

torch.optim.lr_shceduler.MultiStepLR(optimizer, milestones, gamma=0.1)
参数:
milestone(list): 一个列表参数,表示多个学习率需要调整的epoch值,如milestones=[10, 30, 80].
  1. 指数衰减(Exponential):

学习率按照指数形式进行衰减,衰减速度由衰减率(gamma)控制。这种方法适用于模型训练初期需要较大学习率以快速收敛,后期需要较小学习率以微调模型参数的情况。

torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma)
参数:
gamma(float):学习率调整倍数的底数,指数为epoch,初始值我lr, 倍数为γ的epoch次方
  1. 余弦退火(CosineAnnealing):

学习率按照余弦函数进行周期性调整,先下降后上升,形成多个学习率的波峰和波谷。这种方法有助于模型跳出局部最优解,探索更广阔的参数空间。

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0)
参数:
Tmax(int):学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,当epoch>T_max时,学习率将增大;
etamin: 学习率调整的最小值,即epoch=Tmax时,lrmin=etamin, 默认为0.
  • (2)自适应调整:依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau);
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)
-- optimizer (Optimizer): 要调整学习率的优化器(如 SGD, Adam 等)。
-- mode (str, 可选): 指定触发学习率减少的条件。'min' 模式意味着当指标停止下降时减少学习率(即,当指标达到局部最小值				时)。'max' 模式则意味着当指标停止上升时减少学习率。默认值为 'min'-- factor (float, 可选): 学习率减少的因子。新的学习率将是旧学习率乘以这个因子。默认值为 0.1-- patience (int, 可选): 容忍多少个 epoch 指标没有改善后减少学习率。例如,如果 patience=10,则指标在 10 个 epoch 内没有		改善后,学习率将被减少。默认值为 10-- verbose (bool, 可选): 如果为 True,则在每次更新学习率时打印一条消息。默认值为 False-- threshold (float, 可选): 阈值,用于判断指标是否“真正”没有改善。只有当指标的变化小于这个阈值时,才认为指标没有改善。这有助			于避免由于指标的小幅波动而频繁调整学习率。默认值为 1e-4-- threshold_mode (str, 可选): 阈值的比较模式。'rel' 表示相对模式,即阈值是相对于当前最佳指标的百分比;'abs' 表示绝对模			式,即阈值是绝对数值。默认值为 'rel'-- cooldown (int, 可选): 在学习率被减少之后,等待多少个 epoch 再重新考虑是否减少学习率。这有助于在减少学习率后给模型一些时间		来适应新的学习率。默认值为 0,表示不等待。
-- min_lr (floatlist, 可选): 学习率的最小值。如果为单个浮点数,则所有参数组的学习率都不会低于这个值。如果为列表,则每个参		数组的学习率都不会低于列表中对应位置的值。默认值为 0-- eps (float, 可选): 用于提高数值稳定性的小常数。当两个指标值非常接近时,它有助于避免除以零的错误。默认值为 1e-8
  • (3)自定义调整:通过自定义关于epoch的lambda函数调整学习率(LambdaLR)。
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
参数:
lr_lambda(function or list): 自定义计算学习率调整倍数的函数,通常时epoch的函数,当有多个参数组时,设为list.

2. 手动调整学习率

手动调整学习率通常涉及在训练循环中定期检查模型的性能(如验证集上的损失或准确率),并根据这些性能指标来更新学习率。

比如:

# 训练循环  
for epoch in range(num_epochs):  
    # 训练模型(省略具体代码)  
    train(model, optimizer, train_loader)  
      
    # 评估模型在验证集上的性能(省略具体代码)  
    val_loss = validate(model, val_loader)  
      
    # 根据验证集损失手动调整学习率  
    # 这里只是一个简单的示例,实际中你可能需要更复杂的逻辑  
    if epoch % 10 == 0:  # 每10个epoch检查一次  
        if val_loss < best_val_loss:  # 假设best_val_loss在循环外初始化  
            best_val_loss = val_loss  
        else:  
            # 如果验证损失没有改善,则减少学习率  
            for param_group in optimizer.param_groups:  
                param_group['lr'] *= 0.1  # 将学习率乘以0.1 

通过验证集损失,来调整学习率。

总结

本篇介绍了:

  1. 通过调整学习率能够优化训练速度、提高训练稳定性、适应不同的训练阶段以及改善模型性能。
  2. 调整学习率有两种方法:1.使用库函数进行调整;2.手动调整学习率
  3. Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。并提供3种库函数调整方法:有序调整、自适应调整以及自定义调整。
  4. 在库函数调整方法中,注意在每个epochs迭代训练时,使用**scheduler.step()**语句进行学习率更新。

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

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

相关文章

二维四边形网格生成算法:paving(六)行调整 Row Adjustment 与 收尾 Cleanup

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 参考论文&#xff1a;Paving: A new approach to automated quadrilateral mesh generation 关注公众号回复paving可以获得文章链接 paving&#xff08;一&#xff0…

一文讲明白初学者怎么入门大语言模型(LLM)?零基础入门到精通,收藏这篇就够了

关于如何入门LLM&#xff0c;大多数回答都提到了调用API、训练微调和应用。但是大模型更新迭代太快&#xff0c;这个月发布的大模型打榜成功&#xff0c;仅仅过了一个月就被其他模型超越。训练微调也已经不是难事&#xff0c;有大量开源的微调框架&#xff08;llamafactory、fi…

如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内???

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

基于Springboot+Vue的高校党建基本数据管理系统(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

芝法酱学习笔记(0.4)——SpringBoot多模块项目打包,resource分离,lib分离,启动脚本

前言 上期讲了如何在windows平台搭建Java后端的开发环境&#xff0c;并给出了一个简单的hello world级别的多模块代码示例。但上期仅仅是在IDEA中运行&#xff0c;和正式的生产环境完全不同。 本期将讲解&#xff0c;如何配置SpringBoot多模块项目的maven打包&#xff0c;并分…

Ubuntu22.04安装VMware Tools

目录 1. 问题2. 在线安装2.1. 更新软件源列表2.2. 更新软件2.3. 下载安装 open-vm-tools-desktop 3. 网络配置3.1 配置网络连接模式3.2 配置静态IP3.3 配置应用3.4 检查IP 1. 问题 安装好 Ubuntu 系统后&#xff0c;想要适配桌面大小等其它功能就需要安装 VMware Tools 这个工…

Linux 文件 IO 管理(第三讲:文件系统)

Linux 文件 IO 管理&#xff08;第三讲&#xff1a;文件系统&#xff09; 进程为什么默认要打开文件描述符为 0&#xff0c;1 和 2 的文件呢&#xff1f;文件系统物理磁盘简单认识存储结构对磁盘存储进行逻辑抽象分组 —— 文件系统Block Bitmapinode Tableinode BitmapGDT(Gro…

Android 利用OSMdroid开发GIS

1、地址 Github地址&#xff1a;https://gitee.com/mirrors/osmdroid Git地址&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 Git下载包地址&#xff1a;Releases osmdroid/osmdroid GitHub 新建项目 osmdroid在线&#xff1a; &#xff08;1&#xff09…

将Mixamo的模型和动画导入UE5

首先进入Mixamo的官网 , 点击 Character 选择一个模型 (当然你也可以自己上传模型/绑定动画) 然后点击下载 , 这个作为带骨骼的模型 选择FBX格式 , T Pose 直接下载 点击 Animations 选择动画 , 搜索 idle 默认站立动画 点击下载 , 格式选择 FBX , 不带模型只要骨骼 , 帧数选6…

低功耗TF卡:录音笔、领夹麦、电池门铃优选

概述 TF卡&#xff0c;也称为Micro SD卡或TransFlash卡&#xff0c;是一种流行的小型存储卡&#xff0c;广泛应用于手机、平板电脑、相机和其他便携式设备。TF卡的尺寸非常小&#xff0c;便于携带和使用&#xff0c;不会占用太多设备空间。而且TF卡提供多种容量选择&#xff0…

Go基础编程 - 15 - 延迟调用(defer)

延迟调用 defer 1. 特性2. 常用用途3. defer 执行顺序&#xff1a;同函数内先进后出4. defer 闭包5. defer 陷阱 上一篇&#xff1a;泛型 1. 特性 1. 关键字 defer 用于注册延迟调用。 2. defer 调用直到 return 前才被执行。 3. 同函数内多个 defer 语句&#xff0c;按先进后…

第17章 协同式任务切换

第17章 协同式任务切换 在多任务系统中&#xff0c;每个任务都有各自的局部描述符表(LDT)和任务状态段(TSS)。 从任务切换的时机来讲&#xff0c;有两种基本的策略&#xff1a; 协同式&#xff1a;从一个任务切换到另一个任务。需要当前任务主动地请求暂时放弃执行权&#x…

好看的首页展示

代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* RESET…

气膜游泳馆:舒适恒温,寒冷季节中的理想游泳场所—轻空间

随着天气逐渐转凉&#xff0c;许多人在秋冬季节减少了户外活动&#xff0c;尤其是游泳。然而&#xff0c;气膜游泳馆为您提供了一种全新的选择&#xff0c;让您即使在寒冷的季节&#xff0c;也能享受畅游的乐趣。凭借其独特的恒温设计和舒适的环境&#xff0c;气膜游泳馆成为了…

计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

目录 1.课题背景 2.课题意义 ‌ 3.技术介绍 4.技术性需求 4.1后端服务‌&#xff1a; 4.2 前端展示‌ 5.数据库设计‌&#xff1a; 6.系统性能‌&#xff1a; 7.安全性‌&#xff1a; 8. 功能介绍&#xff1a; 9. 部分代码 1.课题背景 近年来&#xff0c;随着宠物饲养数量…

TDEngine在煤矿综采管控平台中的应用

一、行业背景 智能综采管控平台&#xff0c;是将煤矿综采工作面传感器数据采集&#xff0c;通过可视化界面展示。实现综采工作面的透明化展示&#xff0c;并基于历史的传感器数据进行机器学习的训练&#xff0c;了解工作面周期来压&#xff0c;设备故障检测等数据应用。因此针…

AIGC引领数智未来:企业架构演进的深度解析与实践路径,The Open Group 2024生态系统架构·可持续发展年度大会专题报道

随着人工智能技术的迅猛发展&#xff0c;特别是以ChatGPT、Sora等为代表的AIGC&#xff08;人工智能生成内容&#xff09;技术的爆发&#xff0c;我们正处于通用人工智能&#xff08;AGI&#xff09;时代的前夜。AIGC技术在多个领域展现出近乎甚至超越人类的能力&#xff0c;已…

【LeetCode】动态规划—最小路径和(附完整Python/C++代码)

动态规划—64. 最小路径和 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:3.1. 初始化:3.2. 边界条件:3.3. 填充 dp 数组:3.4. 返回结果: 4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 给定一个包含…

liunx系统虚拟机

https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 下载地址 DVD版本 安装vm软件12通过vm软件来创建一个虚拟机空间通过vm软件在创建好的虚拟机空间上&#xff0c;安装我们的centos操作系统使用centos你得需要将鼠标点击进入界面中&#xff0c;但是鼠标会消失&#xf…

杨辉三角-C语言

1.问题&#xff1a; 输出杨辉三角。 2.解答&#xff1a; 对有特点的数&#xff08;每行开头和结束的数都是1&#xff09;进行赋值&#xff0c;给中间的数进行赋值&#xff0c;把上面赋值后的二维数组&#xff0c;遍历输出。 3.代码&#xff1a; #include<stdio.h>//头…