动量法

recall 小批量随机梯度下降:

\[\mathbf{g}_{t} = \frac{1}{|\mathcal{B}_{t}|}\sum_{i\in\mathcal{B}_{t}}\nabla{f_{i}(\mathbf{x}_{t-1})}\]
\[\mathbf{x}_{t} = \mathbf{x}_{t-1} - \eta\mathbf{g}_{t}\]

方向只依赖于当前的梯度,我们希望能看得更远,这时我们可以使用动量法(momentum):

\[\mathbf{v}_{t} = \beta\mathbf{v}_{t-1} + \mathbf{g}_{t}\]
\[\mathbf{x}_{t} = \mathbf{x}_{t-1} - \eta\mathbf{v}_{t}\]

其中 \(\beta \in (0, 1)\)

这就像从山上滚石头,速度 \(\mathbf{v}_{t}\) 的方向不仅依赖于当前的坡度 \(\mathbf{g}_{t}\),还依赖于之前的速度 \(\mathbf{v}_{t-1}\)

目的是将石头滚到最低点,动量法可以借助之前的速度冲出梯度平缓的区域。

import torch
from torch import nn

net = nn.Sequential(nn.Linear(784, 10))
# 在pytorch中,动量可直接在SGD中定义
optimizer = torch.optim.SGD(net.parameters(), lr=0.1, momentum=0.9)