深度学习优化入门:Momentum、RMSProp 和 Adam

简介: 虽然局部极小值和鞍点会阻碍我们的训练,但病态曲率会减慢训练的速度,以至于从事机器学习的人可能会认为搜索已经收敛到一个次优的极小值。让我们深入了解什么是病态曲率。

虽然局部极小值和鞍点会阻碍我们的训练,但病态曲率会减慢训练的速度,以至于从事机器学习的人可能会认为搜索已经收敛到一个次优的极小值。让我们深入了解什么是病态曲率。

病态曲率

考虑以下损失曲线图。

image

如你所知,我们在进入一个以蓝色为标志的像沟一样的区域之前是随机的。这些颜色实际上代表了在特定点上的损失函数的值,红色代表最高的值,蓝色代表最低的值。

我们想要下降到最低点,因此,需要穿过峡谷。这个区域就是所谓的病态曲率。为了了解为何将其称为病态曲率,让我们再深入研究。放大了看,病态曲率就像这样...

image

病态曲率

要知道这里发生的事情并不难。梯度下降沿着峡谷的山脊反弹,向最小的方向移动的速度非常慢。这是因为山脊的曲线在 W1 方向上弯曲的更陡。

考虑山脊表面的 A 点。我们看到,梯度在这点可以分解为两个分量,一个沿着 W1 方向,另外一个沿着 W2 方向。如果 f 显著下降的唯一方向是低曲率的,那么优化可能会变得太慢而不切实际,甚至看起来完全停止,造成局部最小值的假象。

image

正常情况下,我们使用一个较慢的学习率来解决这种山脊间反弹的问题,正如上一篇关于梯度下降的文章所述。然而,这却产生了麻烦。

当我们接近最小值时,慢下来是有意义的,我们想要收敛于它。但是考虑一下梯度下降进入病态曲率的区域,以及到最小值的绝对距离。如果我们使用较慢的学习率,可能需要花费更多的时间才能到达极小值点。事实上,有研究论文报道过使用足够小的学习率来阻值山脊间的反弹可能导致参与者以为损失根本没有改善,从而放弃训练。

如果 f 显著下降的唯一方向是低曲率的,那么优化可能会变得太慢而不切实际,甚至看起来完全停止,造成局部最小值的假象。

也许我们想要的是能让我们慢慢进入病态曲率底部的平坦区域,然后在最小值的方向上加速。二阶导数可以帮助我们做到这一点。

牛顿法

梯度下降是一阶优化方法。它只考虑损失函数的一阶导数,而不考虑更高阶的导数。这基本上意味着它不知道损失函数的曲率。它只能说明损失是否下降以及下降的速度,而不能区分曲线是平坦的,向上的,还是向下的。

image

之所以会发生这种现象,是因为梯度下降只关心梯度,就好像上图中红色的点,三个曲线在这一点上的梯度是相同的。如何解决?使用二阶导数,或者考虑梯度变化的速率。

一个非常流行的可以使用二阶导数的技术,可以解决我们的问题,这个方法称为牛顿法。 如果表面变得不那么陡峭,那么学习步骤就会减少。

牛顿法可以提供一个理想的步长,在梯度方向上移动。 由于我们现在有了关于损失表面曲率的信息,所以可以选择步长,而不是用病态曲率来超过该区域的极限。

牛顿法通过计算 Hessian 矩阵来实现,Hessian 矩阵是损失函数的二阶导数组成的权值组合。我所说的权值组合,如下所示。

image

Hessian 矩阵在一个大矩阵中计算所有这些梯度。

image

Hessian 矩阵给出了一个点的损失曲面曲率的估计。一个损失的表面可以有一个正曲率,这意味着当我们移动时,表面会迅速变得不那么陡峭。如果我们有一个负曲率,这意味着当我们移动时,曲面变得越来越陡。

image

注意,如果这一步是负的,那就意味着我们可以使用任意的步骤。换句话说,我们可以切换回原来的算法。这对应于下面的情况,梯度变得越来越陡。

image

然而,如果梯度变得不那么陡峭,我们可能会走向一个处于病态曲率底部的区域。在这里,牛顿法给了我们一个修正的学习步骤,正如你所看到的,它与曲率成反比,或者曲面变得越来越小。

如果表面变得不那么陡峭,那么学习步骤就会减少。

为什么我们很少使用牛顿法?

看到公式中的 Hessian 矩阵了吗?Hessian 矩阵需要计算损失函数对所有权值组合的梯度。在组合已知的情况下,要求的值的数量约是神经网络中权值数量的平方。

对于现代的网络来说,通常都含有数十亿个参数,使用高阶的优化方法很难计算 10 亿的平方数量级的梯度。

二阶优化是关于梯度本身如何变化的信息。虽然我们不能精确的计算它,但是我们可以遵循启发式方式,以指导我们根据之前的梯度进行优化

Momentum

与 SDG 结合使用的一种常用方法叫做 Momentum。Momentum 不仅会使用当前梯度,还会积累之前的梯度以确定走向。 梯度下降方程修改如下。

