深度学习-学习率调整策略

在深度学习中,学习率调整策略(Learning Rate Scheduling)用于在训练过程中动态调整学习率,以实现更快的收敛和更好的模型性能。选择合适的学习率策略可以避免模型陷入局部最优、震荡不稳定等问题。下面介绍一些常见的学习率调整策略:

1. Step Decay(分步衰减)

原理

Step Decay 是一种分段衰减策略,每隔一定的训练周期或步骤,学习率会缩减一个固定的因子。这可以在训练中途降低学习率,从而让模型在训练末期更加稳定地收敛。

公式

其中:

  • initial_lr 是初始学习率
  • factor 是每次衰减的因子,一般小于 1(例如 0.1)
  • k 是衰减次数
适用场景

适合训练中需要逐步收敛的模型,如卷积神经网络。在一定训练轮次后,降低学习率有助于模型以更稳定的步伐接近最优解。

优缺点
  • 优点:可以逐步收敛,适合比较平稳的优化任务。
  • 缺点:由于步长是固定的,可能会导致过早或过晚调整学习率。
代码示例

在 PyTorch 中实现 Step Decay 可以使用 StepLR

import torch
import torch.optim as optim
import torch.nn as nn# 假设我们有一个简单的模型
model = nn.Linear(10, 2)
optimizer = optim.SGD(model.parameters(), lr=0.1)  # 初始学习率 0.1
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5)  # 每10个epoch衰减一半# 模拟训练过程
for epoch in range(30):# 假设进行前向和后向传播optimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()# 更新学习率scheduler.step()print(f"Epoch {epoch+1}, Learning Rate: {scheduler.get_last_lr()[0]}")

2. Exponential Decay(指数衰减)

原理

指数衰减策略的学习率会以指数方式逐渐减少,公式为:

其中 decay_rate 控制学习率下降的速度。指数衰减适合需要平稳下降的任务,因为这种衰减是连续的且平滑。

适用场景

适合长时间训练或训练数据复杂的模型,能让模型在训练后期继续保持较好的收敛效果。

优缺点
  • 优点:平滑衰减,适合长时间训练。
  • 缺点:如果 decay_rate 设置不当,可能会导致过早或过晚下降。
代码示例

在 PyTorch 中使用 ExponentialLR 实现:

scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)  # 指数衰减因子 0.9for epoch in range(30):optimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()# 更新学习率scheduler.step()print(f"Epoch {epoch+1}, Learning Rate: {scheduler.get_last_lr()[0]}")

3. Cosine Annealing(余弦退火)

原理

Cosine Annealing 利用余弦函数使学习率周期性下降,并在周期末期快速降低至接近 0 的值。

其中 T_max 是控制余弦周期的最大步数,周期性下降可以使模型在接近全局最优时表现更稳定。

适用场景

适合在有一定噪声的数据集上进行多轮次训练,使模型在每个周期内都能充分探索损失函数的不同区域。

优缺点
  • 优点:自然周期下降,易于模型在训练中后期稳定收敛。
  • 缺点:周期设置需要与任务匹配,否则可能在全局最优时过早结束。
代码示例

在 PyTorch 中使用 CosineAnnealingLR 实现:

scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=30)for epoch in range(30):optimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()# 更新学习率scheduler.step()print(f"Epoch {epoch+1}, Learning Rate: {scheduler.get_last_lr()[0]}")

4. Reduce on Plateau(基于验证集表现动态调整)

原理

当验证集的损失在一段时间(耐心期)内没有显著下降,则将学习率按一定因子减少。这样可以防止模型陷入局部最优。

适用场景

特别适合那些验证集损失不稳定或在收敛后期趋于平稳的模型,比如需要细致调整的分类任务。

优缺点
  • 优点:自适应调整学习率,使训练在收敛后期更稳定。
  • 缺点:依赖验证集表现,调整耐心期参数复杂。
代码示例

在 PyTorch 中使用 ReduceLROnPlateau 实现:

scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5)for epoch in range(30):optimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()# 模拟验证损失val_loss = loss.item() + (epoch % 10) * 0.1  # 可调节该值scheduler.step(val_loss)print(f"Epoch {epoch+1}, Learning Rate: {optimizer.param_groups[0]['lr']}")

5. Cyclical Learning Rate (CLR)

原理

CLR 设定了上下限值,让学习率在两者之间循环,探索损失空间不同区域,防止陷入局部最优。

适用场景

