深度学习--优化器篇(超详细付代码测试流程包含:SGD,SGDM,NAG,Adagrad,RMSProp,Adam,Adadelta,Nadam等常用优化器)

news2024/12/25 15:23:21

引言

  • 在深度学习过程中总会在代码中遇到优化器.Adam(),在上一篇实现卷积神经网络CNN的代码分析中也提到了优化器的概念,那么优化器如何通俗的理解呢?
  • 个人通俗理解(仅供参考):为梯度下降法配置的一个的"领航员",寻找模型最优解又要避免出现局部最优解,使之能快速高效的达到"目标"
  • 以下为使用chatgpt3.5的回答(仅供参考,还挺全乎,直接给我把本文要介绍的优化器优缺点都总结好了)

  • 优化器在pytorch的调用看这里: pytorch中文文档

介绍顺序:SGD -> SGDM -> NAG ->AdaGrad -> RMSProp -> AdaDelta -> Adam -> Nadam

SGD( 随机梯度下降法)

  • 首先理解优化器要先懂得梯度下降法

  • 个人理解GD系列的通俗数学表达式(仅供参考)

    • α表示学习率,ΔT表示梯度(以下三种方法的ΔT代表含义并不一样)
    • GD:ΔT会在每输入一个样本就更新一次
    • BGD:ΔT会在批量输入数据之后才更新一次(也就是那个batchsize参数)
    • SGD:在批量的前提下,随机抽取一个样本更新ΔT
    • 以上三个都是在提升参数更新效率的方向上优化,但是都无法克服产生局部震荡,从而只是实现了局部最优解的问题
      W n e w = W o l d − α ∗ Δ T ( W o l d ) W_{new} = W_{old} - \alpha * ΔT(W_{old}) Wnew=WoldαΔT(Wold)
  • 更加详尽的解答见:参考资料1
    参考资料2

SGDM(带动量的SGD:SGD with momentum)

  • 关于加入动量
    • 理解1:为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。就像下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些,即使重力的作用下也会到底后继续往反方向"攀登一些高度" 参考资料3
  • SGDM的公式如下(进攻参考):
    • η为动量系数(一般取0.9) V为动量因子
    • 其他同SGD是一样的
    • 通俗理解原理就是:当更新本次参数的时候,动量因子会根据动量系数保留部分上次梯度,当梯度方向不发生变化那动量因子会加速更新(类比山谷就是陡坡加速到谷底即可),反之方向相反就要减速最好是直接跳过局部最优解的山谷,前往全部最优解的山谷
      V n e w = V o l d ∗ η − α ∗ Δ T ( W o l d ) V_{new} = V_{old}*\eta - \alpha * ΔT(W_{old}) Vnew=VoldηαΔT(Wold)
      W n e w = W o l d + V n e w W_{new} = W_{old} + V_{new} Wnew=Wold+Vnew

NAG(Nesterov Accelerated Gradient 加速梯度)

  • NAG其实是在SGD,SGDM的基础上进一步优化,通过提前"探路"让下降的更加"智能"

  • NGA中使用"下一步位置"也就是未来的梯度来替换当前位置梯度来完成"探路",如果下一步位置比当前更陡峭,那就提前"刹车"防止走不到坡底在动量的推动下跳上了另一个高坡从而错过全部最优解,这样就会比纯动量更加保险,就像在动量上加一个限速锁(emm,又不是太准确,上面的η反倒更像限速锁)防止走的太快

  • 那么未来梯度怎么计算呢?
    W n e w = V o l d ∗ η − α ∗ Δ T ( W o l d ) + W o l d W_{new} = V_{old}*\eta - \alpha * ΔT(W_{old}) + W_{old} Wnew=VoldηαΔT(Wold)+Wold

  • 在SGD计算公式中,其实alpha * ΔT是一个很小的值,因为梯度下降时候学习率太大也就是步子太大会错过最优点所以一般设置学习率都比较小(即使会导致下降的很慢但是不容易错过最优解呀),那么这就决定了上面的乘积结果不会太大,我们就近似得到未来位置的W值
    W f e a t u r e = V o l d ∗ η + W o l d W_{feature} = V_{old}*\eta + W_{old} Wfeature=Voldη+Wold

  • 那我们用未来W值再去计算V_new就可以实现在急速的梯度变化的时候提前"适应",从而提高训练时候的稳定性(W_new依然是动量+W_old)

    • 图片仅供参考哈,不一定非常准确相对来说形象一些
      V n e w = V o l d ∗ η − α ∗ Δ T ( W f e a t u r e ) V_{new} = V_{old}*\eta - \alpha * ΔT(W_{feature}) Vnew=VoldηαΔT(Wfeature)

  • 关于SGD,SGDM,NAG优化器在Pytorch中已经封装到.SGD函数中了

