首页 > 其他分享 >深度学习中常见的学习率调整策略

深度学习中常见的学习率调整策略

时间:2024-11-15 15:45:22浏览次数:3  
标签:optim 常见 调度 学习 epoch lr scheduler 深度

一、简介

        在深度学习中,学习率是一个关键的超参数,它决定了模型在每次迭代中更新参数的步长。选择合适的学习率对于模型的收敛速度和最终性能至关重要。为了提高模型的训练效果,常常需要动态调整学习率。

二、常见策略

        这里,我们介绍一些常用的学习率调度器。

1. StepLR

        StepLR调度器在每隔固定的epoch数后,将学习率按一定的比例缩小。适用于需要在训练过程中定期降低学习率的场景。

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

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建StepLR调度器,每隔30个epoch将学习率缩小为原来的0.1倍
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    scheduler.step()

2. MultiStepLR

        MultiStepLR调度器在指定的epoch数时,将学习率按一定的比例缩小。适用于需要在训练过程中在特定的epoch数降低学习率的场景。

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

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建MultiStepLR调度器,在第30和80个epoch时将学习率缩小为原来的0.1倍
scheduler = MultiStepLR(optimizer, milestones=[30, 80], gamma=0.1)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    scheduler.step()

3. ExponentialLR

        ExponentialLR调度器在每个epoch后,将学习率按指数规律缩小。适用于需要在训练过程中逐步减小学习率的场景。

import torch.optim as optim
from torch.optim.lr_scheduler import ExponentialLR

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建ExponentialLR调度器,每个epoch将学习率缩小为原来的0.95倍
scheduler = ExponentialLR(optimizer, gamma=0.95)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    scheduler.step()

4. CosineAnnealingLR

        CosineAnnealingLR调度器使用余弦退火策略,在一个周期内将学习率从初始值逐渐减小到最小值。适用于需要在训练过程中周期性调整学习率的场景。

import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建CosineAnnealingLR调度器,周期为T_max个epoch,学习率的最小值0.01(默认最小值为0)
# last_epoch是一个整数,表示上一个epoch的索引。默认值为 -1,表示从头开始。如果需要从某个特定epoch开始调整学习率,可以设置这个参数
scheduler = CosineAnnealingLR(optimizer, T_max=50, eta_min=0.01, last_epoch=-1)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    scheduler.step()

5. CosineAnnealingWarmRestarts

        CosineAnnealingWarmRestarts调度器结合了余弦退火和热启动策略,在每个周期内将学习率从初始值逐渐减小到最小值,然后重新开始。适用于需要在训练过程中多次调整学习率的场景。

import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建CosineAnnealingWarmRestarts调度器,初始周期为T_0个epoch
# T_0为初始的周期长度(以epoch为单位),在第一个周期内,学习率将从初始值逐渐减小到最小值。
# T_mult是一个整数,表示每次重启时周期长度的倍增因子。默认值为1,表示每次重启时周期长度保持不变。如果设置为2,则每次重启时周期长度将翻倍。
# eta_min表示学习率的最小值。默认值为0。
# last_epoch表示上一个epoch的索引,默认值为-1。
scheduler = CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    scheduler.step(epoch)

6. OneCycleLR

        OneCycleLR调度器在一个周期内先增加学习率到最大值,然后再逐渐减小到最小值。适用于需要在训练过程中快速找到最佳学习率的场景。

import torch.optim as optim
from torch.optim.lr_scheduler import OneCycleLR

num_epochs = 10

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 创建OneCycleLR调度器,设置最大学习率和总步数
# div_factor是一个浮点数,表示初始学习率与最大学习率的比值,默认值为25,即初始学习率为max_lr/25。
# final_div_factor是一个浮点数,表示最终学习率与初始学习率的比值,默认值为1e4,即最终学习率为initial_lr/1e4。
scheduler = OneCycleLR(optimizer, max_lr=0.1, steps_per_epoch=len(dataloader), epochs=num_epochs, div_factor=25, final_div_factor=1e4)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    for batch in dataloader:
        train(...)
        scheduler.step()

7. LambdaLR

        LambdaLR调度器允许用户自定义学习率的调整策略,通过传入一个函数来定义学习率的变化规律。适用于需要灵活调整学习率的场景。

import torch.optim as optim
from torch.optim.lr_scheduler import LambdaLR

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 定义自定义的学习率调整函数
lambda_lr = lambda epoch: 0.95 ** epoch

# 创建LambdaLR调度器
scheduler = LambdaLR(optimizer, lr_lambda=lambda_lr)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    scheduler.step()

8、Cyclical Learning Rate (CLR)

        学习率在一个周期内循环变化,可以帮助模型跳出局部最优解。常见的CLR方法包括三角形策略(Triangular Policy)和余弦退火策略(Cosine Annealing)。

