为什么二阶 SGD 收敛方法在深度学习中不受欢迎?

机器算法验证 神经网络 优化 收敛 梯度下降 随机梯度下降
2022-02-05 22:50:37

似乎,特别是对于深度学习,有一些非常简单的方法可以优化 SGD 收敛性,比如 ADAM - 很好的概述:http ://ruder.io/optimizing-gradient-descent/

他们只追踪单个方向——丢弃关于剩余方向的信息,他们不尝试估计与近极值的距离——这是梯度演化所建议的(0极值),并且可以帮助选择步长的关键。

这两个错失的机会都可以被二阶方法利用——尝试同时在多个方向(不是全部,只是几个)对抛物线进行局部建模,例如在某些方向上接近鞍座吸引,在其他方向上排斥。这里有一些:

但是一阶方法仍然占主导地位(?),我听说二阶方法不适用于深度学习(?)

主要有 3 个挑战(还有吗?):反转 Hessian、梯度随机性和处理如果在一些有希望的方向(我想使用)将参数化局部建模为抛物线,则所有这些都应该解决:根据计算的梯度更新此参数化,并基于此参数化执行适当的步骤。这样,极值可以在更新的参数中 - 没有 Hessian 反演,参数化的缓慢演变允许从梯度累积统计趋势,我们可以对鞍附近的两个曲率进行建模:相应地吸引或排斥,强度取决于建模的距离。

我们应该采用二阶方法进行深度学习吗?

为什么让它们比简单的一阶方法更成功如此困难——我们能否识别这些挑战……解决它们?

由于实现二阶方法的方法有很多,哪一种看起来最有前途?

更新:SGD 收敛方法概述,包括二阶:https ://www.dropbox.com/s/54v8cwqyp7uvddk/SGD.pdf

更新:有批评巨大的二阶方法,但我们可以在成本范围的另一端工作:从成功的一阶方法中做出微小的步骤,比如单向的廉价在线抛物线模型,例如动量方法,用于更明智地选择步长- 对于一阶方法的二阶增强,是否有有趣的方法? 在此处输入图像描述

2个回答

我们应该采用二阶方法进行深度学习吗?

TL;DR:不,尤其是现在创新步伐放缓,我们看到新的架构创新越来越少,而更多的方法可以在更大的数据集上训练基本上只是现有架构的副本(参见 OpenAI 的 GPT-2 )。

首先,甚至没有达到二阶,值得一提的是,在深度学习中,您甚至没有充分利用(小批量)梯度下降(即,您不执行线搜索),因为优化在线搜索的步骤将非常昂贵。

、二阶方法是:

  • 方式更复杂,即在没有错误的情况下更难实现。深度学习系统正日益成为庞大数据处理管道的一小部分。只有在收益很大程度上抵消了风险的情况下,在复杂系统中引入进一步的复杂性和脆弱性才是明智的。我将在下面争辩说他们没有。
  • 越来越难以针对异构硬件上的分布式计算进行优化,这变得越来越普遍。看看为了让 K-FAC 在分布式(非异构)系统上工作需要做多少工作,性能仍然不比最好的一阶方法好:https ://arxiv.org/pdf/1811.12019.pdf 。相反,如果只是切换到分布式计算使我的一阶方法与二阶方法一样快或更快,我看不出使用更复杂的优化算法的理由。
  • 在迭代成本(而不是数量)内存占用方面更昂贵,因此它们引入了相当大的开销。当前的架构 (GPU) 受内存限制多于计算限制。正如这里很好解释的那样,迭代成本和内存占用的增加越陡,问题的维数越高。深度学习中的优化可以说是最高维的优化问题之一,因此不清楚二阶方法在计算时间(不是迭代次数,这不是我们真正关心的)方面是否具有明显优势首先-订购方法。
  • 深度学习优化的另一个问题是鞍点。越来越清楚的是,“坏”局部最小值在深度学习中不是问题,但鞍点是。牛顿法确实有被鞍点吸引的倾向如果我没记错的话,像 K-FAC 这样的 Hessian 逼近方法没有这个问题,但我认为证明取决于架构的类型,这使得这些方法的使用变得脆弱。
  • 他们没有解决使从业者大部分时间浪费的问题。死单元或饱和单元不是通过 K-FAC 解决的,而是通过更好的初始化方案来解决的,所以这是我们应该关注的,例如 Fixup:https ://arxiv.org/abs/1901.09321
  • 二阶方法的另一个问题是,对于大多数常见的损失函数,很容易使用小批量来获得一个收敛到实际梯度的估计器。建立一个基于采样的估计器来近似于 Hessian 的倒数要复杂得多。换句话说,二阶方法引入了很多复杂性和额外的内存占用,但随机二阶方法引入了更多的复杂性。与随机一阶方法相比,该算法仅比确定性一阶方法稍微复杂一些。
  • 最后,它们有很多活动部件,很难以最佳方式进行调整。你的同一篇论文留下了很多细节需要说明。我们是否需要更多额外的超参数,还是需要稳健的优化方法?请记住,在深度学习中,正如 Shai Shalev-Shwartz 很好地解释的那样,当出现问题时,很难理解如何修复它https://www.youtube.com/watch?v=1nvf_DBnsxo和更多超参数在这方面没有帮助。

这实际上开始发生变化,因为最近的工作显示了专门针对 NLP 问题的二阶方法的好处。一些例子是:

  1. ADAHESSIAN:机器学习的自适应二阶优化器” Zhewei Yao、Amir Gholami、Sheng Shen、Kurt Keutzer、Michael W. Mahoney

  2. 二阶优化变得实用” Rohan Anil、Vineet Gupta、Tomer Koren、Kevin Regan、Yoram Singer

有一种错误的观念认为二阶方法是不切实际的,因为形成 Hessian 的成本是O(N2)或者 Hessian 逆的成本是O(N3). 事实上,你从来没有明确地做任何这些。在实践中,使用随机线性代数方法和无矩阵方法,可以很好地近似于 HessianO(N)复杂。

现在实际上有多个库可以在合理的时间内计算大型模型(甚至十亿参数模型)的 Hessian 谱。下面是我们的实现:

https://github.com/amirgholami/PyHessian

更新:有一个关于如何在不明确形成 Hessian 的情况下使用牛顿方法的问题(O(N2)cost) 并显式应用其逆 (O(N^3)) 成本。答案是您可以使用共轭梯度来计算牛顿步。让我们用g和黑森州H. 在牛顿法中,参数的更新w如下:

wnew=woldH1g

解决方案H1g可以通过求解来计算:

HΔw=g

这是一个可以用共轭梯度求解的线性方程组(对于 PSD H)。谢天谢地,CG不需要H被明确地形成以找到Δw=H1g. 它只需要应用H到可以计算的给定向量O(N)复杂。理论上,您将需要 r 次 CG 迭代来精确求解上述方程(其中 r 是 Hessian 秩)。然而,在实践中,除非需要机器精度精度,否则通常需要进行几次迭代。

这在 Perlmutter 1994 年的论文中得到了优雅的解释(见第 5.2 节):

  1. Hessian 的快速精确乘法” BA Perlmutter

另外,为了进行更深入的分析,我建议阅读以下论文的第 6 节:

  1. 大规模机器学习的优化方法” Leon Bottou、Frank E. Curtis、Jorge Nocedal