之前看了很多人介绍网络的优化器optimizer,无奈很多都把简单的东西讲的复杂化了,不容易让人懂,恰好之前看过吴恩达老师的最新的课程,这里结合老师讲的和个人想法写一下,方便别人同时也为自己以后回顾吧。
深度学习的优化算法主要有GD,SGD,Momentum,RMSProp和Adam算法吧,还有诸如Adagrad算法,不过大同小异,理解了前面几个,后面的也就引刃而解了。GD算法,SGD算法以及mini-batch SGD算法基本大家都能理解,这里就一笔带过了。下面重点讲一下Momentum算法,RMSProp算法和Adam算法。
在讲这个算法之前说一下移动指数加权平均。移动指数加权平均法加权就是根据同一个移动段内不同时间的数据对预测值的影响程度,分别给予不同的权数,然后再进行平均移动以预测未来值。假定给定一系列数据值 x1 , x2 , x3 ,…… xn 。那么,我们根据这些数据来拟合一条曲线,所得的值 v1 , v2 …..就是如下的公式:
v0=0
v1=βv0+(1−β)x1
v2=βv1+(1−β)x2
.............
其中,在上面的公式中,
β 等于历史值的加权率。如果把公式详细的展开,就会得到一个指数形式的公式,这里就不详细讲了。根据这个公式我们可以根据给定的数据,拟合出下图类似的一条比较平滑的曲线。
1. Momentum
通常情况我们在训练深度神经网络的时候把数据拆解成一小批一小批地进行训练,这就是我们常用的mini-batch SGD训练算法,然而虽然这种算法能够带来很好的训练速度,但是在到达最优点的时候并不能够总是真正到达最优点,而是在最优点附近徘徊。另一个缺点就是这种算法需要我们挑选一个合适的学习率,当我们采用小的学习率的时候,会导致网络在训练的时候收敛太慢;当我们采用大的学习率的时候,会导致在训练过程中优化的幅度跳过函数的范围,也就是可能跳过最优点。我们所希望的仅仅是网络在优化的时候网络的损失函数有一个很好的收敛速度同时又不至于摆动幅度太大。
所以Momentum优化器刚好可以解决我们所面临的问题,它主要是基于梯度的移动指数加权平均。假设在当前的迭代步骤第 t 步中,那么基于Momentum优化算法可以写成下面的公式:
vdw=βvdw+(1−β)dW (1)
vdb=βvdb+(1−β)db (2)
W=W−αvdw (3)
b=b−αvdb (4)
其中,在上面的公式中
vdw 和
vdb 分别是损失函数在前
t−1 轮迭代过程中累积的梯度梯度动量,
β 是梯度累积的一个指数,这里我们一般设置值为0.9。所以Momentum优化器的主要思想就是利用了类似与移动指数加权平均的方法来对网络的参数进行平滑处理的,让梯度的摆动幅度变得更小。
dW 和
db 分别是损失函数反向传播时候所求得的梯度,下面两个公式是网络权重向量和偏置向量的更新公式,
α 是网络的学习率。当我们使用Momentum优化算法的时候,可以解决mini-batch SGD优化算法更新幅度摆动大的问题,同时可以使得网络的收敛速度更快。
2. RMSProp
RMSProp算法的全称叫 Root Mean Square Prop,是Geoffrey E. Hinton在Coursera课程中提出的一种优化算法,在上面的Momentum优化算法中,虽然初步解决了优化中摆动幅度大的问题。所谓的摆动幅度就是在优化中经过更新之后参数的变化范围,如下图所示,蓝色的为Momentum优化算法所走的路线,绿色的为RMSProp优化算法所走的路线。
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重
W 和偏置
b 的梯度使用了微分平方加权平均数。
其中,假设在第
t 轮迭代过程中,各个公式如下所示:
sdw=βsdw+(1−β)dW2
sdb=βsdb+(1−β)db2
W=W−αdWsdw√+ε
b=b−αdbsdb√+ε
算法的主要思想就用上面的公式表达完毕了。在上面的公式中
sdw 和
sdb 分别是损失函数在前
t−1 轮迭代过程中累积的梯度梯度动量,
β 是梯度累积的一个指数。所不同的是,RMSProp算法对梯度计算了
微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。(比如当
dW 或者
db 中有一个值比较大的时候,那么我们在更新权重或者偏置的时候除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小)。为了防止分母为零,使用了一个很小的数值
ϵ 来进行平滑,一般取值为
10−8 。
3. Adam
有了上面两种优化算法,一种可以使用类似于物理中的动量来累积梯度,另一种可以使得收敛速度更快同时使得波动的幅度更小。那么讲两种算法结合起来所取得的表现一定会更好。Adam(Adaptive Moment Estimation)算法是将Momentum算法和RMSProp算法结合起来使用的一种算法,我们所使用的参数基本和上面讲的一致,在训练的最开始我们需要初始化梯度的累积量和平方累积量。
vdw=0,vdb=0;sdw=0,sdb=0
假设在训练的第
t 轮训练中,我们首先可以计算得到Momentum和RMSProp的参数更新:
vdw=β1vdw+(1−β1)dW
vdb=β1vdb+(1−β1)db
sdw=β2sdw+(1−β2)dW2
sdb=β2sdb+(1−β2)db2
由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。
vcdw=vdw1−βt1
vcdb=vdb1−βt1
scdw=sdw1−βt2
scdb=sdb1−βt2
通过上面的公式,我们就可以求得在第
t 轮迭代过程中,参数梯度累积量的修正值,从而接下来就可以根据Momentum和RMSProp算法的结合来对权重和偏置进行更新。
W=W−αvcdwscdw√+ε
b=b−αvcdbscdb√+ε
上面的所有步骤就是Momentum算法和RMSProp算法结合起来从而形成Adam算法。在Adam算法中,参数
β1 所对应的就是Momentum算法中的
β 值,一般取0.9,参数
β2 所对应的就是RMSProp算法中的
β 值,一般我们取0.999,而
ϵ 是一个平滑项,我们一般取值为
10−8 ,而学习率
α 则需要我们在训练的时候进行微调。
通过上面的三个算法基本讲述了神经网络中的优化器,理解了这三个算法其他的算法也就引刃而解了。
——————EOF————–