首页 > 其他分享 >《深度学习》—— 神经网络中的调整学习率

《深度学习》—— 神经网络中的调整学习率

时间:2024-09-25 20:20:34浏览次数:8  
标签:epoch 学习 神经网络 lr scheduler 深度 StepLR 调整

文章目录

一、什么是调整学习率?

  • 调整学习率(Adjusting Learning Rate)是在机器学习,特别是在深度学习中,对优化算法中的一个关键超参数进行动态调整的过程。学习率决定了在每一次参数更新时,参数变化的幅度大小。它是控制模型学习速度的一个重要因素。

  • 在训练神经网络时,学习率的选择至关重要。过高的学习率可能会导致模型在训练过程中产生震荡,甚至发散,无法收敛到最优解;而过低的学习率则会导致训练过程非常缓慢,需要更多的迭代次数才能达到较好的效果。

  • 因此,调整学习率的目标是在训练过程中找到一个合适的学习率,使得模型能够稳定且快速地收敛到最优解。这通常需要根据模型的训练情况、数据集的特性以及所使用的优化算法来动态调整学习率。

二、使用PyTorch中的库函数进行调整学习率

  • Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。并提供3种调整方法:

    • 有序调整:等间隔调整(Step),多间隔调整(MultiStep),指数衰减(Exponential),余弦退火(CosineAnnealing);
    • 自适应调整:依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau);
    • 自定义调整:通过自定义关于epoch的lambda函数调整学习率(LambdaLR)
  • torch.optim.lr_sheduler 中有如下多种调整学习率的方法:

    import torch
    scheduler = torch.optim.lr_scheduler
    # 鼠标放在 lr_scheduler 上,按 CTRL 键可进入查看
    __all__ = ['LambdaLR', 'MultiplicativeLR', 'StepLR', 'MultiStepLR', 'ConstantLR', 'LinearLR',
               'ExponentialLR', 'SequentialLR', 'CosineAnnealingLR', 'ChainedScheduler', 'ReduceLROnPlateau',
               'CyclicLR', 'CosineAnnealingWarmRestarts', 'OneCycleLR', 'PolynomialLR']
    

三种常用的方法

1. StepLR

StepLR是一种等间隔调整学习率的方法。它按照预设的间隔(以epoch为单位)调整学习率,每次调整时将学习率乘以一个衰减因子(gamma)。

主要参数

  • step_size(int):学习率下降间隔数,即每经过多少个epoch后调整一次学习率。
  • gamma(float):学习率调整倍数,默认为0.1,即每次调整学习率时,新的学习率为lr = lr * gamma
  • last_epoch(int):上一个epoch数,用于指示学习率是否需要调整。当为-1时,学习率设置为初始值。

示例代码

import torch
import torch.optim as optim
from torch.optim.lr_scheduler import StepLR

optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)

for epoch in range(num_epochs):
    train(...)  # 训练模型
    test(...)   # 测试模型
    scheduler.step()  # 更新学习率

2. MultiStepLR

MultiStepLR允许用户按照给定的间隔列表(milestones)调整学习率。与StepLR不同,这里的间隔不是固定的,而是由用户自定义的一系列epoch值。

主要参数

  • milestones(list):一个列表,包含需要调整学习率的epoch数。
  • gamma(float):学习率调整倍数,与StepLR相同。
  • last_epoch(int):同上。

示例代码

scheduler = MultiStepLR(optimizer, milestones=[30, 80, 120], gamma=0.1)

3. CosineAnnealingLR

CosineAnnealingLR采用余弦退火策略来调整学习率。学习率按照余弦函数周期性变化,在每个周期结束时重置为初始学习率,并在下一个周期中继续变化。

主要参数

  • T_max(int):学习率下降到最小值时的epoch数,即余弦函数周期的一半。
  • eta_min(float):学习率的最小值,默认为0。
  • last_epoch(int):同上。

示例代码

scheduler = CosineAnnealingLR(optimizer, T_max=100, eta_min=0)