image

第一个式子有两项。第一项是上一次迭代的梯度,乘上一个被称为「Momentum 系数」的值,可以理解为取上次梯度的比例。

image

我们设 v 的初始为 0,动量系数为 0.9,那么迭代过程如下:

image

我们可以看到之前的梯度会一直存在后面的迭代过程中,只是越靠前的梯度其权重越小。(说的数学一点,我们取的是这些梯度步长的指数平均)

这对我们的例子有什么帮助呢?观察下图,注意到大部分的梯度更新呈锯齿状。我们也注意到,每一步的梯度更新方向可以被进一步分解为 w1 和 w2 分量。如果我们单独的将这些向量求和,沿 w1 方向的的分量将抵消,沿 w2 方向的分量将得到加强。

image

对于权值更新来说,将沿着 w2 方向进行,因为 w1 方向已抵消。这就可以帮助我们快速朝着极小值方向更新。所以,动量也被认为是一种抑制迭代过程中锯齿下降问题的技术。

这种方法还可以提高收敛速度,但如果超过极小值,可能需要使用模拟退化算法

我们通常初始化动量为 0.5,并且在一定循环次数后逐渐退火到 0.9

RMSProp

RMSProp 或均方根反向传播算法有着有趣的历史。 它是由传奇人物Geoffrey Hinton提出的,当时只是在课堂上是随意提出的一个想法。

RMSProp 算法也旨在抑制梯度的锯齿下降,但与动量相比, RMSProp 不需要手动配置学习率超参数,由算法自动完成。 更重要的是,RMSProp 可以为每个参数选择不同的学习率。

在 RMSprop 算法中,每次迭代都根据下面的公式完成。 它是对每个参数单独迭代。

image

让我们来看看上面的方程都在做什么

在第一个方程中,我们计算一个梯度平方的指数平均值。由于我们需要针对每个梯度分量分别执行平方,所以此处的梯度向量 Gt 对应的是正在更新的参数方向的梯度各个方向的投影分量。

为此,我们将上一次更新的超参数乘希腊字母 nu。然后将当前的梯度平方乘(1-nu)。最后我们将他们加到一起得到这一时刻的指数平均。

我们之所以使用指数平均是因为在 momentum 例子中看到的那样,它可以使得间隔和权重成正比例变化。实际上使用「指数」一词是因为前面项的权重呈指数级下降(最近的项权重是 ρ,次近的 ρ 方,然后是 ρ 立方,以此类推)。

注意我们表示病态曲率的图,梯度沿 w1 方向的分量比沿 w2 方向的分量大的多。我们以平方的方式将 w1 和 w2 叠加,w1 不会发生抵消,w2 在指数平均后会更小。

第二个方程定义了步长,我们沿负梯度方向移动,但是步长受到指数平均值的影响。我们设置了一个初始学习率 eta,用它除指数平均值。在我们的例子中,因为 w1 平均后比 w2 大很多,所以 w1 的迭代步长就比 w2 要小很多。因此这将避免我们在山脊之间跳跃而朝着正确的方向移动。

第三个方程是更新操作,超参数 p 通常选为 0.9,但是你可能需要调整它。方程 2 中的 epsilon 是为了防止被 0 除,通常取 1e-10

还要注意的是,RMSProp 隐含的执行模拟退火,假设我们正朝着极小值前进并且我们想要放慢速度避免越过极小值。当步长很大时 RMSProp 将自动减小梯度更新的步长(大步长容易越过极小值点)。

Adam

到目前为止,我们已经对比了 RMSProp 和 Momentum 两种方法。尽管 Momentum 加速了我们对极小值方向的搜索,但 RMSProp 阻碍了我们在振荡方向上的搜索。

Adam 或 Adaptive Moment Optimization 算法将 Momentum 和 RMSProp 两种算法结合了起来。 这里是迭代方程。

image

我们计算了每个梯度分量的指数平均和梯度平方指数平均(方程 1、方程 2)。为了确定迭代步长我们在方程 3 中用梯度的指数平均乘学习率(如 Momentum 的情况)并除以根号下的平方指数平均(如 Momentum 的情况),然后方程 4 执行更新步骤

超参数 beta1 一般取 0.9 左右,beta_2 取 0.99。Epsilon 一般取1e-10。

结论

在这篇文章中,我们介绍了 3 种基于梯度下降法来解决病态曲率同时加快搜索速度的方法。 这些方法通常称为「自适应方法」,因为学习步骤会根据等高线拓扑进行调整。

在上面的三种方法中,尽管 Adam 算法在论文中被认为是最有前景的算法,但是 Momentum 方法貌似更主流一些。实践结果表明,在给定损失函数的情况下,三种算法都能收敛到不同的局部最优极小值。但是用带 Momentum 的 SGD 算法比 Adam 算法找到的极小值更加平坦,而自适应方法往往会收敛到更加尖锐的极小值点。平坦的极小值通常好于尖锐的极小值。

image

