Optimizer神经网络中各种优化器介绍

1. SGD

1.1 batch-GD

每次更新使用全部的样本,注意会对所有的样本取均值,这样每次更新的速度慢。计算量大。

1.2 SGD

每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本,这使得在梯度下降过程中不需去用所有训练样本来更新Theta。BGD每次迭代都会朝着最优解逼近,而SGD由于噪音比BGD多,多以SGD并不是每次迭代都朝着最优解逼近,但大体方向是朝着最优解,SGD大约要遍历1-10次数据次来获取最优解。

但是 SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。

1.3. MBGD(Mini-batch Gradient Descent)

MBGD有时候甚至比SGD更高效。MBGD不像BGD每次用m(所有训练样本数)个examples去训练,也不像SGD每次用一个example。MBGD使用中间值b个examples
经典的b取值大约在2-100。例如 b=10,m=1000。

2. Momentum

SGD存在的一个主要问题是:在沟壑处无法正常收敛的问题。如果初始化不好不幸陷入沟壑区,则会出现下面左图的震荡问题:即在一个方向上梯度很大,且正负交替出现。而momentum会加上前面的一次迭代更新时的梯度。让与上一次同方向的值更大,反方向的更小,如下面右图所示。momentum公式为:
在这里插入图片描述

v t = γ v t − 1 + η Δ θ J ( θ ) θ = θ − v t \begin{align} v_t&=\gamma v_{t-1}+\eta\Delta_\theta J(\theta)\\ \theta &= \theta-v_t \end{align} vtθ=γvt1+ηΔθJ(θ)=θvt

  • 下降初期时,使用上一次参数更新,下降方向一致,乘上较大的 μ \mu μ能够进行很好的加速。
  • 下降中后期时,在局部最小值来回震荡的时候, g r a d i e n t → 0 gradient\to 0 gradient0 μ \mu μ使得更新幅度增大,跳出陷阱。
  • 在梯度改变方向的时候, μ \mu μ能够减少更新 总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛。
    正确的方向上让他更快,错误的方向上让他更慢。如果上次的momentum(v)与这次的负梯度方向是相同的,那这次下降的幅度就会加大,从而加速收敛。
    momentum的更新方式为:
    在这里插入图片描述

momentum设置太小动量效果不明显,设置太大容器使得本来收敛很好的地方震动太大,特别是训练的后期,一般取0.9。

3. NAG(Nesterov accelerated gradient)

动量法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成。于是一位大神(Nesterov)就开始思考,既然每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那为什么不先按照历史梯度往前走那么一小步,按照前面一小步位置的“超前梯度”来做梯度合并呢?如此一来,小球就可以先不管三七二十一先往前走一步,在靠前一点的位置看到梯度,然后按照那个位置再来修正这一步的梯度方向。如此一来,有了超前的眼光,小球就会更加”聪明“, 这种方法被命名为Nesterov accelerated gradient 简称 NAG。

NAG的更新方式为:
在这里插入图片描述

与momentum不同的是,NAG是先往前走一步,探探路,用超前的梯度来进行修正。
更新公式为:
在这里插入图片描述

实现证明,比momentum更快。

4. AdaGrad

SGD+Momentum的问题是:

  • 设置初始的学习率比较难
  • 所有的参数都使用相同的学习率
    Adam采用累加前面梯度的平方和的方式。能够对每个参数自适应不同的学习速率。因此对于稀疏特征,学习率会大一点。对非稀疏特征,学习率会小一点。因此次方法适合处理稀疏特征。公式为:
    θ t + 1 , i = θ t , i − η G t , i + ϵ g t , i \theta_{t+1, i}=\theta_{t, i}-\frac {\eta}{\sqrt{G_{t,i}+\epsilon}}g_{t,i} θt+1,i=θt,iGt,i+ϵ ηgt,i

其中 g t , i g_{t,i} gt,i同样是当前的梯度,连加和开根号都是元素级别的运算。 η \eta η是初始学习率,由于之后会自动调整学习率,所以初始值就不像之前的算法那样重要了。 ϵ \epsilon ϵ是一个比较小的数,用来保证分母非0。

其含义是,对于每个参数,随着其更新的总距离增多,其学习速率也随之变慢。

g t g_t gt从1到t进行一个递推形成一个约束项, ϵ \epsilon ϵ保证分母非0。
G t , i = ∑ r = 1 t ( g r , i 2 ) G_{t, i}=\sum_{r=1}^t(g_{r,i}^2) Gt,i=r=1t(gr,i2)
G t , i G_{t, i} Gt,i为前面的参数的梯度平方和。特点为:

  • 前期梯度较小的时候,叠加的梯度平方和也比较小,能够加快梯度。
  • 后期梯度叠加项比较大,梯度也会变小,能够以小步幅更新。
  • 对于不同的变量可以用不同的学习率。
  • 适合处理稀疏的数据。

缺点:

  • 依赖一个全局学习率
  • 中后期,梯度的平方和累加会越来越大,会使得 g r a d i e n t → 0 gradient\to 0 gradient0,使得后期训练很慢,甚至接近0。