from torch.optim.lr_scheduler import CyclicLR

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 创建学习率调度器
# 在前step_size_up次迭代中,学习率从base_lr 线性增加到max_lr
# 在接下来的step_size_up次迭代中,学习率从max_lr 线性减小回base_lr
scheduler = CyclicLR(optimizer, base_lr=0.001, max_lr=0.01, step_size_up=2000, mode='triangular')

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    for batch in dataloader:
        train(...)
        scheduler.step()

9、ReduceLROnPlateau

        当监控的指标在若干个epoch内没有改善时,降低学习率。常用于训练过程中验证集损失不再下降的情况。

import torch.optim as optim

# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 创建学习率调度器
# 当监控的指标在指定的patience个epoch内没有改善时,学习率将乘以factor
# mode是监控指标的模式,可以是'min'或'max':
# 'min':当监控的指标不再减小时(即指标值不再变小),降低学习率。
# 'max':当监控的指标不再增大时(即指标值不再变大),降低学习率。
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=True)

# 在训练循环中使用调度器
for epoch in range(num_epochs):
    train(...)
    val_loss = validate(...)
    scheduler.step(val_loss)

三、总结

        一般情况下,我们最开始建模使用的学习率是固定不变的,这也是最基础的情况。当我们发现在这种情况下模型的损失跌宕起伏,甚至不收敛时,则可以考虑使用学习率调度器帮助我们找到最佳的学习率。

 

标签:optim,常见,调度,学习,epoch,lr,scheduler,深度
From: https://blog.csdn.net/ChaneMo/article/details/143714084

相关文章

  • Java常见修饰符
    目录一. 访问修饰符1.public(公共的)2. private(私有的)3. protected(受保护的)4. 默认(也称为包访问权限,没有修饰符)二. 非访问修饰符1.static(静态的)2. final(最终的)3.abstract(抽象的)4. synchronized(同步的)5. volatile(易变的)一. 访问修饰符1.public(公共的......
  • 【英语】短篇学习一
    【音频】第一章外宾接待1.1-英语听力-单曲-网易云音乐(163.com)【英文原文】A:Excuseme,areyouMrs.GreenfromEngland打扰了,请问您是来自英格兰的格林女士吗?B:Yes,Iam是的,我是。A:I'mpleasedtomeetyou,Mrs.Green.MynameisMyra.IworkinBeijing......
  • QuantConnect/Lean学习(1)
    QuantConnect/Lean学习一、什么是Lean?LeanEngine是一个完全开源的算法交易引擎,由QuantConnect平台开发。它可以帮助我们轻松完成策略研究、策略回测、实盘接入。它的核心使用C#编写,但它在Linux、MacOs、Windows操作系统上都可以运行。它支持Python3.11或C#编写策略。二......
  • inline 函数:让你的 C++ 代码飞起来——深度剖析与实战技巧
    你是否曾经为C++代码中的函数调用开销感到烦恼?每次函数调用都需要创建栈帧、传递参数、跳转执行,这些看似微小的操作,累计起来就会成为性能瓶颈。在对性能要求苛刻的程序中,这些开销可能会影响到整体表现。今天,我们要聊的就是一个解决方案——inline函数。想象一下,如果编译器......
  • 深度学习在岩土工程中的应用与实践
    在深度学习与岩土工程融合的背景下,科研的边界持续扩展,创新成果不断涌现。从基本物理模型的构建到岩土工程问题的复杂模拟,从数据驱动的分析到工程问题的智能解决,深度学习正以前所未有的动力推动岩土工程领域的革新。据调查,目前在岩土工程领域内,深度学习的应用主要集中在以下几个......
  • 如何深度学习SpringBoot?
    SpringBoot对于SpringBoot,我们都知道他的设计初衷是解决Spring各版本配置工作过于繁重的问题,简化初始搭建流程、降低开发难度而出现的。可以说用SpringBoot开发,我们在配置上是不用花费太多时间的。我们常常看到这样一种现象:面对Spring繁重配置工作,要是一位初学者仅仅掌握......
  • 【热门主题】000049 人工智能学习框架:开启智能未来的钥匙
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 网络安全自学入门:(超详细)从入门到精通学习路线&规划,学完即可就业
      很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样。算上从学校开始学习,已经在网安这条路上走了10年了,无论是以前在学校做安全研究,还是毕业后在百度、360从事内核安全......
  • 【WPF】Prism学习(二)
    PrismCommands1.命令(Commanding)1.1.ViewModel的作用:ViewModel不仅提供在视图中显示或编辑的数据,还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面(UI)执行的动作或操作通常被定义为命令(Commands)。1.2.命令(Commands)的作用:命令提供了一种方便......
  • 在线教育视频学习小程序
    一、前言 随着互联网技术的飞速发展和智能设备的普及,在线教育成为了教育领域的新趋势。在线教育视频学习小程序以其便捷性、灵活性和高效性,为学习者提供了随时随地进行学习的机会。在当前教育信息化的大背景下,开发一款在线教育视频学习小程序具有重要的现实意义。  该在......