PyTorch使用Tricks:学习率衰减 !!

文章目录

前言

1、指数衰减

2、固定步长衰减

3、多步长衰减

4、余弦退火衰减

5、自适应学习率衰减

6、自定义函数实现学习率调整:不同层不同的学习率


前言

在训练神经网络时,如果学习率过大,优化算法可能会在最优解附近震荡而无法收敛;如果学习率过小,优化算法的收敛速度可能会非常慢。因此,一种常见的策略是在训练初期使用较大的学习率来快速接近最优解,然后逐渐减小学习率,使得优化算法可以更精细地调整模型参数,从而找到更好的最优解。

通常学习率衰减有以下的措施:

  • 指数衰减:学习率按照指数的形式衰减,每次乘以一个固定的衰减系数,可以使用 torch.optim.lr_scheduler.ExponentialLR 类来实现,需要指定优化器和衰减系数。
  • 固定步长衰减:学习率每隔一定步数(或者epoch)就减少为原来的一定比例,可以使用 torch.optim.lr_scheduler.StepLR 类来实现,需要指定优化器、步长和衰减比例。
  • 多步长衰减:学习率在指定的区间内保持不变,在区间的右侧值进行一次衰减,可以使用 torch.optim.lr_scheduler.MultiStepLR 类来实现,需要指定优化器、区间列表和衰减比例。
  • 余弦退火衰减:学习率按照余弦函数的周期和最值进行变化,可以使用 torch.optim.lr_scheduler.CosineAnnealingLR 类来实现,需要指定优化器、周期和最小值。
  • 自适应学习率衰减:这种策略会根据模型的训练进度自动调整学习率,可以使用 torch.optim.lr_scheduler.ReduceLROnPlateau 类来实现。例如,如果模型的验证误差停止下降,那么就减小学习率;如果模型的训练误差上升,那么就增大学习率。
  • 自适应函数实现学习率调整:不同层不同的学习率。

1、指数衰减

指数衰减是一种常用的学习率调整策略,其主要思想是在每个训练周期(epoch)结束时,将当前学习率乘以一个固定的衰减系数(gamma),从而实现学习率的指数衰减。这种策略可以帮助模型在训练初期快速收敛,同时在训练后期通过降低学习率来提高模型的泛化能力。

在PyTorch中,可以使用 torch.optim.lr_scheduler.ExponentialLR 类来实现指数衰减。该类的构造函数需要两个参数:一个优化器对象和一个衰减系数。在每个训练周期结束时,需要调用ExponentialLR 对象的 step() 方法来更新学习率。

以下是一个使用 ExponentialLR代码示例:

import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import ExponentialLR

# 假设有一个模型参数
model_param = torch.nn.Parameter(torch.randn(2, 2, requires_grad=True))

# 使用SGD优化器,初始学习率设置为0.1
optimizer = SGD([model_param], lr=0.1)

# 创建ExponentialLR对象,衰减系数设置为0.9
scheduler = ExponentialLR(optimizer, gamma=0.9)

# 在每个训练周期结束时,调用step()方法来更新学习率
for epoch in range(100):
    # 这里省略了模型的训练代码
    # ...
    
    # 更新学习率
    scheduler.step()

在这个例子中,初始的学习率是0.1,每个训练周期结束时,学习率会乘以0.9,因此学习率会按照指数的形式衰减。

2、固定步长衰减

固定步长衰减是一种学习率调整策略,它的原理是每隔一定的迭代次数(或者epoch),就将学习率乘以一个固定的比例,从而使学习率逐渐减小。这样做的目的是在训练初期使用较大的学习率,加快收敛速度,而在训练后期使用较小的学习率,提高模型精度。

PyTorch提供了 torch.optim.lr_scheduler.StepLR 类来实现固定步长衰减,它的参数有:

  • optimizer:要进行学习率衰减的优化器,例如 torch.optim.SGD torch.optim.Adam等。
  • step_size:每隔多少隔迭代次数(或者epoch)进行一次学习率衰减,必须是正整数。
  • gamma:学习率衰减的乘法因子,必须是0到1之间的数,表示每次衰减为原来的 gamma倍。
  • last_epoch:最后一个epoch的索引,用于恢复训练的状态,默认为-1,表示从头开始训练。
  • verbose:是否打印学习率更新的信息,默认为False。

