在这篇文章中,由于有大量的资源可以解释梯度下降,我想在视觉上引导您了解每种方法的工作原理。 借助我构建的梯度下降可视化工具,希望我可以为您提供一些独特的见解,或者至少提供许多GIF。
我假设对在机器学习中使用梯度下降的原因和方式有基本的了解(如果没有,我推荐3Blue1Brown推荐该视频)。 我在这里的重点是比较和对比这些方法。 如果您已经熟悉所有方法,则可以滚动至底部,观看一些有趣的"赛马"。
让我们快速复习一下。 在机器学习的上下文中,梯度下降的目标通常是使机器学习问题的损失函数最小化。 好的算法可以快速,可靠地找到最小值(即,它不会陷入局部最小值,鞍点或平稳区域,而会求出全局最小值)。
基本的梯度下降算法遵循这样的思想,即梯度的相反方向指向下部区域的位置。 因此,它会沿梯度的相反方向迭代地采取步骤。 对于每个参数theta,它执行以下操作:
增量=-学习率*梯度
θ+ =增量
Theta是您要优化的一些参数(例如,神经网络中神经元到神经元连接的权重,线性回归中特征的系数等)。 机器学习优化设置中可能有成千上万个这样的theta。 Delta是算法每次迭代后theta的变化量; 希望随着每个这样的变化,θ逐渐接近最佳值。
由于人类的感知仅限于3维,因此在我所有的可视化中,假设我们只有两个参数(或theta)需要优化,它们由图中的x和y维表示。 表面是损失函数。 我们想找到位于表面最低点的(x,y)组合。 这个问题对我们来说微不足道,因为我们可以看到整个表面。 但是,球(下降算法)却没有; 它一次只能迈出一步,并探索周围的环境,就像只用手电筒在黑暗中行走一样。
Vannilla梯度下降法是普通的,因为它仅对梯度起作用。 以下方法对梯度进行了一些其他处理,以使其更快,更好。
动量算法(或简称为动量)的梯度下降借鉴了物理学的思想。 想象一下,将球滚动到无摩擦碗内。 累积的动量并没有停止在底部,而是将其向前推动,并且球不断来回滚动。
我们可以将动量的概念应用于我们的香草梯度下降算法。 在每个步骤中,除了规则的渐变以外,它还增加了上一步的运动。 在数学上,它通常表示为:
增量=-学习率梯度+上一个增量衰变率(eq.1)
θ+ =增量(等式2)
如果稍微按摩一下该方程式,然后跟踪(衰减的)累积梯度总和,我会发现它更直观。 当我们稍后介绍Adam算法时,这也将使事情变得更容易。
sum_of_gradient =梯度+ previous_sum_of_gradient *衰减率(eq.3)
delta = -learning_rate * sum_of_gradient(等式4)
θ+ =增量(等式5)
(我所做的是剔除-learning_rate。要查看数学上的等价关系,您可以在等式1中用-learning_rate * sum_of_gradient代替delta以得到等式3。)
让我们考虑两种极端情况,以便更好地了解此衰减率参数。 如果衰减率为0,则它与(香草)梯度下降完全相同。 如果衰减率为1,则它会像我们在开头提到的无摩擦碗类推一样不断地来回摇摆; 你不希望出现这种情况。 通常,衰减率大约在0.8-0.9之间选择-就像表面上有一点摩擦,因此它最终会减速并停止。
那么,动量在哪些方面比香草梯度下降更好? 在左侧的比较中,您可以看到两个优点:
· 动量只是移动得更快(因为它累积了所有动量)
· 动量有逃避局部最小值的作用(因为动量可能将其推离局部最小值)。 同样,正如我们稍后将看到的那样,它还将更好地通过高原地区。
自适应梯度算法(或简称AdaGrad)不是跟踪动量之类的梯度总和,而是跟踪梯度平方的总和,并使用它来适应不同方向的梯度。 方程通常用张量表示。 在这里,我将避免张量来简化语言。 对于每个维度:
sum_of_gradient_squared =上一个sum_of_gradient_squared +渐变²
增量= -learning_rate *梯度/ sqrt(sum_of_gradient_squared)
θ+ = 增量
在ML优化中,某些功能非常稀疏。 稀疏特征的平均梯度通常很小,因此以慢得多的速度训练这些特征。 解决此问题的一种方法是为每个功能设置不同的学习率,但这会很快变得混乱。
AdaGrad使用这种想法解决了这个问题:您更新的功能越多,将来更新的功能就越少,从而为其他功能(例如稀疏功能)提供了赶超的机会。 用视觉术语来说,您更新了此功能有多少表示您在此维度中已移动了多少,并且此概念是由梯度平方的累积和所捕获的。 请注意,在上面的逐步网格图示中,如果没有重新调整缩放比例(1b),球将大部分垂直向下移动; 通过调整(1d),它会沿对角线移动。
此属性使AdaGrad(以及其他类似的基于梯度平方的方法,如RMSProp和Adam)可以更好地逃避鞍点。 AdaGrad将走一条直线,而梯度下降(或相关的动量)则采取"让我先滑下陡坡,然后再担心慢速方向"的方法。 有时,香草梯度下降可能会在两个方向的梯度均为0且在此处完全满足的鞍点处停止。
但是,AdaGrad的问题在于它的运行速度非常慢。 这是因为梯度平方的总和只会增加而不会缩小。 RMSProp(用于均方根传播)通过添加衰减因子来解决此问题。
sum_of_gradient_squared = previous_sum_of_gradient_squared * * decay_rate +梯度²*(1- delay_rate)
增量= -learning_rate *梯度/ sqrt(sum_of_gradient_squared)
θ+ =增量
更精确地,梯度平方的和实际上是梯度平方的衰减的和。 衰减率仅表示最近的梯度²很重要,而很久以前的梯度基本上已被忘记。 附带说明一下,术语"衰减率"有点用词不当。 与我们在动量中看到的衰减率不同,除衰减外,此处的衰减率还具有缩放效果:它将整个项按比例缩小(1-delay_rate)。 换句话说,如果将delay_rate设置为0.99,则除了衰减外,梯度平方的总和将为AdaGrad的sqrt(1- 0.99)= 0.1,因此对于相同的步骤,该步长约为10倍。 学习率。
为了了解衰减的影响,在这种直接对比中,AdaGrad white(白色)最初与RMSProp(绿色)保持一致,这与调整后的学习速率和衰减速率一样。 但是AdaGrad的平方平方和累积起来如此之快,以至于很快就变得庞大起来(由动画中的平方大小证明)。 他们付出了沉重的代价,最终AdaGrad实际上停止了前进。 另一方面,由于衰减率的原因,RMSProp始终将正方形保持在可管理的大小范围内。 这使得RMSProp比AdaGrad更快。
最后但并非最不重要的一点是,Adam(自适应矩估计的缩写)兼具动量和RMSProp的优点。 Adam在经验上表现良好,因此近年来,它通常是深度学习问题的首选。
让我们看看它是如何工作的:
sum_of_gradient = previous_sum_of_gradient * beta1 +渐变*(1-beta1)
sum_of_gradient_squared = previous_sum_of_gradient_squared * beta2 +渐变²*(1- beta2)
delta = -learning_rate * sum_of_gradient / sqrt(sum_of_gradient_squared)
θ+ =增量
Beta1是第一时刻的衰减率,即梯度(又称为动量)之和,通常设置为0.9。 Beta 2是第二个时刻的衰减率,是梯度平方的总和,通常设置为0.999。
Adam从动量获得速度,并从RMSProp获得了在不同方向适应梯度的能力。 两者的结合使其功能强大。
既然我们已经讨论了所有方法,那么让我们来看一下到目前为止讨论的所有下降方法的竞赛! (不可避免地会挑剔一些参数。获得品味的最佳方法是在自己周围玩耍。)
在这个地形上,有两个小山丘阻碍了通向全球最小值的道路。 亚当是唯一能够达到全球最低要求的人。 无论采用哪种方式调整参数,至少从此起始位置开始,其他方法都无法到达该位置。 这意味着动量和自适应梯度都无法解决问题。 这实际上是两者的结合:首先,动量使亚当超出了其他所有球停止运动的局部最小值。 然后,根据梯度平方和进行的调整将其拉到一边,因为它是较少探索的方向,从而导致了最终的胜利。
这是另一场比赛。 在此地形中,有一个围绕全局最小值的平坦区域(高原)。 通过一些参数调整,Momentum和Adam(由于其动量分量)可以使其居中,而其他方法则不能。
总之,梯度下降是一类算法,旨在通过遵循梯度来找到函数上的最小点。 香草梯度下降正好遵循梯度(由学习率定标)。 改善梯度下降的两个常用工具是梯度的总和(第一力矩)和梯度平方的总和(第二动量)。 动量法使用具有衰减率的第一时刻来获得速度。 AdaGrad使用第二个矩不衰减来处理稀疏特征。 RMSProp使用第二矩并以衰减率从AdaGrad加速。 亚当同时使用第一刻和第二刻,通常是最佳选择。 梯度下降算法还有其他一些变体,例如Nesterov加速梯度,AdaDelta等,在本文中未涉及。
最后,我将让您保持这种势头下降而不会衰减的趋势。 它的路径构成了一个有趣的模式。 我还没有看到实际的用途,但只是为了娱乐而已。
试一下本文中用于生成所有可视化的可视化工具,然后看看您发现了什么!
参考资料和相关链接:
[1] http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
[2] https://ruder.io/optimizing-gradient-descent
[3] https://bl.ocks.org/EmilienDupont/aaf429be5705b219aaaf8d691e27ca87
(本文翻译自Lili Jiang的文章《A Visual Explanation of Gradient Descent Methods (Momentum, AdaGrad, RMSProp, Adam)》,参考:https://towardsdatascience.com/a-visual-explanation-of-gradient-descent-methods-momentum-adagrad-rmsprop-adam-f898b102325c)