来源:雷锋网、AI研习社
本文约3100字,建议阅读9分钟本文为你介绍如何将数据转换成正态分布来建立模型。

在这篇文章中,我们讨论另外一个困扰神经网络训练的问题,病态曲率。

虽然局部极小值和鞍点会阻碍我们的训练,但病态曲率会减慢训练的速度,以至于从事机器学习的人可能会认为搜索已经收敛到一个次优的极小值。让我们深入了解什么是病态曲率。

病态曲率

考虑以下损失曲线图。

**病态曲率**

如你所知,我们在进入一个以蓝色为标志的像沟一样的区域之前是随机的。这些颜色实际上代表了在特定点上的损失函数的值,红色代表最高的值,蓝色代表最低的值。

我们想要下降到最低点,因此,需要穿过峡谷。这个区域就是所谓的病态曲率。为了了解为何将其称为病态曲率,让我们再深入研究。放大了看,病态曲率就像这样...

**病态曲率**

要知道这里发生的事情并不难。梯度下降沿着峡谷的山脊反弹,向最小的方向移动的速度非常慢。这是因为山脊的曲线在 W1 方向上弯曲的更陡。

考虑山脊表面的 A 点。我们看到,梯度在这点可以分解为两个分量,一个沿着 W1 方向,另外一个沿着 W2 方向。如果 f 显著下降的唯一方向是低曲率的,那么优化可能会变得太慢而不切实际,甚至看起来完全停止,造成局部最小值的假象。

正常情况下,我们使用一个较慢的学习率来解决这种山脊间反弹的问题,正如上一篇关于梯度下降的文章所述。然而,这却产生了麻烦。

当我们接近最小值时,慢下来是有意义的,我们想要收敛于它。但是考虑一下梯度下降进入病态曲率的区域,以及到最小值的绝对距离。如果我们使用较慢的学习率,可能需要花费更多的时间才能到达极小值点。事实上,有研究论文报道过使用足够小的学习率来阻值山脊间的反弹可能导致参与者以为损失根本没有改善,从而放弃训练。

如果 f 显著下降的唯一方向是低曲率的,那么优化可能会变得太慢而不切实际,甚至看起来完全停止,造成局部最小值的假象。

也许我们想要的是能让我们慢慢进入病态曲率底部的平坦区域,然后在最小值的方向上加速。二阶导数可以帮助我们做到这一点。

牛顿法

梯度下降是一阶优化方法。它只考虑损失函数的一阶导数,而不考虑更高阶的导数。这基本上意味着它不知道损失函数的曲率。它只能说明损失是否下降以及下降的速度,而不能区分曲线是平坦的,向上的,还是向下的。

之所以会发生这种现象,是因为梯度下降只关心梯度,就好像上图中红色的点,三个曲线在这一点上的梯度是相同的。如何解决?使用二阶导数,或者考虑梯度变化的速率。

一个非常流行的可以使用二阶导数的技术,可以解决我们的问题,这个方法称为牛顿法。  如果表面变得不那么陡峭,那么学习步骤就会减少。

牛顿法可以提供一个理想的步长,在梯度方向上移动。由于我们现在有了关于损失表面曲率的信息,所以可以选择步长,而不是用病态曲率来超过该区域的极限。

牛顿法通过计算 Hessian 矩阵来实现,Hessian 矩阵是损失函数的二阶导数组成的权值组合。我所说的权值组合,如下所示。

Hessian 矩阵在一个大矩阵中计算所有这些梯度。

Hessian 矩阵给出了一个点的损失曲面曲率的估计。一个损失的表面可以有一个正曲率,这意味着当我们移动时,表面会迅速变得不那么陡峭。如果我们有一个负曲率,这意味着当我们移动时,曲面变得越来越陡。

注意,如果这一步是负的,那就意味着我们可以使用任意的步骤。换句话说,我们可以切换回原来的算法。这对应于下面的情况,梯度变得越来越陡。

