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

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

在深度学习中,学习率调整策略(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']}")

相关文章:

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

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

【学员提问bug】小程序在onUnload里面调接口,用来记录退出的时间, 但是接口调用还没成功, 页面就关闭了。如何让接口在onUnload关闭前调用成功?

这种问题比较通用,并不涉及到具体方法执行障碍,所以,解决起来也不麻烦。但是新手往往不知道如何做。 在小程序中,如果在 onUnload 中调用 API 记录页面退出时间,但因为页面关闭速度较快导致请求未完成,可以…...

【刷题13】链表专题

目录 一、两数相加二、两两交换链表的节点三、重排链表四、合并k个升序链表五、k个一组翻转链表 一、两数相加 题目: 思路: 注意整数是逆序存储的,结果要按照题目的要求用链表连接起来遍历l1的cur1,遍历l2的cur2,和…...

Python Turtle模块详解与使用教程

Python Turtle模块详解与使用教程 引言 Python是一种广泛使用的编程语言,其简洁易读的语法使得它成为初学者学习编程的理想选择。而Turtle模块则是Python标准库中一个非常有趣且实用的图形绘制工具,特别适合用于教育和学习编程的基础知识。通过Turtle模…...

【PTA】4-2 树的同构【数据结构】

给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 图一…...

Node.js——fs模块-同步与异步

本文的分享到此结束,欢迎大家评论区一同讨论学习,下一篇继续分享Node.js的fs模块文件追加写入的学习。...

Java基于微信小程序的私家车位共享系统(附源码,文档)

博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

vscode 创建 vue 项目时,配置文件为什么收缩到一起展示了?

一、前言 今天用 vue 官方脚手架创建工程,然后通过 vscode 打开项目发现,配置文件都被收缩在一起了。就像下面这样 这有点反直觉,他们应该是在同一层级下的,怎么会这样,有点好奇,但是打开资源管理查看&…...

PySpark任务提交

一般情况下,spark任务是用scala开发的,但是对于一些偏业务人员,或者是基于上手的来说python的API确实降低了开发前置条件的难度,首当其冲的就是能跳过Java和Scala需要的知识储备,但是在提交任务到集群的时候就很麻烦了…...

【果蔬购物商城管理与推荐系统】Python+Django网页界面+协同过滤推荐算法+管理系统网站

一、介绍 果蔬购物管理与推荐系统。本系统以Python作为主要开发语言,前端通过HTML、CSS、BootStrap等框架搭建界面,后端使用Django框架作为逻辑处理,通过Ajax实现前后端的数据通信。并基于用户对商品的评分信息,采用协同过滤推荐…...

【大模型】海外生成式AI赛道的关键玩家:OpenAI、Anthropic之外还有谁?

引言 在生成式AI快速发展的今天,不同公司在各自领域发挥着独特作用。本文将从基础模型研发、开发工具框架、垂直领域应用三个维度,为读者梳理当前生成式AI技术领域的主要参与者,帮助开发者更好地把握技术发展方向。 一、基础模型研发公司 O…...

kubevirt cloud-init配置

https://cloudinit.readthedocs.io/en/latest/reference/examples.html (示例) https://cloudinit.readthedocs.io/en/latest/reference/faq.html (常见问题) https://cloudinit.readthedocs.io/en/latest/howto/debug_user_data.html (检查user_data) https://clo…...

Oracle 大表添加索引的最佳方式

背景: 业务系统中现在经常存在上亿数据的大表,在这样的大表上新建索引,是一个较为耗时的操作,特别是在生产环境的系统中,添加不当,有可能造成业务表锁表,业务表长时间的停服势必会影响正常业务…...

速度了解云原生后端!!!

云原生后端是指基于云计算技术和理念构建的后端系统架构,旨在充分利用云计算的优势,实现快速部署、弹性扩展、高可用性和高效运维。以下是云原生后端的一些关键特点和技术: 容器化 容器化是云原生架构的核心之一,它使用容器技术&…...

云计算Openstack 虚拟机调度策略

OpenStack的虚拟机调度策略是一个复杂而灵活的系统,它主要由两种调度器实现:FilterScheduler(过滤调度器)和ChanceScheduler(随机调度器)。以下是对这两种调度器及其调度策略的详细解释: 一、F…...

在 macOS 上添加 hosts 文件解析的步骤

步骤 1: 打开 hosts 文件 打开终端: 你可以通过 Spotlight 搜索(按 Cmd Space 并输入 Terminal)来打开终端。 使用文本编辑器打开 hosts 文件: 在终端中输入以下命令,使用 nano 文本编辑器打开 hosts 文件&#xff1a…...

RHCE【防火墙】

目录 一、防火墙简介 二、iptables 实验一:搭建web服务,设置任何人能够通过80端口访问。 实验二:禁止所有人ssh远程登录该服务器 实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服…...

基于springboot的招聘系统的设计与实现

摘 要 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在工作岗位要求不断提高的前提下,招聘系统建设也逐渐进入了信息化时代。…...

长度最小的子数组(滑动窗口)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&#xf…...

构建灵活、高效的HTTP/1.1应用:探索h11库

文章目录 构建灵活、高效的HTTP/1.1应用:探索h11库背景这个库是什么?如何安装这个库?库函数使用方法使用场景常见的Bug及解决方案总结 构建灵活、高效的HTTP/1.1应用:探索h11库 背景 在现代网络应用中,HTTP协议是基础…...

【PhysUnits】15.5 引入P1后的标准化表示(standardization.rs)

一、源码 这段代码实现了一个类型级别的二进制数标准化系统&#xff0c;主要用于处理二进制数的前导零和特殊值的简化。 use super::basic::{Z0, P1, N1, B0, B1, NonNegOne, NonZero};/// 处理 B0<H> 类型的标准化 /// Standardization for B0<H> types /// ///…...

csharp ef入门

全局安装 dotnet ef 命令行工具 要 全局安装 dotnet ef 命令行工具&#xff08;即在任何项目目录下都能使用 dotnet ef 命令&#xff09;&#xff0c;请按以下步骤操作&#xff1a; ✅ 全局安装步骤&#xff08;推荐&#xff09; 在终端中运行以下命令&#xff1a; bash复制…...

javaweb-maven以及http协议

1.maven坐标&#xff1a; 坐标是资源的唯一标识&#xff0c;通过该坐标可以唯一定位资源位置&#xff1b; 2.坐标的组成&#xff1a; groupId:定义当前项目隶书的组织名称&#xff1b; artifactId&#xff1a;定义当前maven项目名称 version&#xff1a;定义项目版本 3.依…...

Spring Boot整合JWT实现认证与授权

概述 JSON Web Token (JWT) 是一种开放标准 (RFC 7519)&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间安全地传输信息。在Web应用中&#xff0c;JWT常用于身份验证和信息交换。 依赖配置 首先需要在项目中添加JWT依赖&#xff1a; <!-- JWT依赖…...

Arduino学习-跑马灯

1、效果 2、代码 /**** 2025-5-30 跑马灯的小程序 */ //时间间隔 int intervaltime200; //初始化函数 void setup() {// put your setup code here, to run once://设置第3-第7个引脚为输出模式for(int i3;i<8;i){pinMode(i,OUTPUT);} }//循环执行 void loop() {// put you…...

Kotlin 中集合遍历有哪几种方式?

1 for-in 循环&#xff08;最常用&#xff09; val list listOf("A", "B", "C") for (item in list) {print("$item ") }// A B C 2 forEach 高阶函数 val list listOf("A", "B", "C") list.forEac…...

zookeeper 操作总结

zookeeper 中的节点类型 节点类型命令选项说明‌持久节点‌无选项&#xff08;默认&#xff09;永久存在&#xff0c;除非手动删除。‌临时节点‌-e与客户端会话绑定&#xff0c;会话结束自动删除&#xff08;‌不能有子节点‌&#xff09;。‌顺序节点‌-s节点名自动追加递增…...

8.8 Primary ODSA service without ODSA Portal

主要ODSA服务&#xff08;不使用ODSA门户&#xff09; 以下场景描述如下情况&#xff1a; • 主ODSA客户端应用程序被允许用于该类型的主设备&#xff0c;且对终端用户启用&#xff08;已授权&#xff09;。 • 服务提供商&#xff08;SP&#xff09;能够在不涉及ODSA门户Web服…...

Android设置界面层级为最上层实现

Android设置界面层级为最上层实现 文章目录 Android设置界面层级为最上层实现一、前言二、Android设置界面层级为最上层实现1、主要代码2、后遗症 三、其他1、Android设置界面层级为最上层小结2、悬浮框的主要代码悬浮框 注意事项&#xff08;1&#xff09;权限限制&#xff08…...

5.31 数学复习笔记 22

前面的笔记&#xff0c;全部写成一段&#xff0c;有点难以阅读。现在改进一下排版。另外&#xff0c;写笔记实际上就是图一个放松呢&#xff0c;关键还是在于练习。 目前的计划是&#xff0c;把讲义上面的高数例题搞清楚之后&#xff0c;大量刷练习册上面的题。感觉不做几本练…...