《吴恩达深度学习》学习笔记006_优化算法 (Optimization algorithms)

http://www.ai-start.com/dl2017/html/lesson2-week2.html

优化算法 (Optimization algorithms)

Mini-batch 梯度下降(Mini-batch gradient descent)

可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么把其中的$x{(1)}$到$x$取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从$x{(1001)}$到$x$,然后再取1000个样本,以此类推。

接下来我要说一个新的符号,把$x{(1)}$到$x$称为$X{{1}}$,$x$到$x{(2000)}$称为$X{{2}}$,如果你的训练样本一共有500万个,每个mini-batch都有1000个样本,也就是说,你有5000个mini-batch,因为5000乘以1000就是5000万。

理解mini-batch梯度下降法(Understanding mini-batch gradient descent)

在这里插入图片描述
使用mini-batch梯度下降法,如果你作出成本函数在整个过程中的图,则并不是每次迭代都是下降的,特别是在每次迭代中,你要处理的是$X{{t}}$和$Y{{ t}}$,如果要作出成本函数$J^{{ t}}$的图,而$J{{t}}$只和$X{{ t}}$,$Y{{t}}$有关,也就是每次迭代下你都在训练不同的样本集或者说训练不同的mini-batch,如果你要作出成本函数$J$的图,你很可能会看到这样的结果,走向朝下,但有更多的噪声,所以如果你作出$J{{t}}$的图,因为在训练mini-batch梯度下降法时,会经过多代,你可能会看到这样的曲线。没有每次迭代都下降是不要紧的,但走势应该向下,噪声产生的原因在于也许$X{{1}}$和$Y{{1}}$是比较容易计算的mini-batch,因此成本会低一些。不过也许出于偶然,$X{{2}}$和$Y{{2}}$是比较难运算的mini-batch,或许你需要一些残缺的样本,这样一来,成本会更高一些,所以才会出现这些摆动,因为你是在运行mini-batch梯度下降法作出成本函数图。

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

在这里插入图片描述

理解指数加权平均数(Understanding exponentially weighted averages)

回忆一下这个计算指数加权平均数的关键方程。

${{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}}$

$\beta=0.9$的时候,得到的结果是红线,如果它更接近于1,比如0.98,结果就是绿线,如果$\beta$小一点,如果是0.5,结果就是黄线。
在这里插入图片描述
我们进一步地分析,来理解如何计算出每日温度的平均值。

同样的公式,${{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}}$

使$\beta=0.9$,写下相应的几个公式,所以在执行的时候,$t$从0到1到2到3,$t$的值在不断增加,为了更好地分析,我写的时候使得$t$的值不断减小,然后继续往下写。
在这里插入图片描述

数加权平均的偏差修正(Bias correction in exponentially weighted averages)

你学过了如何计算指数加权平均数,有一个技术名词叫做偏差修正,可以让平均数运算更加准确,来看看它是怎么运行的。
在这里插入图片描述
${{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}}$

在上一个视频中,这个(红色)曲线对应$\beta$的值为0.9,这个(绿色)曲线对应的$\beta$=0.98,如果你执行写在这里的公式,在$\beta$等于0.98的时候,得到的并不是绿色曲线,而是紫色曲线,你可以注意到紫色曲线的起点较低,我们来看看怎么处理。

计算移动平均数的时候,初始化$v_{0} = 0$,$v_{1} = 0.98v_{0} +0.02\theta_{1}$,但是$v_{0} =0$,所以这部分没有了($0.98v_{0}$),所以$v_{1} =0.02\theta_{1}$,所以如果一天温度是40华氏度,那么$v_{1} = 0.02\theta_{1} =0.02 \times 40 = 8$,因此得到的值会小很多,所以第一天温度的估测不准。

$v_{2} = 0.98v_{1} + 0.02\theta_{2}$,如果代入$v_{1}$,然后相乘,所以$v_{2}= 0.98 \times 0.02\theta_{1} + 0.02\theta_{2} = 0.0196\theta_{1} +0.02\theta_{2}$,假设$\theta_{1}$和$\theta_{2}$都是正数,计算后$v_{2}$要远小于$\theta_{1}$和$\theta_{2}$,所以$v_{2}$不能很好估测出这一年前两天的温度。

在这里插入图片描述
有个办法可以修改这一估测,让估测变得更好,更准确,特别是在估测初期,也就是不用$v_{t}$,而是用$\frac{v_{t}}{1- \beta^{t}}$,t就是现在的天数。举个具体例子,当$t=2$时,$1 - \beta^{t} = 1 - {0.98}^{2} = 0.0396$,因此对第二天温度的估测变成了$\frac{v_{2}}{0.0396} =\frac{0.0196\theta_{1} + 0.02\theta_{2}}{0.0396}$,也就是$\theta_{1}$和$\theta_{2}$的加权平均数,并去除了偏差。你会发现随着$t$增加,$\beta^{t}$接近于0,所以当$t$很大的时候,偏差修正几乎没有作用,因此当$t$较大的时候,紫线基本和绿线重合了。不过在开始学习阶段,你才开始预测热身练习,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线。

