参考cs231n与这位的博文https://www.zhihu.com/people/will-55-30/posts?page=1 非常感谢!
-
随机梯度下降法SGD
weights+=-step_size*weights_grad
-
带动量的随机梯度下降SGD+momentum
加了动量的可以这样理解,在滚下山坡的时候速度会累积,然后在到达最低点的时候它是具有速度的,这对于局部最低点来说十分有用,因为这样它就可以越过这个局部最低的地方。当然在最后找到真的最低点的时候它也会越过去然后再慢慢回来。
rho相当于摩擦系数,这个变量有效的抑制了速度,不然小球在山底永远停不下来
通过交叉验证,这个参数通常设置为[0.5,0.9,0.95,0.99]中的一个。一个典型的设置是刚开始将动量设置为0.5而后在后面的多个周期中慢慢提升到0.99。
-
Nesterov Momentum
这个用于凸函数的优化的时候特别有用
想法是这样的既然已经知道速度会把小球带到绿色箭头所指向的地方,那就在那个位置计算梯度,而不是在原点计算梯度。
-
AdaGrad
这个想法在于,比如有两个坐标轴,其中一个轴有很高的梯度,而另一个梯度很小,累积梯度的平方,然后在更新的时候除以它的平方根。那么对于小梯度来说就会除以一个比较小的值,这样就加速了小梯度维度上学习速度,大梯度的反之,会被降低训练速度。
但存在一个问题就是随着时间边长,步长会越来越小
-
RMSProp
加了decay_rate所以不会越过太远。
-
Adam
结合了动量与RMSProp
在firststep的时候步长可能会非常大,这很糟糕,如果本身初始化的值就不太合理的话,然后用一个很大的步长,那就跑得很远了就很难收敛了。
为解决这个问题而引入了偏置
随时间降低学习率
降低学习率的想法是:假设模型已经接近一个比较不错的取值区域时,此时梯度已经很小了,保持原有学习率的话只能在最优点附近徘徊而到不了最优点,降低学习率的话就可以进一步下降。带动量的SGD中就经常用,但Adam中不太用。实践中,一般先尝试不用衰减看看会发生什么,然后仔细观察损失曲线看看希望在哪个地方衰减。