7.4 动量法
在7.2节(梯度下降和随机梯度下降)中我们提到,目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter07_optimization/7.4_momentum
7.4.1 梯度下降的问题
让我们考虑一个输入和输出分别为二维向量x=[x1,x2]⊤x=[x1,x2]⊤ \boldsymbol{x} = [x_1, x_2]^\top0.4时自变量的迭代轨迹。
%matplotlib inline
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
import torch
eta = 0.4
def f_2d(x1, x2):
return 0.1 x1 ** 2 + 2 x2 ** 2
def gd_2d(x1, x2, s1, s2):
return (x1 - eta 0.2 x1, x2 - eta 4 x2, 0, 0)
d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))Copy to clipboardErrorCopied
输出:
epoch 20, x1 -0.943467, x2 -0.000073
Copy to clipboardErrorCopied
可以看到,同一位置上,目标函数在竖直方向(x2x2 x_2x1轴方向)的斜率的绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。那么,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优解。然而,这会造成自变量在水平方向上朝最优解移动变慢。
下面我们试着将学习率调得稍大一点,此时自变量在竖直方向不断越过最优解并逐渐发散。
eta = 0.6
d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
Copy to clipboardErrorCopied
输出:
epoch 20, x1 -0.387814, x2 -1673.365109
Copy to clipboardErrorCopied
7.4.2 动量法
动量法的提出是为了解决梯度下降的上述问题。由于小批量随机梯度下降比梯度下降更为广义,本章后续讨论将沿用7.3节(小批量随机梯度下降)中时间步tt tγ=0时,动量法等价于小批量随机梯度下降。
在解释动量法的数学原理前,让我们先从实验中观察梯度下降在使用动量法后的迭代轨迹。
def momentum_2d(x1, x2, v1, v2):
v1 = gamma * v1 + eta * 0.2 * x1
v2 = gamma * v2 + eta * 4 * x2
return x1 - v1, x2 - v2, v1, v2
eta, gamma = 0.4, 0.5
d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))Copy to clipboardErrorCopied
输出:
epoch 20, x1 -0.062843, x2 0.001202
Copy to clipboardErrorCopied
可以看到使用较小的学习率η=0.4η=0.4 \eta=0.4η=0.6,此时自变量也不再发散。
eta = 0.6
d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))
Copy to clipboardErrorCopied
输出:
epoch 20, x1 0.007188, x2 0.002553
Copy to clipboardErrorCopied
7.4.2.1 指数加权移动平均
为了从数学上理解动量法,让我们先解释一下指数加权移动平均(exponentially weighted moving average)。给定超参数0≤γ<10≤γ<1 0 \leq \gamma < 1γ=0.9时,