class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]

  • lr:学习率(learning rate),控制每次参数更新的步长。默认值为0.001。
  • momentum:动量(momentum),加速SGD在相关方向上前进,抑制震荡。常常取值为0.9。若设为0,则为经典的SGD算法。
  • dampening:阻尼(dampening),用于防止动量的发散(η)。默认值为0。
  • weight_decay:权重衰减(weight decay),也称权重衰减(weight regularization),用于防止过拟合。默认值为0。
  • nesterov:采用Nesterov加速梯度法(Nesterov accelerated gradient,NAG)。默认值为False。
  • 最下方将使用上篇CNN代码篇代码替换优化器进行测试,效果可见测试结果 参考资料5
    参考资料6

Adagrad(Adaptive gradient algorithm)

  • 自适应梯度优化器(自适应学习率优化算法),优化的是学习率α

    • 如参考文章中所说的:深度学习模型中有大量参数(可以看上篇CNN原理介绍的时候就提过全连接神经网络随着层级和神经元的增加参数量成次方倍上升),但是不是所有的参数更新频率都是一致的,对于更新不频繁的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些;对于更新频繁的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些。
  • Adagrad引入一个新的概念就是对每个参数进行"缓存",来判断该参数更新的频率,该值是集合了直到当前点为止的梯度的平方

    • Adagrad的数学表达式:(学习率α可以看为全局初始学习率,真正的学习率有α/分母这一部分决定,ε为一个超级小的数来防止分母为0的)
    • Adagrad优化器的基本原理根据计算公式解释:如果权重进行了非常大的更新,那么其缓存值也将增加学习率将变得更小,随之权重的更新幅度会随时间而减少。反之如果权重没有进行任何重大更新,那么其缓存值将非常小学习率将提高,从而迫使其进行较大的更新
    • 优点:不需要人为的调节学习率,它可以自动调节;对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性;
    • 优点也同样会成为算法的缺点:无论权重过去的梯度如何,由于平方不能为负,因此缓存将始终增加一定的量。因此每个权重的学习率最终都会降低到非常低的值(会到0)以至于训练无法再有效进行(这样就引出了下一个优化器RMSProp)。
    • 注:很多参考资料会说明这个cache_{new}是一个对角阵,个人感觉通俗来讲可以暂且将其视为一个变量即可,因为深度学习算法原理计算基本都是矩阵的形式,待理解程度的加深后再做解释
      c a c h e n e w = c a c h e o l d + [ Δ T ( W o l d ) ] 2 cache_{new} =cache_{old} + [ΔT(W_{old})]^2 cachenew=cacheold+[ΔT(Wold)]2
      W n e w = W o l d − α c a c h e n e w + ϵ ∗ Δ T ( W o l d ) W_{new} = W_{old} - \frac{\alpha}{\sqrt{cache_{new} + \epsilon}} * ΔT(W_{old}) Wnew=Woldcachenew+ϵ αΔT(Wold)
  • 接口部分(一般取学习率为0.01)

torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)

