0%

你还在用 SGD?

深度学习优化算法: SGD -> SGDM -> NAG -> AdaGrad -> AdaDelta -> Adam -> Nadam
下面介绍的内容都会用到的数学表达:

  • 待优化参数 $w$
  • 目标函数 $f(w)$
  • 初始学习率 $a$

优化过程可以建模为, 在每个 epoch $t$ 中:

    1. 计算目标函数关于当前参数梯度: $g_t = \nabla f(w_t)$
    1. 根据历史梯度计算 一阶动量 二阶动量:$m_t=\phi(g_1,…,g_t)$, $V_t=\varphi(g_1,…,g_t)$
    1. 计算当前时刻的下降梯度:$\eta_t = a \cdot m_t / \sqrt{V_t}$
    1. 根据下降梯度进行更新:$w_{t+1} = w_t - \eta_t$

      1. SGD (stochastic gradient descent) 随机梯度下降

      SGD 没有动量的概率,即 $m_t=g_t, V_t=I^2$, 即 $\eta_t=a\cdot g_t$
  • 缺点:下降速度慢,可能在沟壑的两边持续政党,停留在局部最优点。

2. SGDM (stochastic gradident descent with momentum)

为了抑制 SGD 的震荡,SGDM 认为梯度下降过程加入了惯性,下坡的实收,如果发现是陡坡,那么惯性下降更快。
$$m_t = \beta_1m_{t-1} + (1-\beta_1)g_t$$
一阶动量是各个时刻梯度方向的指数移动平均值,约等于 $1/(1-\beta_1)$ 个最近时刻的梯度方法的平均值。

3. 3 SGD with Nesterov Acceleration

NAG 全称 Nesterov Accelerated Gradient, 是在 SGD, SGD-M 的基础上进行了改进,主要是在 步骤 1 上进行了改进。根据上面公式,时刻 $t$ 的主要下降方向主要由 累计动量 决定,t 时刻的 梯度方向 说了不算,为此可以先看看跟着累计动量走一步的结果,NAG 主要在步骤 1 中 不计算当前位置的梯度方向,而是按照累积动量走一步。
$$g_t = \nabla f(w_t - a \cdot m_{t-1} / \sqrt{V_{t-1}})$$

4. AdaGrad

二阶动量的到来,意味着 自适应学习率 优化算法的到来。SGD 及其变体以同样的学习率更新每一个参数,而深度神经网络包含大量的参数,这些参数并不是总会得到,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太多,希望学习速率慢一点;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然的样本上学习一些,即学习率大一些。

  • 度量历史更新频率:二阶动量表示所有梯度值的平方和: $V_t = \sum_t g_t^2$

  • $\eta_t = a \cdot m_t / \sqrt{V_t}$, 参数更新越频繁,二阶动量越大,学习率越小。

  • 缺点是 $V_t$ 是单调增加的,那么学习率可能减少到 0, 使得训练提前结束。

5. AdaDelta / RMSProp

改进 AdaGrad 的学习率变化过于激进的缺点,思路是并不累积所有历史提取,而是关注于过去一段时间窗口的下降梯度。
$$V_t = \beta_2 V_{t-1} + (1 - \beta_2) g_t^2$$
避免二阶动量持续累积,导致训练提前结束的问题了。

6. Adam

  • 实际的下降方法:$m_t$;

  • 实际的学习速率:$a / \sqrt{V_t}$

  • SGD-M 在 SGD 上考虑了一阶动量, AdaGrad, AdaDelta 在 SGD 上考虑了二阶动量, 把一阶动量和二阶动量都用起来,就是 Adam(Adapative Momentum)。
    $$m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t $$
    $$V_t = \beta_2 V_{t-1} + (1 - \beta_2) g_t^2 $$

  • 缺点:

    • 可能会不收敛的情况。二阶动量 $V_t$ 在学习的过程中时大时小,产生震荡。学习率递减策略。

    • 可能错过全局最优解。主要是 Adam 后期学习率太低了,影响了有效的收敛。

7. NAdam (Nesterov + Adam)

$$g_t = \nabla f(w_t - m_{t-1}/\sqrt{V_t})$$

8. RAdam

它能够根据方差分散度,动态地打开或者关闭自适应学习率,提供一种不需要可调节参数学习率预热的方法,它兼顾了 Adam 和 SGD 两者的有点,即能保证收敛速度快,也不容易陷入局部最优解,在较大学习率的情况下,精度甚至优于 SGD。

9. Lookahead

  • lookahead 与 其他最优化器是正交的,意味着可以使用 lookahead 加强现有最优化方法的性能

  • 它能够有效的降低方差

  • Lookahead 是怎么做的

    • lookahead 会迭代地更新两组权重,slow weights $\phi$ 和 fast weights $\varPhi$, 前者在后者每更新 k 次后更新一次。lookahead 可以将任意标准优化算法 A 作为内部优化器来更新 fast weights.

    • 内部优化器 A 进行 k 次更新后,Lookahead 在权重空间 $\phi - \varPhi$ 中进行线性插值更新 slow weights。方向为最后一个 fast weights.

    • slow weights 每更新一次, fast weights 将被重置尾目前的 slow weights 值。
      具体算法如下图所示

10. Warmup 策略

热身,在模型刚开始训练的时候是一个非常小的学习率,紧接着模型训练学习率慢慢变大。
有效原因:

  • 有助于减缓模型在初始阶段对 mini-batch 的 提前过拟合,保持分布的平稳。

  • 有助于保持模型深层的稳定性。

  • 在刚开始训练的时候,模型的权重是随机初始化的,选择一个较大的学习率,可能带来模型的不稳定(震荡)。

坚持原创技术分享,您的支持将鼓励我继续创作!