Coursera吴恩达《优化深度神经网络》课程笔记(2)-- 优化算法

深度机器学习中的batch的大小

深度机器学习中的batch的大小对学习效果有何影响?

1. Mini-batch gradient descent

SGD VS BGD VS MBGD

3. 指数加权平均(Exponentially weighted averages)

这种滑动平均算法称为指数加权平均(exponentially weighted average)其一般形式为:

值决定了指数加权平均的天数,近似表示为:

例如,当 β=0.9 ,则 ,表示将前10天进行指数加权平均。

当 β=0.98 ,则 ,表示将前50天进行指数加权平均。

β值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,但是同时也会向右平移。下图绿色曲线和黄色曲线分别表示了 β=0.98 和 β=0.5 时,指数加权平均的结果。

这里简单解释一下公式 是怎么来的。准确来说,指数加权平均算法跟之前所有天的数值都有关系,根据之前的推导公式就能看出。但是指数是衰减的,一般认为衰减到 就可以忽略不计了。因此,根据之前的推导公式,我们只要证明

1/(1-β)是迭代中β乘的次数,左式指前面的V(如V0)在迭代多次后(如当前V是20)V0的β近似值,它衰减到  那么V0就可以忽略不计了,详见下图

,则 。即证明转化为:

显然,当 时,上述等式是近似成立的。

至此,简单解释了为什么指数加权平均的天数的计算公式为

4. 指数加权平均理解

重新看上面这个式子, 原始数据值, 是类似指数曲线,从右向左,呈指数下降的。 的值就是这两个子式的点乘,将原始数据值与衰减指数点乘,相当于做了指数衰减,离得越近,影响越大,离得越远,影响越小,衰减越厉害。

5.指数加权平均的偏移校正

上文中提到当 时,指数加权平均结果如下图绿色曲线所示。但是实际上,真实曲线如紫色曲线所示。

我们注意到,紫色曲线与绿色曲线的区别是,紫色曲线开始的时候相对较低一些。这是因为开始时我们设置 ,所以初始值会相对小一些,直到后面受前面的影响渐渐变小,趋于正常。

修正这种问题的方法是进行偏移校正(bias correction),即在每次计算完 后,对 进行下式处理:

在刚开始的时候,t比较小, ,这样就将 修正得更大一些,效果是把紫色曲线开始部分向上提升一些,与绿色曲线接近重合。随着t增大, 基本不变,紫色曲线与绿色曲线依然重合。这样就实现了简单的偏移校正,得到我们希望的绿色曲线。

值得一提的是,机器学习中,偏移校正并不是必须的。因为,在迭代一次次数后(t较大), 受初始值影响微乎其微,紫色曲线与绿色曲线基本重合。所以,一般可以忽略初始迭代过程,等到一定迭代之后再取值,这样就不需要进行偏移校正了。

6.动量梯度下降算法 SGD with Momentum

在普通的随机梯度下降和批梯度下降当中,参数的更新是按照如下公式进行的:

W = W - αdW 
b = b - αdb

其中α是学习率,dW、db是cost function对w和b的偏导数。

原始的梯度下降算法如上图蓝色折线所示。在梯度下降过程中,梯度下降的振荡较大,尤其对于W、b之间数值范围差别较大的情况。此时每一点处的梯度只与当前方向有关,产生类似折线的效果,前进缓慢。而如果对梯度进行指数加权平均,这样使当前梯度不仅与当前方向有关,还与之前的方向有关,这样处理让梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。

有一个梯度下降法叫做动量梯度下降。在SGD基础上引入了一阶动量

使用这个公式,可以将之前的dW和db都联系起来,不再是每一次梯度都是独立的情况。其中β是可以自行设置的超参数,一般情况下默认为0.9(也可以设置为其他数值)。β代表了现在的vdW和vdb与之前的1 / (1 - β)个vdW和vdb有关。

从动量的角度来看,以权重W为例, 可以成速度V, 可以看成是加速度a。指数加权平均实际上是计算当前的速度,当前速度由之前的速度和现在的加速度共同影响。而 ,又能限制速度 过大。也就是说,当前的速度是渐变的,而不是瞬变的,是动量的过程。这保证了梯度下降的平稳性和准确性,减少振荡,较快地达到最小值处。

另外,关于偏移校正,可以不使用。因为经过10次迭代后,随着滑动平均的过程,偏移情况会逐渐消失。

7. AdaDelta/RMSProp

RMSprop是另外一种优化梯度下降速度的算法。考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。

每次迭代训练过程中,其权重W和常数项b的更新表达式为:

下面简单解释一下RMSprop算法的原理,仍然以下图为例,为了便于分析,令水平方向为W的方向,垂直方向为b的方向。

