【知识】PyTorch中不同优化器的特点和使用

news2025/2/25 5:46:12

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

目录

1. SGD(随机梯度下降)

2. Adam(自适应矩估计)

3. AdamW

4. Adagrad

5. Adadelta

6. Adafactor

7. SparseAdam

8. Adamax

9. LBFGS

10. RMSprop

11. Rprop(弹性反向传播)

12. ASGD(平均随机梯度下降)

13. NAdam(Nesterov 加速自适应矩估计)

14. RAdam(修正 Adam)

15. Adafactor(自适应因子化梯度)

16. AMSGrad 

性能考虑

总结


torch.optim — PyTorch 2.6 documentation

1. SGD(随机梯度下降)

  • 用途:适用于小型到中型模型的基本优化。

  • 特点

    • 通过负梯度方向更新参数。

    • 可以包含动量(momentum)以加速学习并减少震荡。

    • 简单且广泛使用,但需要仔细调整学习率。

import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个简单的模型
model = nn.Linear(10, 1)  # 一个线性模型
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-4)

# 训练循环
for input, target in dataloader:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()

2. Adam(自适应矩估计)

  • 用途:深度学习模型,尤其是需要 L2 正则化时。

  • 特点

    • 根据一阶和二阶矩估计为每个参数计算自适应学习率。

    • 支持学习率衰减的无偏估计。

    • 通常在适当设置下比 SGD 收敛更快。

optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.0, amsgrad=False)

3. AdamW

  • 用途:迁移学习、视觉任务,以及权重衰减关键的场景。

  • 特点

    • 将权重衰减与梯度解耦,使其更有效。

    • 在某些场景下性能超过 Adam 和 SGD。

optimizer = optim.AdamW(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01)

4. Adagrad

  • 用途:处理稀疏数据,例如自然语言处理或图像识别。

  • 特点

    • 累积之前的平方梯度以调整学习率。

    • 随着训练的进行,学习率单调递减,有助于收敛。

optimizer = optim.Adagrad(model.parameters(), lr=0.01, lr_decay=0.0, weight_decay=0.0, initial_accumulator_value=0.0, eps=1e-10)

5. Adadelta

  • 用途:文本数据处理和图像分类。

  • 特点

    • 通过使用窗口和解决 Adagrad 的学习率递减问题。

    • 维护平方梯度和平方参数更新的运行平均值。

optimizer = optim.Adadelta(model.parameters(), lr=1.0, rho=0.9, eps=1e-06, weight_decay=0.0)

6. Adafactor

  • 用途:大规模模型、大批量或长序列(例如深度学习在网页文本语料库上的应用)。

  • 特点

    • 通过使用近似值替换二阶矩来减少计算开销。

    • 专为非常大的模型设计,不会增加训练时间。

optimizer = optim.Adafactor(model.parameters(), lr=0.05, eps=(1e-30, 1e-3), clip_threshold=1.0, decay_rate=-0.8, beta1=None, weight_decay=0.0, scale_parameter=True, relative_step=True, warmup_init=False)

7. SparseAdam

  • 用途:具有稀疏梯度数据的模型,例如 NLP 中的嵌入层。

  • 特点

    • 优化稀疏张量更新;结合 SparseAdam 用于密集张量和 Adagrad 用于稀疏更新。

    • 专为具有许多零值的参数设计。

optimizer = optim.SparseAdam(model.sparse_parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08)

8. Adamax

  • 用途:类似于 Adam,但基于无穷范数,某些问题上更稳定。

  • 特点

    • 使用过去梯度的最大值而不是平均值。

optimizer = optim.Adamax(model.parameters(), lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.0)

9. LBFGS

  • 用途:无约束优化问题、回归以及需要二阶信息的问题。

  • 特点

    • 使用梯度评估近似海森矩阵的拟牛顿方法。

    • 比 SGD 或 Adam 需要更多内存和计算资源。

optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)

# 使用 LBFGS 需要提供一个闭包(closure)来重新评价模型
def closure():
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    return loss

optimizer.step(closure)

10. RMSprop

  • 用途:卷积神经网络和递归神经网络。

  • 特点

    • 维护平方梯度的运行平均值,并对参数更新进行归一化。

    • 解决 Adagrad 学习率单调递减的问题。

