pytorch优化器详解

news2024/10/7 14:27:37

1 什么是优化器

1.1 优化器介绍

在PyTorch中,优化器(Optimizer)是用于更新神经网络参数的工具。它根据计算得到的损失函数的梯度来调整模型的参数,以最小化损失函数并改善模型的性能。

即优化器是一种特定的机器学习算法,通常用于在训练深度学习模型时调整权重和偏差。是用于更新神经网络参数以最小化某个损失函数的方法。它通过不断更新模型的参数来实现这一目的。

优化器通常用于深度学习模型,因为这些模型通常具有大量可训练参数,并且需要大量数据和计算来优化。优化器通过不断更新模型的参数来拟合训练数据,从而使模型在新数据上表现良好。

1.2 优化器如何工作

在模型训练过程中,在损失函数中会得到一个loss值,即模型输出与真实值之间的一个差异

对于loss值我们通常会采取pytorch中的自动求导autograd模块去求取模型当中的参数的梯度grad

优化器拿到梯度grad后,进行一系列的优化策略去更新模型参数,使得loss值不断下降

 1.3 导数、方向导数与梯度

学习参数通常是指权值或者偏置bias,更新的策略在神经网络中通常都会采用梯度下降方法。

  • 方向导数

两个自变量x,y,输出值为z可以认为是山坡的高度。多元函数的导数都是偏导,对x的偏导就是,固定y,求在x方向上的变化率;而方向有无穷多个,不仅仅x、y方向上有变化率,其他方向任意方向上都有变化率

  • 梯度是一个向量,它向量的方向是使得方向导数最大的那个方向

梯度的方向为方向导数变化率最大的方向(方向为使得方向导数取得最大值的方向),朝着斜坡最陡峭的地方去。模长即为方向导数的值,即为方向导数的变化率。梯度就是在当前这个点增长最快的一个方向,模长就是增长的速度。梯度的负方向就是下降最快的。
 

2 优化器的属性与方法

为实现管理并更新模型中可学习参数的值,使得模型输出更接近真实标签,线面是优化器中的核心概念

  • 导数:函数在指定坐标轴上的变化率
  • 方向导数:指定方向上的变化率
  • 梯度:一个向量,方向为方向导数取得最大值的方向
  • 梯度下降:朝着梯度下降的负方向去变化,下降是最快的

2.1 基本属性

  • defaults里面是基本的超参数:lr、momentum、dampending、weight_decay、nesterov等,用字典打包;
  • state没有训练时为空;
  • param_groups是一个list,list中每一个元素是一个字典,字典中的'params'才是我们真正的参数,'params'里面的数据又是一个list,list中的一个元素又是一组参数
  • params里面的内容为网络的可学习参数,比如,00表示第一个卷积层权重,01表示bias
  • _step_count记录更新次数,以便于调整训练策略,例如每更新100次参数,对学习率调整一下

2.2 基本方法

  • zero_grad()

在每一次反向传播过程中,需要对梯度张量进行清零,因为pytorch张量梯度不能自动清零,是累加的。

  • step()

执行,对参数进行更新。优化器保存的权值地址和真实权值的地址是一样的,说明优化器是通过地址去寻找权值

  • add_param_group()

通过参数组param_groups的概念来设置不同的参数有不同的学习率,在模型的fineturn中非常实用

  • state_dict() 与 load_state_dict()

state_dict()和load_state_dict()用于保存模型信息和加载模型信息,用于模型断点的续训练,一般在10个epoch或50个epoch的时候要保存当前的状态信息;

state_dict()返回两个字典,一个state用于保存缓存信息packed_state和一个param_groups;

load_state_dict()用于接收一个state_dict放在优化器中;

3 典型的优化器

3.1 SGD(Stochastic Gradient Descent)

3.1.1 思想

SGD是一种经典的优化器,用于优化模型的参数。SGD的基本思想是,通过梯度下降的方法,不断调整模型的参数,使模型的损失函数最小化。SGD的优点是实现简单、效率高,缺点是收敛速度慢、容易陷入局部最小值。

3.1.2 数学表达

通过如下的方式来更新模型的参数:

 3.1.3 实际使用

在PyTorch中,可以使用torch.optim.SGD类来实现SGD。

# 定义模型
model = ...

# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 训练模型
for inputs, labels in dataset:
    # 计算损失函数
    outputs = model(inputs)
    loss = ...

    # 计算梯度
    optimizer.zero_grad()
    loss.backward()

    # 更新参数
    optimizer.step()

本实例中首先定义了模型,然后定义了SGD优化器,并指定了学习率为0.1。接着,通过循环迭代数据集,计算损失函数和梯度,并更新模型的参数。通过这样的方式,就可以在PyTorch中使用SGD来训练模型了。

3.2 Adam(Adaptive Moment Estimation)

3.2.1 思想

Adam是一种近似于随机梯度下降的优化器,用于优化模型的参数。Adam的基本思想是,通过维护模型的梯度和梯度平方的一阶动量和二阶动量,来调整模型的参数。Adam的优点是计算效率高,收敛速度快,缺点是需要调整超参数。

3.2.2 数学表达