在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。

所以你学会了计算指数加权移动平均数,我们接着用它来构建更好的优化算法吧!

动量梯度下降法(Gradient descent with Momentum)

如果你要优化成本函数,函数形状如图,红点代表最小值的位置,假设你从这里(蓝色点)开始梯度下降法,如果进行梯度下降法的一次迭代,无论是batch或mini-batch下降法,也许会指向这里,现在在椭圆的另一边,计算下一步梯度下降,结果或许如此,然后再计算一步,再一步,计算下去,你会发现梯度下降法要很多计算步骤对吧?
在这里插入图片描述
例如,如果你要优化成本函数,函数形状如图,红点代表最小值的位置,假设你从这里(蓝色点)开始梯度下降法,如果进行梯度下降法的一次迭代,无论是batch或mini-batch下降法,也许会指向这里,现在在椭圆的另一边,计算下一步梯度下降,结果或许如此,然后再计算一步,再一步,计算下去,你会发现梯度下降法要很多计算步骤对吧?

慢慢摆动到最小值,这种上下波动减慢了梯度下降法的速度,你就无法使用更大的学习率,如果你要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,你要用一个较小的学习率。

另一个看待问题的角度是,在纵轴上,你希望学习慢一点,因为你不想要这些摆动,但是在横轴上,你希望加快学习,你希望快速从左向右移,移向最小值,移向红点。所以使用动量梯度下降法,你需要做的是,在每次迭代中,确切来说在第$t$次迭代的过程中,你会计算微分$dW$,$db$,我会省略上标$[l]$,你用现有的mini-batch计算$dW$,$db$。如果你用batch梯度下降法,现在的mini-batch就是全部的batch,对于batch梯度下降法的效果是一样的。如果现有的mini-batch就是整个训练集,效果也不错,你要做的是计算$v_{{dW}}= \beta v_{{dW}} + \left( 1 - \beta \right)dW$,这跟我们之前的计算相似,也就是$v = \beta v + \left( 1 - \beta \right)\theta_{t}$,$dW$的移动平均数,接着同样地计算$v_{db}$,$v_{db} = \beta v_{{db}} + ( 1 - \beta){db}$,然后重新赋值权重,$W:= W -av_{{dW}}$,同样$b:= b - a v_{db}$,这样就可以减缓梯度下降的幅度。

RMSprop

root mean square prop算法

回忆一下我们之前的例子,如果你执行梯度下降,虽然横轴方向正在推进,但纵轴方向会有大幅度摆动,为了分析这个例子,假设纵轴代表参数$b$,横轴代表参数$W$,可能有$W_{1}$,$W_{2}$或者其它重要的参数,为了便于理解,被称为$b$和$W$。

所以,你想减缓$b$方向的学习,即纵轴方向,同时加快,至少不是减缓横轴方向的学习,RMSprop算法可以实现这一点。

在这里插入图片描述
在第$t$次迭代中,该算法会照常计算当下mini-batch的微分$dW$,$db$,所以我会保留这个指数加权平均数,我们用到新符号$S_{dW}$,而不是$v_{dW}$,因此$S_{dW}= \beta S_{dW} + (1 -\beta) {dW}^{2}$,澄清一下,这个平方的操作是针对这一整个符号的,这样做能够保留微分平方的加权平均数,同样$S_{db}= \beta S_{db} + (1 - \beta){db}^{2}$,再说一次,平方是针对整个符号的操作。

接着RMSprop会这样更新参数值,$W:= W -a\frac{dW}{\sqrt{S_{dW}}}$,$b:=b -\alpha\frac{db}{\sqrt{S_{db}}}$,我们来理解一下其原理。记得在横轴方向或者在例子中的$W$方向,我们希望学习速度快,而在垂直方向,也就是例子中的$b$方向,我们希望减缓纵轴上的摆动,所以有了$S_{dW}$和$S_{db}$,我们希望$S_{dW}$会相对较小,所以我们要除以一个较小的数,而希望$S_{db}$又较大,所以这里我们要除以较大的数字,这样就可以减缓纵轴上的变化。你看这些微分,垂直方向的要比水平方向的大得多,所以斜率在$b$方向特别大,所以这些微分中,$db$较大,$dW$较小,因为函数的倾斜程度,在纵轴上,也就是b方向上要大于在横轴上,也就是$W$方向上。$db$的平方较大,所以$S_{db}$也会较大,而相比之下,$dW$会小一些,亦或$dW$平方会小一些,因此$S_{dW}$会小一些,结果就是纵轴上的更新要被一个较大的数相除,就能消除摆动,而水平方向的更新则被较小的数相除。