从图中可以看出,梯度下降(蓝色折线)在垂直方向(b)上振荡较大,在水平方向(W)上振荡较小,表示在b方向上梯度较大,即 较大,而在W方向上梯度较小,即 较小。因此,上述表达式中 较大,而 较小。在更新W和b的表达式中,变化值 较大,而 较小。也就使得W变化得多一些,b变化得少一些。即加快了W方向的速度,减小了b方向的速度,减小振荡,实现快速梯度下降算法,其梯度下降过程如绿色折线所示。总得来说,就是如果哪个方向振荡大,就减小该方向的更新速度,从而减小振荡。

还有一点需要注意的是为了避免RMSprop算法中分母为零,通常可以在分母增加一个极小的常数

其中, ,或者其它较小值。

8. Adam optimization algorithm

我们看到,SGD-M在SGD基础上增加了一阶动量,AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。

其算法流程为:

Adam算法包含了几个超参数,分别是: 。其中, 通常设置为0.9, 通常设置为0.999, 通常设置为 。一般只需要对 进行调试。

实际应用中,Adam算法结合了动量梯度下降和RMSprop各自的优点,使得神经网络训练速度大大提高。

————————————————————————————————————————

详解深度学习中的常用优化算法

优化算法通用框架

首先定义:待优化参数:w ,目标函数: f(w),初始学习率 α。

而后,开始进行迭代优化。在每个epoch t:

  1. 计算目标函数关于当前参数的梯度:

  2. 根据历史梯度计算一阶动量和二阶动量:

  3. 计算当前时刻的下降梯度:

  4. 根据下降梯度进行更新:

   

掌握了这个框架,你可以轻轻松松设计自己的优化算法。

我们拿着这个框架,来照一照各种玄乎其玄的优化算法的真身。步骤3、4对于各个算法都是一致的,主要的差别就体现在1和2上。

Adam:可能不收敛

回忆一下上文提到的各大优化算法的学习率:

其中,SGD和Momentum没有用到二阶动量,因此学习率是恒定的(实际使用过程中会采用学习率衰减策略,因此学习率递减)。

AdaGrad(参见详解深度学习中的常用优化算法)的二阶动量不断累积,单调递增,因此学习率是单调递减的。因此,这两类算法会使得学习率不断递减,最终收敛到0,模型也得以收敛。

但AdaDelta(RMSProp)和Adam则不然。二阶动量是固定时间窗口内的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得 可能会时大时小,不是单调变化。这就可能在训练后期引起学习率的震荡,导致模型无法收敛。

不同算法的核心差异

不同优化算法最核心的区别,就是第三步所执行的下降方向

Vt是之前的S,mt是之前的V

这个式子中,前半部分是实际的学习率(也即下降步长),后半部分是实际的下降方向。SGD算法的下降方向就是该位置的梯度方向的反方向,带一阶动量的SGD的下降方向则是该位置的一阶动量方向。自适应学习率类优化算法为每个参数设定了不同的学习率,在不同维度上设定不同步长,因此其下降方向是缩放过(scaled)的一阶动量方向。

————————————————————————————————————————

9. 减小学习因子

减小学习因子 也能有效提高神经网络训练速度,这种方法被称为learning rate decay。

Learning rate decay就是随着迭代次数增加,学习因子 逐渐减小。下面用图示的方式来解释这样做的好处。下图中,蓝色折线表示使用恒定的学习因子 ,由于每次训练 相同,步进长度不变,在接近最优值处的振荡也大,在最优值附近较大范围内振荡,与最优值距离就比较远。绿色折线表示使用不断减小的 ,随着训练次数增加, 逐渐减小,步进长度减小,使得能够在最优值处较小范围内微弱振荡,不断逼近最优值。相比较恒定的 来说,learning rate decay更接近最优值。

Learning rate decay中对 可由下列公式得到:

其中,deacy_rate是参数(可调),epoch是训练完所有样本的次数。随着epoch增加, 会不断变小。

除了上面计算 的公式之外,还有其它可供选择的计算公式:

其中,k为可调参数,t为mini-bach number。

除此之外,还可以设置 为关于t的离散值,随着t增加, 呈阶梯式减小。当然,也可以根据训练情况灵活调整当前的 值,但会比较耗时间。

10. The problem of local optima

在使用梯度下降算法不断减小cost function时,可能会得到局部最优解(local optima)而不是全局最优解(global optima)。之前我们对局部最优解的理解是形如碗状的凹槽,如下图左边所示。

但是在神经网络中,local optima的概念发生了变化。准确地来说,大部分梯度为零的“最优点”并不是这些凹槽处,而是形如右边所示的马鞍状,称为saddle point。也就是说,梯度为零并不能保证都是convex(极小值),也有可能是concave(极大值)。特别是在神经网络中参数很多的情况下,所有参数梯度为零的点很可能都是右边所示的马鞍状的saddle point,而不是左边那样的local optimum。

