Momentum优化算法
通常情况我们在训练深度神经网络的时候把数据拆解成一小批一小批地进行训练,这就是我们常用的mini-batch SGD
训练算法,然而虽然这种算法能够带来很好的训练速度,但是在到达最优点的时候并不能够总是真正到达最优点,而是在最优点附近徘徊。另一个缺点就是这种算法需要我们挑选一个合适的学习率,当我们采用小的学习率的时候,会导致网络在训练的时候收敛太慢;当我们采用大的学习率的时候,会导致在训练过程中优化的幅度跳过函数的范围,也就是可能跳过最优点。我们所希望的仅仅是网络在优化的时候网络的损失函数有一个很好的收敛速度同时又不至于摆动幅度太大。
所以Momentum优化器刚好可以解决我们所面临的问题,它主要是基于梯度的移动指数加权平均。假设在当前的迭代步骤第 t 步中,那么基于Momentum优化算法可以写成下面的公式:
其中,在上面的公式中vdw和vdb分别是损失函数在前t−1轮迭代过程中累积的梯度梯度动量,β是梯度累积的一个指数,这里我们一般设置值为0.9。所以Momentum优化器的主要思想就是利用了类似与移动指数加权平均的方法来对网络的参数进行平滑处理的,让梯度的摆动幅度变得更小。
dW和db分别是损失函数反向传播时候所求得的梯度,下面两个公式是网络权重向量和偏置向量的更新公式,α是网络的学习率。当我们使用Momentum优化算法的时候,可以解决mini-batch SGD优化算法更新幅度摆动大的问题,同时可以使得网络的收敛速度更快。
RMSProp
(对AdaGrad的改进)
在上面的Momentum优化算法中,虽然初步解决了优化中摆动幅度大的问题。所谓的摆动幅度就是在优化中经过更新之后参数的变化范围,如下图所示,蓝色的为Momentum优化算法所走的路线,绿色的为RMSProp优化算法所走的路线。
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重 W 和偏置 b 的梯度使用了微分平方加权平均数。
其中,假设在第 t 轮迭代过程中,各个公式如下所示:
算法的主要思想就用上面的公式表达完毕了。在上面的公式中sdw和sdb分别是损失函数在前t−1轮迭代过程中累积的梯度梯度动量,β 是梯度累积的一个指数。所不同的是,RMSProp算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。(比如当 dW 或者 db 中有一个值比较大的时候,那么我们在更新权重或者偏置的时候除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小)。为了防止分母为零,使用了一个很小的数值 ϵ 来进行平滑,一般取值为10−8。
adam
有了上面两种优化算法,一种可以使用类似于物理中的动量来累积梯度,另一种可以使得收敛速度更快同时使得波动的幅度更小。那么讲两种算法结合起来所取得的表现一定会更好。Adam(Adaptive Moment Estimation)算法是将Momentum算法和RMSProp算法结合起来使用的一种算法,我们所使用的参数基本和上面讲的一致,在训练的最开始我们需要初始化梯度的累积量和平方累积量。
假设在训练的第 t 轮训练中,我们首先可以计算得到Momentum和RMSProp的参数更新:
由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。
通过上面的公式,我们就可以求得在第 t 轮迭代过程中,参数梯度累积量的修正值,从而接下来就可以根据Momentum和RMSProp算法的结合来对权重和偏置进行更新。
上面的所有步骤就是Momentum算法和RMSProp算法结合起来从而形成Adam算法。在Adam算法中,参数 β1 所对应的就是Momentum算法中的 β 值,一般取0.9,参数 β2 所对应的就是RMSProp算法中的 β 值,一般我们取0.999,而 ϵ 是一个平滑项,我们一般取值为 10−8,而学习率 α 则需要我们在训练的时候进行微调。
AdaDelta算法
AdaDelta算法主要是为了解决AdaGrad算法中存在的缺陷,下面先介绍一下AdaGrad算法优点和以及存在的问题:
AdaGrad的迭代公式如下所示:
优点
- 学习率将随着梯度的倒数增长,也就是说较大梯度具有较小的学习率,而较小的梯度具有较大的学习率 ,可以解决普通的sgd方法中学习率一直不变的问题
缺点
- 还是需要自己手动指定初始学习率,而且由于分母中对历史梯度一直累加,学习率将逐渐下降至0,并且如果初始梯度很大的话,会导致整个训练过程的学习率一直很小,从而导致学习时间变长。
改进方法一:Accumulate Over Window
在一个窗口w中对梯度进行求和,而不是对梯度一直累加
因为存放 w 之前的梯度是低效的,所以可以用对先前所有梯度均值(使用RMS即均方根值实现)的一个指数衰减作为代替的实现方法。
更新公式如下:
① 将累计梯度信息从全部历史梯度变为当前时间向前的一个窗口期内的累积:
相当于历史梯度信息的累计乘上一个衰减系数ρ,然后用(1−ρ)作为当前梯度的平方加权系数相加。
②然后将上述计算值开方后,作为每次迭代更新后的学习率衰减系数:
其中ϵ是为了防止分母为0而加上的一个极小值。
这种更新方法解决了对历史梯度一直累加而导致学习率一直下降的问题,当时还是需要自己选择初始的学习率。
改进方法二:Correct Units with Hessian Approximation
看不懂~~~