下面是一个使用  torch.optim.lr_scheduler.StepLR 类的具体例子,假设有一个简单的线性模型,使用 torch.optim.SGD 作为优化器,初始学习率为0.1,每隔5个epoch就将学习率乘以0.8,训练100个epoch:

import torch
import matplotlib.pyplot as plt

# 定义一个简单的线性模型
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = torch.nn.Linear(1, 1)

    def forward(self, x):
        return self.fc(x)

# 创建模型和优化器
model = Net()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 创建固定步长衰减的学习率调度器
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.8)

# 记录学习率变化
lr_list = []

# 模拟训练过程
for epoch in range(100):
    # 更新学习率
    scheduler.step()
    # 记录当前学习率
    lr_list.append(optimizer.param_groups[0]['lr'])

# 绘制学习率曲线
plt.plot(range(100), lr_list, color='r')
plt.xlabel('Epoch')
plt.ylabel('Learning Rate')
plt.show()

学习率在每个5个epoch后都会下降为原来的0.8倍,直到最后接近0。

固定步长衰减指数衰减都是学习率衰减的策略,但它们在衰减的方式和速度上有所不同:

  • 固定步长衰减:在每隔固定的步数(或epoch)后,学习率会减少为原来的一定比例。这种策略的衰减速度是均匀的,不会随着训练的进行而改变。
  • 指数衰减:在每个训练周期(或epoch)结束时,学习率会乘以一个固定的衰减系数,从而实现学习率的指数衰减。这种策略的衰减速度是逐渐加快的,因为每次衰减都是基于当前的学习率进行的。

3、多步长衰减

多步长衰减是一种学习率调整策略,它在指定的训练周期(或epoch)达到预设的里程碑时,将学习率减少为原来的一定比例。这种策略可以在模型训练的关键阶段动态调整学习率。

在PyTorch中,可以使用 torch.optim.lr_scheduler.MultiStepLR 类来实现多步长衰减。以下是一个使用 MultiStepLR 的代码示例:

import torch
import torch.optim as optim
from torch.optim.lr_scheduler import MultiStepLR

# 假设有一个简单的模型
model = torch.nn.Linear(10, 2)
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建 MultiStepLR 对象,设定在第 30 和 80 个 epoch 时学习率衰减为原来的 0.1 倍
scheduler = MultiStepLR(optimizer, milestones=[30, 80], gamma=0.1)

# 在每个训练周期结束时,调用 step() 方法来更新学习率
for epoch in range(100):
    # 这里省略了模型的训练代码
    # ...
    
    # 更新学习率
    scheduler.step()

在这个例子中,初始的学习率是0.1,当训练到第30个epoch时,学习率会变为0.01(即0.1*0.1),当训练到第80个epoch时,学习率会再次衰减为0.001(即0.01*0.1)。

4、余弦退火衰减

余弦退火衰减是一种学习率调整策略,它按照余弦函数的周期和最值来调整学习率。在PyTorch中,可以使用 torch.optim.lr_scheduler.CosineAnnealingLR 类来实现余弦退火衰减。

以下是一个使用 CosineAnnealingLR 的代码示例:

import torch
import torch.nn as nn
from torch.optim.lr_scheduler import CosineAnnealingLR
import matplotlib.pyplot as plt

# 假设有一个简单的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(10, 2)

model = SimpleModel()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 创建 CosineAnnealingLR 对象,周期设置为 10,最小学习率设置为 0.01
scheduler = CosineAnnealingLR(optimizer, T_max=10, eta_min=0.01)

lr_list = []
# 在每个训练周期结束时,调用 step() 方法来更新学习率
for epoch in range(100):
    # 这里省略了模型的训练代码
    # ...
    
    # 更新学习率
    scheduler.step()
    lr_list.append(optimizer.param_groups[0]['lr'])

# 绘制学习率变化曲线
plt.plot(range(100), lr_list)
plt.xlabel('Epoch')
plt.ylabel('Learning Rate')
plt.title("Learning rate schedule: CosineAnnealingLR")
plt.show()

在这个例子中,初始的学习率是0.1,学习率会按照余弦函数的形式在0.01到0.1之间变化,周期为10个epoch。

5、自适应学习率衰减

