自动调优超参数:斯坦福大学提出SGD动量自调节器YellowFin

手动调整 SGD(随机梯度下降)动量(momentum)的方法可与目前最先进的自适应方法(如 Adam)竞争,那么 SGD 动量能不能自动调节呢?斯坦福大学的研究人员近日提出了 YellowFin,一种自动调整 SGD 动量超参数的方法。YellowFin 在大型 ResNet 和 LSTM 模型的训练中迭代次数少于此前的最佳水平,而且通过负反馈环路机制,它在异步设置的运行中表现得更好。目前,YellowFin 已经推出了 TensorFlow 和 Pytorch 的实现,详见文末。


YellowFin 与 Adam 在训练 ResNet 和 CIFAR100 时,同步(左侧)和异步(右侧)的时间消耗,使用了 16 工作器。

超参数调优是深度学习研究当中最痛苦的部分之一。很多论文都包括一系列令人惊奇的结果,它们就像黑魔法一样:这些都得归功于研究人员花费大量时间调整了超参数空间。找到一个可运行配置的过程可能会演变成一件恼人的工作。


而像 Adam 和 RMSProp 这样能调整单个变量学习率的工具可以让生活变得简单一些。

我们的实验显示,在 ResNet 和 LSTM 上,这些自适应方法可能无法与仔细手动调节 SGD 动量相提并论。

这些观点得到了最近一些研究的支持(如论文《The Marginal Value of Adaptive Gradient Methods in Machine Learning》),这也表明适应性方法可能会因不谨慎的泛化而不起作用。它的假设在于可变适用性能最终找到完全不同的极小值。在这里,斯坦福大学的研究人员们指出了另一个重要却被忽视的因素:动量。

动量调整对于有效训练深度学习模型至关重要。

经典的凸结果和最近的论文《Why Momentum Really Works》都研究并强调了它的重要性。异步动力学是另一个需要仔细调整动量的原因。斯坦福大学近日发表的另一篇论文《Asynchrony begets Momentum, with an Application to Deep Learning》显示了训练异步引入的动量式力在更新梯度时的重要性。这些增加的力可以让动量变得更加重要,有时甚至负动量值也可以是最佳的!

尽管有很好的结果,目前最好的方法无法自动调整动量!

大多数深度学习文献中,动量被固定在 0.9——所以改善性能的方法显而易见。最成功的 GAN 论文《Improved Training of Wasserstein GANs》将动量手动控制在零到一个小正数的原因也就不言自明了。

YellowFin 的动量

我们回顾了 Polyak SGD 动量的方法,研究了一些它的鲁棒性属性,并且给调节器提炼出了设计原则——YellowFin。YellowFin 会自动为 SGD 调节一个单一的学习速率和动量值。最终的结果是快速的!


本文对 YellowFin 论文中的结果进行了完整的回顾:

  • 鲁棒性:动量在曲率变化中是鲁棒的。从经验上来讲,这可以给一些非凸(non-convex objectives)目标提供一个恒定的收敛速率。这一观察结果给 YellowFin 动量调优提供了动力。
  • 运行中的异步补偿:我们可以测量一个系统的总体动量,包括任何异步感应动量(asynchrony-induced momentum)。YellowFin 使用了一个简单的负反馈环来控制算法的动量值。
  • 飞鱼:同步和异步配置下的实验结果显示了 YellowFin 需要更少量的迭代来训练模型,比如 ResNets 和与 Adam 相比的大型 LSTMs。

YellowFin 调优器已有 TensorFlow 和 PyTorch 实现可供使用(见本文末)。

动量的鲁棒属性

YellowFin 的核心处有一个非常简单的技术内核;我们在这里会描述这个基本思想。我们先关注一下二次方目标。Polyak 和 Nesterov 规定的动量最优值的经典结果是曲率动态范围的函数:比如,条件数 κ。


假设也对学习速率进行合理地选择,上述动量值就会保证所有的变量将会在相同的线性速率下收敛于它们的最终值。


具体来说,这是由于沿着目标的任意标量部分来描述动量动态的 2x2 线性运算子有着相同的谱半径,ρ,如上所示。我们把满足此条超参数配置群叫做鲁棒区。

对于非凸函数,研究人员给出了该结果的简单推广。在此,我们可以定义一个「泛化条件数值」,它捕捉标量函数的曲率变化。例如下图左侧所示的函数包含有两个二次方程曲线 c 和 1000c,所以泛化条件数值就是 1000。经过分析,根据这一数值调整动量可以让整个函数在动量操作中保持恒定谱半径。不过,谱半径的结果不一定能保证非二次目标的收敛,如右下图所示。


非凸目标的收敛速度恒定,如左图所示。右侧图黑色线显示了动量算法,根据理论预测的根动量则为红色。

在真实模型,如 LSTM 模型的情况下,这些方法也获得了验证(如下图)。我们可以观察到,对于大动量值,大多数变量(灰线)遵循二次模型的根μ收敛速度(红线)。


训练真实模型(LSTM)时收敛速度恒定。

以上内容简要说明了 YellowFin 的设计背景。

YellowFin 的设计理念

设计理念 1:保持在鲁棒区域内。调整动量值,让它保持在鲁棒区内。对于二次近似,这可以保证所有模型变量在一个常见的速率下收敛,这个经验可以扩展到某些非凸目标。

为调整变量,YellowFin 一直保持曲线估算的运行,从而得出泛化条件数值。这种估计无需完全准确。在实践中我们可以看到,噪声梯度的粗糙测量也可以得到很好的结果这种设计理念给出了动量价值的下限。