RMSprop的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。还有个影响就是,你可以用一个更大学习率$a$,然后加快学习,而无须在纵轴上垂直方向偏离。

要说明一点,我一直把纵轴和横轴方向分别称为$b$和$W$,只是为了方便展示而已。实际中,你会处于参数的高维度空间,所以需要消除摆动的垂直维度,你需要消除摆动,实际上是参数$W_1$,$W_2$等的合集,水平维度可能$W_3$,$W_4$等等,因此把$W$和$b$分开只是方便说明。实际中$dW$是一个高维度的参数向量,$db$也是一个高维度参数向量,但是你的直觉是,在你要消除摆动的维度中,最终你要计算一个更大的和值,这个平方和微分的加权平均值,所以你最后去掉了那些有摆动的方向。所以这就是RMSprop,全称是均方根,因为你将微分进行平方,然后最后使用平方根。

Adam 优化算法(Adam optimization algorithm)

Adam代表的是Adaptive Moment Estimation
Adam优化算法基本上就是将Momentum和RMSprop结合在一起。

学习率衰减(Learning rate decay)

假设你要使用mini-batch梯度下降法,mini-batch数量不大,大概64或者128个样本,在迭代过程中会有噪音(蓝色线),下降朝向这里的最小值,但是不会精确地收敛,所以你的算法最后在附近摆动,并不会真正收敛,因为你用的$a$是固定值,不同的mini-batch中有噪音。
在这里插入图片描述
但要慢慢减少学习率$a$的话,在初期的时候,$a$学习率还较大,你的学习还是相对较快,但随着$a$变小,你的步伐也会变慢变小,所以最后你的曲线(绿色线)会在最小值附近的一小块区域里摆动,而不是在训练过程中,大幅度在最小值附近摆动。

所以慢慢减少$a$的本质在于,在学习初期,你能承受较大的步伐,但当开始收敛的时候,小一些的学习率能让你步伐小一些。

指数衰减、离散下降、手动衰减

局部最优的问题(The problem of local optima)

在这里插入图片描述
这是曾经人们在想到局部最优时脑海里会出现的图,也许你想优化一些参数,我们把它们称之为$W_{1}$和$W_{2}$,平面的高度就是损失函数。在图中似乎各处都分布着局部最优。梯度下降法或者某个算法可能困在一个局部最优中,而不会抵达全局最优。如果你要作图计算一个数字,比如说这两个维度,就容易出现有多个不同局部最优的图,而这些低维的图曾经影响了我们的理解,但是这些理解并不正确。事实上,如果你要创建一个神经网络,通常梯度为零的点并不是这个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点。

也就是在这个点,这里是$W_{1}$和$W_{2}$,高度即成本函数$J$的值。

在这里插入图片描述
但是一个具有高维度空间的函数,如果梯度为0,那么在每个方向,它可能是凸函数,也可能是凹函数。如果你在2万维空间中,那么想要得到局部最优,所有的2万个方向都需要是这样,但发生的机率也许很小,也许是$2^{-20000}$,你更有可能遇到有些方向的曲线会这样向上弯曲,另一些方向曲线向下弯,而不是所有的都向上弯曲,因此在高维度空间,你更可能碰到鞍点。

所以我们从深度学习历史中学到的一课就是,我们对低维度空间的大部分直觉,比如你可以画出上面的图,并不能应用到高维度空间中。适用于其它算法,因为如果你有2万个参数,那么$J$函数有2万个维度向量,你更可能遇到鞍点,而不是局部最优点。

如果局部最优不是问题,那么问题是什么?结果是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动,我换个笔墨颜色,大家看得清楚一些,然后你的算法能够走出平稳段(红色笔)。

在这里插入图片描述
我们可以沿着这段长坡走,直到这里,然后走出平稳段。

所以此次视频的要点是,首先,你不太可能困在极差的局部最优中,条件是你在训练较大的神经网络,存在大量参数,并且成本函数$J$被定义在较高的维度空间。

第二点,平稳段是一个问题,这样使得学习十分缓慢,这也是像Momentum或是RMSprop,Adam这样的算法,能够加速学习算法的地方。在这些情况下,更成熟的优化算法,如Adam算法,能够加快速度,让你尽早往下走出平稳段。

因为你的网络要解决优化问题,说实话,要面临如此之高的维度空间,我觉得没有人有那么好的直觉,知道这些空间长什么样,而且我们对它们的理解还在不断发展,不过我希望这一点能够让你更好地理解优化算法所面临的问题。

posted @ 2020-12-01 20:52  Stark0x01  阅读(171)  评论(0)    收藏  举报