优化器与优化策略的搭配

在深度学习中不同的optimizer 通常会选择不同 优化策略 lr_sheduler 与之搭配;

1. SGD 与 Adam 优化器

Adam 与经典 SGD 的不同之处在于,

  1. Adam 执行局部参数更新(即在参数级别进行更改),而不是全局执行此操作的 SGD,
  2. 以及 它执行一些动量-类似的优化与经典 SGD 的无动量相反。

2. 学习率退火 annealing 方式

火,特别是在优化深度学习模型的背景下,是指在训练过程中逐渐降低学习率的技术。这个过程通常称为“学习率退火”或“学习率衰减”,对于帮助模型在训练结束时更有效地收敛至关重要。

“退火”一词源自冶金学,它描述了加热然后缓慢冷却以消除内应力并使材料增韧的过程。

通过逐渐降低学习率,您可以让模型对权重进行更小、更精确的调整。这增加了在损失情况中收敛到更好且可能更深的最小值的可能性。

在 PyTorch 中使用 StepLR 或 ExponentialLR 等学习率调度程序可以灵活有效地控制学习率随时间的变化,这对于有效训练深度神经网络至关重要。根据验证性能调整这些参数以获得最佳结果。

2.1 Step Decay: .

步骤衰减:每隔几个时期定期将学习率降低固定因子。这是一种简单且广泛使用的方法。

2.2 Exponential Decay

指数衰减:每个时期持续将学习率降低一个小因子,这会导致学习率随着时间的推移呈指数下降。

2.3 Linear or Polynomial Decay

线性或多项式衰减:随时间线性或根据多项式函数降低学习率。

2.4 Cosine Annealing

余弦退火:根据余弦函数调整学习率,在可能重新启动循环之前逐渐将其降低到最小值,这种技术称为热重启余弦退火。

2.5 各类学习率退火的 对比

步进与指数衰减:步进衰减降低了大的离散跳跃的学习率,这可以更容易配置并且行为更可预测。相比之下,指数衰减会逐渐且连续地改变学习率,这有助于保持更稳定的收敛,尤其是在训练的后期阶段。

线性/多项式与余弦退火:线性或多项式衰减提供了学习率的可预测、稳定的变化,可以调整为更积极或温和地降低。余弦退火以非线性方式降低学习率,这可以更好地探索损失景观并有可能避免局部最小值。

3. cycle 类型学习率退火算法

3.1 梯度型 学习率更新

先从 base_lr —> max_lr ----> base_lr ,

学习率先上升 —》 维持一定的epoch 数目 ----》 最后的阶段下降为 base_lr学习率;

下图中有错误, base_lr , max_lr 这两个学习率的位置应该互换。

在这里插入图片描述

根据您提供的图像(该图像说明了梯形学习率计划),我将调整之前提供的 PyTorch 代码。该计划从基本学习率 ( base_lr ) 开始,在一定数量的 epoch ( step_size ) 内线性增加到最大学习率 ( max_lr ),保持一段时间内的最大学习率 ( anneal_start_epoch - 2 * step_size ),然后在相同数量的 epoch 内线性降低回基本学习率 ( step_size

下面是梯形学习率调度程序的调整后的 PyTorch 代码,考虑到了图表

import torch
from torch.optim.lr_scheduler import _LRSchedulerclass TrapezoidalLR(_LRScheduler):def __init__(self, optimizer, base_lr, max_lr, step_size, anneal_start_epoch, last_epoch=-1):self.base_lr = base_lrself.max_lr = max_lrself.step_size = step_sizeself.anneal_start_epoch = anneal_start_epochself.ramp_down_start_epoch = anneal_start_epoch + step_sizesuper(TrapezoidalLR, self).__init__(optimizer, last_epoch)def get_lr(self):if self.last_epoch < self.step_size:# Ramp up phaselr = [self.base_lr + (self.max_lr - self.base_lr) * (self.last_epoch / self.step_size) for base_lr in self.base_lrs]elif self.last_epoch < self.anneal_start_epoch:# Hold phaselr = [self.max_lr for _ in self.base_lrs]elif self.last_epoch < self.ramp_down_start_epoch:# Ramp down phaseprogress = (self.last_epoch - self.anneal_start_epoch) / self.step_sizelr = [self.max_lr - (self.max_lr - self.base_lr) * progress for base_lr in self.base_lrs]else:# After traininglr = [self.base_lr for _ in self.base_lrs]return lr# Example usage
model = ...  # Define your model
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)  # Initial LR is overridden by scheduler# Define the total epochs based on your training plan
total_epochs = anneal_start_epoch + step_size
scheduler = TrapezoidalLR(optimizer, base_lr=0.001, max_lr=0.006, step_size=5, anneal_start_epoch=10)# Training loop
for epoch in range(total_epochs):scheduler.step(epoch)for input, target in train_loader:optimizer.zero_grad()output = model(input)loss = criterion(output, target)loss.backward()optimizer.step()print(f'Epoch: {epoch+1}, LR: {scheduler.get_lr()[0]}')