通过如下的方式来更新模型的参数:

3.2.3 实际使用

在PyTorch中,可以使用torch.optim.Adam类来实现Adam。

# 定义模型
model = ...

# 定义优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.1, betas=(0.9, 0.999))

# 训练模型
for inputs, labels in dataset:
    # 计算损失函数
    outputs = model(inputs)
    loss = ...

    # 计算梯度
    optimizer.zero_grad()
    loss.backward()

    # 更新参数
    optimizer.step()

本实例中首先定义了模型,然后定义了Adam优化器,并指定了学习率为0.1, β1​和β2的值分别为0.9和0.999。接着,通过循环迭代数据集,计算损失函数和梯度,并更新模型的参数。通过这样的方式,就可以在PyTorch中使用Adam来训练模型了。

3.3 RMSprop(Root Mean Square Propagation)

3.3.1 思想

RMSprop是一种改进的随机梯度下降优化器,用于优化模型的参数。RMSprop的基本思想是,通过维护模型的梯度平方的指数加权平均,来调整模型的参数。RMSprop的优点是收敛速度快,缺点是计算复杂度高,需要调整超参数。

3.3.2 数学表达

具体来说,RMSprop优化算法的公式如下:

3.3.3 实际使用

在PyTorch中,可以使用torch.optim.Adam类来实现Adam。

import torch

# 定义模型
model = MyModel()

# 如果可用则model移至GPU
if torch.cuda.is_available():
    model = model.cuda()

# 设定训练模式
model.train()
# 定义 RMSprop 优化器
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)

# 循环训练
for input, target in dataset:
    # 如果可用则将input、target移至GPU
    if torch.cuda.is_available():
        input = input.cuda()
        target = target.cuda()

    # 前向传递:通过将输入传递给模型来计算预测输出
    output = model(input)

    # 计算损失
    loss = loss_fn(output, target)

    # 清除所有优化变量的梯度
    optimizer.zero_grad()

    # 反向传递:计算损失相对于模型参数的梯度
    loss.backward()

    # 执行单个优化步骤(参数更新)
    optimizer.step()

本实例中首先定义了模型,并将其转换为训练模式。然后定义了RMSprop优化器,并指定了要优化的模型参数,学习率为0.1, α的值为0.9。接着通过循环迭代数据集,计算损失函数和梯度,并更新模型的参数。通过这样的方式,就可以在PyTorch中使用RMSprop来训练模型了。

4 优化器的选择

除了上面提到的三种优化器,PyTorch还提供了多种优化器,比如Adadelta、Adagrad、AdamW、SparseAdam等。选择优化器时需要根据实际情况和需求进行综合考虑,以下是可参考的点:

  • 优化器的收敛速度和稳定性:不同的优化器在收敛速度和稳定性方面表现不同。一般来说,随机梯度下降(SGD)和Adam具有较快的收敛速度,而动量(Momentum)和Adagrad则具有较好的稳定性。
  • 优化器对数据集的处理能力:对于大规模数据集,SGD或Mini-batch SGD可能更合适,因为它们可以更好地处理大量数据,且计算成本较低。对于小规模数据集,Adam或其变体可能是一个更好的选择。
  • 优化器对模型复杂度的处理能力:如果模型具有很多局部最小值或鞍点,动量优化器或其变体(如Nadam或AMSGrad)可能更好,因为它们可以在这些情况下提高稳定性。
  • 优化器的适用场景:如果处理的是序列数据,自适应优化器,如RMSprop或Adagrad可能更好,因为它们可以更好地处理时间序列数据的稀疏性。
  • 优化器的参数设置:不同的优化器具有不同的参数设置,如学习率、动量等。选择合适的参数设置可以显著提高模型的训练效果。

可以通过试验不同的优化器和调整参数来找到最适合的优化器。

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

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

相关文章

2014年计网408

第一题 在 OSI 参考模型中, 直接为会话层提供服务的是()A. 应用层B. 表示层C. 传输层D. 网络层 运输层是会话层的相邻下层,它为会话层直接提供服务。运输层也称为传输层。 第二题 某以太网拓扑及交换机当前转发表如下图所示, 主机 00-e1-d5-00-23-a1 向主机 00−…

Postman小白安装和注册入门教程

近期在复习Postman的基础知识,在小破站上跟着百里老师系统复习了一遍,也做了一些笔记,希望可以给大家一点点启发。 一)安装 访问官网https://www.getpostman.com/downloads/,直接下载安装。 二)注册和登录…

金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体

文章目录 金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体父窗体打开子窗体准备设置携带参数打开子窗体子窗体接收参数 金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体 父窗体打开子窗体准备 BillShowParameter OtherInAdd n…

使用PE U盘在VM Workstation中安装系统

VM Workstation中虚拟机的启动项如下图,发现不能支持U盘启动,需要使用PE盘在虚拟机中安装系统怎么办呢! 喜欢使用ISO镜像安装系统的小伙伴可以放弃这种方法了。但是这种方法可以测试你的PE盘是否正常工作,模拟在物理服务器上的安…

十进制转换成2进制

十进制转换成2进制 参考链接:https://blog.csdn.net/qq_44755403/article/details/89279970?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169960944816800227457337%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id…