5. AdaDelta

Adadelta是对于Adagrad的扩展。最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。 Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项(Adagrad需要存储),并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) g t 2 Δ θ t = − η E [ g 2 ] t + ϵ g t \begin{align} E[g^2]_t&=\gamma E[g^2]_{t-1}+(1-\gamma)g_t^2\\ \Delta\theta_t&=-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}g_t \end{align} E[g2]tΔθt=γE[g2]t1+(1γ)gt2=E[g2]t+ϵ ηgt

因为AdaDelta需要计算 R [ g t − w : t ] R[g_t-w:t] R[gtw:t],需要存储前面 w w w个状态,比较麻烦。因此AdaDelta采用了类似momtemum的平均化方法,如果 γ = 0.5 \gamma=0.5 γ=0.5,则相当于前面的均方根RMS。其中Inception-V3的初始化建议为1。

此处AdaDelta还是依赖于全局学习率,因此作者做了一定的处理来近似:
经过二阶海森矩阵近似之后,得到 Δ x ∼ x \Delta x\sim x Δxx
Δ x t = − ∑ r = 1 t − 1 Δ x r 2 E [ g 2 ] t + ϵ \Delta_{x_t}=-\frac{\sqrt{\sum_{r=1}^{t-1}\Delta x_r^2}}{\sqrt{E[g^2]_t+\epsilon}} Δxt=E[g2]t+ϵ r=1t1Δxr2
这样的话,AdaDelta已经不依赖于全局学习率了。

  • 训练初中期,加速效果不错,很快
  • 训练后期,反复在局部最小值附近抖动

6. RMSProp

RMSProp是AdaDelta的一种扩展。当 γ = 0.5 \gamma=0.5 γ=0.5的时候就变成了RMSProp。但是RMSProp仍然依赖于全局学习率。效果介于AdaGrad和AdaDelta之间。

7. Adam

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
g t = Δ θ J ( θ t − 1 ) m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t θ = θ − α m ^ t v ^ t + ϵ \begin{align} g_t&=\Delta_\theta J(\theta_{t-1})\\ m_t&=\beta_1m_{t-1}+(1-\beta_1)g_t\\ v_t&=\beta_2 v_{t-1}+(1-\beta_2)g_t^2\\ \hat m_t&=\frac{m_t}{1-\beta_1^t}\\ \hat v_t&=\frac{v_t}{1-\beta_2^t}\\ \theta&=\theta-\alpha \frac{\hat m_t}{\sqrt{\hat v^t}+\epsilon} \end{align} gtmtvtm^tv^tθ=ΔθJ(θt1)=β1mt1+(1β1)gt=β2vt1+(1β2)gt2=1β1tmt=1β2tvt=θαv^t +ϵm^t
然后对 m t m_t mt v t v_t vt进行无偏估计。因为 m 0 m_0 m0 v 0 v_0 v0初始化都是0,我们希望能够快点从0中跳出来。因为如果 β \beta β比较大的话,原来的 m t m_t mt可能会跳不出来。因此进行无偏估计后能够放大。 β 1 \beta_1 β1 β 2 \beta_2 β2两个超参数一般设置为0.9和0.999。:
m ^ t = m t 1 − β 1 t \hat m_t=\frac{m_t}{1-\beta_1^t} m^t=1β1tmt
接下来更新参数,初始的学习率 α \alpha α(默认0.001)乘以梯度均值与梯度方差的平方根之比。由表达式可以看出,对更新的步长计算,能够从梯度均值及梯度平方两个角度进行自适应地调节,而不是直接由当前梯度决定。

直接对梯度的矩进行估计对内存没有额外的要求,而且可以根据梯度进行动态调整。而且后面的一项比值可以对学习率形成一个动态约束,因为它是有范围的。

目前来讲,效果最好的是Adam。但是经典的论文搞上去的方式都是先用Adam,然后再用SGD+momentum死磕上去。

Adam看作是Momentum+RMSProp的结合体。

形成一个动态约束,因为它是有范围的。

目前来讲,效果最好的是Adam。但是经典的论文搞上去的方式都是先用Adam,然后再用SGD+momentum死磕上去。

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

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

相关文章

css3之3D转换transform