自适应学习率衰减是一种学习率调整策略,它会根据模型的训练进度自动调整学习率。例如,如果模型的验证误差停止下降,那么就减小学习率;如果模型的训练误差上升,那么就增大学习率。在PyTorch中,可以使用 torch.optim.lr_scheduler.ReduceLROnPlateau 类来实现自适应学习率衰减。

以下是一个使用 ReduceLROnPlateau 的代码示例:

import torch
import torch.nn as nn
from torch.optim.lr_scheduler import ReduceLROnPlateau

# 假设有一个简单的模型
model = nn.Linear(10, 2)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 创建 ReduceLROnPlateau 对象,当验证误差在 10 个 epoch 内没有下降时,将学习率减小为原来的 0.1 倍
scheduler = ReduceLROnPlateau(optimizer, 'min', patience=10, factor=0.1)

# 模拟训练过程
for epoch in range(100):
    # 这里省略了模型的训练代码
    # ...

    # 假设有一个验证误差
    val_loss = ...

    # 在每个训练周期结束时,调用 step() 方法来更新学习率
    scheduler.step(val_loss)

6、自定义函数实现学习率调整:不同层不同的学习率

可以通过为优化器提供一个参数组列表来实现对不同层使用不同的学习率。每个参数组是一个字典,其中包含一组参数和这组参数的学习率。

以下是一个具体的例子,假设有一个包含两个线性层的模型,想要对第一层使用学习率0.01,对第二层使用学习率0.001:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个包含两个线性层的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.layer1 = nn.Linear(10, 2)
        self.layer2 = nn.Linear(2, 10)

model = SimpleModel()

# 创建一个参数组列表,每个参数组包含一组参数和这组参数的学习率
params = [{'params': model.layer1.parameters(), 'lr': 0.01},
          {'params': model.layer2.parameters(), 'lr': 0.001}]

# 创建优化器
optimizer = optim.SGD(params)

# 现在,当调用 optimizer.step() 时,第一层的参数会使用学习率 0.01 进行更新,第二层的参数会使用学习率 0.001 进行更新

在这个例子中,首先定义了一个包含两个线性层的模型。然后,创建一个参数组列表,每个参数组都包含一组参数和这组参数的学习率。最后创建了一个优化器SGD,将这个参数组列表传递给优化器。这样,当调用 optimizer.step() 时,第一层的参数会使用学习率0.01进行更新,第二层的参数会使用学习率0.001进行更新。

参考:深度图学习与大模型LLM

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PowerPoint安装IguanaTex插件

1 前提 电脑已经配置好Latex环境 2 安装过程 2.1 下载IguanaTex_v1_56插件 官网下载地址 下载的文件格式为:IguanaTex v1.56 (.ppam) .ppam 2.2 移动插件 将IguanaTex v1.56 .ppam移动到C:\Users\ 你的用户名\AppData\Roaming\Microsoft\AddIns目录下。 2.3 …

【初始消息队列】消息队列的各种类型

消息队列相关概念 什么是消息队列 MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、机器人等

专属领域论文订阅 VX关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为…

SQL-Labs靶场“11-15”关通关教程

君衍. 一、十一关 基于POST单引号字符型注入1、源码分析2、联合查询注入3、报错注入 二、十二关 基于POST双引号字符型注入1、源码分析2、联合查询注入3、报错注入 三、十三关 基于POST单引号报错注入变形1、源码分析2、报错注入 四、十四关 基于POST双引号报错注入1、源码分析…

PWM驱动直流电机

一、知识补充; 低频时有蜂鸣器响声,加大PWM频率,超出人耳范围就可以听不到,20Hz~20kHz 加大频率-->减小预分频器,从720-->36现在频率就是20kHz这样不会影响占空比? 二、接线图 三、代码分析 main,c #include…

批量采集网站产品图并生成对应EXCEL

运营的小哥需要批量采集某网站的产品大图产品标题,粗略看了看是shopfy的网站,数据大概1000多点,需求嘛就是需要生成带图的cxcel文档,想想去折腾个程序太浪费时间了,何况不会python就另辟蹊径了。 用到了后羿采集器&am…

rust函数 stuct struct方法 关联函数

本文结合2个代码实例主要介绍了rust函数定义方法,struct结构体定义、struct方法及关联函数等相关基础知识。 代码1: main.rc #[derive(Debug)]//定义一个结构体 struct Ellipse {max_semi_axis: u32,min_semi_axis: u32, }fn main() {//椭圆&#xff0…