RMSProp

  • RMSprop和下面要介绍的Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的

  • RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,以及增加一个新参数,衰减率参数γ,防止训练过程提前结束的问题

  • 同类型RMSProp数学表达式如下:(可能有错,进攻理解参考)
    c a c h e n e w = c a c h e o l d ∗ γ + ( 1 − γ ) ∗ [ Δ T ( W o l d ) ] 2 cache_{new} = cache_{old} * \gamma + (1- \gamma) * [ΔT(W_{old})]^2 cachenew=cacheoldγ+(1γ)[ΔT(Wold)]2
    W n e w = W o l d − α c a c h e n e w + ϵ ∗ Δ T ( W o l d ) W_{new} = W_{old} - \frac{\alpha}{\sqrt{cache_{new} + \epsilon}} * ΔT(W_{old}) Wnew=Woldcachenew+ϵ αΔT(Wold)

  • 其实上述公式这样的话是方便理解了,但是我觉得是瑕疵的,因为没有凸显出指数加权移动平均的作用,所以附上下面另一个表达式(下图是下面公式的参考公式)
    E ( c a c h e n e w 2 ) = E ( c a c h e o l d 2 ) ∗ γ + ( 1 − γ ) ∗ [ Δ T ( W o l d ) ] 2 E(cache_{new}^2) = E(cache_{old}^2) * \gamma + (1- \gamma) * [ΔT(W_{old})]^2 E(cachenew2)=E(cacheold2)γ+(1γ)[ΔT(Wold)]2
    W n e w = W o l d − α E ( c a c h e n e w 2 ) + ϵ ∗ Δ T ( W o l d ) W_{new} = W_{old} - \frac{\alpha}{\sqrt{E(cache_{new}^2) + \epsilon}} * ΔT(W_{old}) Wnew=WoldE(cachenew2)+ϵ αΔT(Wold)

  • 代码部分(γ一般取0.9,学习率η取0.001)

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

Adadelta

  • AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法属于是结合了两种算法更新参数的优点

  • 同样通俗数学公式为:

    • 从公式可以看出AdaDelta不需要设置一个默认的全局学习率
    • 在模型训练的初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。
    • 在模型训练的后期,模型会反复地在局部最小值附近抖动。
      Δ W A d a G r a d = − α c a c h e n e w + ϵ ∗ Δ T ( W o l d ) ΔW_{AdaGrad} = - \frac{\alpha}{\sqrt{cache_{new} + \epsilon}} * ΔT(W_{old}) ΔWAdaGrad=cachenew+ϵ αΔT(Wold)
      Δ W R M S p r o p = − α E ( c a c h e n e w 2 ) + ϵ ∗ Δ T ( W o l d ) ΔW_{RMSprop} = - \frac{\alpha}{\sqrt{E(cache_{new}^2) + \epsilon}} * ΔT(W_{old}) ΔWRMSprop=E(cachenew2)+ϵ αΔT(Wold)
      Δ W = − Δ W A d a G r a d Δ W R M S p r o p ΔW = - \frac{ΔW_{AdaGrad}}{ΔW_{RMSprop}} ΔW=ΔWRMSpropΔWAdaGrad
      W n e w = W o l d + Δ W W_{new} = W_{old} + ΔW Wnew=Wold+ΔW
  • 代码部分(γ一般设置为0.9)

torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

Adam(Adaptive Moment Estimation)

  • 前面SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量(其实就是那个平方项,很多参考资料称之为二阶动量),那么把一阶动量和二阶动量都用起来就是Adam的构成了,即:Adaptive(Adadelta, RMSProp,Adagrad) + Momentum。

  • 首先我们计算动量部分:(与之前的V_new表达式只是把学习率α换成了(1-β))
    m n e w = β 1 ∗ m o l d − ( 1 − β ) ∗ Δ T ( W o l d ) m_{new} = \beta1 * m_{old} - (1 - \beta) * ΔT(W_{old}) mnew=β1mold(1β)ΔT(Wold)

  • 接下来二阶动量(参数缓存)部分,结构一毛一样
    c a c h e n e w = c a c h e o l d ∗ β 2 + ( 1 − β 2 ) ∗ [ Δ T ( W o l d ) ] 2 cache_{new} = cache_{old} * \beta2 + (1- \beta2) * [ΔT(W_{old})]^2 cachenew=cacheoldβ2+(1β2)[ΔT(Wold)]2
    W n e w = W o l d − α c a c h e n e w + ϵ ∗ m n e w W_{new} = W_{old} - \frac{\alpha}{\sqrt{cache_{new} + \epsilon}} * m_{new} Wnew=Woldcachenew+ϵ αmnew

  • Adam通过计算动量来执行梯度的累积,而且我们还通过使用缓存不断地改变学习率。所以在神经网络中相对比较常用甚至是无脑选的感觉,Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。

  • 在Adam的论文中,建议的参数beta_1为0.9,beta_2为0.99,epsilon为1e-08 .

  • 补:其实真实场景是下图的方式,初始值都为0,需要进行修正后参数才可以使用

  • 代码部分(一般 β1 = 0.9,β2 = 0.999,ϵ = 10e−8)

torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)