css3之3D转换 一.特点二.坐标系三.3D移动(translate3d)1.概念2.透视(perpective)(近大远小)(写在父盒子上) 四.3D旋转(rotate3d)1.概念2.左手准则3.呈现(transfrom-style)(写父级盒子…

智能革命:ChatGPT3.5与GPT4.0的融合,携手DALL·E 3和Midjourney开启艺术新纪元

迷图网(kk.zlrxjh.top)是一个融合了顶尖人工智能技术的多功能助手,集成了ChatGPT3.5、GPT4.0、DALLE 3和Midjourney等多种智能系统,为用户提供了丰富的体验。以下是对这些技术的概述: ChatGPT3.5是由OpenAI开发的一个自然语言处理模型&#x…

KeepAlived使用介绍

目录 1、Introduce 2、基本使用 (1)安装 (2)配置文件 (3)使用教程 1、Introduce keepalived是一个用于实现高可用性和负载均衡的开源软件。它提供了一种轻量级的方式来管理多个服务器,并确保…

使用Detours进行HOOK

文章目录 Detours介绍Detours配置Detours进行Sleep Hook Detours介绍 Detours是微软研究院开发的一款软件工具,用于Windows平台上的应用程序重定向和修改。 它可以在运行时修改应用程序的执行路径,允许开发人员注入自定义代码来改变应用程序的 行为&…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度,度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时,会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…

鸿蒙OS开发实例:【ArkTS类库多线程I/O密集型任务开发】

使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行解决。 I/O密集型任务的性能重点通常不在于CPU的处理能力,而在于I/O操作的速度和效率。…

上位机图像处理和嵌入式模块部署(qmacvisual寻找圆和寻找直线)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面有几篇文章,我们谈到过直线拟合、圆拟合和椭圆拟合。当时,我们的做法是,先找到了轮廓,接着找到…

this.$route.back()时的组件缓存

1.this.$route.back()回到上一个路径会重新加载 跳转时,前一个路由的内容会被销毁,当回来时,重新创建树,组件内有保存了距离,没有一开始是0. 2.keep-alive写在router-view上面,这个地方所代表的路由会被保存,因此可以写在上面,保存,当返回时,如果是这个路由,里面的内容是一样…

超强命令行解析工具Apache Commons CLI

概述 为什么要写这篇文章呢?因为在读flink cdc3.0源码的时候发现了这个工具包,感觉很牛,之前写过shell命令,shell是用getopts来处理命令行参数的,但是其实写起来很麻烦,长时间不写已经完全忘记了,现在才发现原来java也有这种工具类,所以先学习一下这个的使用,也许之后自己在写…

canvas画图,画矩形可拖拽移动,可拖拽更改尺寸大小

提示:canvas画图,画矩形,圆形,直线,曲线可拖拽移动 文章目录 前言一、画矩形,圆形,直线,曲线可拖拽移动总结 前言 一、画矩形,圆形,直线,曲线可拖…

AI绘画教程:Midjourney使用方法与技巧从入门到精通

文章目录 一、《AI绘画教程:Midjourney使用方法与技巧从入门到精通》二、内容介绍三、作者介绍🌤️粉丝福利 一、《AI绘画教程:Midjourney使用方法与技巧从入门到精通》 一本书读懂Midjourney绘画,让创意更简单,让设计…

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径,把default.yaml复制放到相应的路径下。(缺少相应…

redis和数据库数据不一直问题,缓存常见的三大问题

文章目录 数据一致性缓存常见问题缓存穿透缓存击穿缓存雪崩 数据一致性 1 思路 查询数据的时候,如果缓存未命中,则查询数据库,将数据写入缓存设置超时时间修改数据时,先修改数据库,在删除缓存。 2 代码实现 修改更…

大数据 - Hadoop系列《五》- HDFS文件块大小及小文件问题

系列文章: 大数据- Hadoop入门-CSDN博客 大数据 - Hadoop系列《二》- Hadoop组成-CSDN博客 大数据 - Hadoop系列《三》- HDFS(分布式文件系统)概述_大量小文件的存储使用什么分布式文件系统-CSDN博客 大数据 - Hadoop系列《三》- MapRedu…

JMeter基础用法和测试WebSocket请求

目录 JMeter websocket插件安装测试接口的编写添加测试线程组创建取样器创建WebSocket连接创建循环控制器创建WebSocket request-response Sampler创建固定定时器 正则匹配上一个请求的数据做为当前请求参数正则编写使用匹配值 CSV文件读取参数添加汇总报告和结果树 JMeter web…

PyCharm中出现Microsoft Defender配置建议

原因 Windows安全中心的病毒和威胁防护会自动扫描电脑中的文件夹,我们的项目文件夹和IDE文件夹也会被扫描,而PyCharm认为这会降低IDE性能。 解决方法 直接点击提示框里的自动。 或是手动给扫描添加排除项,步骤如下: 1、先打开…

基于SSM 旅游平台的设计与实现

基于SSM 旅游平台的设计与实现 获取源码——》哔站搜:计算机专业毕设大全 获取源码——》哔站搜:计算机专业毕设大全 源码获取——》可以私信

ESP8266 WiFi物联网智能插座—上位机软件实现

1、软件架构 上位机主要作为下位机数据上传服务端以及节点调试的控制端,可以等效认为是专属版本调试工具。针对智能插座协议,对于下位机进行可视化监测和管理。 软件技术架构如下,主要为针对 Windows 的PC 端应用程序,采用WPF以及…

Spring Boot单元测试全指南:使用Mockito和AssertJ

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

使用hping3网络工具构造TCP/IP数据包和进行DDos攻击

1 概述 hping3是一个强大的命令行工具,用于生成、发送和解析TCP/IP协议的数据包。它是开源的网络安全工具,由Salvatore Sanfilippo开发,主要应用于网络审计、安全测试和故障排查等领域。hping3不仅可以作为普通的网络连通性检测工具&#xf…