大数据01-导论

零、文章目录 大数据01-导论 1、数据与数据分析 **数据:是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。**数据可以是连续的值,比如声音、图像,称为模拟数据;也可…

电阻器的脉冲浪涌能力?

由于现有需求,许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护,尤其是在电机控制器等电路中。当电机启动时,此时消耗的电流过大,可能导致电阻器故障。同样,如果电容器用于电机…

2023-CVPR-Adjustment and Alignment for Unbiased Open Set Domain Adaptation

Adjustment and Alignment (ANNA) Front-Door Adjustment:类似二分类交叉熵,令概率接近1,以降低损失 Decoupled Causal Alignment:类似多分类交叉熵,令概率接近标签M

差异分析和PPI网路图绘制教程

写在前面 在原文中,作者获得285个DEG,在此推文中共获得601个DEG。小杜的猜想是标准化的水段不同的原因吧,或是其他的原因。此外,惊奇的发现发表医学类的文章在附件中都不提供相关的信息文件,如DEG数据、GO、KEGG富集信…

【教3妹学编程-算法题】N 叉树的前序遍历

2哥 : 叮铃铃,3妹,准备复工了啊,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。 3妹:切,不想上班,假期能不能重来一遍啊,虽然在家我妈张罗着要给我相亲呢。可是在家还是很好的…

Linux CentOS stream 9 安装docker

在计算机技术中,虑拟化是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。 目前,大多数服务器的容量的利用率不足15%,这导致服务器数量激增以及增加了复杂性。服务…

SG5032EEN晶体振荡器SPXO

5G将使通信流量呈指数级增长,5G通信网络需要高速和宽带,同时将噪声水平保持在最低水平,这可以通过通信设备的高频低抖动参考时钟来实现,使用上述晶体振荡器SPXO,客户可以输入一个具有极低相位抖动和功率的高频参考时钟…

《Go 简易速速上手小册》第3章:数据结构(2024 最新版)

文章目录 3.1 数组与切片:Go 语言的动态队伍3.1.1 基础知识讲解3.1.2 重点案例:动态成绩单功能描述实现代码扩展功能 3.1.3 拓展案例 1:数据分析功能描述实现代码扩展功能 3.1.4 拓展案例 2:日志过滤器功能描述实现代码扩展功能 3…

鸿蒙开发者预览版如何?

在24年的华为鸿蒙发布会中表示。预览版已经向开发者开放申请,首批支持的机型有三款分别为华为 Mate 60、华为Mate 60 Pro、华为Mate X5。 其HarmonyOS NEXT去除Linux内核以及AOSP代码,采用的鸿蒙内核以及代码,HarmonyOS NEXT系统仅支持鸿蒙内…

MySQL数据库基础(四):图形化开发工具DataGrip

文章目录 图形化开发工具DataGrip 一、DataGrip介绍 二、DataGrip安装 三、创建工程 四、连接数据库 五、选择要使用的数据库 六、DataGrip软件设置 1、设置字体大小 2、设置关键字大写 3、自动排版 图形化开发工具DataGrip 一、DataGrip介绍 DataGrip是JetBrains公…

用于图像处理的Python顶级库 !!

文章目录 前言 1、OpenCV 2、Scikit-Image 3、Scipy 4、Python Image Library(Pillow / PIL) 5、Matplotlib 6、SimpleITK 7、Numpy 8、Mahotas 前言 正如IDC所指出的,数字信息将飙升至175ZB,而这些信息中的巨大一部分是图片。数…

综合交易模型教程---qmt实盘链接,提供源代码

综合交易模型教程---qmt实盘链接,提供源代码 Original L1511732 数据分析与运用 2024-02-17 00:13 贵州 目前框架实盘全部完成了,后面写教程,每一个函数怎么样使用,怎么样开发自己的策略 模拟盘现在登录不了我直接实盘展示 后面…

FLUENT Meshing Watertight Geometry工作流入门 - 8 添加边界层网格

本视频中学到的内容: 如何使用 “添加边界层”任务生成边界层网格边界层网格在流体动力学中的重要性可用于添加边界层网格的方法以及所需的用户输入 视频链接: FLUENT Meshing入门教程-8添加边界层网格_哔哩哔哩_bilibili 流体动力学中边界层的概念及…