适合包含复杂损失结构的任务,如图像分类中的较大卷积网络。

优缺点
  • 优点:避免陷入局部最优,提高全局搜索能力。
  • 缺点:调整范围较难控制,适用性有限。
代码示例

可以使用 torch.optim 库实现自定义的 CLR:

import numpy as np# 计算CLR的函数
def cyclical_learning_rate(step, base_lr=0.001, max_lr=0.006, step_size=2000):cycle = np.floor(1 + step / (2 * step_size))x = np.abs(step / step_size - 2 * cycle + 1)lr = base_lr + (max_lr - base_lr) * np.maximum(0, (1 - x))return lr# 训练过程
for step in range(10000):lr = cyclical_learning_rate(step)optimizer.param_groups[0]['lr'] = lroptimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()if step % 1000 == 0:print(f"Step {step}, Learning Rate: {optimizer.param_groups[0]['lr']}")

6. One Cycle Policy(单周期策略)

原理

One Cycle Policy 从较低学习率开始,逐渐增加到最大值,然后再逐步减小到较低值。适合需要快速探索和稳定收敛的任务。

适用场景

适合迁移学习和较小数据集。

优缺点
  • 优点:适合迁移学习,能快速稳定收敛。
  • 缺点:对于较长训练任务效果一般。
代码示例

在 PyTorch 中实现 One Cycle Policy:

from torch.optim.lr_scheduler import OneCycleLRscheduler = OneCycleLR(optimizer, max_lr=0.1, steps_per_epoch=100, epochs=10)for epoch in range(10):for i in range(100):  # 假设一个 epoch 有 100 个 batchoptimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()scheduler.step()  # 每步更新学习率print(f"Epoch {epoch+1}, Step {i+1}, Learning Rate: {scheduler.get_last_lr()[0]}")

7.如何选择合适的学习率调整策略?

(1). 数据规模和训练时长

  • 小数据集训练时间短
    使用 One Cycle PolicyCyclical Learning Rate。这类策略能够快速调整学习率,在有限的时间内加速训练并避免局部最优。

  • 中等数据集训练时间适中
    可以选择 Step DecayExponential Decay。这些策略在收敛过程中平稳下降,适合中等规模的任务。

  • 大数据集长时间训练
    选择 Cosine AnnealingReduce on Plateau。这类策略能够适应较长的训练周期,避免学习率下降过快,从而保持稳定的收敛效果。


(2). 模型类型和复杂度

  • 简单模型(如浅层神经网络):
    使用 Step DecayExponential Decay。这些简单的衰减策略适合训练时间不长且模型复杂度低的情况。

  • 深度模型(如卷积神经网络、递归神经网络):
    选择 Cosine AnnealingReduce on PlateauOne Cycle Policy。这些策略在后期能平滑衰减,有助于复杂模型更好地探索损失函数的不同区域。

  • 预训练模型的微调
    One Cycle Policy 是一个理想选择。它从较低的学习率开始,快速升至最大,再衰减回较小值,适合在微调过程中稳定调整参数。


(3). 任务类型

  • 分类任务
    分类任务中常用 Step DecayCosine AnnealingCyclical Learning Rate,特别是在图像分类任务中,余弦退火可以在训练后期更好地收敛,CLR 则有助于探索不同的损失空间。

  • 回归任务
    Exponential DecayReduce on Plateau,回归任务通常要求模型在后期保持较稳定的收敛效果,因此指数衰减和基于验证集表现的动态调整策略更为合适。

  • 时间序列预测
    使用 Reduce on PlateauExponential Decay,因为时间序列预测中数据较为复杂,不同时间段的学习率需求变化大,可以使用验证集损失表现来决定学习率的动态调整。


(4). 模型对学习率敏感性

  • 学习率敏感模型
    对学习率波动敏感的模型适合使用 Cosine AnnealingReduce on Plateau。这类模型需要学习率逐步下降的过程来平稳收敛,不易受到过大的学习率波动影响。

  • 对学习率不敏感的模型
    使用 Cyclical Learning RateOne Cycle Policy,这两种策略适合让学习率在一个范围内波动,从而让模型更快跳出局部最优,快速找到全局最优解。


(5). 损失函数表现与收敛性

  • 损失波动较大(不稳定收敛):
    选择 Reduce on Plateau,让模型在验证集损失长时间不下降时再降低学习率,避免过早或频繁地调整学习率。

  • 损失逐渐收敛(平稳下降):
    使用 Step DecayExponential Decay,这些策略更适合平稳下降的场景,且能在训练后期提供更小的学习率。

