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

红色石头的我的网站:redstonewill.comweb

上节课咱们主要介绍了如何创建一个实用的深度学习神经网络。包括Train/Dev/Test sets的比例选择,Bias和Variance的概念和区别:Bias对应欠拟合,Variance对应过拟合。接着,咱们介绍了防止过拟合的两种方法:L2 regularization和Dropout。而后,介绍了如何进行规范化输入,以加快梯度降低速度和精度。而后,咱们介绍了梯度消失和梯度爆炸的概念和危害,并提出了如何使用梯度初始化来下降这种风险。最后,咱们介绍了梯度检查,来验证梯度降低算法是否正确。本节课,咱们将继续讨论深度神经网络中的一些优化算法,经过使用这些技巧和方法来提升神经网络的训练速度和精度。算法

1. Mini-batch gradient descent

以前咱们介绍的神经网络训练过程是对全部m个样本,称为batch,经过向量化计算方式,同时进行的。若是m很大,例如达到百万数量级,训练速度每每会很慢,由于每次迭代都要对全部样本进行进行求和运算和矩阵运算。咱们将这种梯度降低算法称为Batch Gradient Descent。网络

为了解决这一问题,咱们能够把m个训练样本分红若干个子集,称为mini-batches,这样每一个子集包含的数据量就小了,例如只有1000,而后每次在单一子集上进行神经网络训练,速度就会大大提升。这种梯度降低算法叫作Mini-batch Gradient Descent。app

假设总的训练样本个数m=5000000,其维度为 ( n x , m ) 。将其分红5000个子集,每一个mini-batch含有1000个样本。咱们将每一个mini-batch记为 X { t } ,其维度为 ( n x , 1000 ) 。相应的每一个mini-batch的输出记为 Y { t } ,其维度为 ( 1 , 1000 ) ,且 t = 1 , 2 , , 5000 机器学习

这里顺便总结一下咱们遇到的神经网络中几类字母的上标含义:svg

  • X ( i ) :第i个样本学习

  • Z [ l ] :神经网络第 l 层网络的线性输出优化

  • X { t } , Y { t } :第t组mini-batch网站

Mini-batches Gradient Descent的实现过程是先将总的训练样本分红T个子集(mini-batches),而后对每一个mini-batch进行神经网络训练,包括Forward Propagation,Compute Cost Function,Backward Propagation,循环至T个mini-batch都训练完毕。atom

f o r     t = 1 , , T     {

        F o r w a r d   P r o p a g a t i o n

        C o m p u t e C o s t F u n c t i o n

        B a c k w a r d P r o p a g a t i o n

        W := W α d W

        b := b α d b

}

通过T次循环以后,全部m个训练样本都进行了梯度降低计算。这个过程,咱们称之为经历了一个epoch。对于Batch Gradient Descent而言,一个epoch只进行一次梯度降低算法;而Mini-Batches Gradient Descent,一个epoch会进行T次梯度降低算法。

值得一提的是,对于Mini-Batches Gradient Descent,能够进行屡次epoch训练。并且,每次epoch,最好是将整体训练数据从新打乱、从新分红T组mini-batches,这样有利于训练出最佳的神经网络模型。

2. Understanding mini-batch gradient descent

Batch gradient descent和Mini-batch gradient descent的cost曲线以下图所示:

这里写图片描述

对于通常的神经网络模型,使用Batch gradient descent,随着迭代次数增长,cost是不断减少的。然而,使用Mini-batch gradient descent,随着在不一样的mini-batch上迭代训练,其cost不是单调降低,而是受相似noise的影响,出现振荡。但总体的趋势是降低的,最终也能获得较低的cost值。

之因此出现细微振荡的缘由是不一样的mini-batch之间是有差别的。例如可能第一个子集 ( X { 1 } , Y { 1 } ) 是好的子集,而第二个子集 ( X { 2 } , Y { 2 } ) 包含了一些噪声noise。出现细微振荡是正常的。

如何选择每一个mini-batch的大小,即包含的样本个数呢?有两个极端:若是mini-batch size=m,即为Batch gradient descent,只包含一个子集为 ( X { 1 } , Y { 1 } ) = ( X , Y ) ;若是mini-batch size=1,即为Stachastic gradient descent,每一个样本就是一个子集 ( X { 1 } , Y { 1 } ) = ( x ( i ) , y ( i ) ) ,共有m个子集。

咱们来比较一下Batch gradient descent和Stachastic gradient descent的梯度降低曲线。以下图所示,蓝色的线表明Batch gradient descent,紫色的线表明Stachastic gradient descent。Batch gradient descent会比较平稳地接近全局最小值,可是由于使用了全部m个样本,每次前进的速度有些慢。Stachastic gradient descent每次前进速度很快,可是路线曲折,有较大的振荡,最终会在最小值附近来回波动,难以真正达到最小值处。并且在数值处理上就不能使用向量化的方法来提升运算速度。