然而,如果梯度变得不那么陡峭,我们可能会走向一个处于病态曲率底部的区域。在这里,牛顿法给了我们一个修正的学习步骤,正如你所看到的,它与曲率成反比,或者曲面变得越来越小

如果表面变得不那么陡峭,那么学习步骤就会减少。

为什么我们很少使用牛顿法?

看到公式中的 Hessian 矩阵了吗?Hessian 矩阵需要计算损失函数对所有权值组合的梯度。在组合已知的情况下,要求的值的数量约是神经网络中权值数量的平方

对于现代的网络来说,通常都含有数十亿个参数,使用高阶的优化方法很难计算 10 亿的平方数量级的梯度。

二阶优化是关于梯度本身如何变化的信息。虽然我们不能精确的计算它,但是我们可以遵循启发式方式,以指导我们根据之前的梯度进行优化。

Momentum

与 SDG 结合使用的一种常用方法叫做 Momentum。Momentum 不仅会使用当前梯度,还会积累之前的梯度以确定走向。梯度下降方程修改如下。

第一个式子有两项。第一项是上一次迭代的梯度,乘上一个被称为「Momentum 系数」的值,可以理解为取上次梯度的比例。

我们设 v 的初始为 0,动量系数为 0.9,那么迭代过程如下:

我们可以看到之前的梯度会一直存在后面的迭代过程中,只是越靠前的梯度其权重越小。(说的数学一点,我们取的是这些梯度步长的指数平均)。

这对我们的例子有什么帮助呢?观察下图,注意到大部分的梯度更新呈锯齿状。我们也注意到,每一步的梯度更新方向可以被进一步分解为 w1 和 w2 分量。如果我们单独的将这些向量求和,沿 w1 方向的的分量将抵消,沿 w2 方向的分量将得到加强。

对于权值更新来说,将沿着 w2 方向进行,因为 w1 方向已抵消。这就可以帮助我们快速朝着极小值方向更新。所以,动量也被认为是一种抑制迭代过程中锯齿下降问题的技术。

这种方法还可以提高收敛速度,但如果超过极小值,可能需要使用模拟退化算法

我们通常初始化动量为 0.5,并且在一定循环次数后逐渐退火到 0.9。

RMSProp

RMSProp 或均方根反向传播算法有着有趣的历史。它是由传奇人物Geoffrey Hinton提出的,当时只是在课堂上是随意提出的一个想法。

RMSProp 算法也旨在抑制梯度的锯齿下降,但与动量相比, RMSProp 不需要手动配置学习率超参数,由算法自动完成。更重要的是,RMSProp 可以为每个参数选择不同的学习率。

在 RMSprop 算法中,每次迭代都根据下面的公式完成。它是对每个参数单独迭代。

让我们来看看上面的方程都在做什么。

在第一个方程中,我们计算一个梯度平方的指数平均值。由于我们需要针对每个梯度分量分别执行平方,所以此处的梯度向量 Gt 对应的是正在更新的参数方向的梯度各个方向的投影分量。

为此,我们将上一次更新的超参数乘希腊字母 nu。然后将当前的梯度平方乘(1-nu)。最后我们将他们加到一起得到这一时刻的指数平均。

我们之所以使用指数平均是因为在 momentum 例子中看到的那样,它可以使得间隔和权重成正比例变化。实际上使用「指数」一词是因为前面项的权重呈指数级下降(最近的项权重是 ρ,次近的 ρ 方,然后是 ρ 立方,以此类推)。

注意我们表示病态曲率的图,梯度沿 w1 方向的分量比沿 w2 方向的分量大的多。我们以平方的方式将 w1 和 w2 叠加,w1 不会发生抵消,w2 在指数平均后会更小。

第二个方程定义了步长,我们沿负梯度方向移动,但是步长受到指数平均值的影响。我们设置了一个初始学习率 eta,用它除指数平均值。在我们的例子中,因为 w1 平均后比 w2 大很多,所以 w1 的迭代步长就比 w2 要小很多。因此这将避免我们在山脊之间跳跃而朝着正确的方向移动。