Nadam(Nesterov-accelerated adaptive moment estimation)

  • Adam是融合了动量和缓存,但是还有一个NAG思想没用上,那么再融合NAG加速就是Nadma了,但是NAG思想是用下一个预测点来探路,但是在Nadam中并未使用而是在当前位置对当前梯度方向做两次更新
  • 参考上面Aadm的图示,看下图比对理解即可(由于个人理解也有点不太确定,所以仅供参考待后面理解更深再做修改解释)

  • 代码部分(该优化器貌似没有内置,仅供参考此处待以后如果用到再详细介绍)

torch.optim.NAdam(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, momentum_decay=0.004)

参考资料中都有一个各个优化器的动画图,这里也贴上(仅供参考)

优化器1
优化器2

  • 下面是学习时候见到的一个使用python实现各种优化器文章,代码个人并未测试,仅供参考
    使用python实现各个优化器

结尾:

  • 首先:关于本文中优化器的数学表达式,分成两种,一种是通俗形式(经供参考可能有错误),另一种是各种版本的数学表达式,相对比较抽象,也很费解,文中我会简单说明一下注意甄别,个人感觉由于实际使用中是调用优化器函数,要理解的是1:各个优化器优化思想 2:懂得优化器函数中超参数在数学表达式的意义可以调参即可,用来表达优化器思想的数学式子可以是千变万化的
  • 文中有错误的地方欢迎指正,共同进步
  • 文中代码部分部分有验证,验证详情待资源文件,未验证的还请斟酌食用
    • GITHUB资源地址
  • 关于实际测试的文件待更新…(资源需要审核,其中后几个优化器我的pytorch版本太低并不支持,与python版本要匹配所以未测试出结果,有兴趣可以自行安装后测试)

  • 其中参考资料1解释的更加详尽与透彻,但是公式多少有些抽象费解,参考资料2作者的有些讲解可以辅助理解,关于通俗一些的公式主要是参考(可能有错误,注意甄别)数学公式通俗理解

其他参考资料

其他1
其他2
其他3
其他4
其他5
其他6
其他7

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

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

相关文章

realman——控制真实的机械臂

概述 MoveIt!完成运动规划后的输出接口是一个命名为“FollowJointTrajectory”的 action,其中包含了一系列规划好的路径点轨迹,与使用 MoveIt!控制 Gazebo中的机械臂不同的是,虚拟机械臂有 gazebo 的 ros_control 插件自动帮我们获取了follow_joint_trajectory 的动作 acti…

MVI56-GSC 串行增强通信模块

通用ASCII串行增强通信模块 MVI56E-GSC/GSCXT 通用ASCII串行增强通信模块允许Rockwell Automation ControlLogix可编程自动化控制器(PACs)使用非特定ASCII字符文本串或字节值串行通信协议轻松与串行设备连接。 MVI56E-GSC增强功能包括通过模块的以太网端口进行本地和远程诊断…

2023年高性能计算就业前景如何?IT人的机遇与挑战

在当今数字化时代,高性能计算(HPC)作为一项关键技术,正迅速成为各行各业的核心需求。不论是在职程序员还是在校大学生,懂高性能计算都将大大提升工作及科研、做课题的效率。而且加之2023年大模型的风靡,人工…

MySQL 连接的使用

MySQL 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。 ​ 本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。 你可以在 SEL…

炸裂开源:你肯定需要的6 个中文版 ChatGPT 提示教程。

提示工程(Prompt Engineering)是一门相对较新的学科,教你你如何开发、优化提示来更好的使用 GPT 等大模型、更好的将大模型的能力接入到你的系统中。 本文整理了 GitHub 上质量最高的 6 个【中文版】提示工程教程。请收藏、转发,…

vue3-lazy图片懒加载

vue3-lazy:https://github.com/ustbhuangyi/vue3-lazy 1、npm安装 npm install vue3-lazy -S2、main.js注册 import { createApp } from vue import App from ./app import lazyPlugin from vue3-lazyconst app createApp(App) app.use(lazyPlugin, {loading: l…

Linux使用指定账户启动进程的两种思路和实现

出于安全的考虑,通常启动进程会不适用root账户,而是使用一些权限较低的账户。 例如启动nginx,在安装这个应用的时候创建nginx账户,用于启动nginx服务。 在nginx配置文件中,user选项就是指定启动nginx使用的用户名。 这里我们 看到nginx进程除了第一个是root用户,其它…

算法工程师的基本职责概述(合集)

