在上一篇博客中,我们介绍了梯度下降算法。但是梯度下降算法存在计算量过大或者陷入局部最优的问题。人们如今已经提出动量法和自适应梯度法来解决上述的问题。
1.梯度下降存在的问题
1.批量梯度下降(BGD)
在梯度下降的每一步中,我们都用到了所有的训练样本,我们需要进行求和运算,在梯度下降中,在计算微积随机梯度下降(SGD)
2.随机梯度下降法(SGD)
由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。
3.小批量梯度下降(MBGD)
同SGD一样,每次梯度的方向不确定,可能陷入局部最优。
2.动量法(momentum)
普通的梯度下降法当接近最优值时梯度会比较小,由于学习率固定,普通的梯度下降法的收敛速度会变慢,有时甚至陷入局部最优。
改进目标:改进梯度下降算法存在的问题,即减少震荡,加速通往谷低
改进思想:利用累加历史梯度信息更新梯度
这时如果考虑历史梯度,将会引导参数朝着最优值更快收敛,这就是动量算法的基本思想。
可是为什么加入历史梯度值,就会避免陷入震荡,落入局部最优呢?
因为累加过程中震荡方向相互抵消,假设第n次的梯度g为-1,第n+1计算的梯度g’为1,那么通过累加后,二者再更新权重时梯度就会变成0,而不是在梯度g为-1的方向进行权重更新后,再在梯度g为1的方向进行权重更新(也就是说避免震荡)。
此外动量法还可以避免高维空间中的鞍点(导数为0的点但不是全局最优点)
3.自适应梯度与RMSProp
自适应梯度法通过减小震荡方向步长,增大平坦方向步长来减小震荡,加速通往谷底方向。但是如何区分震荡方向与平坦方向?梯度幅度的平方较大的方向是震荡方向;梯度幅度的平方较小的方向是平坦方向。
AdaGrad方法和RMSProp方法都是自适应梯度方法
3.1AdaGrad方法
AdaGrad会记录过去所有梯度的平方和,更新权重时如下图所示
但是学习越深入,r会累计的越来越大,更新的幅度就越小。如果无止境地学习,更新量就会变为0, 完全不再更新。
3.2RMSProp方法
RMSProp优化算法和AdaGrad算法唯一的不同,就在于累积平方梯度的求法不同。RMSProp算法不是像AdaGrad算法那样暴力直接的累加平方梯度,而是加了一个衰减系数来控制历史信息的获取多少。
假设ρ取0.9,则在100次之后约等于2.65e-5=0.0000265≈0,也就是说100次前的梯度不在参与计算了。这样就可以控制历史信息的获取多少。
4.Adam方法(Adaptive Momentum Estimation)
Adam是RMSProp的动量版,采用了一个修正偏差来解决冷启动问题。
不同最优化方法效果:
上图展示了一个马鞍状的最优化地形,其中对于不同维度它的曲率不同(一个维度下降另一个维度上升)。注意SGD很难突破对称性,一直卡在顶部。而RMSProp之类的方法能够看到马鞍方向有很低的梯度。因为在RMSProp更新方法中的分母项,算法提高了在该方向的有效学习率,使得RMSProp能够继续前进。