pytorch优化器详解

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移至GPUif 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.rhkb.cn/news/186756.html

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

相关文章

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

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

javaScript爬虫程序抓取评论

由于评论区目前没有开放的API接口,所以我们不能直接通过编程获取到评论区的内容。但是,我们可以通过模拟浏览器的行为来实现这个功能。以下是一个使用Python的requests库和BeautifulSoup库来实现这个功能的基本思路: import requests from bs…

服务器往客户端发送字符串的网络编程

服务器主要就是能够打开命令行提供的网络端口&#xff0c;然后一有客户端连接上&#xff0c;就会向客户端发送Welcome to Our Server!这段话。 服务器代码serverSayWelcome.c的代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.…

MySQL库的库操作指南

1.创建数据库 一般格式&#xff1a;create database (if not exists) database1_name,database2_name...... 特殊形式&#xff1a; create database charset harset_name collate collate_name 解释&#xff1a; 红色字是用户自己设置的名称charset&#xff1a;指定数据…

网络安全——

文章目录 网络安全TCP/IP与网络安全网络安全构成要素加密技术基础 网络安全 TCP/IP与网络安全 起初&#xff0c;TCP/IP只用于一个相对封闭的环境&#xff0c;之后才发展为并无太多限制、可以从远程访问更多资源的形式。因此&#xff0c;“安全”这个概念并没有引起人们太多的…

FL Studio21.2宿主软件中文免费版下载

纵观当下宿主软件市场&#xff0c;正值百家争鸣、百花齐放之际像Mac系统的Logic Pro X、传统宿主软件代表Cubase、录音师必备Pro Tools、后起之秀Studio One等&#xff0c;都在各自的领域具有极高的好评度。而在众多宿主软件中&#xff0c;有这么一款历久弥新且长盛不衰的独特宿…

Linux应用开发基础知识——Framebuffer 应用编程(四)

前言&#xff1a; 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意 思&#xff0c;buffer 是缓冲的意思&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着 一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值&#xff0c;假设…

【云栖2023】王峰:开源大数据平台3.0技术解读

本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;王峰 | 阿里云研究员&#xff0c;阿里云计算平台事业部开源大数据平台负责人 演讲主题&#xff1a;开源大数据平台3.0技术解读 实时化与Serverless是开源大数据3.0时代的必然选…

【亚马逊云科技产品测评】活动征文|10分钟拥有一台AWS Linux系统

前言 在数字化时代&#xff0c;AWS云服务扮演着至关重要的角色。AWS&#xff08;Amazon Web Services&#xff09;是亚马逊公司旗下的云计算服务平台&#xff0c;为全球各地的企业、组织和个人开发者提供了一系列广泛而深入的云服务。 在AWS云服务中&#xff0c;计算、存储、数…

flink1.18.0 sql-client报错

报错 Flink SQL> select * from t1; [ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: Could not find any factory for identifier kafka that implements org.apache.flink.table.factories.DynamicTableFactory in t…

小程序如何部署SSL证书

微信小程序开发前提必须拥有一本SSL证书&#xff0c;办理SSL证书之前确保好指定的微信小程序开发接口使用的域名&#xff0c;如果没有域名的提前申请好&#xff0c;并且到国内服务器提供商去办理备案。 了解微信小程序使用SSL证书的作用&#xff0c;包括以下三个方面&#xff1…

Mabitys总结

一、ORM ORM(Object/Relation Mapping)&#xff0c;中文名称&#xff1a;对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。 使用JDBC技术时&#xff0c;手动实现ORM映射&#xff1a; 使用ORM时&#xff0c;自动关系映射&#xff1a; &am…

<C++> list模拟实现

目录 前言 一、list的使用 1. list的构造函数 2. list iterator的使用 3. list capacity 4. list modifiers 5. list的算法 1. unique​ 2. sort 3. merge 4. remove 5. splice 二、list模拟实现 1. 设置节点类 && list类 2. push_back 3. 迭代器 重载 * 重载前置 …

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

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

基于安卓android微信小程序的物流仓储系统

项目介绍 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对物流仓储系统进行需求分析&#xff0c;得出物流仓储系统主要功能。接着对物流仓储系统进行总体设计和详细…

安科瑞故障电弧探测器在建筑电气的设计与应用

安科瑞 崔丽洁 【摘要】&#xff1a;电气设备是建筑中不可缺少的一部分&#xff0c;具有较为重要的作用和意义&#xff0c;在应用过程中不仅能够提升建筑本身实用性能&#xff0c;而且可为消费者提供更加优良的生活环境。但设备一旦在运行过程中出现故障&#xff0c;不仅会影响…

JDBC(二)

第4章 操作BLOB类型字段 4.1 MySQL BLOB类型 MySQL中&#xff0c;BLOB是一个二进制大型对象&#xff0c;是一个可以存储大量数据的容器&#xff0c;它能容纳不同大小的数据。 插入BLOB类型的数据必须使用PreparedStatement&#xff0c;因为BLOB类型的数据无法使用字符串拼接写…

Webpack 中 loader 的作用是什么?常用 loader 有哪些?

说说webpack中常见的Loader&#xff1f;解决了什么问题&#xff1f;- 题目详情 - 前端面试题宝典 1、loader 是什么 loader是 webpack 最重要的部分之一。 通过使用不同的 loader&#xff0c;我们能够调用外部的脚本或者工具&#xff0c;实现对不同格式文件的处理。 loader…

Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)

文章目录 AbstractIntroduction引入问题1&#xff09; Sample level imbalance2) Feature level imbalance3) Objective level imbalance进行解决贡献 Related Work&#xff08;他人的work&#xff0c;捎带与我们的对比&#xff09;Model architectures for object detection&a…

23个优秀开源免费BI仪表盘

BI也称为商业智能&#xff0c;是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识&#xff0c;以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…