最近的梯度下降算法的更新概述
对之前的总结和补充
Vanilla Gradient Descent
现代深度学习优化器的故事始于朴素梯度下降。朴素梯度下降遵循以下迭代,具有一定的学习速率参数 $\eta$: \(\theta_{t+1} = \theta_t - \eta \cdot g_t\) 其中 loss 是从整个训练数据集中随机抽取的、使用一定数量的样本计算得出的平均 loss。 对于批次梯度下降(或简称为梯度下降),在每次迭代中都使用整个训练数据集来计算损失。 对于随机梯度下降(SGD),每次迭代绘制一个样本。 在实践中,通常使用微型批处理,并且常见的微型批处理大小在64到2048之间。小批量梯度下降非常普遍,通常称为SGD。
Momentum
考虑两种情况,a)局部损失景观是平坦的山丘,b)局部损失景观是陡峭的山沟。 在第一种情况下,梯度下降算法可能要花很长时间才能到达山顶,即使它显然沿相同方向行进。 在第二种情况下,梯度下降算法可能会在陡峭的山沟壁之间来回弹跳而不会很快到达底部,如果可以对来回梯度进行平均以减小方差,那将是很好的。
这是需要梯度累加或平均机制的两种常见解释,这导致了 Momentum 出现。Momentum 是由 $\beta$(通常等于 0.9)参数化的过去梯度的指数移动平均值(exponential moving average of past gradients),由以下算法给出: \(v_t = \gamma v_{t-1} + g_t \\ \theta_{t+1} = \theta_t - \eta v_t \\\) 有多种实现方式见 James Melville
AdaGrad (Adaptive Gradient)
AdaGrad 受直觉启发,不经常更新的权重应该以比经常更新的权重更大的学习率来更新。基本上,如果权重很少得到大的梯度,则当它收到大的梯度时应该充分利用它。这是通过保持每个权重的平方梯度的累加总和并将学习率除以该累加总和来实现的。 从 AdaGrad 开始,针对 $\theta$ 的每个坐标 $i$ 的 SGD 递归变为: \(\theta_{t+1,i} = \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii} + \epsilon}} \cdot g_{t,i}\) 其中 $G_t \in \mathbb{R}^{p \times p}$ 通常是过去梯度的平方之和的对角线预处理矩阵,而 $\epsilon > 0$ 是一个小常数。 注意在 $G_t$ 上使用的平方根(也可以有效地使用 0 到 1 之间的其他幂),但是平方根是一个很好的起点。
这通常有另外两个含义:a)对超参数不像 Momentum 那么敏感(某些模型一次训练可能要花费100,000美元!),b)这近似于对角线矩阵,并且是仅使用一阶矩信息对二阶距的估计。 这些学习速率自适应算法可以理解为利用当前和过去的梯度信息来设计更好地近似损失函数的局部曲率的预处理矩阵。
RMSprop
但是,AdaGrad 中平方梯度的累积只会增加,这意味着如果优化程序运行足够长的时间,则实际上后续更新太小。RMSprop(均方根反向传播)将每次累积的矩阵 $G_t$ 替换为每次迭代计算的梯度均方根,其中 $\beta_2$ 最初建议为 0.9,良好的默认学习率为 0.001。然后,RMSprop更新为: \(E[g^2]_t = \beta_2 E[g^2]_{t-1} + (1 - \beta_2) g_t^2 \\ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t\)
Adam
如果我们为 RMSprop 增加动力该怎么办?这就是 Adam。除了 RMSprop 之外,Adam 还保留了过去梯度的指数衰减平均值:【另外一个博客说这边还要计算经过偏差校正的第一和第二矩估计值来抵消这些偏差】 \(m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \\ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} m_t\) 其中建议 $\beta_1 = 0.9,\beta_2 = 0.999, 学习率 \eta=0.001$。 当 $\beta_1 = 0$ 时,观察到 Adam 等于 RMSprop。 我们再次提到要注意 $E[g^2]_t$ 的平方根可以取别的值,并且0到1之间的其他幂已经被有效使用(有一种称为 Padam 的算法)。
AMSGrad
AMSGrad 的动机在于,Adam 无法收敛于一个简单的优化问题。作者通过 Adam 证明中有关指数移动平均 $E[g^2]_t$ 的技术细节来解决此问题。AMSGrad 保留了 $E[g^2]$ 的运行最大值,而不是指数移动平均值。
参数化 AMSGrad 算法($\eta = 0,\beta_1 < 1, \beta_2 < 1$): \(\hat v_t = max(\hat v_{t-1}, v_t) \\ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat v_t} + \epsilon} m_t\) 通常公认的是,AMSGrad 在实践中并不比 Adam 更好。另外,没人真正知道AMSGrad代表什么。
AdamW
权重衰减(Weight decay)是训练神经网络的一种技术,它试图使权重值保持较小。直觉是,权重过大往往会造成过拟合。这通常是通过在损失函数中添加一个项来实现的,该项是权重值的函数,这样,较大的权重将显着增加总损失。权重衰减的最流行形式是L2正则化,它惩罚权重的平方值,并且便于同时处理正负权重以及可微性。
AdamW 通过将权重衰减与梯度更新解耦,修改了Adam 中权重衰减正则化的典型实现。特别是,通常使用以下修改实现 Adam 中的 L2 正则化,其中 $w_t$ 是时间 $t$ 的权重衰减率: \(g_t = \nabla_{\theta_t} f(\theta_t) + w_t \theta_t\) 而 AdamW 则将权重衰减项调整为出现在梯度更新中: \(\theta_{t} = \theta_{t-1} - \eta (\frac{1}{\sqrt{\hat v_t + \epsilon}} \cdot m_t + w_t \theta_t)\) 事实证明,这在实践上有所作为,并且已在机器学习社区的某些部分采用。您会惊讶于一些小细节如何对性能产生显着影响!