第三个方程是更新操作,超参数 p 通常选为 0.9,但是你可能需要调整它。方程 2 中的 epsilon 是为了防止被 0 除,通常取 1e-10。

还要注意的是,RMSProp 隐含的执行模拟退火,假设我们正朝着极小值前进并且我们想要放慢速度避免越过极小值。当步长很大时 RMSProp 将自动减小梯度更新的步长(大步长容易越过极小值点)。

Adam

到目前为止,我们已经对比了 RMSProp 和 Momentum 两种方法。尽管 Momentum 加速了我们对极小值方向的搜索,但 RMSProp 阻碍了我们在振荡方向上的搜索。

Adam 或 Adaptive Moment Optimization 算法将 Momentum 和 RMSProp 两种算法结合了起来。这里是迭代方程。

我们计算了每个梯度分量的指数平均和梯度平方指数平均(方程 1、方程 2)。为了确定迭代步长我们在方程 3 中用梯度的指数平均乘学习率(如 Momentum 的情况)并除以根号下的平方指数平均(如 Momentum 的情况),然后方程 4 执行更新步骤。

超参数 beta1 一般取 0.9 左右,beta_2 取 0.99。Epsilon 一般取1e-10。

结论

在这篇文章中,我们介绍了 3 种基于梯度下降法来解决病态曲率同时加快搜索速度的方法。这些方法通常称为「自适应方法」,因为学习步骤会根据等高线拓扑进行调整。

在上面的三种方法中,尽管 Adam 算法在论文中被认为是最有前景的算法,但是 Momentum 方法貌似更主流一些。实践结果表明,在给定损失函数的情况下,三种算法都能收敛到不同的局部最优极小值。但是用带 Momentum 的 SGD 算法比 Adam 算法找到的极小值更加平坦,而自适应方法往往会收敛到更加尖锐的极小值点。平坦的极小值通常好于尖锐的极小值。

尽管自适应算法有助于我们在复杂的损失函数上找到极小值点,但这还不够,特别是在当前网络越来越来越深的背景下。除了研究更好的优化方法之外,还有一些研究致力于构建产生更平滑损失函数的网络架构。Batch-Normalization 和残差连接是其中的解决方法,我们也会尽快在博客上发布有关的详细介绍。欢迎随时在评论中提问。

扩展阅读

  • Video on Exponential Weighted Averages

    https://www.youtube.com/watch?v=wJBcz7FyLzg&index=59&t=0s&list=PLBAGcD3siRDguyYYzhVwZ3tLvOyyG5k6K

  • For the mathematically inclined, a brilliant explanation of Momentum

    https://distill.pub/2017/momentum/

  • More on Pathological Curvature and second order optimization

    http://www.cs.toronto.edu/~jmartens/docs/Deep_HessianFree.pdf

  • On Newton's method and optimization in general

    http://www.deeplearningbook.org/contents/numerical.html

原文链接:

https://blog.paperspace.com/intro-to-optimization-momentum-rmsprop-adam/

编辑:黄继彦

