基于机器学习动量梯度下降算法加快深层神经网络的训练速度

梯度下降算法

在机器学习中,当我们使用梯度下降法优化损失函数的时候,每次都会朝着目标函数下降最快的方向,这也称为最速下降法。但是梯度下降算法看似非常快,实际上存在一些问题,它的收敛速度会很慢,我们来看一下为什么会这样?

基于机器学习动量梯度下降算法加快深层神经网络的训练速度

损失函数等高线

如图所示是损失函数等高线,我们可以将它想象成一个很扁的漏斗,这样在竖直方向上,梯度就非常大,在水平方向上,梯度就相对较小,所以我们在设置学习率的时候就不能设置太大,因为如果太大则在竖直方向上参数更新太过了,如果较小的学习率又导致了水平方向上参数在更新的时候太过于缓慢,所以就导致最终收敛起来非常慢。为了解决这个问题,我们可以使用动量梯度下降算法

动量梯度下降算法

动量法就是为了解决传统的梯度下降算法收敛很慢的问题,它是在梯度下降算法基础上做了修改,具体来说是这样的:

基于机器学习动量梯度下降算法加快深层神经网络的训练速度

动量梯度下降算法

这里使用了一个指数加权平均数的数学概念,γ是动量参数,是一个小于 1的正数。如果我们把 γ定为 0.9,那么更新幅度的峰值就是原本梯度乘学习率的 10 倍。

我们使用动量法相当于每次在进行参数更新的时候,都会将之前的速度考虑进来,每个参数在各方向上的移动幅度不仅取决于当前的梯度,还取决于过去各个梯度在各个方向上是否一致,如果一个梯度一直沿着当前方向进行更新(水平方向),那么每次更新的幅度就越来越大,如果一个梯度在一个方向上不断变化(竖直方向),那么其更新幅度就会被衰减,这样我们就可以使用一个较大的学习率,使得收敛更快,同时梯度比较大的方向就会因为动量的关系每次更新的幅度减少,如下图

基于机器学习动量梯度下降算法加快深层神经网络的训练速度

损失函数等高线

如图所示可以看到折线就是梯度下降的路线,我们可以看出它在数值方向波动变小了,而在水平方向下降速度变快了,这就是动量梯度下降算法的直观体现。

我们从物理角度来理解动量梯度下降算法是这样的,动量法就仿佛我们从山顶上推一个球,小球在向下滚动的过程中积累了动量,在途中也会变得越来越快,最后会达到一个峰值,对应于我们的算法中就是,动量项会沿着梯度指向方向相同的方向不断增大,对于梯度方向改变的方向逐渐减小,得到了更快的收敛速度以及更小的震荡。

实现代码

def sgd_momentum(parameters, vs, lr, gamma):
 for param, v in zip(parameters, vs):
 v[:] = gamma * v + lr * param.grad.data
 param.data = param.data - v

这就是在机器学习中动量梯度下降算法相比于传统梯度下降算法的优势所在。

相关推荐