optimizer = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0.0, momentum=0.0, centered=False)

11. Rprop(弹性反向传播)

  • 用途:神经网络中梯度大小不重要的场景。

  • 特点

    • 仅使用梯度的符号来更新参数,根据梯度符号变化调整学习率。

optimizer = optim.Rprop(model.parameters(), lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50.0))

12. ASGD(平均随机梯度下降)

  • 用途:促进某些模型的泛化。

  • 特点

    • 维护优化过程中遇到的参数的运行平均值。

optimizer = optim.ASGD(model.parameters(), lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0.0)

13. NAdam(Nesterov 加速自适应矩估计)

  • 用途:结合 Nesterov 动量和 Adam。

  • 特点

    • 结合 Nesterov 加速梯度(NAG)以提供更稳定的收敛。

optimizer = optim.NAdam(model.parameters(), lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.0, momentum_decay=0.004)

14. RAdam(修正 Adam)

  • 用途:需要自适应学习率但希望减少方差的场景。

  • 特点

    • 根据梯度方差动态调整学习率。

optimizer = optim.RAdam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.0)

15. Adafactor(自适应因子化梯度)

  • 用途:大规模模型的内存高效优化。

  • 特点

    • 通过将大梯度分解为小成分来减少内存使用。

optimizer = optim.Adafactor(model.parameters(), lr=0.3, eps=(1e-30, 1e-3), clip_threshold=1.0, decay_rate=-0.8, beta1=None, weight_decay=0.0, scale_parameter=True, relative_step=True, warmup_init=False)

16. AMSGrad 

  • 用途: Adam 优化器的一种改进版本,旨在解决 Adam 在某些情况下可能不收敛的问题。它通过保留梯度的历史信息来防止学习率过早下降,从而提高训练的稳定性和收敛性。
  • 特点
    • 自适应学习率:AMSGrad 自适应地调整学习率,以便更好地训练神经网络。

    • 防止震荡:它可以防止 Adam 算法中的震荡现象,从而提高训练效果。

    • 改进收敛性:通过优化二阶动量,避免了 Adam 算法可能遭遇的收敛问题,特别适合长时间训练或解决深层网络难题。

# 初始化 AMSGrad 优化器,通过amsgrad参数设置
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=True)

性能考虑

  • 这些优化器的性能可能因硬件和问题的性质而异。PyTorch 将优化器分为以下几类:

    • For-loop:基本实现,但由于内核调用较慢。

    • Foreach:使用多张量操作以加快处理速度。

    • Fused:将步骤合并为单个内核以实现最大速度。

总结

  • 选择优化器取决于问题的复杂性、数据的稀疏性和硬件的可用性。像 Adam 或 AdamW 这样的自适应算法因其通用有效性而被广泛使用,而像 SGD 这样的简单方法在适当调整超参数时是最优的。

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

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

相关文章

AI智算-k8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略

k8sSGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略 前言环境准备1. 模型下载2.软硬件环境介绍 正式部署1. 部署LWS API2. 通过 LWS 部署DeepSeek-r1模型3. 查看显存占用情况4. 服务对外暴露5. 测试部署效果5.1 通过 curl5.2 通过 OpenWebUIa. 部署 Ope…

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入:小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛:“美食图像识别”。参赛者需要训练计算机,看一张食物照片(例如披萨、苹果、汉堡等),就能猜出这是什么食物。听起来…

sql的索引与性能优化相关

之前面试的时候,由于在简历上提到优化sql代码,老是会被问到sql索引和性能优化问题,用这个帖子学习记录一下。 1.为什么要用索引 ------------------------------------------------------------------------------------------------------…

碰撞检测 | 图解凸多边形分离轴定理(附ROS C++可视化)

目录 0 专栏介绍1 凸多边形碰撞检测2 多边形判凸算法3 分离轴定理(SAT)4 算法仿真与可视化4.1 核心算法4.2 仿真实验 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线…

计算机网络真题练习(高软29)

系列文章目录 计算机网络阶段练习 文章目录 系列文章目录前言一、真题练习总结 前言 计算机网络的阶段练习题,带解析答案。 一、真题练习 总结 就是高软笔记,大佬请略过!