任务场景推荐学习率调整策略
小数据集,快速训练One Cycle Policy,CLR
大数据集,长时间训练Cosine Annealing,Reduce on Plateau
微调预训练模型One Cycle Policy
简单模型Step Decay,Exponential Decay
深层复杂模型Cosine Annealing,Reduce on Plateau
分类任务Step Decay,Cosine Annealing,CLR
时间序列或自然语言处理Exponential Decay,Reduce on Plateau
高波动的验证集损失Reduce on Plateau

以下是一个综合示例,展示了如何在 PyTorch 中动态选择并应用学习率调整策略:

import torch
import torch.optim as optim
import torch.nn as nn
from torch.optim.lr_scheduler import StepLR, ExponentialLR, CosineAnnealingLR, ReduceLROnPlateau, OneCycleLR# 假设我们有一个简单的模型
model = nn.Linear(10, 2)
optimizer = optim.SGD(model.parameters(), lr=0.1)  # 初始学习率 0.1# 根据需求选择合适的学习率调整策略
def get_scheduler(optimizer, strategy='step_decay'):if strategy == 'step_decay':return StepLR(optimizer, step_size=10, gamma=0.5)elif strategy == 'exponential_decay':return ExponentialLR(optimizer, gamma=0.9)elif strategy == 'cosine_annealing':return CosineAnnealingLR(optimizer, T_max=30)elif strategy == 'reduce_on_plateau':return ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5)elif strategy == 'one_cycle':return OneCycleLR(optimizer, max_lr=0.1, steps_per_epoch=100, epochs=10)else:raise ValueError("Unknown strategy type")# 选择策略
scheduler = get_scheduler(optimizer, strategy='cosine_annealing')# 模拟训练过程
for epoch in range(30):optimizer.zero_grad()output = model(torch.randn(10))loss = nn.MSELoss()(output, torch.randn(2))loss.backward()optimizer.step()# 调整学习率if isinstance(scheduler, ReduceLROnPlateau):# 如果是 Reduce on Plateau,使用验证集的损失作为依据val_loss = loss.item() + (epoch % 10) * 0.1  # 模拟验证损失scheduler.step(val_loss)else:scheduler.step()print(f"Epoch {epoch+1}, Learning Rate: {optimizer.param_groups[0]['lr']}")

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题 插件介绍 pdfdist-mergeofd插件的作用可查看这篇文章,同时使用ofdjs和pdfjs遇到的问题,和解决方法——懒加载 该插件主要是为了解决pdfjs和ofdjs同时…

【PUCCH——Format和资源集】

PUCCH 信道格式,就是指对于PUCCH信道,在时域上占据多少个OFDM符号,频域上占据多少个RB,传输比特数多少的一种约定。 NR中,在38.213-9.2.2节对PUCCH 格式进行了定义,目前,一共有5种格式&#xf…

【CUDA代码实践03】m维网格n维线程块对二维矩阵的索引

文章目录 一、数据存储方式二、二维网格二维线程块三、二维网格一维线程块四、一维网格一维线程块 为了方便下次找到文章,也方便联系我给大家提供帮助,欢迎大家点赞👍、收藏📂和关注🔔!一起讨论技术问题&am…

软件测试工程师晋升方向,你选对了吗?

在信息技术行业中,软件测试工程师是一个至关重要的角色,他们负责确保软件的质量和稳定性。然而,随着经验和技能的增长,软件测试工程师也面临着晋升和职业发展的问题。本文将探讨软件测试工程师的晋升方向,为有志于在软…

关键词排名技巧实用指南提升网站流量的有效策略

内容概要 在数字营销的世界中,关键词排名的影响不可小觑。关键词是用户在搜索引擎中输入的词语,通过精确选择和优化这些关键词,网站能够更轻松地被目标用户发现。提升关键词排名的第一步是了解基本概念,包括关键词的分类、重要性…

NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力

视频诊断技术是一种智能化的视频故障分析与预警系统,NVR设备ONVIF接入平台EasyCVR通过对前端设备传回的码流进行解码以及图像质量评估,对视频图像中存在的质量问题进行智能分析、判断和预警。这项技术在安防监控领域尤为重要,因为它能够确保监…

前端八股文第一篇

自我介绍:我的优势以及和这个岗位的匹配度。 为什么想进我们公司:HR想听有没有对这个岗位进行充分了解。 以前做的项目:你的思路,你的贡献,你的总结是什么。 介绍最失败的事情:有没有总结和反思。 要求…