尽管自适应算法有助于我们在复杂的损失函数上找到极小值点,但这还不够,特别是在当前网络越来越来越深的背景下。除了研究更好的优化方法之外,还有一些研究致力于构建产生更平滑损失函数的网络架构。Batch-Normalization 和残差连接是其中的解决方法,我们也会尽快在博客上发布有关的详细介绍。欢迎随时在评论中提问。

原文发布时间为:2018-07-20
本文来自云栖社区合作伙伴“机器学习算法与Python学习”,了解相关信息可以关注“机器学习算法与Python学习

相关文章
|
16天前
|
机器学习/深度学习 算法 网络架构
深度学习中的自动超参数优化技术探究
在深度学习模型的训练中,选择合适的超参数对模型性能至关重要。本文探讨了自动超参数优化技术在深度学习中的应用,分析了不同方法的优缺点,并着重讨论了基于贝叶斯优化和进化算法的最新进展。 【7月更文挑战第8天】
|
19天前
|
机器学习/深度学习 自然语言处理 监控
进阶技术分享:利用深度学习优化自然语言处理应用
在当今技术快速发展的背景下,深度学习作为一种强大的工具正在不断改进自然语言处理(NLP)应用的性能。本文探讨了如何利用深度学习模型,特别是Transformer架构,来优化和提升NLP应用的效果。通过详细的技术分析和实际案例,展示了这些先进技术如何应用于文本分类、情感分析和语言生成等领域,为读者提供了深入理解和实施的指导。【7月更文挑战第5天】
30 3
|
24天前
|
机器学习/深度学习 算法 Python
使用Python实现深度学习模型:元学习与模型无关优化(MAML)
使用Python实现深度学习模型:元学习与模型无关优化(MAML)
37 0
使用Python实现深度学习模型:元学习与模型无关优化(MAML)
|
1月前
|
机器学习/深度学习 并行计算 算法
深度学习中的自动化超参数优化方法探究
传统的深度学习模型优化通常依赖于人工调整超参数,这一过程繁琐且耗时。本文探讨了当前流行的自动化超参数优化方法,包括贝叶斯优化、遗传算法和进化策略等,分析它们在提高模型效率和性能方面的应用与挑战。
|
1天前
|
机器学习/深度学习 搜索推荐 TensorFlow
使用Python实现深度学习模型:个性化推荐与广告优化
【7月更文挑战第22天】 使用Python实现深度学习模型:个性化推荐与广告优化
125 70
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习中的深度学习优化策略
【6月更文挑战第29天】在机器学习领域,深度学习已成为推动人工智能发展的关键力量。本文将深入探讨如何通过一系列创新的优化策略来提升深度学习模型的性能和效率,包括调整学习率、使用先进的优化算法、以及应用正则化技术等。这些方法不仅能够加速模型的训练过程,还能提高模型在新数据上的泛化能力。我们将通过具体案例分析,展示这些策略在实际问题中的应用效果,并讨论其在未来研究中的潜在方向。
|
1月前
|
机器学习/深度学习 算法 异构计算
为什么说深度学习入门难?
深度学习对于初学者可能会有一定的学习曲线,但并不是不可战胜的难题。深度学习难不难学?通过合适的学习资源、坚持不懈的努力和实际项目的实践,你可以逐渐掌握深度学习的技能。深度学习的重要性和广泛应用性使得克服学习难度是非常值得的。
21 3
|
1月前
|
机器学习/深度学习 算法 C语言
【深度学习】优化算法:从梯度下降到Adam
【深度学习】优化算法:从梯度下降到Adam
66 1
|
22天前
|
机器学习/深度学习 安全 网络安全
利用深度学习优化网络安全:技术分享与实践指南数字时代的守护者:网络安全漏洞、加密技术与安全意识的深度剖析
随着信息技术的飞速发展,网络安全问题日益凸显。传统防护措施面对复杂多变的网络攻击手段逐渐显得力不从心。本文将深入探讨如何通过深度学习技术提升网络安全防护能力,分析其在识别和预防潜在网络威胁方面的有效性,并结合实际案例,为读者提供一套可行的技术实施方案。 在数字化浪潮中,网络安全成为维护信息完整性、保密性和可用性的关键。本文深入探讨了网络安全的三大支柱:网络漏洞的识别与防护、加密技术的演进与应用、以及安全意识的培养与提升。通过分析最新的研究数据和案例,揭示这些要素如何共同构建起防御网络威胁的坚固堡垒。
|
26天前
|
机器学习/深度学习 决策智能
**批量归一化(BN)**是2015年提出的深度学习优化技术,旨在解决**内部协变量偏移**和**梯度问题**。
【6月更文挑战第28天】**批量归一化(BN)**是2015年提出的深度学习优化技术,旨在解决**内部协变量偏移**和**梯度问题**。BN通过在每个小批量上执行**标准化**,然后应用学习到的γ和β参数,确保层间输入稳定性,加速训练,减少对超参数的敏感性,并作为隐含的正则化手段对抗过拟合。这提升了模型训练速度和性能,简化了初始化。
16 0

热门文章

最新文章