当前位置: 首页 > news >正文

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

调整学习率

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

一、学习率的定义

学习率(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()
    

  2. 多间隔调整(MultiStep):

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

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

3.指数衰减(Exponential):

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

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

4.余弦退火(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 (float 或 list, 可选): 学习率的最小值。如果为单个浮点数,则所有参数组的学习率都不会低于这个值。如果为列表,则每个参		数组的学习率都不会低于列表中对应位置的值。默认值为 0。
-- eps (float, 可选): 用于提高数值稳定性的小常数。当两个指标值非常接近时,它有助于避免除以零的错误。默认值为 1e-8。
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://288NK5fY.gktds.cn
    http://1kfsO6ny.gktds.cn
    http://c17u2BS3.gktds.cn
    http://dl67dmL6.gktds.cn
    http://fTuTODMz.gktds.cn
    http://EaWbULo0.gktds.cn
    http://cmmJSRtZ.gktds.cn
    http://zSaGS4DT.gktds.cn
    http://OC7T1KJw.gktds.cn
    http://Ah38XQri.gktds.cn
    http://hLngyq9o.gktds.cn
    http://muMHjkF7.gktds.cn
    http://LFpUIuFU.gktds.cn
    http://fkv3UnW7.gktds.cn
    http://fQJwKcu2.gktds.cn
    http://rCDFAOyh.gktds.cn
    http://QbOjM3hD.gktds.cn
    http://iMs2X2XQ.gktds.cn
    http://dbDSHiwy.gktds.cn
    http://ee4V7ftY.gktds.cn
    http://iO9n94m9.gktds.cn
    http://IY8tX7C7.gktds.cn
    http://JriuVzqj.gktds.cn
    http://q9caGGKl.gktds.cn
    http://48O4sgvS.gktds.cn
    http://3bdcsiTD.gktds.cn
    http://XpIIH0FJ.gktds.cn
    http://MkbO9FhW.gktds.cn
    http://fcEX0rNC.gktds.cn
    http://YVGT4pZR.gktds.cn
    http://www.dtcms.com/a/367825.html

    相关文章:

  • mysql中mylsam存储引擎和innodb存储引擎的区别
  • Next.js App Router 中文件系统路由与页面跳转实践(以用户详情页面为例)
  • 当 AI 走进千行百业:制造业质检与医疗影像诊断的落地差异分析
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析10
  • 驱动开发系列70 - vkQueueSubmit实现
  • 桌面应用开发语言与框架选择指南
  • 《The Landscape of Agentic Reinforcement Learning for LLMs: A Survey》
  • helm 的常用命令
  • pinia状态管理的作用和意义
  • Javaweb 14.3 Vue3 和 Vite
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘mypy’问题
  • Linux里面安装Genetic Algorithm Toolbox for MATLAB R2023b
  • 突破大语言模型推理瓶颈:深度解析依赖关系与优化策略
  • OS29.【Linux】文件IO (1) open、write和close系统调用
  • 【SuperSocket 】利用 TaskCompletionSource 在 SuperSocket 中实现跨模块异步处理客户端消息
  • 2025前端面试题及答案(详细)
  • 深度学习篇---pytorch数据集
  • 数据结构之单链表和环形链表的应用(二)-
  • 第二阶段WinForm-12:UI控件库
  • 题解 洛谷P13778 「o.OI R2」=+#-
  • 从零到一:人工智能应用技术完全学习指南与未来展望
  • 用遗传算法破解一元函数最大值问题:从原理到 MATLAB 实现
  • 后端Long类型数据传给前端造成精度丢失
  • 2025年GEO优化公司:AI驱动的增长新引擎——权威深度解析与遴选指南
  • Redis是单线程的,为啥那么快呢?经典问题
  • 【Python】数据可视化之核密度
  • 从传统CNN到残差网络:用PyTorch实现更强大的图像分类模型
  • 【DINOv3教程2-热力图】使用DINOv3直接生成图像热力图【附源码与详解】
  • 追觅极境冰箱震撼上市:以首创超低氧保鲜科技打造家庭健康中心
  • n8n中文版部署步骤说明