DPVS-1:编译安装DPVS (ubuntu22.04)

操作系统 rootubuntu22:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy rootubuntu22:~# 前置软件准备 apt install git apt install meson apt install gcc ap…

EasyRTC:全平台支持与自研算法驱动的智能音视频通讯解决方案

在智能硬件的浪潮中,设备之间的互联互通已成为提升用户体验的核心需求。无论是智能家居、智能办公,还是工业物联网,高效的音视频通讯和交互能力是实现智能化的关键。然而,传统音视频解决方案往往面临平台兼容性差、交互体验不佳以…

Elasticsearch 自动补全搜索 - autocomplete

作者:来自 Elastic Amit Khandelwal 探索处理自动完成的不同方法,从基础到高级,包括输入时搜索、查询时间、完成建议器和索引时间。 在本文中,我们将介绍如何避免严重的性能错误、Elasticsearch 默认解决方案为何不适用以及重要的…

快速入门Springboot+vue——MybatisPlus多表查询及分页查询

学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:7.MybatisPlus多表查询及分页查询_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 多表查询 多表查询[Mybatis中的]:实现复杂关系映射,可以使…

工程师 - VSCode的AI编码插件介绍: MarsCode

豆包 MarsCode MarsCode AI: Coding Assistant Code and Innovate Faster with AI 豆包 MarsCode - 编程助手 安装完成并使能后,会在下方状态栏上显示MarsCode AI。 安装完并重启VSCode后,要使用这个插件,需要注册一下账号。然后授权VSCod…

VOS3000线路对接、路由配置与路由分析操作教程

一、VOS3000简介 VOS3000是一款常用的VoIP运营平台,支持多种线路对接和路由配置,适合新手快速上手。本教程将带你了解如何对接线路、配置路由以及进行路由分析。 二、线路对接 准备工作 获取线路信息:从供应商处获取线路的IP地址、端口、用…

学习Linux准备2

使用win10系统带的wsl配置ubuntu系统,通过wsl功能我们可以更简单更轻松的获得Linux系统环境。 首先开启Windows自带的wsl功能 打开控制面板,选中启用或关闭Windows功能 这里我们点击进入 将上图红√点击上,点击确定,然后重新启动…

四、综合案例(Unity2D)

一、2D渲染 1、2D相机基本设置 上面是透视,下面是正交 2、图片资源 在Unity中,常规图片导入之后,一般不在Unity中直接使用,而是转为精灵图Sprite 将图片更改为即可使用Unity内置的图片切割功能 无论精灵图片是单个的还是多个的…

Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现

Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作,使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案&#xff0…

Golang | 每日一练 (3)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Golang | 每日一练 (3)题目参考答案map 实现原理hmapb…

Docker入门及基本概念

让我们从最基础的概念开始逐步理解。假设你已经准备好了docker 环境。 第一步,让我们先通过实际操作来看看当前系统中的镜像(images)和容器(containers)状态: docker images # 查看所有镜像 docker ps -a # 查看所有容器(包括未运行…

设备唯一ID获取,支持安卓/iOS/鸿蒙Next(uni-device-id)UTS插件

设备唯一ID获取 支持安卓/iOS/鸿蒙(uni-device-id)UTS插件 介绍 获取设备唯一ID、设备唯一标识,支持安卓(AndroidId/OAID/IMEI/MEID/MacAddress/Serial/UUID/设备基础信息),iOS(Identifier/UUID),鸿蒙&am…

基于Springboot医院预约挂号小程序系统【附源码】

基于Springboot医院预约挂号小程序系统 效果如下: 小程序主页面 帖子页面 医生账号页面 留言内容页面 管理员主页面 用户管理页面 我的挂号页面 医生管理页面 研究背景 随着信息技术的飞速发展和互联网医疗的兴起,传统的医疗服务模式正面临着深刻的变…

如何手动设置u-boot的以太网的IP地址、子网掩码、网关信息、TFTP的服务器地址,并进行测试

设置IP地址 运行下面这条命令设置u-boot的以太网的IP地址: setenv ipaddr 192.168.5.9设置子网掩码 运行下面这条命令设置u-boot的以太网的子网掩码: setenv netmask 255.255.255.0设置网关信息 运行下面这条命令设置u-boot的网关信息: …