momentum

2020-01-15 15:24:59 浏览数 (1)

momentum(动量)的概念源自于物理学,可理解为惯性,那么它是如何帮助我们寻找最优解的呢?

如果把梯度下降法比作是一个小球从山坡到山谷的过程,那么它具体的过程是这样的:从起始点A开始,计算当前A的坡度,沿着坡度最大的方向滑一段路,停下到B,再从B看一看周围的坡度,沿坡度最大的方向再滑一段路,再停下,重复这样的操作,直至到达山谷。但是真正的小球是这样运动的吗?真正的小球从A点滚动到B点的时候,小球带有一定的加速度,一般是不会停下来的,小球会越滚越快,更快的奔向谷底。momentum就是模拟这一过程来加速神经网络优化的。下图直观的解释了momentum的全部内容

深度学习的核心公式是

$$ w^{k 1}=w^{k}-alphanabla f(w^k) $$

我们现在定义一个表达式

$$ z^{k 1}=beta z^k alpha nabla f(w^k) $$

$z^k$表示之前所有步骤所累积的动量和,$beta$是一个使得梯度衰减的系数,这样的做法可以让早期的梯度对当前梯度的影响越来越小,如果没有衰减值,模型往往会震荡难以收敛,甚至发散,所以新的参数更新公式变为

$$ w^{k 1}=w^{k}-z^{k 1} $$

展开就是

$$ w^{k 1}=w^k - alpha nabla f(w^k) - beta z^k $$

这样一步步下去,带着初速度的小球就会急速奔向谷底

我们以一个更实际例子讲解

下图是没有设置momentum的时候,网络仅仅只是更新到局部最优解就停止了,而且我们看最开始几次迭代的方向非常random,因为它更新方向仅取决于当前位置的梯度方向

下图是设置了momentum的情况,相比于没有momentum,网络更新更快,而且也几乎找到了全局最优解

但要注意,并不是所有的模型都适合加入momentum,有些加了反而速度变慢(因为考虑了之前的历史因素)

在pytorch中添加momentum参数十分方便,只需要在优化器设置函数中进行添加即可

代码语言:javascript复制
optimizer = torch.optim.SGD(model.parameters(), args.lr, # learning_rate
                            momentum=args.momentum, # momentum
                            weight_decay=args.weight_decayt_decay) # L2-regularization

但要注意,对于Adam优化器来说,它没有momentum这个参数,因为它已经内置了momentum机制,只有SGD才需要额外设置

0 人点赞