《pytorch》——优化器的解析和使用

ops/2025/2/13 3:44:07/

优化器简介

在 PyTorch 中,优化器(Optimizer)是用于更新模型参数以最小化损失函数的关键组件。在机器学习和深度学习领域,优化器是一个至关重要的工具,主要用于在模型训练过程中更新模型的参数,其目标是最小化损失函数。

工作原理

在这里插入图片描述

优化器的作用

  • 提高训练效率:不同的优化算法能够更有效地搜索参数空间,找到使损失函数最小的参数值,从而减少训练所需的时间和计算资源。
  • 避免局部最优解:一些优化算法,如带有动量的 SGD 或 Adam 等,能够在一定程度上避免模型陷入局部最优解,从而找到更优的全局最优解。
  • 处理不同类型的数据:对于不同的数据集和任务,不同的优化器可能会有不同的表现。选择合适的优化器可以提高模型的泛化能力和性能。

常见优化器算法和优化器

随机梯度下降(SGD):

  • 原理:随机梯度下降是最基础的优化算法。它通过计算每个小批量数据的梯度来更新模型的参数。
  • 代码示例:
python">import torch
import torch.optim as optim
from torch import nn# 定义模型
model = nn.Linear(10, 1)
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
  • 参数说明:lr 是学习率,控制每次参数更新的步长;momentum 是动量参数,用于加速收敛,模拟物理中的动量概念。

Adagrad

  • 原理:Adagrad 算法根据每个参数的历史梯度平方和来调整学习率。对于经常更新的参数,它会减小学习率;对于不经常更新的参数,它会增大学习率。
  • 代码示例:
python">optimizer = optim.Adagrad(model.parameters(), lr=0.01)

Adadelta

  • 原理:Adadelta 是 Adagrad 的改进版本,它通过使用一个衰减的累积梯度平方和来代替 Adagrad 中的累积梯度平方和,从而避免了学习率过早衰减的问题。
  • 代码示例:
python">optimizer = optim.Adadelta(model.parameters(), lr=1.0)

RMSProp

  • 原理:RMSProp 也是 Adagrad 的改进算法,它通过引入一个衰减系数来控制历史梯度平方和的累积,使得学习率不会过早衰减。
  • 代码示例:
python">optimizer = optim.RMSProp(model.parameters(), lr=0.001, alpha=0.99)
  • 参数说明:alpha 是衰减系数,用于控制历史梯度平方和的衰减速度。

Adam

  • 原理:Adam(Adaptive Moment Estimation)结合了 Adagrad 善于处理稀疏梯度和 RMSProp 善于处理非平稳目标的优点。它计算梯度的一阶矩估计和二阶矩估计,并利用这些估计来动态调整每个参数的学习率。
  • 代码示例:
python">optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
  • 参数说明:betas 是用于计算一阶矩估计和二阶矩估计的系数。

AdamW

  • 原理:AdamW 是对 Adam 的改进,主要改进在于将权重衰减(L2 正则化)从损失函数中分离出来,直接应用于优化器的更新规则中,避免了传统 Adam 中权重衰减与梯度更新的耦合问题。
  • 代码示例:
python">optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
  • 参数说明:weight_decay 是权重衰减系数,用于控制模型参数的正则化强度。

自适应优化算法:

  • 如 Adagrad、Adadelta、RMSProp 和 Adam 等。这些算法会根据参数的不同特性自适应地调整学习率,以提高训练效率和模型性能。例如,Adam 算法结合了动量和自适应学习率的思想,在很多任务中表现出色。

http://www.ppmy.cn/ops/157948.html

相关文章

算法跟练第九弹——栈与队列

文章目录 part01 用栈实现队列part02 用队列实现栈part03 有效的括号part04 删除字符串中的所有相邻重复项归纳栈队列 跟着代码随想录刷题的第九天。 代码随想录链接:代码随想录 part01 用栈实现队列 题目链接:232.用栈实现队列 代码: class…

datasets: PyTorch version 2.5.1+cu124 available 这句话是什么意思

这句话的意思是: datasets:可能是 Python datasets 库的日志信息,说明它检测到了 PyTorch 的安装信息。PyTorch version 2.5.1cu124 available: PyTorch version 2.5.1:表示你的 PyTorch 版本是 2.5.1。cu124&#xf…

在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合

文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码(Positional Encoding)1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

【问题处理】【Mysql】mysqld进程CPU占用高排查思路

一、问题背景 Linux服务器CPU占用极高,经过排查,是mysqld占用了大部分的CPU资源。需要进一步排查是什么原因导致mysqld占用飙升。 因当前并没有大量正在执行的业务,所以初步排除业务量过大导致的Mysql资源飙升。 二、原因 Mysql服务端中可…

字符设备驱动开发

驱动就是获取外设、传感器数据和控制外设。数据会提交给应用程序。 Linux 驱动编译既要编写一个驱动,还要编写一个简单的测试应用程序。 而单片机下驱动和应用都是放在一个文件里,也就是杂在一块。而 Linux 则是分开了。 一、字符设备驱动开发流程 Lin…

黑马Redis详细笔记(实战篇---短信登录)

目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …

DeepAR:一种用于时间序列预测的深度学习模型

介绍 DeepAR是一种基于递归神经网络(RNN)的时间序列预测模型,由亚马逊在2017年提出。它特别适用于处理多变量时间序列数据,并能够生成概率预测。DeepAR通过联合训练多个相关时间序列来提高预测性能,从而在实际应用中表…