SolidWorks 导出 URDF 中的惯性矩阵错误问题

系列文章目录 前言 一、 dsubhasish09于2021年5月23日发表评论 在装配体中定义由多个零件组成的 link 时,单个零件质心处各自的惯性值(在使用相似性变换使其与关节坐标系平行后)会直接相加,从而得到净惯性矩阵,而不是…

鸿蒙UI开发——基于组件安全区方案实现沉浸式界面

1、概 述 本文是接着上篇文章 鸿蒙UI开发——基于全屏方案实现沉浸式界面 的继续讨论。除了全屏方案实现沉浸式界面外,我们还可以使用组件安全区的方案。 当我们没有使用setWindowLayoutFullScreen()接口设置窗口为全屏布局时,默认使用的策略就是组件安…

鸿蒙学习总结

鸿蒙(HarmonyOS),做为国产自主研发设计的第一个操作系统,从开放测试以来一直备受关注。其纯血鸿蒙版(HarmonyOS NEXT)也于进日发布。过去的一段时间里,我站在一个移动开发者的角度对HarmonyOS进…

【electron8】electron实现“图片”的另存为

注:该列出的代码,都在文章内示例出 1. 另存为按钮事件: const saveAsHandler async () > {const { path, sessionId } recordInfoif(typeof message ! string) return;// 因为我的图片是加密的,所以我需要根据接口返回的路…

着色器的认识

知识了解: 着色器: 顶点着色器: 用来描述顶点的特性,如位置、颜色等,其中,顶点:是指二维或三维空间中的一个点比如交点或者端点。 片元着色器:用来进行逐片元处理操作,比如光照、颜色叠加等&…

如何将原本打开Edge呈现出的360浏览器,更换成原本的Edge页面或者百度等其他页面

每次打开Edge浏览器,都会呈现出360浏览器的页面,很烦。以下将说明如果将呈现出的360浏览器,更换成原本的Edge页面或者百度等其他页面。 1.找到你的控制面板,点击卸载程序。 2. 找到360安全卫士,右键单击更改/卸载。 3…

Android 应用申请 Google MBA权限

Google Case链接:89 > 34810 > 30025 > 155353 > Handheld > MBA Policies 按照指引填写模板 This bug is for the approval of MBAs under [13.2.2 Pregrant permissions policy](https://docs.partner.android.com/gms/policies/domains/mba#mba-…

基于 ThinkPHP+Mysql 灵活用工_灵活用工系统_灵活用工平台

基于 ThinkPHPMysql 灵活用工灵活用工平台灵活用工系统灵活用工小程序灵活用工源码灵活用工系统源码 开发语言 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示 一、企业管理后台 二、运用管理平台 三、手机端

Web 核心指标优化之 INP 篇

这篇文章是我在公司做 INP 优化经验分享的演讲稿。 大家好,今天我要做的分享是关于 INP 的一些优化经验。 概念 首先,什么叫 INP 呢。 INP 的全称叫 Interaction to Next Pain ,翻译过来就是从交互到下一次绘制的延迟。这是 Google 提出来的…

Footprint Analytics 现已支持 TRON 链上数据分析

我们很高兴地宣布,全球最大的区块链网络之一 TRON(波场)已经成功接入 Footprint Analytics!通过这次集成,开发者、分析师和区块链爱好者们现在可以使用 Footprint 的专业分析工具,深入挖掘 TRON 生态系统的…

考到了PMP证书之后,我的电话被打爆了....

考到了PMP之后,万年不见响的手机竟也开始频繁来call了~🙅 一般是哪些人,会因为什么事来找?本期小赛就给大家讲讲是啥情况~ 一、HR打电话邀请面试 在没有PMP证书的时候,自己投出去的简历往往是石沉大海,杳…

UI设计软件全景:13款工具助力创意实现

选择恰当的UI设计工具对于创建美观且用户体验良好的应用程序界面至关重要。不同的APP功能可能需要不同的界面设计软件,但并非所有工具都需要精通,熟练掌握几个常用的就足够了。以下是13款APP界面设计软件,它们能够为你的团队提供绘制APP界面所…

使用iframe内嵌grafana监控页面

grafana监控大盘被普遍采用,但一个缺点就是一次只能打开一个页面,切换页面很不便,如果能一次同时展示多个页面就好了,如图: 使用tab标签,结合iframe,把各个监控页面全放在一起,可以…