确保正确定义模型和数据加载器,并在训练循环中设置正确的损失函数。根据您的特定用例的需要调整 base_lr 、 max_lr 、 step_size 和 anneal_start_epoch 。此代码假设时期总数将是 step_size 、 anneal_start_epoch 和另一个 step_size 的总和,以匹配如图所示的梯形时间表。

3.2 oneCycleLR

先上升后下降,

PyTorch 中的 OneCycleLR 调度器是学习率调度器 API 的一部分,它根据 1cycle 学习率策略调整学习率,该策略由 Leslie N. Smith 在题为“Super-Convergence: Very”的论文中提出使用大学习率快速训练神经网络”。 1cycle 策略是循环学习率 (CLR) 计划的一种形式,由两个主要阶段组成:

  1. 学习率从下限( base_lr 或 initial_lr )增加到上限( max_lr )的初始阶段。

  2. 第二阶段,学习率从上限( max_lr )下降到下限( base_lr 或 final_lr ),甚至进一步下降到非常小的值( base_lr 的 final_div_factor )。

此外, OneCycleLR 调度程序可以调整学习率的动量,这被认为有助于优化过程。

以下是 OneCycleLR 调度程序的工作原理及其关键参数:

Working Mechanism:

第 1 阶段 - 学习率退火(向上):学习率线性增加或使用自定义退火函数从 base_lr 到 max_lr 。此阶段允许优化器探索损失情况并对模型的权重进行重大更改。

第 2 阶段 - 学习率退火(向下):学习率随后降低,通常遵循余弦退火计划,从 max_lr 降低到非常小的值。此阶段有助于模型收敛到良好的解决方案。

动量调整(可选):如果使用动量,它通常会向与学习率相反的方向调整;
当学习率增加时减少,当学习率减少时增加。

Key Parameters:

  1. optimizer :调整学习率的优化器。
  1. max_lr :每个参数组循环中的学习率上限。

total_steps :循环中的总步数。请注意,如果您不指定此项,则必须指定 epochs 和 steps_per_epoch 。

epochs :训练的纪元数。如果未提供 total_steps ,则与 steps_per_epoch 一起使用来推断循环中的总步数。

steps_per_epoch :每个时期训练的步骤数(样本批次)。如果未提供 total_steps ,则与 epochs 一起使用来推断循环中的总步数。

pct_start :用于提高学习率的周期百分比(以总步数计)。

anneal_strategy :学习率和可选动量的退火策略。对于余弦退火方案,它可以是“cos”,对于线性方案,它可以是“线性”。

base_lr :初始学习率,是每个参数组循环的下限。

final_div_factor :通过 base_lr / final_div_factor 确定最小学习率。

div_factor :通过 max_lr / div_factor 确定初始学习率。

three_phase :如果为 True,它会在学习率从 base_lr / div_factor 到 base_lr / < 的末尾添加一个额外的步骤b4> 占总步数的一小部分。

import torch
import torch.optim as optim
from torch.optim.lr_scheduler import OneCycleLRmodel = ... # your model
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = OneCycleLR(optimizer, max_lr=1.0, steps_per_epoch=len(train_loader), epochs=num_epochs, anneal_strategy='cos')for epoch in range(num_epochs):for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()# Step through the scheduler after each optimizer updatescheduler.step()

