随机梯度下降算法_梯度下降算法的正确步骤

随机梯度下降算法_梯度下降算法的正确步骤主要内容:提供不同算法的原理以及效果直观展示,并希望读者能够在实际问题中更合理的选用梯度下降类算法。目录:1.简介梯度下降法2.随机梯度下降3.随机梯度下降的问题与挑战4.随机梯度下降的优化算法(主要内容)


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

主要内容:提供不同算法的原理以及效果直观展示,并希望读者能够在实际问题中更合理的选用梯度下降类算法。
目录:
1.简介梯度下降法
2.随机梯度下降
3.随机梯度下降的问题与挑战
4.随机梯度下降的优化算法(主要内容)

梯度下降算法的困难之处:
1.梯度的计算
在机器学习和统计参数估计问题中目标函数经常是求和函数的形式
J x ( θ ) = ∑ i J x i ( θ ) J_x (\theta)= \sum_{i} J_{x_i}(\theta) Jx​(θ)=i∑​Jxi​​(θ)

其中每一个函数都对应一个样本
当样本极大时,梯度的计算就变得非常耗时耗力。
2.学习率的选择
学习率选择过小会导致算法收敛太慢,学习率选择过大容易导致算法不收敛

如何选择学习率需要具体问题具体分析:

  1. 局部梯度的反方向不一定是函数整体下降的方向
    对图像比较崎岖的函数,尤其是隧道型曲面,梯度下降表现不佳对图像比较崎岖的函数,尤其是隧道型曲面,梯度下降表现不佳
  2. 预定学习率衰减法的问题
    学习率衰减法很难根据当前数据进行自适应
  3. 对不同参数采取不同的学习率的问题
    在数据由一定稀疏性时,希望对不同特征采取不同的学习率
  4. 神经网络训练中梯度下降法容易被困在鞍点附近的问题
    比起局部极小值,鞍点更加可怕

为什么不用牛顿法?
牛顿法要求计算目标函数的二阶导数,在高维特征情形下这个矩阵非常巨大,计算和存储都成问题
在使用小批量情形下,牛顿法对于二阶导数的估计噪声太大
在目标函数非凸时,牛顿法更容易受到鞍点甚至最大值点的吸引

随机梯度下降法主要为了解决第一问题:梯度计算
由于随机梯度下降的引入,我们通常将梯度下降法分为三种类型:
1.批量梯度下降法(GD)
原始的梯度下降法
2.随机梯度下降法(SGD)
每次梯度计算只使用一个样本

  • 避免在类似样本上计算梯度造成的冗余计算
  • 增加了跳出当前的局部最小值的潜力
  • 在逐渐缩小学习率的情况下,由于批梯度下降法类似的收敛速度

3.小批量随机梯度下降法(Mini Batch SGD)
每次梯度计算使用一个小批量样本

  • 梯度计算比单样本更加稳定
  • 可以很好的利用县城的高度优化的矩阵运算工具

动量法(Momentum)(适用于隧道型曲面)
动量法每次更新都吸收一部分上次更新的余势:
V t = γ V t − 1 + δ ∇ θ J ( θ ) V_t=\gamma V_{t-1} +\delta\nabla \theta J(\theta) Vt​=γVt−1​+δ∇θJ(θ) θ t = θ t − 1 − V t \theta_t= \theta_{t-1} -V_{t} θt​=θt−1​−Vt​
这样主体方向的更新就得到了更大的保留,从而效果被不断放大。
物理上这就像是推一个很重的铁球下山,因为铁球保持了下山主体方向的动量,所以在隧道伤沿两侧震荡侧次数就会越来越少。

Nesterov(动量法的改进算法)
动量法的一个问题在于:从山顶退下的铁球会越滚越快,以至于到了山底停不下来。我们希望算法更加聪明一些,可以在到达底部之前就自己刹车。
利用主题下降方向提供的先见之明,预判自己下一步的位置,并到预判位置计算梯度。
v t = γ v t − 1 + δ ∇ θ J ( θ − v t − 1 ) v_t=\gamma v_{t-1}+\delta {\nabla \theta} J(\theta – v_{t-1}) vt​=γvt−1​+δ∇θJ(θ−vt−1​) θ = θ − v t \theta= \theta -v_{t} θ=θ−vt​

Adagrad(自动调整学习率,适用于稀疏数据)
梯度下降法在每一步对每一个参数使用同样的学习率,这种一刀切的做法不能有效地利用每一个数据及自身的特点。
Adagrad是一种自动调整学习率的方法

  • 随着模型的训练,学习率自动衰减
  • 对于更新频繁的参数,采取较小的学习率
  • 对于更新不频繁的参数,采取较大的学习率
    为了实现对于更新频繁的参数使用较小的学习率,Adagrad对每个参数历史上的每次更新进行叠加,并以此来做下一次更新的惩罚系数。

梯度: g t , i = ∇ θ J ( θ i ) g_{t,i}=\nabla \theta J(\theta_i) gt,i​=∇θJ(θi​)
梯度历史矩阵: G t G_t Gt​对角矩阵,其中 G t , i i = ∑ k g k , i 2 G_{t,ii}=\sum_{k} g_{k,i}^2 Gt,ii​=∑k​gk,i2​
参数更新: θ t + 1 , i = θ t , i − δ G t , i i + ε g t , i \theta_{t+1,i} =\theta_{t,i} – \dfrac{\delta}{ \sqrt{G_{t,ii}+\varepsilon}}g_{t,i} θt+1,i​=θt,i​−Gt,ii​+ε
​
δ
​
gt,i​

