RMSProp/zh

    From Marovi AI
    This page is a translated version of the page RMSProp and the translation is 100% complete.
    Other languages:
    Article
    Topic area optimization
    Prerequisites Stochastic Gradient Descent, Backpropagation, Gradient Descent


    概述

    RMSProp(Root Mean Square Propagation,均方根传播)是一种通过随机梯度下降训练神经网络的自适应学习率优化算法。该方法由 Geoffrey Hinton 在其 2012 年 Coursera 神经网络课程中提出,RMSProp 按照对迄今所见梯度平方进行指数衰减的滑动平均来缩放每个参数的更新。梯度持续较大的参数获得较小的有效步长,而梯度较小或稀疏的参数则获得较大的更新。这种逐参数的重新缩放帮助优化器在损失曲面的平缓方向上快速前进,同时避免在陡峭方向上发散;在 Adam 兴起之前,它一直是循环神经网络的默认优化器。[1]

    该方法在原始的梯度下降与 Adam 等完全自适应方法之间占据中间位置。它解决了 AdaGrad 一个广为人知的失效模式:梯度平方的累积和单调增长,最终将有效学习率缩减为零。RMSProp 用指数滑动平均代替累积和,使步长能够响应近期的曲率信息,因此在长时间训练以及深度学习强化学习中常见的非平稳目标上仍然可用。

    直觉

    核心思想是为每个参数估计近期梯度的典型量级,并将每次更新除以该估计值。如果某参数的梯度绝对值持续较大,则梯度平方的滑动平均也较大,更新被抑制。如果梯度较小,除数也较小,因此相同的标称学习率就会产生更大的有效步长。其效果是对每个参数的步长进行近似归一化,而不需要诸如海森矩阵这样的二阶信息。

    一个有用的直观比喻是损失曲面上一条狭长的山谷。使用单一全局学习率的普通SGD要么在陡峭的谷壁之间来回振荡(学习率过大),要么在谷底缓慢爬行(学习率过小)。RMSProp在梯度平方较大的陡峭方向上缩小步长,同时在平缓方向上保留相对较大的步长。轨迹因此更平滑,沿谷底的前进也加速。与 AdaGrad 不同,梯度平方的估计会随时间衰减,因此优化器在训练后期需要时仍能采取较大的步长。

    公式

    $ \theta_t \in \mathbb{R}^n $ 表示第 $ t $ 步的参数向量,并令 $ g_t = \nabla_\theta L(\theta_t) $ 为损失 $ L $ 关于参数的梯度,在一个小批量上计算。RMSProp维护逐元素梯度平方的指数滑动平均 $ v_t $,并用其平方根来重新缩放更新:

    $ {\displaystyle v_t = \rho\, v_{t-1} + (1 - \rho)\, g_t \odot g_t} $

    $ {\displaystyle \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t} + \epsilon}\, g_t} $

    其中 $ \eta $ 为全局学习率$ \rho \in [0, 1) $ 为滑动平均的衰减率(常记为 $ \beta $$ \gamma $),$ \epsilon $ 为防止除以零的小常数。运算 $ \odot $ 表示逐元素乘法,平方根与除法也按元素逐一进行。状态 $ v_0 $ 初始化为零。

    一种常见的替代写法将分母记为 $ \sqrt{v_t + \epsilon} $,将 $ \epsilon $ 放在平方根内部而不是之后再加上;这是 TensorFlow 采用的形式,在训练初期会产生略有不同的数值行为,但本质上是等价的。超参数的典型默认值为 $ \eta = 10^{-3} $$ \rho = 0.9 $$ \epsilon = 10^{-8} $,但学习率通常需要针对具体问题进行调优。

    训练与推理

    RMSProp仅在训练时使用;在推理时,训练好的权重被直接使用,不涉及优化器状态。训练期间,优化器维护一个与参数形状相同的额外张量(即滑动平均 $ v_t $),因此内存开销大约等于模型本身。这比同时存储一阶矩和二阶矩的 Adam 更省内存,但比不存储任何状态的标准 SGD 占用更多内存。

    每一步需要一次逐元素平方运算、一次逐元素乘加运算以更新 $ v_t $、一次逐元素平方根运算以及一次逐元素除法运算。这些运算在 GPU 上是高度并行的,相对于网络的前向和反向传播开销可以忽略不计。由于矩估计是按批次累积的,进度的有意义单位是优化器步数而不是挂钟时间;学习率调度和预热阶段通常以步数表示。

    从检查点恢复训练时,必须同时恢复参数和优化器状态。仅恢复参数实际上会将梯度平方的估计重置为零,导致最初的几次更新过大,从而可能在冷启动时破坏训练的稳定性。大多数深度学习框架在保存检查点时会自动保存和恢复优化器状态。

    变体

    基础算法的若干变体出现在文献和实践中。Hinton 最初的课程描述了不带动量RMSProp,但一个常见的扩展通过维护独立的速度缓冲区加入动量

    $ {\displaystyle m_t = \mu\, m_{t-1} + \frac{\eta}{\sqrt{v_t} + \epsilon}\, g_t} $

    $ {\displaystyle \theta_{t+1} = \theta_t - m_t} $

    当 TensorFlow 的动量超参数非零时,它公开的就是这种带动量的 RMSProp 形式,在曲率条件较差的问题上往往表现更好。Graves 提出的进一步扩展将 Nesterov 风格的前瞻应用于动量步。[2]

    与之密切相关的 AdaDelta 算法由 Zeiler 于 2012 年独立提出,得到的更新规则类似,但还额外用参数更新平方的滑动平均对分子进行重新缩放,从而无需指定全局学习率[3] Adam 可以视作在 RMSProp 的基础上增加了一阶矩估计(平滑后的梯度)和偏置校正项;在实践中两者在监督学习任务上常给出可比的结果,而在现代训练流水线中通常将 Adam 作为默认选择。

    与其他优化器的比较

    AdaGrad 相比,RMSProp通过对旧的梯度平方信息进行指数衰减来避免步长无限缩小;这使其更适合长时间训练和非平稳问题。与采用固定全局学习率的标准 SGD 相比,RMSProp 对学习率选择不当更为宽容,并且在参数尺度不均匀的问题上收敛更快,例如同时训练不同类型的层或不同模态时。代价是每个参数多一个状态张量,并且每一步的算术开销略有增加。

    Adam 相比,RMSProp 省略了一阶矩(速度)估计和偏置校正步骤。在一阶矩对噪声梯度起到明显平滑作用的场景中,例如小批量或噪声较大的强化学习采样,Adam 通常优于 RMSProp。在梯度本身较为平稳的场景中,两者通常可以互换,而 RMSProp 的简洁性和略低的内存占用可成为优势。从经验上看,2010 年代中期,许多深度循环网络和策略梯度训练流水线默认使用带动量的 RMSProp,而它至今仍作为强化学习库中的基线方法出现。

    局限性

    RMSProp继承了自适应优化器的一般局限性。逐参数缩放会干扰显式权重衰减;将正则化项与重新缩放后的更新耦合所产生的有效惩罚,与将其与原始梯度耦合时不同,这正是促使解耦权重衰减变体被提出的原因,后者后来成为 Adam 类方法的标准做法。在将 RMSProp 与学习率预热或调度的突变结合使用时也需谨慎,因为滑动平均 $ v_t $ 需要数千步才能稳定下来,可能与步长的突然跳变产生意外的相互作用。

    该算法在非凸目标上的收敛保证并不比 SGD 更强;并且在某些凸问题上,已被证明即使在无限样本极限下也无法收敛到稳定点,这是它与 Adam 共有的缺陷。[4] 在实践中,对于过参数化的神经网络这很少成为问题,但这也意味着在收敛保证至关重要的场景下,不应将 RMSProp 作为黑箱求解器。最后,与所有逐元素的自适应方法一样,RMSProp 忽略参数之间的相关性,因此无法利用真正的二阶方法所能捕获的曲率结构。

    参考文献

    1. Hinton, G. Lecture 6.5 - rmsprop: Divide the gradient by a running average of its recent magnitude. Coursera: Neural Networks for Machine Learning, 2012.
    2. Graves, A. Generating Sequences With Recurrent Neural Networks. arXiv:1308.0850, 2013.
    3. Zeiler, M. D. ADADELTA: An Adaptive Learning Rate Method. arXiv:1212.5701, 2012.
    4. Reddi, S. J., Kale, S., Kumar, S. On the Convergence of Adam and Beyond. ICLR, 2018.