这是我参与8月更文挑战的第6天,活动详情查看: 8月更文挑战html
momentum(动量)的概念源自于物理学,可理解为惯性,那么它是如何帮助咱们寻找最优解的呢?python
若是把梯度降低法比做是一个小球从山坡到山谷的过程,那么它具体的过程是这样的:从起始点A开始,计算当前A的坡度,沿着坡度最大的方向滑一段路,停下到B,再从B看一看周围的坡度,沿坡度最大的方向再滑一段路,再停下,重复这样的操做,直至到达山谷。可是真正的小球是这样运动的吗?真正的小球从A点滚动到B点的时候,小球带有必定的加速度,通常是不会停下来的,小球会越滚越快,更快的奔向谷底。momentum就是模拟这一过程来加速神经网络优化的。下图直观的解释了momentum的所有内容markdown
深度学习的核心公式是网络
咱们如今定义一个表达式app
表示以前全部步骤所累积的动量和, 是一个使得梯度衰减的系数,这样的作法可让早期的梯度对当前梯度的影响愈来愈小,若是没有衰减值,模型每每会震荡难以收敛,甚至发散,因此新的参数更新公式变为dom
展开就是函数
这样一步步下去,带着初速度的小球就会急速奔向谷底post
咱们以一个更实际例子讲解学习
下图是没有设置momentum的时候,网络仅仅只是更新到局部最优解就中止了,并且咱们看最开始几回迭代的方向很是random,由于它更新方向仅取决于当前位置的梯度方向优化
下图是设置了momentum的状况,相比于没有momentum,网络更新更快,并且也几乎找到了全局最优解 但要注意,并非全部的模型都适合加入momentum,有些加了反而速度变慢(由于考虑了以前的历史因素)
在pytorch中添加momentum参数十分方便,只须要在优化器设置函数中进行添加便可
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才须要额外设置