神经网络优化器的核心算法以及为什么需要它们

实践教程,直观的深度学习,像SGD,动量,RMSPROP,ADAM和其他人一样,渐变下降优化器使用的柔和指南,以简单的英语

ketan doshi

10分钟阅读

优化器是神经网络架构的关键组成部分。在训练期间,他们在帮助网络学习以提高更好的预测方面发挥着关键作用。

它们通过找到权重和偏差等最佳模型参数来执行此操作,以便该模型可以产生它们解决问题的最佳输出。

大多数神经网络使用的最常见的优化技术是梯度下降。

最受欢迎的深度学习图书馆,如Pytorch和Keras,基于梯度下降,拥有普遍的内置优化器,例如。SGD,Adadelta,Adagagrad,RMSProp,Adam等。

为什么有这么多不同的优化算法?我们如何决定选择哪一个?

如果您读取每个文件的文档,则描述如何更新模型参数的公式。每个配方是什么意思,其重要性是什么?

在我们准备好进入数学之前,我与本文的目标是提供一些整体背景并获得一些关于每种算法如何适合的一种直觉。事实上,我不会在这里讨论公式,但会进行另一种讨论。

让我们从工作中的梯度下降算法的典型3D图片开始。

> Loss curve for Gradient Descent (Source)

此图片显示具有两个权重参数的网络:

  • 水平平面分别具有两个轴,分别用于重量W1和W2。

  • 垂直轴显示损耗的值,适用于权重的每个组合

换句话说,曲线的形状显示了神经网络的“损失景观”。它绘制了权重的不同值的损失,而我们将输入数据集固定在一起。

蓝线在优化期间绘制梯度下降算法的轨迹:

  • 它通过为两个重量选择一些随机值来开始,并计算损耗值。

  • 在每次迭代时,它更新其权重值,导致较低的损耗(希望),它移动到曲线的较低点

  • 最后,它到达其目标是损耗最低的曲线的底部。

计算渐变

该算法基于该点处的损耗曲线的梯度更新权重,以及学习速率因子。

> Gradient Descent parameter update (Image by Author)

梯度测量斜率,并且是垂直方向(DL)的变化除以水平方向(DW)的变化。这意味着梯度对于陡峭的斜坡而小,对于轻柔的斜坡而小。

> Computing the Gradient (Image by Author)

实践中的梯度下降

这些损失曲线是一个有用的可视化,以了解梯度下降的概念。但是,我们应该意识到这是一个理想化的场景,而不是一个现实的情景:

  • 上图显示了光滑的凸形曲线。实际上,曲线非常颠簸。 > A neural network loss landscape (Source, by permission of Hao Li)

  • 其次,我们不会有2个参数。通常有数十或数百百万,并且无法想象或甚至想象在你的头上。

在每次迭代时,梯度血缘血液由“看着各个方向找到它可以下降的最佳斜坡”。那么当最好的坡度不是最好的方向时会发生什么?

  • 如果景观在一个方向上陡峭倾斜,但最低点是朝向更平缓的斜坡的方向?

  • 或者如果周围的景观相当平坦,怎么办?

  • 或者如果它沿着深沟沿着它攀登如何爬出它?

这些是对其困难的曲线的一些例子。让我们看看那些接下来。

梯度下降优化的挑战

局部最小值

在典型的损失曲线中,除了全局最小值之外,您可能有许多本地最小值。由于梯度下降旨在继续向下,一旦它沿着局部最小,就会发现爬回斜坡很难。所以它可能会在没有达到全局最小的情况下陷入困境。

> Local minima and Global minimum (Source)

马鞍点

另一个关键挑战是“马鞍要点”的发生。这是一个点,在对应于一个参数的一个方向上,曲线处于局部最小值。另一方面,在对应于另一个参数的第二方向上,曲线处于局部最大值。

> Saddle Point (Source)

是什么让马鞍点棘手,是马鞍点周围的区域通常相当平坦,就像一个高原。这意味着梯度接近零。这使得优化器在第一参数的方向上围绕鞍点振荡,而不能够沿第二参数的方向下降斜率。

因此,梯度下降不正确地假设它发现它最小。

沟壑

梯度血统也发现难以遍历沟壑。这是一个长长的狭窄山谷,陡峭地沿一个方向(即,山谷的侧面),并且在第二方向上轻轻地(即沿着山谷)。这种山沟通常会导致最小。因为难以导航,这种形状也称为病理曲率。

> Ravines (Modified from Source, by permission of James Martens)

想象一下这就像一只狭窄的河流,从山上轻轻地倾斜,直到它在湖中结束。你想做的是在山谷的方向上快速下行。然而,梯度下降非常容易沿着山谷的侧面来回反弹,并在河的方向上非常缓慢地移动。

虽然它们继续在核心下使用梯度下降,但优化算法已经开发了一系列改善的香草梯度下降,以解决这些挑战。

梯度下降的首先改进 - 随机梯度下降(SGD)

梯度下降通常意味着“全批梯度下降”,其中使用数据集中的所有项目计算丢失和梯度。

相反,迷你批量随机梯度血液为每个训练迭代采用数据集的随机选择的子集。

随机性有助于我们探索损失景观。

早些时候我们已经提到通过改变模型参数来获得损耗曲线,同时保持输入数据集固定。但是,如果通过在每个小批处理中选择不同的数据样本来改变输入,则损耗值和渐变也会变化。换句话说,通过改变输入数据集,可以使用每个迷你批处理获得略微不同的损耗曲线。

