深度学习优化入门: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学习

相关文章
|
6月前
|
机器学习/深度学习 数据采集 PyTorch
使用自定义 PyTorch 运算符优化深度学习数据输入管道
使用自定义 PyTorch 运算符优化深度学习数据输入管道
37 0
|
11天前
|
机器学习/深度学习 算法 计算机视觉
深度学习在图像识别中的应用及优化策略
【4月更文挑战第8天】 在计算机视觉领域,深度学习技术已成为推动图像识别进步的关键力量。本文章旨在探讨深度学习模型在图像识别任务中的应用,并分析其性能提升的优化方法。通过对比传统机器学习方法,本文阐述了深度神经网络如何通过多层次特征提取有效识别复杂图像,并讨论了数据增强、网络结构调整、正则化技巧等优化策略。此外,文中还涉及了迁移学习与多任务学习在图像识别中的实际应用案例,以及未来发展趋势。
|
27天前
|
机器学习/深度学习 数据采集 自动驾驶
利用深度学习优化图像识别在自动驾驶系统中的应用
在自动驾驶技术迅猛发展的当下,图像识别作为其核心技术之一,对于提升车辆的环境感知能力至关重要。本文聚焦于探讨如何通过深度学习算法优化图像识别过程,以增强自动驾驶系统的准确性和实时反应能力。文中介绍了卷积神经网络(CNN)在图像处理中的关键作用,分析了数据预处理、模型训练策略以及模型压缩等技术对性能的影响。此外,还探讨了迁移学习在缺乏标注数据时的应用,以及对抗性网络在提高模型鲁棒性方面的潜力。通过实验评估,本文展示了这些技术在真实世界数据集上的应用效果,并对未来自动驾驶系统中图像识别技术的发展趋势进行了展望。
22 1
|
1月前
|
机器学习/深度学习 分布式计算
ICLR 2024:首个零阶优化深度学习框架
【2月更文挑战第28天】ICLR 2024:首个零阶优化深度学习框架
16 1
ICLR 2024:首个零阶优化深度学习框架
|
1月前
|
机器学习/深度学习 算法 网络架构
基于深度学习的图像识别优化策略
【2月更文挑战第21天】 随着人工智能技术的飞速发展,深度学习在图像识别领域取得了突破性进展。然而,在实际应用中,模型的识别效率和准确性常常受限于数据量、计算资源和算法设计。本文旨在探讨针对现有深度学习模型的图像识别优化策略,通过改进训练过程、网络结构与后处理技术,提高模型性能并减少计算资源的消耗。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
从零开始学习深度学习:入门指南与实践建议
本文将引导读者进入深度学习领域的大门,从基础概念到实际应用,为初学者提供全面的学习指南和实践建议。通过系统化的学习路径规划和案例实践,帮助读者快速掌握深度学习的核心知识和技能,迈出在人工智能领域的第一步。
|
1月前
|
机器学习/深度学习 数据处理 计算机视觉
深度学习在图像识别中的应用及优化策略
【2月更文挑战第18天】 随着计算机视觉技术的迅猛发展,深度学习已成为推动图像识别领域进步的核心力量。本文将探讨深度学习在图像识别任务中的关键应用,并重点分析数据增强、网络结构优化以及迁移学习等提升模型性能的策略。通过深入剖析这些技术,我们旨在为读者提供一套实用的方法论,以应对不断变化的图像识别挑战。
15 3
|
2月前
|
机器学习/深度学习 自然语言处理 大数据
深度学习中的卷积神经网络优化技术探析
【2月更文挑战第4天】在深度学习领域,卷积神经网络(CNN)一直扮演着重要角色,但其训练和推理过程中存在许多挑战。本文将从优化角度出发,探讨卷积神经网络中的权重初始化、损失函数设计、学习率调整等优化技术,旨在为深度学习爱好者提供一些实用的技术感悟和分享。
22 3
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习入门:Python 与神经网络
深度学习是机器学习的一个分支,它涉及使用多层神经网络来处理和学习数据。在 Python 中,有许多流行的深度学习库和框架可以帮助我们轻松地构建和训练神经网络模型。在本文中,我们将介绍深度学习的基本概念,并使用 Python 中的 TensorFlow 和 Keras 库来构建一个简单的神经网络模型。
|
3月前
|
机器学习/深度学习 人工智能 PyTorch
【Hello AI】安装和使用AIACC-AGSpeed(优化PyTorch深度学习模型)
AIACC-AGSpeed(简称AGSpeed)专注于优化PyTorch深度学习模型在阿里云GPU异构计算实例上的计算性能,相比原始的神龙AI加速引擎AIACC,可以实现无感的计算优化性能。本文为您介绍安装和使用AGSpeed的方法。