SGD存在的问题
- 损失(loss)在一个方向上快速变化而在另一个方向慢慢变化:沿平缓方向进展非常缓慢,沿陡峭方向剧烈抖动。
- 如果损失函数具有局部最小值或鞍点,该怎么办?
动量法(Momentum)
SGD难以冲破沟壑,让Momentum帮助SGD加速,避免震荡。上一步骤的更新矢量乘以系数,与本次更新矢量进行相加,得到,动量项通常设为0.9。
可以看到,参数更新时不仅考虑当前梯度值,而且加上了一个积累项(冲量),但多了一个超参,一般取接近1的值如0.9。相比原始梯度下降算法,冲量梯度下降算法有助于加速收敛。当梯度与冲量方向一致时,冲量项会增加,而相反时,冲量项减少,因此冲量梯度下降算法可以减少训练的震荡过程。
有时候,冲量梯度下降算法也可以按下面方式实现:
此时我们就可以清楚地看到,所谓的冲量项其实只是梯度的指数加权移动平均值(Exponentially weighted moving averages)。这个实现和之前的实现没有本质区别,只是学习速率进行了放缩一下而已。移动平均数只是计算比较相近时刻数据的加权平均数,一般可认为这个时间范围为 ,比如,你可以近似认为只是平均了10时刻之内的数据而已,因为再往前权重太小了,基本没影响了。
此处应该有图
动量法的意义
- 对于梯度改变方向的维度减少更新
- 对于梯度相同方向的维度增加更新
此处应有图
- 缺点:先计算坡度,然后进行大跳跃,盲目的加速下坡。
Nesterov加速梯度法(NAG)
先在前一个累计的梯度方向上进行跳跃,然后测量下一跳跃点的梯度并与之前点的动量进行加和,从而更新向量。
图一中,黄色线段为当前点累积的动量,红色线为下一个点的梯度,绿色线为修正后的动量,蓝色短线为当前点的梯度,蓝色长线与黄色线平行即为当前点累积的动量。