因此,即使您在一个百分之批处理中陷入景观中的某个地方,您可能会看到下一个迷你批次的不同景观,这让您继续移动。这可以防止算法卡在景观的特定部分中,特别是在培训的早期阶段。

梯度下降的第二种改善 - 动量

动态调整更新量

梯度下降的棘手方面之一是处理陡峭的斜坡。因为梯度在那里很大,所以当你实际上想要慢慢地和谨慎时,你可能会迈出一大步。这可能导致来回弹跳,从而减慢训练。

> (Image by Author)

理想情况下,您希望动态地改变更新的大小,因此您可以响应您周围景观的变化。如果斜坡非常陡峭,你想要减速。如果斜坡非常平坦,你可能想要加速等等。

梯度下降,基于梯度和学习速率,您可以在每个步骤中进行更新。因此,要修改更新的大小,您可以执行两件事:

  • 调整梯度

  • 调整学习率

动量与SGD.

势头是一种以前的方式,以上是。调整梯度。

使用SGD,我们只看目前的渐变并忽略所有过去的梯度。这意味着如果损失曲线中存在突然异常,您的轨迹可能会抛弃课程。

另一方面,当使用动量时,您可以让过去的渐变引导整体方向,以便您留在课程中。这使您可以使用您在此一点中看到的周围景观的了解,并有助于抑制异常值在损失曲线中的效果

  • 第一个问题是你过去有多远?你走的另外一步,你会受到异常影响得越少。

  • 其次,每个梯度都是从过去计数的同样?最近过去的事情应该是从遥远的过去的东西算上的东西。因此,如果景观的变化不是异常,而是真正的结构变化,那么你确实需要对它做出反应并逐渐改变你的课程。

动量算法使用梯度的指数移动平均值,而不是当前梯度值。

使用动量的横向沟壑

动量可以帮助您解决病态曲率的狭窄蹂躏问题,其中梯度非常高,对于一个重量参数,但另一个参数非常低。

> Momentum helps you traverse ravines (Modified from Source, by permission of James Martens)

通过使用动量,您将抑制SGD会发生的Zig Zag振荡。

  • 对于具有陡坡的第一个参数,大梯度会导致从谷的一侧到另一侧的“曲折”。但是,在下一步中,这将被反面中的“ZAG”取消。

  • 另一方面,对于第二个参数,第一步的小更新由第二步的小更新加强,因为它们处于相同方向。这是你想去的山谷的方向。

使用不同公式使用动量的优化器算法的一些示例是:

  • SGD与势头

  • nesterov加速梯度

第三次改善梯度下降 - 修改学习率(基于梯度)

如上所述,修改参数更新量的第二种方法是通过调整学习率。

到目前为止,我们一直在将学习速度保持在一个迭代到下一个迭代。其次,渐变更新使用了所有参数的相同学习率。

但是,正如我们所看到的,不同参数的梯度之间可能存在大的变化。一个参数可能有一个陡峭的斜率,而另一个参数具有平缓的斜率。

我们可以利用这一点来调整每个参数的学习率。我们可以利用过去的渐变(分别为每个参数)选择该参数的学习速率。

使用略微不同的技术,有一些优化器算法这样做,例如。Adagrad,Adadelta,RMS Prop。

例如,Adagrad平方于过去的渐变并增加它们,同样加权所有这些。RMSPROP还在过去的梯度方方化,但使用其指数移动平均值,从而更重要地对最近的梯度。

现在,通过平衡梯度,它们都变成了正面的IE。有相同的方向。这否定了我们谈到动量的抵消效果,朝着相反方向的渐变。

这意味着对于具有陡坡斜率的参数,梯度很大,梯度的正方形非常大并且总是正的,因此它们快速累积。为了抑制这一点,算法通过将累积的平方梯度除以较大的因素来计算学习率。这允许它减慢陡峭的斜坡。

类似地,对于浅斜率,累积很小,因此算法将累积的正方形分成较小的因素来计算学习率。这会提高温和斜坡的学习率。

一些优化器算法组合了这两种方法 - 根据上述修改学习率以及使用动量来修改梯度。例如。亚当及其许多变种,羔羊。

第四次改善梯度下降 - 修改学习率(根据您的培训进度)

在上一节中,基于参数的梯度修改了学习速率。此外,我们可以根据培训过程的进展来调整学习率。基于训练epoch设置的学习速率,并在该点处独立于模型的参数。

这实际上不是由优化器完成的。事实上,它是称为调度器的神经网络的单独组件。我提到这是为了完整性,并展示我们与我们讨论的优化技术的关系,但在这里不会进一步覆盖它们。

结论

我们现在了解基于梯度下降的优化器使用的基本技术,为什么它们使用,以及它们如何彼此相关。

这使我们能够更好地进入许多具体的优化算法,并了解他们如何详细工作。我希望很快地涵盖另一篇文章……

让我们继续学习!

(本文由闻数起舞翻译自Federico Mannucci的文章《Neural Network Optimizers Made Simple: Core algorithms and why they are needed》,转载请注明出处,原文链接:
https://towardsdatascience.com/neural-network-optimizers-made-simple-core-algorithms-and-why-they-are-needed-7fd072cd2788)

(0)

相关推荐