0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入浅出地介绍了牛顿法、动量法、RMSProp、Adam优化算法

zhKF_jqr_AI 来源:未知 作者:李倩 2018-10-08 09:15 次阅读

编者按:DRDO研究人员Ayoosh Kathuria深入浅出地介绍了牛顿法、动量法、RMSProp、Adam优化算法

本系列的上一篇文章介绍了随机梯度下降,以及如何应对陷入局部极小值或鞍点的问题。在这篇文章中,我们将查看另一个困扰神经网络训练的问题,病态曲率。

局部极小值和鞍点会使训练停滞,而病态曲率则会减慢训练速度,以至于机器学习从业者可能会觉得搜索收敛到了一个次优极小值。让我们深入了解下什么是病态曲率。

病态曲率

考虑下面的损失曲面。

如你所见,我们从随机点开始,渐渐进入蓝色的沟壑区。(颜色表示损失函数在特定点的值是高是低,红色表示高值,蓝色表示低值。)

在到达最小值之前,我们需要首先穿过沟壑区,也就是病态曲率。让我们放大一下这一区域,看看为什么称病态?

红线为梯度下降的路径;蓝线为理想路径

如上图所示,梯度下降在沟壑区的脊间反复振荡,极其缓慢地向最小值处移动。这是因为w1方向要陡峭得多。

考虑下图中A点的梯度,可以分解为w1、w2方向的两个分量。w1方向的梯度要大很多,因此梯度的方向大为偏向w1,而不是w2(但w2才是能够更快到达最小值处的梯度方向)。

通常情况下,我们使用低学习率来应对这样的反复振荡,但在病态曲率区域使用低学习率,可能要花很多时间才能达到最小值处。事实上,有论文报告,防止反复振荡的足够小的学习率,也许会导致从业者相信损失完全没有改善,干脆放弃训练。

大概,我们需要找到一种方法,首先缓慢地进入病态曲率的平坦底部,然后加速往最小值方向移动。二阶导数可以帮助我们做到这一点。

牛顿法

梯度下降是一阶优化方法。它只考虑损失函数的一阶导数,不考虑高阶函数。基本上这意味着它对损失函数的曲率一无所知。梯度下降可以告诉我们损失是否下降,下降得有多快,但无法区分曲线的的弯曲程度。

上图三条曲线,红点处的梯度都是一样的,但曲率大不一样。解决方案?考虑二阶导数,或者说梯度改变得有多快。