算法工程师的基本职责概述 算法工程师的基本职责概述1 职责: 1、负责图像特征提取、运动物体跟踪算法的开发与实现。 2、负责进行各类机器学习、深度神经网络产品的研发。 3、负责设计研究相关算法,并优化算法性能。 4、负责撰写相关算法研发报告、技术方…

基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)

目录 1 主要内容 目标函数 计算步骤 节点系统 2 部分代码 3 程序结果 4 下载链接 点击直达! 1 主要内容 程序完全复现文献《A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading》,建立了一个考虑…

3年测试工作经验裸辞,现在有点后悔了····

2020年毕业,现在有3年的测试工作经验,刚毕业前半年在一家知名上市公司,后面则进入一家传统行业公司待到现在2年半。 由于看不到技术成长以及其他原因,上上周辞职了,目前交接中,下个月中旬就得离开了&#…

ChatGPT免费国内在线直连入口,2023持续分享中

这个国内在线版ChatGPT可以提供与OpenAI官方ChatGPT相同的使用效果,让你在不懂技术的情况下轻松接触人工智能。 国内镜像: ChatGPT国内直连版(点我)http://test.ai111.top 随着OpenAI不断推出更新版本,现在GPT3.5和…

如何成为机器学习工程师

如何成为机器学习工程师 又到一年一度的毕业季。今年的毕业季有点不同,这是迎着 AI 爆发元年的毕业季,很多同学想投身 AI 和机器学习行业,向我咨询了很多如何成为一名机器学习工程师的问题。在此,我结合自身入行十年的经理&#…

科聪控制系统助力铸造行业向“智能”实现“质”的突破!

此项目现场为传统铸造业,铸造是装备制造业发展不可或缺的重要环节,是众多主机和重大技术装备发展的重要支撑。该现场以往由人工遥控车辆来进行物资的挪动,现投运搭载科聪控制系统的AGV来代替人工用遥控车辆来移动物资。实现上位机上一键发送任…

TF卡被格式化后要如何找到照片

TF卡在日常使用时,具有体积小存储大的优势而被我们用来存储一些重要的照片,但由于内存比较小,TF卡用户需要经常对TF卡中的照片进行清理,避免内存不足等问题,接下来讲下TF卡被格式化后要如何找到照片。TF卡被格式化后要…

什么是IPAM(IP地址管理)?

我们目前生活在一个依赖IP的世界,IPAM(IP地址管理)已成为网络管理不可避免的一部分。在 IP 连接设备爆炸式增长之前,IPAM 网络通常随着连接用户数量的增加而增长。但是,现在网络必须根据我们用于工作的 IP 设备数量为每…

消防安全知识答题活动小程序v4.1.0

消防安全知识答题活动小程序v4.1.0 v4.1.0 1&#xff09;支持多选题 .wxml <checkbox-group class"checkbox-group" bindchange"checkboxChange"><label class"checkbox" wx:for"{{questionList[index].option}}" wx:for…

网络货运系统开发,网络货运系统源码,货主端APP源码、司机端APP源码、PC后台管理系统源码

网络货运系统开发&#xff0c;网络货运系统源码&#xff0c;货主端APP源码、司机端APP源码、PC后台管理系统源码 网络货运为无车承运人更名而来&#xff0c;网络货运平台的好处可以节省找车找货的时间与成本。根据国家对智慧物流行业的发展规划&#xff0c;及《网络平台道路货…

Wincc报表:利用用户归档制作报表查询+打印输出

本文需要结合案例及教学视频共同观看 wincc报表项目案例及完整教学视频下载地址&#xff1a; http://www.zhikonglianmeng.com/t-1635.html 一、创建变量 1、分别创建1个系统变量和1个内部变量&#xff1a;用于时间和日期存储。 WINCC组态项目编辑器——变量管理——单击添加…

Angular学习笔记:environment.ts文件,路由

本文是自己的学习笔记&#xff0c;主要参考资料如下。 - B站《Angular全套实战教程》&#xff0c;达内官方账号制作&#xff0c;https://www.bilibili.com/video/BV1i741157Fj?https://www.bilibili.com/video/BV1R54y1J75g/?p32&vd_sourceab2511a81f5c634b6416d4cc1067…

navicat 导出字段信息

1&#xff0c;在新建查询创建sql如下 SELECT TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM information_schema. COLUMNS WHERE T…