设计理念 2:在每个步骤里优化超参数,最小化局部二次逼近。

因为理念 1 的约束,我们调整学习速率和动量以最小化,以将预期的平方距离最小化为局部二次逼近的最小值,实现的全部细节参见论文。

结果

实验证明,YellowFin 在未经特殊调整的情况下可以比 Adam 手调基础学习速率和手调 SGD 动量在 ResNet 和 LSTM 训练中需要更少的迭代。


手调 SGD 动量、手调 Adam 和 YellowFin 的训练损失,左图为 110 层 ResNet CIFAR10,右图为 164 层 ResNet CIFAR100。


三种方法的 LSTM 测试数据(YellowFin 达到了目前业内最佳的表现)左图为词级语言建模,中图为字符级语言建模,右图为选区分析。


异步动态和闭环 YellowFin

斯坦福大学近期的研究表明,异步可以造成动量。这意味着异步运行时,系统中的整体动量一定会超过为优化器提供的算法中的动量值,因为其中多出了异步引发的动量。

在新的研究中,研究人员第一次指出总动量是可以被计算的。下图左侧显示了斯坦福大学的计算方式在同步运行时符合算法值。而在异步系统中,动量总数永远都会大于算法值(右侧)


总动量计算在同步运行时符合算法值(左侧);而在使用 16 工作器的异步系统中高于算法值(右侧)。

这种动量过剩可能会对统计效率产生不利的影响。由于我们拥有了测量总动量的能力,这就允许我们在运行中对异步进行补偿。具体来说,我们使用了负反馈循环来保证测量到的总动量保持在 YellowFin 选定的目标动量值范围之内。


关闭 16 异步工作器动量循环:负反馈环路使用整体动量测量的结果来减少算法的动量值,让整体结果保持在目标值附近。

结果

通过关闭动量循环来减少算法动量,有时甚至让它变成负数!我们可以发现它在异步设置中是非常有益的。(开环)YellowFin 已经比 Adam 表现要好了,主要是因为它可以让损失更小,而因为闭环,YellowFin 的表现更是加倍的存在(相比 Adam 最低的损失几乎快了三倍)。


关闭 16 异步工作器动量循环:负反馈循环使用总动量测量来减少算法动量值。最终结果是总动量紧随着目标值。

结论

YellowFin 是动量 SGD 的自动调谐器,它可以与业内最佳、对每个变量使用单独学习率的适应性方法相媲美。在异步设置中,它使用了一种全新的闭环设计,可显著减少迭代次数。

下一步

  • YellowFin 为曲率变化和梯度变化量等参数提供了一些测量指标,以调整它们的超参数。在第一版实现中,研究人员使用了简单的近似估计,获得了不错的结果。研究其他的实现方法是一个方向,如对 Hessian 对角线使用基于反向传播的估计,或者利用智能线搜索来估计距离局部最小值的距离。
  • 计算优化:目前我们专注于让工具智能化地调谐动量,让它实现平滑动量 SGD 的过程在统计效率上达到最佳水准(迭代次数为表现形式)。下一步,研究人员准备探索如何减少调节过程中的计算消耗量。
  • 在论文中,研究人员已经展示了手动调节 Adam 动量可以提高它的异步表现。设计在其他方法中异步测算动量和负反馈循环的应用或许是又一个方向。

论文:YellowFin and the Art of Momentum Tuning


论文链接:https://arxiv.org/abs/1706.03471

摘要

超参数调优是深度学习最大的成本之一,目前业内最佳的优化器,如 Adagrad、RMSProp 和 Adam,通过自适应每个变量的学习速率让事情变得容易了一些。这种级别的调整可以形成更加强大的方法。但是根据我们的经验,特别是最近 Wilson 等人的研究所示,手动调节的随机梯度下降(SGD)可以获得更好的结果,而且更快。

Wilson 等人的假设是自适应方法收敛于不同的最小值。在这里我们指出另一个因素:以上所有方法都没有调节动量参数,而它是深度学习应用中相当重要的一点(Sutskever et al.)。在异步-平行系统中,动量参数的重要性更大(Mitliagkas et al.),因为异步带来了动量式的动态变化,而降低算法动量对于平行化的效率非常重要。

我们回顾了简单动量 SGD 算法,并展示了手动调整单个学习速率和动量值的方式可以与 Adam 的表现竞争。我们分析了其在学习率错误指定和客观曲率变化中的鲁棒性。基于这些,我们设计了 YellowFin:一个自动调整 SGD 动量和学习速率的工具。YellowFin 可以使用全新的动量传感组件和负反馈环路机制在运行中补偿异步系统带来的动量增加。在大型 ResNet 和 LSTM 模型中,我们展示了 YellowFin 的迭代次数小于 Adam,在同步设置中最多快 2.8 倍,在异步设置中快 2.7 倍。

实现

YellowFin 目前已经开源了 Pytorch 和 TensorFlow 实现。在 Pytorch 版本中,开发者宣称它可以嵌入式替代任何 Pytorch 内的优化器,在 from yellowfin import YFOptimizer 之后,它像所有 Pytorch 优化器一样支持 step 和 zero_grad 函数。 

  • TellowFin 的 Pytorch 实现:https://github.com/JianGoForIt/YellowFin_Pytorch
  • TensorFlow 实现:https://github.com/JianGoForIt/YellowFin
产业斯坦福大学深度学习YellowFin工程SGD