6.6 动量法#
在3.3节内容中,我们详细介绍了如何通过梯度下降算法来最小化目标函数并以此求解得到模型对应的权重参数。进一步,我们在3.6节内容中还介绍了什么是随机梯度下降算法和小批量梯度下降算法。在本节内容中我们将会介绍另外一种基于梯度下降改进的动量法(Momentum )[1]。
6.6.1 动量法动机#
在使用基于小批量样本的梯度下降算法最小化模型的过程中,我们可以通过调整学习率的大小来加快模型的收敛速速,但是通常情况下我们很难找到一个合适的学习率。过小会使得模型收敛速度慢,而过大则会可能使得目标函数发散,如图6-21所示。
在图6-21中对于该目标函数来说,当学习率设置为0.45时(左)目标函数大约在20次迭代后收敛;当学习率增大至0.55时(右)目标函数则在大约10次迭代便进入了发散状态。同时可以看出,在这两种情况下目标函数在$w_2$上的偏移量都要远大于在$w_1$上的偏移量,这是因为该目标函数在竖直方向上的斜率要远大于水平方向上的斜率。正是因为这些原因使得目标函数在优化过程中梯度来回震荡,导致模型难以收敛或发散。一种有效的做法便是权重参数在当前位置计算梯度时,同时也考虑到在上一次位置时的梯度,而这也被称之为动量法。
6.6.2 动量法原理#
动量法是梯度下降算法的一种改进,它引入了动量的概念以加速目标函数收敛过程并减小震荡。动量法的基本思想是在更新参数的过程中,不仅考虑当前的梯度方向,同时也考虑历史累积的梯度信息。具体地,设目标函数在第$t$时刻关于所有权重参数的梯度为$g_t$,速度变量为$v_t$且$v_0=0$,权重参数为$\theta_t$,则第$t+1$时刻结果过$\theta_{t+1}$可通过如下过程计算
$$ \begin{aligned} v_{t+1} & = \mu * v_{t} + g_{t+1}, \\[1ex] \theta_{t+1} & = \theta_{t} - \gamma * v_{t+1}, \end{aligned}\tag{6-29} $$其中$\mu$表示动量系数,$\gamma$表示学习率。为了方便各位读者阅读内容时能够同实践相结合,因此本节及后续几节内容中相关计算公式的符号标记均遵循了PyTorch框架中相应接口描述文档中类似的标记方式。
从式(6-29)可以看出,在通过梯度下降算法计算第$t+1$时刻的结果时所依赖的速度$v_{t+1}$便同时考虑了第$t$时刻的速度$v_t$,并通过超参数$\mu$来控制依赖程度,这与6.3节内容中式(6-19)通过移动平均来计算均值和方差类似。此时可以看出,当$\mu=0$时式(6-29)便等价于原始的梯度下降算法。