When using OneCycleLR, it's crucial to ensure that the scheduler is stepped after each batch rather than each epoch since the learning rate needs to adjust after each optimizer update. This technique is known for helping to train models quickly and efficiently, and for achieving better generalization.

使用 OneCycleLR 时,确保调度程序在每个批次而不是每个时期之后步进至关重要,因为学习率需要在每次优化器更新后进行调整。该技术因有助于快速有效地训练模型并实现更好的泛化而闻名。

reference

  1. https://github.com/bckenstler/CLR/issues/19;
  2. https://github.com/daisukelab/TrapezoidalLR

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制太阳黑子区域分布极坐标散点图

下面是一个示例&#xff0c;演示如何使用MATLAB绘制太阳黑子区域分布的极坐标散点图。在这个示例中&#xff0c;我们使用了数据集sunspotarea.csv的太阳黑子区域数据&#xff0c;来绘制极坐标散点图。 购书地址&#xff1a;https://item.jd.com/14102657.html

一不小心,创业5年了。。。

时间过得太快。2019年的春天&#xff0c;小灰毅然选择离开职场&#xff0c;选择了自媒体创业这条道路。时至今日&#xff0c;已经有整整5年了。 很多朋友问小灰&#xff0c;为什么要选择离开职场去创业呢&#xff1f;原因主要有两个&#xff1a; 第一&#xff0c;小灰是一个喜欢…

小程序 rich-text 解析富文本 图片过大时如何自适应?

在微信小程序中&#xff0c;用rich-text 解析后端返回的数据&#xff0c;当图片尺寸太大时&#xff0c;会溢出屏幕&#xff0c;导致横向出现滚动 查看富文本代码 图片是用 <img 标签&#xff0c;所以写个正则匹配一下图片标签&#xff0c;手动加上样式即可 // content 为后…

easyx库的学习(鼠标信息)

前言 本次博客是作为介绍easyx库的使用&#xff0c;最好是直接代码打到底&#xff0c;然后看效果即可 代码 int main() {initgraph(640, 480, EX_SHOWCONSOLE|EX_DBLCLKS);setbkcolor(RGB(231, 114, 227));cleardevice();//定义消息结构体ExMessage msg { 0 };//获取消息wh…

6.2 整合MongoDB

6.2 整合MongoDB 1. MongoDB简介2. MongoDB安装2.1 下载2.2 配置MongoDB2.3 MongoDB的启动和关闭1. 启动MongoDB2. 关闭MogoDB 2.4 安全管理 3. 整合SpringBoot3.1 依赖3.2 MongoTemplate使用3.3 测试1. 新增2. 查询3. 删除 *************************************************…

每天学习一个Linux命令之stat

每天学习一个Linux命令之stat 简介 在Linux系统中&#xff0c;stat命令用于显示文件的详细信息&#xff0c;包括文件的设备号、文件类型、权限、链接数、所有者、组、大小、时间戳等。stat命令是一个非常常用的命令&#xff0c;能够帮助我们了解文件的属性和状态。本篇博客将介…

uniapp 引用组件后 不起作用 无效果 不显示

根据uniapp官方文档easycom组件规范 只要组件安装在项目的components目录下或uni_modules目录下&#xff0c;并符合components/组件名称/组件名称.(vue|uvue)目录结构&#xff08;注意&#xff1a;当同时存在vue和uvue时&#xff0c;uni-app 项目优先使用 vue 文件&#xff0c;…

用于割草机器人,商用服务型机器人的陀螺仪

介绍一款EPSON推出适用于割草机器人&#xff0c;商用服务型机器人的高精度陀螺仪模组GGPM61&#xff0c;具体型号为GGPM61-C01。模组GGPM61是一款基于QMEMS传感器的低成本航向角输出的传感器模组&#xff0c;它可以输出加速度、角速度及姿态角等信息&#xff0c;为控制机器人运…

【目标检测】FPN特征金字塔完整流程详解

学习视频&#xff1a;1.1.2 FPN结构详解 对比 可以看到FPN是自上而下、自下而上并且可以进行多尺度特征融合的的层级结构。 具体结构 1x1 conv: 对通道数进行调整&#xff0c;不同大小的特征图通道数不同&#xff0c;越高层次的特征图通道数越大&#xff0c;论文中使用256个1…