这里写图片描述

实际使用中,mini-batch size不能设置得太大(Batch gradient descent),也不能设置得过小(Stachastic gradient descent)。这样,至关于结合了Batch gradient descent和Stachastic gradient descent各自的优势,既能使用向量化优化算法,又能叫快速地找到最小值。mini-batch gradient descent的梯度降低曲线以下图绿色所示,每次前进速度较快,且振荡较小,基本能接近全局最小值。

这里写图片描述

通常来讲,若是整体样本数量m不太大时,例如 m 2000 ,建议直接使用Batch gradient descent。若是整体样本数量m很大时,建议将样本分红许多mini-batches。推荐经常使用的mini-batch size为64,128,256,512。这些都是2的幂。之因此这样设置的缘由是计算机存储数据通常是2的幂,这样设置能够提升运算速度。

3. Exponentially weighted averages

该部分咱们将介绍指数加权平均(Exponentially weighted averages)的概念。

举个例子,记录半年内伦敦市的气温变化,并在二维平面上绘制出来,以下图所示:

这里写图片描述

看上去,温度数据彷佛有noise,并且抖动较大。若是咱们但愿看到半年内气温的总体变化趋势,能够经过移动平均(moving average)的方法来对天天气温进行平滑处理。

例如咱们能够设 V 0 = 0 ,当成第0天的气温值。

第一天的气温与第0天的气温有关:

V 1 = 0.9 V 0 + 0.1 θ 1

次日的气温与第一天的气温有关:

(1) V 2 = 0.9 V 1 + 0.1 θ 2 (2) = 0.9 ( 0.9 V 0 + 0.1 θ 1 ) + 0.1 θ 2 (3) = 0.9 2 V 0 + 0.9 0.1 θ 1 + 0.1 θ 2

第三天的气温与次日的气温有关:

(4) V 3 = 0.9 V 2 + 0.1 θ 3 (5) = 0.9 ( 0.9 2 V 0 + 0.9 0.1 θ 1 + 0.1 θ 2 ) + 0.1 θ 3 (6) = 0.9 3 V 0 + 0.9 2 0.1 θ 1 + 0.9 0.1 θ 2 + 0.1 θ 3

即第t天与第t-1天的气温迭代关系为:

(7) V t = 0.9 V t 1 + 0.1 θ t (8) = 0.9 t V 0 + 0.9 t 1 0.1 θ 1 + 0.9 t 2 0.1 θ 2 + + 0.9 0.1 θ t 1 + 0.1 θ t

通过移动平均处理获得的气温以下图红色曲线所示:

这里写图片描述

这种滑动平均算法称为指数加权平均(exponentially weighted average)。根据以前的推导公式,其通常形式为:

V t = β V t 1 + ( 1 β ) θ t

上面的例子中, β = 0.9 β 值决定了指数加权平均的天数,近似表示为:

1 1 β

例如,当 β = 0.9 ,则 1 1 β = 10 ,表示将前10天进行指数加权平均。当 β = 0.98 ,则 1 1 β = 50 ,表示将前50天进行指数加权平均。 β 值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,可是同时也会向右平移。下图绿色曲线和黄色曲线分别表示了 β = 0.98 β = 0.5 时,指数加权平均的结果。

这里写图片描述

这里简单解释一下公式 1 1 β 是怎么来的。准确来讲,指数加权平均算法跟以前全部天的数值都有关系,根据以前的推导公式就能看出。可是指数是衰减的,通常认为衰减到 1 e 就能够忽略不计了。所以,根据以前的推导公式,咱们只要证实

β 1 1 β = 1 e

就行了。

1 1 β = N N > 0 ,则 β = 1 1 N 1 N < 1 。即证实转化为:

( 1 1 N ) N = 1 e

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

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

4. Understanding exponetially weighted averages

咱们将指数加权平均公式的通常形式写下来:

(9) V t = β V t 1 + ( 1 β ) θ t (10) = ( 1 β ) θ t + ( 1 β ) β θ t 1 + ( 1 β ) β 2 θ t 2 + (11) + ( 1 β ) β t 1 θ 1 + β t V 0

观察上面这个式子, θ t , θ t 1 , θ t 2 , , θ 1 是原始数据值, ( 1 β ) , ( 1 β ) β , ( 1 β ) β 2 , , ( 1 β ) β t 1 是相似指数曲线,从右向左,呈指数降低的。 V t 的值就是这两个子式的点乘,将原始数据值与衰减指数点乘,至关于作了指数衰减,离得越近,影响越大,离得越远,影响越小,衰减越厉害。

这里写图片描述