以上三种方法各有特点,适用于不同的训练场景。StepLRMultiStepLR适用于需要固定或自定义间隔调整学习率的场景,而CosineAnnealingLR则提供了一种更为平滑的学习率调整方式,有助于模型在训练过程中更好地探索参数空间。在实际应用中,可以根据具体任务和模型情况选择合适的方法。

标签:epoch,学习,神经网络,lr,scheduler,深度,StepLR,调整
From: https://blog.csdn.net/weixin_73504499/article/details/142526863

相关文章

  • 《深度学习》—— 神经网络中常用的激活函数
    文章目录1.Sigmoid激活函数2.Softmax激活函数3.ReLU激活函数4.LeakyReLU激活函数5.ELU激活函数6.Tanh激活函数激活函数(ActivationFunction)是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。它在神经网络中扮演着至关重要的角色,主......
  • 关于HarmonyOS的学习
    day35一、回调地狱  //比如我们发送三个ajax请求  //-第一个正常发送  //-第二个请求需要第一个请求的结果中的某一个值作为参数  //-第三个请求需要第二个请求的结果中的某一个值作为参数  ajax_get({    url:'http://localhost......
  • 关于HarmonyOS的学习
    day36一、可选链和空集合并符1.?  //?作用:1、三目运算符2、可选链  constobj={    id:1,    //info:{    //  name:'张',    //  age:18    //} }  console.log(obj.id)  cons......
  • Java中集合泛型的学习
    集合遍历目录集合遍历泛型的基本概念泛型的好处泛型的使用1.泛型类2.泛型接口3.泛型方法Java集合框架中的泛型泛型通配符Java集合泛型是JavaSE1.5(Java5)中引入的一个重要特性,它允许在定义类、接口和方法时指定一个或多个类型参数。这些类型参数在实例化或调用时会被具体的......
  • prometheus学习笔记之集群内服务发现环境准备
    一、环境介绍主要演示prometheus在k8s集群中如何通过服务自动去发现k8s集群自有服务及其他服务发现场景,后续会演示集群外部署prometheus自动发现k8s服务并获取数据创建监控使用的namespaceskubectlcreatensmonitoring配置docker可以下载镜像[root@k8s-masterdeploy]#cat/etc/......
  • prometheus学习笔记之PromQL
    一、PromQL语句简介官方文档:https://prometheus.io/docs/prometheus/latest/querying/basics/Prometheus提供⼀个函数式的表达式语⾔PromQL(PrometheusQueryLanguage),可以使⽤户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可以在Prometheus表达式浏览器中以......
  • prometheus学习笔记之Grafana安装与配置
    一、Grafana简介grafana是⼀个可视化组件,⽤于接收客户端浏览器的请求并连接到prometheus查询数据,最后经过渲染并在浏览器进⾏体系化显示,需要注意的是,grafana查询数据类似于zabbix⼀样需要⾃定义模板,模板可以⼿动制作也可以导⼊已有模板。Grafana的基础架构主要包括以下几个核心组......
  • prometheus学习笔记之简介与安装
    一、prometheus简介1.简介Prometheus是基于go语⾔开发的⼀套开源的监控、报警和时间序列数据库的组合,是由SoundCloud公司开发的开源监控系统,Prometheus于2016年加⼊CNCF(CloudNativeComputingFoundation,云原⽣计算基⾦会),2018年8⽉9⽇prometheus成为CNCF继kubernetes之后......
  • 学习docker后的个人理解
    一、什么是dockerDocker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,它将软件组件包装成一个完整的标准化单元,其中包含所有要运行的内容......
  • 量化交易学习日记8-大单净额进阶(张江高科为例)
    说明大单净额是反应主力的动向,这没错,可是,成交额多少算大单?之前写的大单净额功能我自己测试了一下,拿庄股张江高科建仓的阶段举个例子:可以看到,不管是大单净额(门槛是25万)还是全资金流向,流出都是惊人的,可是,建仓阶段不应该是主力进入的过程吗,我对该股进行过长期跟踪,这是一......