优化器与优化策略的搭配

在深度学习中不同的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 _LRScheduler

class TrapezoidalLR(_LRScheduler):
    def __init__(self, optimizer, base_lr, max_lr, step_size, anneal_start_epoch, last_epoch=-1):
        self.base_lr = base_lr
        self.max_lr = max_lr
        self.step_size = step_size
        self.anneal_start_epoch = anneal_start_epoch
        self.ramp_down_start_epoch = anneal_start_epoch + step_size
        super(TrapezoidalLR, self).__init__(optimizer, last_epoch)

    def get_lr(self):
        if self.last_epoch < self.step_size:
            # Ramp up phase
            lr = [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 phase
            lr = [self.max_lr for _ in self.base_lrs]
        elif self.last_epoch < self.ramp_down_start_epoch:
            # Ramp down phase
            progress = (self.last_epoch - self.anneal_start_epoch) / self.step_size
            lr = [self.max_lr - (self.max_lr - self.base_lr) * progress for base_lr in self.base_lrs]
        else:
            # After training
            lr = [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 OneCycleLR

model = ... # 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 update
        scheduler.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

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

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

相关文章

非计算机专业考软考高项有必要吗?

我认为这非常重要。 看了你的介绍&#xff0c;如果你已经考取了会计证书&#xff0c;而且想要考取计算机专业的证书&#xff0c;或者你的职业规划涉及到计算机岗位&#xff0c;又或者你对计算机感兴趣&#xff0c;我建议你优先考虑软考&#xff0c;因为这个证书的含金量是有保…

冯喜运:4.22晚间欧市支撑阻力:现货黄金+美原油走势及操作建议

【黄金消息面解析 】&#xff1a;周一(4月20日)欧市早盘&#xff0c;现货黄金短线加速跳水&#xff0c;金价目前跌向2350美元/盎司关口&#xff0c;日内崩跌逾40美元。美国定于周五公布的个人消费支出(PCE)物价指数预计将显示&#xff0c;3月PCE物价指数同比增幅将从2月份的2.5…

Linux 安装 Docker +Docker Compose + cucker/get_command_4_run_container

TIP&#xff1a;下面演示的 Linux 系统为 CentOS 7.9。 Docker 更新你的系统并安装必要的依赖项&#xff1a; sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加 Docker 的官方仓库&#xff1a; sudo yum-config-manager --add-rep…

什么是 PCIe 及其工作原理?

什么是外围组件互连 Express (PCIe)&#xff1f; 外围组件互连 Express (PCIe) 是一种高速串行计算机扩展总线标准&#xff0c;可将设备连接到主板。 它于 2004 年首次推出&#xff0c;作为以前 PCI 和 AGP 方式的替代。 PCIe 允许处理器和各种扩展卡&#xff08;例如显卡、声…

上市公司数字化转型速度测-含代码及原始数据(2000-2022年)

数据来源&#xff1a;Wind数据库、企业年报时间跨度&#xff1a;2000-2022年 其中吴非、赵宸宇版本的数据是从2000到2022年&#xff1b;袁淳版本和李瑛玫版本的数据均是从2001-2022年。数据范围&#xff1a;上市公司数据指标&#xff1a;计算了三份测算数字化转型速度的数据。其…

关系抽取与属性补全

文章目录 实体关系抽取的任务定义机器学习框架属性补全 实体关系抽取的任务定义 从文本中抽取出两个或者多个实体之间的语义关系&#xff1b;从文本获取知识图谱三元组的主要技术手段&#xff0c;通常被用于知识图谱的补全。美丽的西湖坐落于浙江省的省会城市杭州的西南面。&am…

基于SSM+Jsp+Mysql的文物管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

可视化大屏可不是花架子,绝对有实用价值。

Hello&#xff0c;我是大千UI工场&#xff0c;不少老铁觉得可视化大屏就是花架子&#xff0c;是取悦领导的&#xff0c;那真是不懂可视化大屏的价值。欢迎友友们关注、评论&#xff0c;如果有订单可私信。 可视化大屏并不是花架子&#xff0c;而是一种实际有效的工具&#xff0…

实战|哈尔滨等保2.0 Linux主机测评过程之身份鉴别

一、身份鉴别 a)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换。 输入 more /etc/shadow,得知系统所有用户&#xff0c;此语句字段格式有九段。 第一字段&#xff1a;用户名&#xff08;也被称为登录名…

Webpack-

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

C语言本身不难,难得是应用场景很多

你学了C语言多半是要做项目的&#xff0c;这个过程中C语言是远远不够的&#xff0c;你把这部分难度加到C语言上&#xff0c;自然就难了在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区…

基于51单片机智能窗帘仿真设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机智能窗帘仿真设计( proteus仿真程序设计报告讲解视频&#xff09; 基于51单片机智能窗帘仿真设计 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 仿真图proteus8.9及以上…

一线实战,一次底层超融合故障导致的Oracle异常恢复

背景概述 某客户数据由于底层超融合故障导致数据库产生有大量的坏块&#xff0c;最终导致数据库宕机&#xff0c;通过数据抢救&#xff0c;恢复了全部的数据。下面是详细的故障分析诊断过程&#xff0c;以及详细的解决方案描述&#xff1a; 故障现象 数据库宕机之后&#xff0c…

Shell和Linux权限

目录 shell Liunx权限 用户 sudo Linux的权限管理 文件访问者的分类 文件的属性 文件的权限 文件全权限值的表示方法 1.字符表示 2.八进制数值表示 用户符号 修改文件访问权限 修改文件拥有者 修改拥有者和所属组 修改所属组 文件目录的权限的含义 问题 粘滞…

【C++航海王:追寻罗杰的编程之路】C++11(中)

目录 C11(上) 1 -> STL中的一些变化 2 -> 右值引用和移动语义 2.1 -> 左值引用和右值引用 2.2 -> 左值引用与右值引用比较 2.3 -> 右值引用使用场景与意义 2.4 -> 右值引用引用左值及其更深入的使用场景分析 2.5 -> 完美转发 C11(上) 1 -> STL…

边缘计算智能分析网关V4地面垃圾AI检测算法介绍及场景应用

在传统的卫生监管场景中&#xff0c;无法及时发现地面遗留的垃圾&#xff0c;通过人工巡逻的方式需要大量的人力、物力和时间&#xff0c;而且效率不高&#xff0c;并存在一定的滞后性&#xff0c;而采用地面垃圾AI检测算法则可以大大提高监管效率。 TSINGSEE青犀AI智能分析网…

“磁性蝴蝶”:创新结构纳米石墨烯能更精确控制自旋磁行为

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 深度好文&#xff1a;1300字丨7分钟阅读 摘要&#xff1a;新加坡国立大学的研究团队&#xff0c;开发出一种蝴蝶形磁性纳米石墨烯&#xff0c;包含四个具有铁磁和反铁磁相互作用的不…

视频号怎么开小店?这些必备材料,准备齐全再开店才不踩坑

大家好&#xff0c;我是电商笨笨熊 视频号小店作为今年的电商黑马&#xff0c;自是吸引着不少玩家&#xff1b; 但是开通视频号小店是需要一定门槛的&#xff0c;且与其他电商平台不同&#xff0c;因此拿着其他平台的玩法来做视频号&#xff0c;多半从开店起就会“翻车”。 …

【C++】priority_queue(优先级队列介绍、仿函数控制大堆小堆、模拟实现)

一、优先级队列 1.1介绍 优先级队列&#xff08;Priority Queue&#xff09;是一种特殊的数据结构&#xff0c;其并不满足队列先进先出的原则&#xff0c;它结合了队列和堆的特点&#xff0c;允许我们在其中插入元素&#xff0c;并且能够保证任何时候提取出的元素都是当前队列…

有公网IP,如何设置端口映射实现访问?

很多中小型公司或个人会根据自身需求自建服务器&#xff0c;或者将自己内网的服务、应用发布到外网&#xff0c;实现异地访问&#xff0c;如远程桌面、网站、数据库、公司的管理系统、FTP、管家婆、监控系统等等。 没接触过的人可能会觉得这个很难&#xff0c;实际上使用快解析…