各种优化方法:SGD、动量梯度下降法Momentum、Adagrad, RMSprop, Adam

1、梯度下降法

请参考随机梯度下降

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

梯度的定义本身暗含着:只要参数沿梯度反方向走的足够小,就能使得之后的函数值不比之前的大,且下降率最快。也就是梯度下降法,下面给出证明:

2、SGD

如果每次都采用全部的梯度的话,那么往往都会陷入同样的局部误差点,但是如果采用的是随机梯度下降的话,那么这一次陷入这个局部误差点,下一次陷入另外一局部误差点,然后相互之间抵消抵消,反倒能得到更好的结果。

还能减少计算量,加快收敛速度。

3、动量梯度下降法Momentum

请参考动量梯度下降法Momentum

SGD不加动量的时候(图中蓝色线段),函数会在纵轴上不停的波动。加了动量之后,纵轴上的这些波动的平均值是接近于0的,有正有负,抵消一部分,因此w对于梯度方向改变的方向,动量逐渐减小,更新小。红线就会更加加强,走在了更好的路径上。得到了更快的收敛速度以及更小的震荡。

为啥红线就会更加加强?

函数变化不大的时候,函数满足一定的光滑性(例如李普希兹),导数的范数也是变化不大的,所以他们的改变量也是近似相等的。蓝色和红色一步走的差不多长度,然后蓝色走偏了。

4、动量梯度下降法Momentum、Adagrad, RMSprop, Adam总结

请参考一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

Adam的纠偏是怎么回事?

注意到,在迭代初始阶段,v和 p 有一个向初值的偏移(过多的偏向了 0)。因此,可以对一阶和二阶动量做偏置校正 (bias correction)。可以看到,迭代到后期 t 比较大,那么 a^t,b^t几乎为 0,就不会对 v 和 p 有任何影响了。

5、每种优化方法,我都在MNIST数据集上自己实现了一下,跑出来的结果如下:

(1) SGD (batch_size=1, lr=0.01)


(2) SGD (batch_size=64, lr=0.01)

(3) Momentum(batch_size=64)

(4) Adagrad(batch_size=64)

(5) RMSprop(batch_size=64)

(6) Adam

发布了312 篇原创文章 · 获赞 32 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Scarlett_Guan/article/details/98957906