使用二阶导数解决这一问题的一个非常流行的技术是牛顿法(Newton's Method)。为了避免偏离本文的主题,我不会过多探究牛顿法的数学。相反,我将尝试构建牛顿法的直觉。

牛顿法可以提供向梯度方向移动的理想步幅。由于我们现在具备了损失曲面的曲率信息,步幅可以据此确定,避免越过病态曲率的底部。

牛顿法通过计算Hessian矩阵做到这一点。Hessian矩阵是损失函数在所有权重组合上的二阶导数的矩阵。

Hessian提供了损失曲面每一点上的曲率估计。正曲率意味着随着我们的移动,损失曲面变得不那么陡峭了。负曲率则意味着,损失曲面变得越来越陡峭了。

注意,如果这一步的计算结果是负的,那就意味着我们可以切换回原本的算法。这对应于下面梯度变得越来越陡峭的情形。

然而,如果梯度变得越来越不陡峭,那么我们也许正向病态曲率的底部移动。这时牛顿算法提供了一个修正过的学习步幅,和曲率成反比。换句话说,如果损失曲面变得不那么陡峭,学习步幅就下降。

为何我们不常使用牛顿法?

你已经看到公式中的Hessian矩阵了。Hessian矩阵需要我们计算损失函数在所有权重组合上的梯度。也就是说,需要做的计算的数量级是神经网络所有权重数量的平方。

现代神经网络架构的参数量可能是数亿,计算数亿的平方的梯度在算力上不可行。

虽然高阶优化方法在算力上不太可行,但二阶优化关于纳入梯度自身如何改变的想法是可以借鉴的。虽然我们无法准确计算这一信息,但我们可以基于之前梯度的信息使用启发式算法引导优化过程。

动量

搭配SGD使用的一个非常流行的技术是动量(Momentum)。动量法不仅使用当前的梯度,同时还利用之前的梯度提供的信息。

上面的第一个等式就是动量,动量等式由两部分组成,第一项是上一次迭代的动量,乘以“动量系数”。

比如,假设我们将初始动量v设为0,系数定为0.9,那么后续的更新等式为:

我们看到,后续的更新保留了之前的梯度,但最近的梯度权重更高。(致喜欢数学的读者,这是梯度的指数平均。)

下面我们来看看动量法如何帮助我们缓解病态曲率的问题。下图中,大多数梯度更新发生在之字形方向上,我们将每次更新分解为w1和w2方向上的两个分量。如果我们分别累加这些梯度的两个分量,那么w1方向上的分量将互相抵消,而w2方向上的分量得到了加强。

也就是说,基于动量法的更新,积累了w2方向上的分量,清空了w1方向上的分量,从而帮助我们更快地通往最小值。从这个意义上说,动量法也有助于抑制振荡。

动量法同时提供了加速度,从而加快收敛。但你可能想要搭配模拟退火,以免跳过最小值。

在实践中,动量系数一般初始化为0.5,并在多个epoch后逐渐退火至0.9.

RMSProp

RMSProp,也就是均方根传播的历史很有趣。它是传奇人物Geoffrey Hinton在Coursera授课时初次提出的。

RMSProp也试图抑制振荡,但采取的方法和动量不同。此外,RMSProp可以自动调整学习率。还有,RMSProp为每个参数选定不同的学习率。

在第一个等式中,类似之前的动量法,我们计算了梯度平方的指数平均。由于我们为每个参数单独计算,这里的梯度gt表示正更新的参数上的梯度投影。

第二个等式根据指数平均决定步幅大小。我们选定一个初始学习率η,接着除以平均数。在我们上面举的例子中,w1的梯度指数平均比w2大得多,所以w1的学习步幅比w2小得多。这就帮助我们避免了脊间振荡,更快地向最小值移动。

第三个等式不过是权重更新步骤。

上面的等式中,超参数ρ一般定为0.9,但你可能需要加以调整。等式2中的ε是为了确保除数不为零,一般定为1e-10.

注意RMSProp隐式地应用了模拟退火。在向最小值移动的过程中,RMSProp会自动降低学习步幅,以免跳过最小值。

Adam

Adam,即Adaptive Moment Optimization算法结合了动量和RMSProp的启发式算法。

这里,我们计算了梯度的指数平均和梯度平方的指数平均(等式1和等式2)。为了得出学习步幅,等式3在学习率上乘以梯度的平均(类似动量),除以梯度平方平均的均方根(类似RMSProp)。等式4是权重更新步骤。

超参数β1一般取0.9,β2一般取0.99. ε一般定为1e-10.

结语

本文介绍了三种应对病态曲率同时加速训练过程的梯度下降方法。

在这三种方法之中,也许动量法用得更普遍,尽管从论文上看Adam更吸引人。经验表明这三种算法都能收敛到给定损失曲面的不同的最优局部极小值。然而,动量法看起来要比Adam更容易找到比较平坦的最小值,而自适应方法(自动调整学习率)倾向于迅速地收敛于较尖的最小值。比较平坦的最小值概括性更好。

尽管这些方法有助于我们驯服深度网络难以控制的损失平面,随着网络日益变深,它们开始变得不够用了。除了选择更好的优化方法,有相当多的研究试图寻找能够生成更平滑的损失曲面的架构。批量归一化(Batch Normalization)和残差连接(Residual Connections)正是这方面的两个例子。我们会在后续的文章中详细介绍它们。但这篇文章就到此为止了

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4570

    浏览量

    98706
  • 函数
    +关注

    关注

    3

    文章

    3863

    浏览量

    61303

原文标题:深度学习优化算法入门:二、动量、RMSProp、Adam

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【RISC-V开放架构设计之道|阅读体验】+ 个人心得并祝福

    全面的技术介绍深入的分析,宝贵的参考和指导。 我感受有几个,内容全面,深入浅出。拿到这本书后不可能一次性读懂,仍需要反复咀嚼。 案例丰富,引人入胜。有case,不再无聊了。 观点独
    发表于 01-26 15:52

    【年度精选】2023年度top5榜单——电机控制资料

    读懂PID控制算法(抛弃公式,从原理上真正理解PID控制) 作者:ben111 下载量:360 推荐理由: 这篇资料从原理上深入浅出地解释PID控制算法,让读者真正理解其核心
    发表于 01-16 14:34

    javascript深入浅出介绍

    JavaScript是一种广泛使用的脚本语言,用于开发互联网应用程序。它非常受欢迎,因为它可以用于网页开发,服务器端开发以及移动应用程序开发。本文将深入浅出介绍JavaScript的各个方面,包括
    的头像 发表于 12-03 11:09 1.1w次阅读

    python牛顿迭代法

    与x轴的交点处得到近似解。通过不断迭代切线与x轴的交点,可以逐渐接近方程的解。牛顿迭代法在数学和工程领域有广泛的应用,如求根、优化等问题。 牛顿迭代法的核心思想是使用切线来逼近曲线。具体来说,对于一个方程f(x)=0,我们先
    的头像 发表于 11-21 15:06 428次阅读

    javascript深入浅出

    JavaScript是一种广泛使用的编程语言,常用于Web开发。下面是对JavaScript的深入浅出的解释: JavaScript简介 JavaScript是一种解释型、动态类型、基于原型的语言
    的头像 发表于 11-16 10:34 327次阅读

    求助,关于NTC查表获得温度的问题

    最近在做一个温度采集模块,单片机通过查表获得NTC的温度值,调试时间长了,有点犯迷糊,发现一个问题,不知道是不错觉,最近感觉头脑头不怎么好使……貌似通过查表获得温度时,跟单片机
    发表于 11-08 06:00

    用于高密度和高效率电源设计的意半导体WBG解决方案

    • 上市周期短(距第3代不到2年)意半导体沟槽技术:长期方法• 意半导体保持并巩固领先地位• 相比现有结构的重大工艺改良• 优化和完善的关键步骤
    发表于 09-08 06:33

    keras内置的7个常用的优化介绍

    为指数衰减的移动平均以丢弃遥远的过去历史。 RMSprop优化器通常是训练循环神经网络 RNN 的不错选择。 2.4 Adam(自适应动量估计)
    发表于 08-18 06:32

    深入浅出GPU优化系列:gemv优化

    这次讲到并行算法设计,什么叫并行算法设计。每个人的理解都不太一样,在GPU中,我的理解就是:设计block和thread的workload,说白了就是要搞清楚一个block负责哪部分的计算,一个thread要负责哪部分的计算。
    的头像 发表于 05-25 09:03 771次阅读
    <b class='flag-5'>深入浅出</b>GPU<b class='flag-5'>优化</b>系列:gemv<b class='flag-5'>优化</b>

    #深入浅出学习eTs#(八)“猜大小”小游戏

    本项目Gitee仓地址:[深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com)](   上一章节提到的模拟器存在的BUG问题,目前没有办法直接改善,本来打算直接使用鸿蒙远程设备
    的头像 发表于 05-17 15:08 717次阅读
    #<b class='flag-5'>深入浅出</b>学习eTs#(八)“猜大小”小游戏

    #深入浅出学习eTs#(十)蓝药丸还是红药丸

    本项目Gitee仓地址: 深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、需求分析 我们本章的内容选择致敬黑客帝国,如果你处于主角的立场,你会选择蓝药丸还是红药丸呢?本章
    的头像 发表于 05-17 15:07 685次阅读
    #<b class='flag-5'>深入浅出</b>学习eTs#(十)蓝药丸还是红药丸

    深入浅出学习eTs之九宫格密码锁功能实现

    本项目Gitee仓地址:深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、需求分析 相信没有人没有使用过九宫格解锁吧,从智能机开始迸发的时期到现在,我们本期就要做一个自己
    的头像 发表于 05-13 13:25 1039次阅读
    <b class='flag-5'>深入浅出</b>学习eTs之九宫格密码锁功能实现

    #深入浅出学习eTs#(九)变红码?专属二维码生成

    本项目Gitee仓地址: 深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、需求分析 我们本章的内容是要制作一个可以随着自己想要内容而变化的一个二维码,通过输入框输入
    的头像 发表于 05-13 13:21 1002次阅读
    #<b class='flag-5'>深入浅出</b>学习eTs#(九)变红码?专属二维码生成

    深入浅出学习eTs(七)如何判断密码是否正确

    本项目Gitee仓地址: 深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、基本界面 本项目基于#深入浅出学习eTs#(四)登陆界面UI,继续进行,实现一个判断的功能
    的头像 发表于 05-13 13:20 646次阅读
    <b class='flag-5'>深入浅出</b>学习eTs(七)如何判断密码是否正确

    深入浅出学习eTs(一)模拟器/真机环境搭建

    本项目的Gitee仓地址: 深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) (之前有些意外,数据丢失了,现在重新发,且不参与任何活动,在第一篇说明一下,之后就不
    的头像 发表于 05-13 13:17 1138次阅读
    <b class='flag-5'>深入浅出</b>学习eTs(一)模拟器/真机环境搭建