咱们已经知道了指数加权平均的递推公式。实际应用中,为了减小内存的使用,咱们可使用这样的语句来实现指数加权平均算法:

V θ = 0

R e p e a t   {

        G e t   n e x t   θ t

        V θ := β V θ + ( 1 β ) θ t

}

5. Bias correction in exponentially weighted average

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

这里写图片描述

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

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

V t 1 β t

在刚开始的时候,t比较小, ( 1 β t ) < 1 ,这样就将 V t 修正得更大一些,效果是把紫色曲线开始部分向上提高一些,与绿色曲线接近重合。随着t增大, ( 1 β t ) 1 V t 基本不变,紫色曲线与绿色曲线依然重合。这样就实现了简单的偏移校订,获得咱们但愿的绿色曲线。

值得一提的是,机器学习中,偏移校订并非必须的。由于,在迭代一次次数后(t较大), V t 受初始值影响微乎其微,紫色曲线与绿色曲线基本重合。因此,通常能够忽略初始迭代过程,等到必定迭代以后再取值,这样就不须要进行偏移校订了。

6. Gradient descent with momentum

该部分将介绍动量梯度降低算法,其速度要比传统的梯度降低算法快不少。作法是在每次训练时,对梯度进行指数加权平均处理,而后用获得的梯度值更新权重W和常数项b。下面介绍具体的实现过程。

这里写图片描述

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

权重W和常数项b的指数加权平均表达式以下:

V d W = β V d W + ( 1 β ) d W

V d b = β V d b + ( 1 β ) d b

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

动量梯度降低算法的过程以下:

O n   i t e r a t i o n   t :

        C o m p u t e   d W ,   d b   o n   t h e   c u r r e n t   m i n i b a t c h

        V d W = β V d W + ( 1 β ) d W

        V d b = β V d b + ( 1 β ) d b

        W = W α V d W ,   b = b α V d b

初始时,令 V d W = 0 , V d b = 0 。通常设置 β = 0.9 ,即指数加权平均前10天的数据,实际应用效果较好。

另外,关于偏移校订,能够不使用。由于通过10次迭代后,随着滑动平均的过程,偏移状况会逐渐消失。

补充一下,在其它文献资料中,动量梯度降低还有另一种写法:

V d W = β V d W + d W

V d b = β V d b + d b

即消去了 d W d b 前的系数 ( 1 β ) 。这样简化了表达式,可是学习因子 α 至关于变成了 α 1 β ,表示 α 也受 β 的影响。从效果上来讲,这种写法也是能够的,可是不够直观,且调参涉及到 α ,不够方便。因此,实际应用中,推荐第一种动量梯度降低的表达式。

7. RMSprop

RMSprop是另一种优化梯度降低速度的算法。每次迭代训练过程当中,其权重W和常数项b的更新表达式为:

S W = β S d W + ( 1 β ) d W 2

S b = β S d b + ( 1 β ) d b 2

W := W α d W S W ,   b := b α d b S b

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

这里写图片描述

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

还有一点须要注意的是为了不RMSprop算法中分母为零,一般能够在分母增长一个极小的常数 ε

W := W α d W S W + ε ,   b := b α d b S b + ε

其中, ε = 10 8 ,或者其它较小值。

8. Adam optimization algorithm

Adam(Adaptive Moment Estimation)算法结合了动量梯度降低算法和RMSprop算法。其算法流程为:

V d W = 0 ,   S d W ,   V d b = 0 ,   S d b = 0

O n   i t e r a t i o n   t :

        C i m p u t e   d W ,   d b

        V d W = β 1 V d W + ( 1 β 1 ) d W ,   V d b = β 1 V d b + ( 1 β 1 ) d b

        S d W = β 2 S d W + ( 1 β 2 ) d W 2 ,   S d b = β 2 S d b + ( 1 β 2 ) d b 2

        V d W c o r r e c t e d = V d W 1 β 1 t ,   V d b c o r r e c t e d = V d b 1 β 1 t

        S d W c o r r e c t e d = S d W 1 β 2 t ,   S d b c o r r e c t e d = S d b 1 β 2 t

        W := W α V d W c o r r e c t e d S d W c o r r e c t e d + ε ,   b := b α V d b c o r r e c t e d S d b c o r r e c t e d + ε

Adam算法包含了几个超参数,分别是: α , β 1 , β 2 , ε 。其中, β 1 一般设置为0.9, β 2 一般设置为0.999, ε 一般设置为 10 8 。通常只须要对 β 1 β 2 进行调试。

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

9. Learning rate decay

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

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

这里写图片描述

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

α = 1 1 + d e c a y _ r a t e e p o c h α 0

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

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

α = 0.95 e p o c h α 0

α = k e p o c h α 0         o r         k t α 0

其中,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降低过慢的问题,大大提升神经网络的学习速度。

更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)
这里写图片描述