Zabbix深入解析与实战

1.Zabbix 1.1.监控概述 监控是指对行为、活动或其他变动中信息的一种持续性关注,通常是为了对人达成影响、管理、指导或保护的目的 监控 监视主机架构状态控制,事后追责目标:早发现早处理(故障、性能、架构) 网站扩容(用数据说话) 为什么要…

OC-编译错误

明明包含了头文件,但是还是显示未知的类型 可能这个头文件被某个宏包住了 #if defined(__cplusplus) 在 C 代码中包含了一个 C 的头文件会显示这个错误“the util lib only be used in c”,此时用 #if defined(__cplusplus) #endif 包一下就行了&…

行情分析——加密货币市场大盘走势(11.10)

大饼今日继续上涨,正如预期,跌不下来,思路就是逢低做多。现在已经上涨到36500附近,目前从MACD日线来看,后续还要继续上涨,当然稳健的可以不做。昨日的策略已经达到止盈,也是顺利的落袋为安啦。一…

TCC分布式事务----以Hmily框架为例

插曲:RocketMQ的Half Message 先引入一个插曲,RocketMQ为什么要有Half Message 为什么不在本地事务提交之后,直接发一个commit消息不就行了,为什么还要先发一个可以撤回的、不能被消费的half message,再执行本地事务…

FindMy网络帮助您找到电动车

随着科技的发展,我们的生活变得越来越智能化。而现在,这项技术已经深入到了我们的出行方式中。如果你是一位电动车主,那么你可能会遇到一个常见的问题:忘记你的电动车停在了哪里。这种情况在日常生活中时有发生,而现在…

磁盘的分区、格式化、检验与挂载 ---- fdisk,mkfs,mount

磁盘的分区、格式化、检验与挂载 磁盘管理是非常重要的,当我们想要再系统里面新增一块磁盘使用时,应执行如下几步: 对磁盘进行划分,以建立可用的硬盘分区 (fdisk / gdisk)对硬盘分区进行格式化&#xff0…

【微信公众号开发】1.1 微信公众号开发课程内容介绍

一、微信公众号介绍 1、公众号类型及基本介绍 服务号、订阅号、小程序之间的关联及区别 2、编辑模式的使用 非开发者使用微信公众号的方式,通过微信公众号提供的平台来编辑 3、开发模式及预备知识介绍 如果我们不想使用默认的编辑模式,可以在具备一…

首周 Web3 开发者激励开启!数据与钱包新锐派送福利

如何在 Web3 时代汇聚更多开发者的力量,寻找全新的技术发展机遇和突破点?打造生态繁荣、高度协作的社区生态是不二路径。现在,一系列更为开放、活跃、包容的开发者社区活动正向大家发起邀请,你确定不来看看吗? 为了吸…

Power Automate-创建审批流

提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表,再点击添加新步骤 搜索审批,点击进入 操作里的选项区别: 1)创建审批:创建一个审批任务 2)等待审批&…

【Linux】 mdir命令使用

mdir 为mtools工具指令,模拟MS-DOS的dir指令,可显示MS-DOS文件系统中的目录内容。 语法 mdir [参数][目录] mdir命令 -Linux手册页 命令选项及作用 执行令 mdir--help 执行命令结果 参数 -a  显示隐藏文件。-f  不显示磁盘所剩余的可用空间。-w…

踹他GPT 之 弄个大乐透助手

11月7日凌晨的OpenAI第一次开发者大会,除了速度提升、服务使用费用的减少、开发者生态以外,最让我震撼的是,GPTS是ChatGPT的定制版本,是通过简单配置就可以完成一个使用ChatGPT、集成系统和数据服务的智能助手。比如OpenAI开发者体…

用Go实现网络流量解析和行为检测引擎

1.前言 最近有个在学校读书的迷弟问我:大德德, 有没有这么一款软件, 能够批量读取多个抓包文件,并把我想要的数据呈现出来, 比如:源IP、目的IP、源mac地址、目的mac地址等等。我说:“这样的软件你要认真找真能找出不少开源软件, 但毕竟没有你自己的灵魂在里面,要不…

【Python】queue模块Queue对象

Python中的queue模块是一个同步队列类,实现了多生产者、多消费者队列,适用于在多线程之间安全地传递消息或其他数据。Queue提供了所有必需的锁定语义。 queue模块有三种类型的队列(只是队列中元素的提取顺序不同):先进…

小型洗衣机好用吗?最好用的迷你洗衣机

很多人会觉得小型洗衣机是智商税,没有必要专门买一个小型洗衣机来洗内衣,洗个内衣只需要两分钟的事情,需要花个几百块钱去入手一个洗衣机吗?然而清洗贴身衣物的并不是一件简单的事情,如果只是简单的搓洗,内…

Unity Mirror学习(一) SyncVars特性使用

官网中所说的网络对象,指的是挂了 NetworkIdentity组件的对象 官网中所说的玩家对象,指的是NetworkManager脚本上的PlayerPrefab预制体 这个概念对阅读官网文档很重要,我刚开始并不理解,走了歪路 SyncVars(同步变量&a…