深度学习优化入门:Momentum、RMSProp 和 Adam相关推荐

  1. 深度学习:优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam

    深度学习:优化方法 1. 指数加权平均(Exponentially weighted average) 2. 带偏差修正的指数加权平均(bias correction in exponentially ...

  2. 深度学习 --- 优化入门六(正则化、参数范数惩罚L0、L1、L2、Dropout)

    前面几节分别从不同的角度对梯度的优化进行梳理,本节将进行正则化的梳理,所谓正则化,简单来说就是惩罚函数,在机器学习中的SVM中引入拉格朗日乘子法即引入惩罚项解决了约束问题,在稀疏自编码器中我们引入了惩 ...

  3. 深度学习 --- 优化入门五(Batch Normalization(批量归一化)二)

    批归一化真的可以解决内部协方差偏移问题?如果不能解决,那它的作用是什么?你所接受的整个深度学习教育是一个谎言吗?让我们来寻找答案吧! 开始之前...... 我想提醒一下,本文是深度学习优化算法系列的第 ...

  4. 深度学习 --- 优化入门二(SGD、动量(Momentum)、AdaGrad、RMSProp、Adam详解)

    另在一篇文章中,我们介绍了随机梯度下降的细节以及如何解决陷入局部最小值或鞍点等问题.在这篇文章中,我们看看另一个困扰神经网络训练的问题,即病态曲率. 虽然局部最小值和鞍点可以阻止我们的训练,但是病态曲 ...

  5. 深度学习 --- 优化入门一(梯度下降所面临的问题)

    前面几节详细介绍了卷积神经网络和深度卷积神经网络,这个网络可以说是为图像处理量身制作,同时在2010年,hintion带领的团队使用AlexNet网络(深度卷积网络)在ImageNet大赛中获得冠军, ...

  6. 深度学习 --- 优化入门四(Batch Normalization(批量归一化)一)

    前几节我们详细的探讨了,梯度下降存在的问题和优化方法,本节将介绍在数据处理方面很重要的优化手段即批量归一化(批量归一化). 批量归一化(Batch Normalization)并不能算作是一种最优化算 ...

  7. 深度学习 --- 优化入门三(梯度消失和激活函数ReLU)

    前两篇的优化主要是针对梯度的存在的问题,如鞍点,局部最优,梯度悬崖这些问题的优化,本节将详细探讨梯度消失问题,梯度消失问题在BP的网络里详细的介绍过(兴趣有请的查看我的这篇文章),然后主要精力介绍Ru ...

  8. 深度学习优化算法:RMSProp算法

    原文链接:动手学深度学习pytorch版:7.6 RMSProp算法 github:https://github.com/ShusenTang/Dive-into-DL-PyTorch 原论文: [1 ...

  9. 深度学习优化算法实现(Momentum, Adam)

    目录 Momentum 初始化 更新参数 Adam 初始化 更新参数 除了常见的梯度下降法外,还有几种比较通用的优化算法:表现都优于梯度下降法.本文只记录完成吴恩达深度学习作业时遇到的Momentum ...

最新文章

  1. Leetcode: Remove Element
  2. 你的微信昵称,正在暴露你!
  3. Web安全之命令执行漏洞
  4. Objective-C ,ios,iphone开发基础:picker控件详解与使用,(实现省市的二级联动)
  5. 单身狗救星!电子科大校长为理工科男脱单提建议
  6. redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...
  7. Zabbix配置模板监控指定服务器主机
  8. JDK8新特性(十一)之收集Stream流中的结果
  9. 安卓开发12:安卓各种事件操作
  10. 深入理解java中的线程池
  11. 【车间调度】基于matlab粒子群算法求解生产调度问题【含Matlab源码 485期】
  12. linux如何进入超级终端,使用telnet和超级终端登录控制Ubuntu
  13. 流畅的python mobi_流畅的Python中文pdf_Python教程
  14. zmap扫描mysql_zmap快速扫描
  15. html微信公众平台登录界面,微信公众平台登录界面在哪里
  16. Pandorabox(Openwrt) 双宽带(WAN) 叠加网络实战
  17. 信用风险计量模型简述
  18. win10 下Adobe Reader XI闪退问题解决
  19. word中表格出现无法自动换页问题
  20. 强烈推荐|超经典的Matlab学习书籍下载

热门文章

  1. Vue-弹层显示样式
  2. Css之使用calc()计算宽高(vw/vh)
  3. 测试用例的特性以及编写测试用例的方法
  4. window.open打开的新窗口里执行原窗口url跳转
  5. 人生第一次JAVA编程,电梯(并不算完成版),以及IDEA里使用git
  6. echarts 全局换肤 echarts根据系统颜色换肤,echarts自定义icon,echarts发光效果
  7. apt安装JDK8并设置为系统默认Java
  8. android API HOOK
  9. 如何高效撰写毕业论文之Origin绘图 (一)
  10. 蓝牙耳机哪个品牌性价比高?适合圣诞送礼的高性价比蓝牙耳机推荐