Adadelta(Adagrad的改进算法)
Adagrad的一个问题在于随着训练的进行,学习率快速单调衰减。
Adadelta 则使用梯度平方的移动平均来取代全部历史平方和。
定义移动平方: E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) g t 2 E[g^2]_t=\gamma E[g^2]_{t-1}+(1-\gamma)g_t^2 E[g2]t​=γE[g2]t−1​+(1−γ)gt2​
于是就得到参数更新法则:
θ t + 1 , i = θ t , i − δ E [ g 2 ] t , i i + ε g t , i \theta_{t+1,i}=\theta_{t,i}- \dfrac{\delta}{ \sqrt{E[g^2]_{t,ii}+\varepsilon}}g_{t,i} θt+1,i​=θt,i​−E[g2]t,ii​+ε
​
δ
​
gt,i​

由于梯度与参数的单位不匹配。
Adadelta使用参数更新的移动平均来取代学习率 δ \delta δ,于是参数的更新法则:
θ t + 1 , i = θ t , i − E [ Δ θ ] t − 1 E [ g 2 ] t , i i + ε g t , i \theta_{t+1,i}=\theta_{t,i}- \dfrac{\sqrt{E[\Delta\theta]_{t-1}}}{ \sqrt{E[g^2]_{t,ii}+\varepsilon}}g_{t,i} θt+1,i​=θt,i​−E[g2]t,ii​+ε
​
E[Δθ]t−1​
​
​
gt,i​

Adam(结合了动量法和Adamdelta算法)
如果把Adadelta里面梯度的平方和看成是梯度的二阶矩,那么梯度自身的求和就是一阶矩。Adam算法在Adadelta的二阶矩基础上又引入了1一阶矩。
而一阶矩,其实就类似于动量法里面的动量。
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1}+(1-\beta_1)g_t mt​=β1​mt−1​+(1−β1​)gt​ v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1}+(1-\beta_2)g_t^2 vt​=β2​vt−1​+(1−β2​)gt2​

于是参数更新法则为:
θ t + 1 = θ t − δ v t + ε m t \theta_{t+1}=\theta_t – \dfrac{\delta}{\sqrt{v_t}+\varepsilon}m_t θt+1​=θt​−vt​
​
+ε
δ
​
mt​

究竟如何选择算法呢?
动量法和Nesterov的改进方法着重解决目标函数图像崎岖的问题
Adagrad和Adadelta主要解决学习率更新问题
Adam集中了前述两种做法的主要优点
目前为止Adam可能是几种算法中综合表现最好的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195100.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2023考研高数接力题典1800习题讲解

    2023考研高数接力题典1800习题讲解第一部分(函数、极限、连续)极限求法:①直接代入数值②约去不能代入的零因子③分子分母同除最高次幂④分子分母有理化⑤公式法⑥等价无穷小量的代换⑦洛必达法则⑧换底公式(对数)入门练习填空题讲解(1~4):第一题:我们通过观察,发现是0/0型的,自然想到了洛必达法则。百度百科:洛必达法则是在一定条件下通过分子分母分别求导再求极限来确定未定式值的方法。众所周知,两个无穷小之比或两个无穷大之比的极限可能存在,也可能不存在。因此,求这类极限时往往需要适当的变形,转化成可利用极限运算法则或重要

    2022年8月11日
  • 群晖docker使用教程_docker的使用

    群晖docker使用教程_docker的使用概括Docker与传统虚拟机的区别与传统虚拟机的区别Docker的安装的安装Dockerdaemon,client,containerd镜像与容器操作容器运行配置Docker网络配置网络配置AlpineDockerImage制作自己的DockerImageDocker安全性问题安全性问题Dock

    2022年10月9日
  • maven快速入门_maven如何使用

    maven快速入门_maven如何使用企业级架构框架图之前我们关注的是前端的解决方案(涉及到的技术有H5、CSS3、JavaScript,CSS升级为Bootstrap再升级到ElementUI,JavaScript升级到jQuery再升级到Vue+NodeJS)现在开始我们开始关注后端的解决方案,也就是服务器端到底干了什么,哪些技术来支持(SpringBoot、Maven、SpringMVC、Spring、Mybatis)。这样前后端都学习完,整个软件项目所需要的基本技术就全线贯通,就可以自己独立完成企业级项目的开发了。下面我们来描

    2022年8月22日
  • win10打印服务无法启动(运行时错误automation)

    这是3/11号遇到的问题,微软更新了一个叫KB5009543的补丁之后,电脑的打印功能就一直打印不了,刚开始检查以为打印机脱机或者驱动没安装,检查之后发现毫无作用,还是提示操作无法完成。到电脑控制面板-打印机设备查看所有连接过的打印机都是灰色的。我的解决方案:1、卸载掉所有kb5开头的补丁。2、运行输入services.msc按回车找到打印服务,重新启动打印服务程序。3、找到电脑C磁盘,C:\Windows\System32\spool找到这个路径下,把里面文件全部删掉。3,重新安装一遍对

    2022年4月18日
  • java中import作用详解

    java中import作用详解java中import详解import与package机制相关,这里先从package入手,再讲述import以及staticimport的作用。

    2022年6月7日
  • jquery 使用dialog弹窗显示在整个屏幕上,而不是只遮盖当前的ifream或div,另附dialog中加返回按钮,设置高宽等「建议收藏」

    jquery 使用dialog弹窗显示在整个屏幕上,而不是只遮盖当前的ifream或div,另附dialog中加返回按钮,设置高宽等「建议收藏」jquery 使用dialog弹窗显示在整个屏幕上,而不是只遮盖当前的ifream或div,另附dialog中加返回按钮,设置高宽等

    2022年4月23日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号