SGD动量法和Nesterov加速梯度下降法

SGD存在的问题

  • 损失(loss)在一个方向上快速变化而在另一个方向慢慢变化:沿平缓方向进展非常缓慢,沿陡峭方向剧烈抖动。
  • 如果损失函数具有局部最小值或鞍点,该怎么办?

动量法(Momentum)

SGD难以冲破沟壑,让Momentum帮助SGD加速,避免震荡。上一步骤V_{t-1}的更新矢量乘以系数\gamma,与本次更新矢量进行相加,得到v_t,动量项\gamma通常设为0.9。

V_t = \gamma V_{t-1} + \eta \bigtriangledown_\theta J(\theta)
\theta = \theta - V_t

可以看到,参数更新时不仅考虑当前梯度值,而且加上了一个积累项(冲量),但多了一个超参\gamma,一般取接近1的值如0.9。相比原始梯度下降算法,冲量梯度下降算法有助于加速收敛。当梯度与冲量方向一致时,冲量项会增加,而相反时,冲量项减少,因此冲量梯度下降算法可以减少训练的震荡过程。

有时候,冲量梯度下降算法也可以按下面方式实现:
V_t = \beta V_{t-1} + (1-\beta) \bigtriangledown_\theta J(\theta)
\theta = \theta - \eta V_t
此时我们就可以清楚地看到,所谓的冲量项其实只是梯度的指数加权移动平均值(Exponentially weighted moving averages)。这个实现和之前的实现没有本质区别,只是学习速率进行了放缩一下而已。移动平均数只是计算比较相近时刻数据的加权平均数,一般可认为这个时间范围为{1} \over {1-\beta} ,比如\beta=0.9,你可以近似认为只是平均了10时刻之内的数据而已,因为再往前权重太小了,基本没影响了。

此处应该有图

动量法的意义

  • 对于梯度改变方向的维度减少更新
  • 对于梯度相同方向的维度增加更新

此处应有图

  • 缺点:先计算坡度,然后进行大跳跃,盲目的加速下坡。

Nesterov加速梯度法(NAG)

先在前一个累计的梯度方向上进行跳跃\theta - \gamma V_{t-1},然后测量下一跳跃点的梯度并与之前点的动量进行加和,从而更新向量。
V_t = \gamma V_{t-1} + \eta \bigtriangledown(\theta-\gamma V_{t-1})
\theta = \theta - V_t
图一中,黄色线段为当前点累积的动量,红色线为下一个点的梯度,绿色线为修正后的动量,蓝色短线为当前点的梯度,蓝色长线与黄色线平行即为当前点累积的动量。

图一

图二

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容