在 Windows 系统上彻底卸载 TeamViewer 软件

在 Windows 系统上彻底卸载 TeamViewer 软件 References 免费版仅供个人使用 您的会话将在 5 分钟后终止 Close TeamViewer by locating the TeamViewer icon in the system tray, right click and “Exit TeamViewer”. Right click Windows start menu then Control Panel -…

[Linux][多线程][三][条件变量][生产者消费者模型][基于BlockingQueue的生产者消费者模型]详细讲解

目录 1.线程同步1.同步概念与竞态条件2.条件变量 2.条件变量函数1.初始化 -- pthread_cond_init()2.销毁 -- pthread_cond_destroy()3.等待条件变量 -- pthread_cond_wait()4.唤醒等待5.为什么pthread_cond_wait()需要互斥量&#xff1f;6.错误的程序设计7.条件变量使用规范 3.…

2024 OceanBase 开发者大会:OceanBase 4.3正式发布,打造PB级实时分析数据库

4月20日&#xff0c;2024 OceanBase开发者大会盛大召开&#xff0c;吸引了50余位业界知名的数据库专家和爱好者&#xff0c;以及来自全国各地的近600名开发者齐聚一堂。他们围绕一体化、多模、TP与AP融合等前沿技术趋势展开深入讨论&#xff0c;分享场景探索的经验和最佳实践&a…

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit&#xff0c;包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …

换脸插件升级导致SDWebUI无法启动cannot import name ‘Undefined‘ from ‘pydantic.fields‘

今天在一台新的机器环境装了SDWEBUI&#xff0c;都使用最新的版本&#xff0c;升级了下换脸的插件&#xff0c;于是乎启动崩溃了。错误如下 Launching Web UI with arguments: --listen --skip-torch-cuda-test --disable-nan-check --skip-version-check --skip-python-versi…

C++信息学奥赛 数据结构认识

数据结构 1.1数据结构分类 1.2基本数据类型 1.3数字编码 1.4字符编码 1.1数据结构分类 数据结构如同一副稳固而多样的框架。为数据的有序组织提供了蓝图&#xff0c;算法得以在此基础上生动起来。 常用的数据结构包括哪些 &#xff0c; &#xff0c; &…

Django中的事务

1 开启全局的事务 DATABASES {default: {ENGINE: django.db.backends.mysql, # 使用mysql数据库NAME: tracerbackend, # 要连接的数据库USER: root, # 链接数据库的用于名PASSWORD: 123456, # 链接数据库的用于名HOST: 192.168.1.200, # mysql服务监听的ipPORT: 3306, …

2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介&#xff1a; 2024新算法爱情进化算法&#xff08;LEA&#xff09;和经典灰狼优化器&#xff08;GWO&#xff09;进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗&#xff0c;并使无人机能够适应复杂环…

薄板样条插值TPS原理以及torch和opencv实现

薄板样条插值TPS原理以及torch和opencv实现 1、薄板样条插值TPS原理概述原理以及公式推导2、torch实现3、opencv实现1、薄板样条插值TPS原理 概述 薄板样条(Thin Plate Spline),简称TPS,是一种插值方法,可找到通过所有给定点的“最小弯曲”光滑曲面。因为它一般都是基于…

跟着野火从零开始手搓emWin(1)初识emWin

PS&#xff1a;在嵌入式领域&#xff0c;本人认为QT的应用范围和性能几乎吊打市面上所有的GUI工具。但是本人之所以学习emWin&#xff0c;是因为自己有些微不足道的小想法&#xff0c;需要通过它来实现。但是QT有点吃硬件的配置&#xff0c;为了MCU专门发行的QT我又懒得去弄&am…

vscode将本地服务转发到外网地址访问

示例中将本地的5500端口&#xff0c;用vscode进行端口转发&#xff0c;在外网地址访问服务 要转发的端口 转发端口 点击转发端口 输入要转发的端口&#xff0c;按下回车 Enter 点击允许&#xff0c;弹出确认界面后点击打开 转发端口已经成功配置上&#xff0c;右键可见性…