类似马鞍状的plateaus会降低神经网络学习速度。Plateaus是梯度接近于零的平缓区域,如下图所示。在plateaus上梯度很小,前进缓慢,到达saddle point需要很长时间。到达saddle point后,由于随机扰动,梯度一般能够沿着图中绿色箭头,离开saddle point,继续前进,只是在plateaus上花费了太多时间。

总的来说,关于local optima,有两点总结:

  • 只要选择合理的强大的神经网络,一般不太可能陷入local optima
  • Plateaus可能会使梯度下降变慢,降低学习速度

值得一提的是,上文介绍的动量梯度下降,RMSprop,Adam算法都能有效解决plateaus下降过慢的问题,大大提高神经网络的学习速度。

优化深度神经网络(二)优化算法 SGD Momentum RMSprop Adam的更多相关文章

  1. 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)

    优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...

  2. TensorFlow实现与优化深度神经网络

    TensorFlow实现与优化深度神经网络 转载请注明作者:梦里风林Github工程地址:https://github.com/ahangchen/GDLnotes欢迎star,有问题可以到Issue ...

  3. 优化深度神经网络(三)Batch Normalization

    Coursera吴恩达<优化深度神经网络>课程笔记(3)-- 超参数调试.Batch正则化和编程框架 1. Tuning Process 深度神经网络需要调试的超参数(Hyperparam ...

  4. 优化深度神经网络(一) dropout 初始化

    Coursera吴恩达<优化深度神经网络>课程笔记(1)-- 深度学习的实用层面 1. Train/Dev/Test sets  训练集(Training sets).验证集(Develo ...

  5. 深度学习优化算法Momentum RMSprop Adam

    一.Momentum 1. 计算dw.db. 2. 定义v_db.v_dw \[ v_{dw}=\beta v_{dw}+(1-\beta)dw \] \[ v_{db}=\beta v_{db}+( ...

  6. TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络

    转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程地址 视频/字幕下载 全 ...

  7. 各种优化方法总结比較(sgd/momentum/Nesterov/adagrad/adadelta)

    前言 这里讨论的优化问题指的是,给定目标函数f(x),我们须要找到一组參数x.使得f(x)的值最小. 本文下面内容如果读者已经了解机器学习基本知识,和梯度下降的原理. SGD SGD指stochast ...

  8. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam) 深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 ...

  9. 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)

    前言 这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小. 本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理. Batch gradient d ...

随机推荐

  1. idea结合git使用(正常项目开发过程中的使用)

    1.如何将本地项目代码提交到公司码云上面 1.项目右键 2. 在远处的remotes里面设置你的url

  2. 51nod-1201-数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 1201 整数划分 基准时间限制:1 秒 空间限制:131072 ...

  3. neutron之SDN简单测试

    title: Neutron SDN 手动实现手册 date: 2017-04-13 23:37 tags: Network 本文旨在通过自己搭建类似neutron (openvswitch + gr ...

  4. 【sparkStreaming】SparkStream的创建

    DStream编程数据模型 DStream(Discretized Stream)作为Spark Streaming的基础抽象,它代表持续性的数据流. 这些数据流既可以通过外部输入源赖获取,也可以通过 ...

  5. Project Euler 126 - Cuboid layers

    这题先是推公式… 狂用不完全归纳+二次回归,最后推出这么一个奇怪的公式 \[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\] 表示长宽高为\(x\).\(y\).\ ...

  6. css中zoom:1以及z-index的作用

    一.CSS中zoom:1的作用在做IE6.IE7.IE8浏览器兼容的时候,经常会遇到一些问题,可以使用zoom:1来解决,有如下作用:1.触发IE浏览器的haslayout2.解决IE下的浮动,mar ...

  7. 【辅助工具】Python实现微信跳一跳

    最近迷上了微信跳一跳小游戏,正好也看到知乎上有大神分享了技术贴,我也参考了好多资料,原理就是通过abd命令截取图片,python计算两个点距离,然后转化按压时间,让电脑来完成游戏.我花了很长时间才把程 ...

  8. JAVA并发全景图1.1版本

    感谢微信群"Spring Boot那些事"兄弟们的热心整理和总结

  9. 【JD的一人戏】之"小羊踢足球"第一篇

    好多次加班后坐的士回家,副驾驶座位后内嵌的显示屏正好在播放一个美食节目,内容就是一个着装怪异的厨子把各种食材分门别类地摆在你面前,然后用小小的锅碗瓢盆慢慢的做出很精致的够一个人吃的分量的各种美食,做好 ...

  10. 转载的,讲解java.util的集合类

    本文是转载的 http://www.ibm.com/developerworks/cn/java/j-lo-set-operation/index.html#ibm-pcon 在实际的项目开发中会有很 ...