各种优化方法: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值