《吴恩达深度学习》学习笔记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^{(1)} x(1) x ( 1000 ) x^{(1000)} x(1000)取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从 x ( 1001 ) x^{(1001)} x(1001) x ( 2000 ) x^{(2000)} x(2000),然后再取1000个样本,以此类推。

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

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

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

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

在这里插入图片描述

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

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

v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt

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

同样的公式, v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt

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

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

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

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

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

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

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

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

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

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

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

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

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

RMSprop

root mean square prop算法

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

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

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

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

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

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

Adam 优化算法(Adam optimization algorithm)

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

学习率衰减(Learning rate decay)

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值