Optimization algorithms
2.6 动量梯度下降法(Gradient descent with Momentum)
本节让我们一起来看看一种新的加速梯度下降学习的方法——动量梯度下降法。它的运行速度几乎总是快于标准的梯度下降算法。它基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新权重。
一个普通batch/mini-batch的学习过程
例如,如果你要优化成本函数,函数形状如图,红点代表最小值的位置,假设你从这里(蓝色点)开始梯度下降法,如果进行梯度下降法的一次迭代,无论是batch或mini-batch下降法,也许会指向这里,现在在椭圆的另一边,计算下一步梯度下降,结果或许如此,然后再计算一步,再一步
慢慢摆动到最小值,这种上下波动减慢了梯度下降法的速度,你就无法使用更大的学习率,如果你要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,你要用一个较小的学习率。
所以我们希望的是减小纵轴上的摆动,加速横轴上的移动。更快的移向红点。那么要如何实现这一个过程呢?
Momentum的方法
先举一个例子:
想象你有一个碗,我们的梯度下降就是希望走到碗底。你拿一个球,微分项给了这个球一个加速度,此时球正向山下滚,球因为加速度越滚越快,而因为
β
\beta
β稍小于1,表现出一些摩擦力,所以球不会无限加速下去,所以不像梯度下降法,每一步都独立于之前的步骤,你的球可以向下滚,获得动量,可以从碗向下加速获得动量。
使用动量梯度下降法,你需要做的是,第t次迭代的过程中,也就是一个反向传播的过程。你会计算微分
d
W
,
d
b
dW,db
dW,db,跟我们之前在梯度下降法中的过程相似,接下来要
我们这里相当于是把它们在纵轴上的移动做了平均,让我们回到刚开始的那个图:
在平均的过程中,纵轴上的平均值正负相消,接近于0;而横轴上的所有微分都指向了增长的方向,因此你将它平均不会使它变小。总的来看,结果就是在纵轴方向上我们的波动减小了。而横轴的速度上升了。达到了我们的需求,也就是加快了我们的学习过程。
总的算法如下:
2.7 RMSprop(root mean square prop算法)
前面提到了动量梯度下降法,还有一个RMSprop的算法能够达到我们的需求。
一个普通的batch/mini-batch学习过程
这里依旧拿出上一小节中的图来说明:
回忆一下我们之前的例子,我们假设这里的横轴代表了参数
W
W
W,纵轴代表了
b
b
b。所以我们现在想的是减缓
b
b
b方向的学习,加快
W
W
W方向的学习。
RMSprop方法
下面是RMSprop的具体做法:
在第t次迭代中,该算法会照常计算当下mini-batch的微分
d
W
,
d
b
dW,db
dW,db, 用到一个新符号
S
d
W
S_{dW}
SdW,所以:
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
W方向,我们希望学习速度快,而在垂直方向,也就是例子
b
b
b中的方向,我们希望减缓纵轴上的摆动,所以有了
S
d
W
,
S
d
b
S_{dW},S_{db}
SdW,Sdb我们希望
S
d
W
S_{dW}
SdW会相对较小,所以我们要除以一个较小的数,而希望
S
d
b
S_{db}
Sdb又较大,所以这里我们要除以较大的数字,这样就可以减缓纵轴上的变化。注意看这些微分,垂直方向的要比水平方向的大得多,所以斜率在方向特别大,所以这些微分中,
d
b
db
db较大,
d
W
dW
dW较小,结果就是纵轴上的更新要被一个较大的数相除,就能消除摆动,而水平方向的更新则被较小的数相除。
RMSprop的结果就是,梯度下降的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。还有个影响就是,你可以用一个更大学习率
α
\alpha
α,然后加快学习,而无须在纵轴上垂直方向偏离。
2.8 Adam优化算法(Adam optimization algorithm)
Adam优化算法基本上就是将Momentum和RMSprop结合在一起,那么一起来看看如何使用Adam算法。
2.9 学习率衰减(Learning rate decay)
加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减
为什么需要改变学习率
假设你要使用mini-batch梯度下降法,mini-batch数量不大,大概64或者128个样本,在迭代过程中会有噪音(蓝色线),下降朝向这里的最小值,但是不会精确地收敛,所以你的算法最后在附近摆动,并不会真正收敛,因为你用的是固定值,不同的mini-batch中有噪音。
但要慢慢减少学习率 α \alpha α的话,在初期的时候,学习率 α \alpha α还较大,你的学习还是相对较快,但随着 α \alpha α变小,你的步伐也会变慢变小,所以最后你的曲线(绿色线)会在最小值附近的一小块区域里摆动,而不是在训练过程中,大幅度在最小值附近摆动。
所以慢慢减少 α \alpha α的本质在于,在学习初期,你能承受较大的步伐,但当开始收敛的时候,小一些的学习率能让你步伐小一些。
改变学习率的一些方法
指数衰减、离散下降等
2.10 局部最优问题(The problem of local optima)
在深度学习研究早期,人们总是担心优化算法会困在极差的局部最优,不过随着深度学习理论不断发展,我们对局部最优的理解也发生了改变。
其实是陷入了低维误区
曾经人们在想到局部最优时脑海里会出现的图,也许你想优化一些参数,平面的高度就是损失函数。在图中似乎各处都分布着局部最优。梯度下降法或者某个算法可能困在一个局部最优中,而不会抵达全局最优。如果你要作图计算一个数字,比如说这两个维度,就容易出现有多个不同局部最优的图,而这些低维的图曾经影响了我们的理解,但是这些理解并不正确。事实上,如果你要创建一个神经网络,通常梯度为零的点并不是这个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点。
而鞍点长这样:
所以我们从深度学习历史中学到的一课就是,我们对低维度空间的大部分直觉,比如你可以画出上面的图,并不能应用到高维度空间中。适用于其它算法,因为如果你有2万个参数,那么成本函数有2万个维度向量,你更可能遇到鞍点,而不是局部最优点。
问题在哪?
如果局部最优不是问题,那么问题是什么?问题是是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动。
所以,平稳段是一个问题,这样使得学习十分缓慢,但是!
我们之前学的Momentum或是RMSprop,Adam这样的算法,是能够加速学习算法。在这些情况下,更成熟的优化算法,如Adam算法,能够加快速度,让你尽早往下走出平稳段。