Piotr Skalski作者

神经网络的奥秘之优化器的妙用

加强对神经网络内部运行流程的理解有助于研究者和开发者训练神经网络。本文作者 Piotr Skalski 撰写了一系列文章介绍神经网络的奥秘,本文就是其中一篇,介绍了神经网络训练过程中的常见优化策略,并进行了分析和对比,包括梯度下降、小批量梯度下降、动量梯度下降、RMSProp、Adam 等。

之前的文章介绍了,我可以只使用 Numpy 来创建神经网络。这项挑战性工作极大地加深了我对神经网络内部运行流程的理解,还使我意识到影响神经网表现的因素有很多。精选的网络架构、合理的参数,甚至准确的参数初始化,都是其中一部分。本文将关注能够显著影响学习过程速度与预测准确率的决策──优化策略的选择。本文挑选了一些常用优化器,研究其内在工作机制并进行对比。

注:由于我想覆盖的学习材料范围太大,因此文中未列出任何代码段。不过,大家可以在 GitHub 上找到所有用于创建可视化的代码。此外,我还准备了一些 notebook,帮助大家更好地理解本文所讨论的问题。

代码地址: https://github.com/SkalskiP/ILearnDeepLearning.py

优化

优化是不断搜索参数以最小化或最大化目标函数的过程。我们通常使用间接优化方法训练机器学习模型,选择一个评价指标(如准确率、精度或召回率)表明模型求解给定问题的优良程度。但是,我们一直在优化不同的成本函数 J(θ),希望最小化成本函数以改善评价指标。毫无疑问,成本函数的选择通常与需要解决的具体问题相关。本质上,这种「有意设计」表明我们与理想解决方案有多远。正如大家所知,这个问题相当复杂,可以再另写一篇主题文章。

沿途陷阱

结果证明,寻找非凸成本函数最小值通常不太容易,本文应用高级优化策略去定位最小值。如果你学过微积分,就一定知道局部极小值──优化器极易落入的最大陷阱之一。对于那些还不了解局部极小值之美的读者,我只能说局部极小值是给定区域内函数取最小值的点集。如上图左半部分所示,优化器定位的点并非是全局最优解。

而「鞍点」问题则被人们认为更具挑战性。当成本函数值几乎不再变化时,就会形成平原(plateau),如上图右半部分所示。在这些点上,任何方向的梯度都几乎为零,使得函数无法逃离该区域。

有时候,尤其是在多层网络中,我们必须处理成本函数的陡峭区域。陡峭区域中的梯度增长迅速(也就是梯度爆炸)会引起大步跃迁,通常会破坏先前的优化结果。不过,该问题可以通过梯度裁剪轻松解决。

梯度下降

在学习高级算法前,我们先来了解一些基本策略。最直接有效的方法之一是向函数上当前点对应梯度的反方向前进,公式如下:

参数 α 表示学习率,代表算法每次迭代过程的前进步长。学习率的选择一定程度上代表了学习速度与结果准确率之间的权衡。选择步长过小不利于算法求解,且增加迭代次数。反之,选择步长过大则很难发现最小值。具体过程见图 2,图中展示了不稳定的迭代过程。而选择合适步长后,模型几乎立即发现最小点。

图 2. 大、小学习率条件下梯度下降过程的可视化。为了易于观察,图中仅展示了最后 10 步的可视化情况。

此外,该算法很容易受鞍点问题的影响。因为后续迭代过程的步长与计算得到的梯度成比例,所以我们无法摆脱 plateau。

最重要的是,算法由于每次迭代过程中都需要使用整个训练集而变得低效。这意味着,在每个 epoch 中我们都必须考虑所有样本,以确保执行下轮优化。对于只有几千个样本的训练集来说,这也许不是问题。但是,拥有数百万样本的神经网络才能表现最佳。基于此,每次迭代都使用全部数据集令人难以想象,既浪费时间又占用内存。上述原因致使纯粹的梯度下降无法应用于大部分情况。

小批量梯度下降

图 3. 梯度下降与小批量梯度下降对比图。

我们首先尝试解决上一节提到的最后一个问题──低效性。尽量向量化通过单次处理多个训练样本来加速计算,但在使用百万量级的数据集时优化过程还是需要花费很长时间。此处,我们试用一个简单的方法──将完整数据集切分成许多小批量以完成后续训练。小批量梯度下降的可视化动图见图 3。假设左图的等高线象征需要优化的成本函数。如图所示,由于新算法的待处理数据较少,它能够快速完成优化。我们再看看两个模型的移动轨迹对比。当噪音较少时,梯度下降采取较少步和相对较大的步长。另一方面,小批量梯度下降前进更频繁,但由于数据集的多样性,噪声更多。甚至可能在某次迭代过程中,算法移动的方向与预计方向相反。不过,小批量梯度下降通常一直朝向最小值移动。

图 4. 将数据集划分为多个批量。

大家肯定想知道如何选择批量大小?以深度学习为例,批量大小通常不是绝对的,应参照具体情况。如果批量与整体数据集大小相等,那它就与普通梯度下降无异。另一方面,如果批量为 1,那么算法每次迭代仅适用数据集中的 1 个样本,这也失去了向量化的意义,该方法有时被称为随机梯度下降。实际情况下,我们通常会选择中间值──64 至 512 个样本。

指数加权平均

指数加权平均应用广泛,如统计学、经济学,甚至深度学习。即便给定点的梯度为 0,指数加权平均仍能持续优化,所以许多高级神经网络优化算法都采用此概念。

图 5. 不同 β值的指数加权平均(EWA)图示。

指数加权平均本质上是对之前的数值求平均值,避免局部波动,关注整体趋势。指数加权平均的计算公式如上所示,其中参数 β 控制待平均的数的范围。后续迭代过程中,算法将使用 1/(1 - β) 个样本。β 值越大,平均的样本数越多,图像越平滑。另一方面,图像缓慢右移是因为,平均时间范围较长会使指数加权平均适应新趋势较慢。如图 5 所示,股票实际收盘价与另外 4 条曲线展示了不同 β 值条件下的指数加权平均值。

动量梯度下降

动量梯度下降利用指数加权平均,来避免成本函数的梯度趋近于零的问题。简单说,允许算法获得动量,这样即使局部梯度为零,算法基于先前的计算值仍可以继续前进。所以,动量梯度下降几乎始终优于纯梯度下降

如以往一样,我们使用反向传播计算网络各层的 dW 和 db 值。然而,这次我们没有直接使用计算梯度来更新神经网络参数,我们首先计算 VdW 和 Vdb 的中间值。然后在梯度下降中使用 VdW 和 Vdb。值得注意的是,实现该方法需要记录迭代过程中的指数加权平均值。大家可以在 Github 中看到全部过程。

图 6. 动量梯度下降

我们尝试想象下指数加权平均对模型行为的影响,再想象下成本函数的等高线。上图对比展示了标准梯度下降动量梯度下降。我们可以看到成本函数图的形态使得优化非常缓慢。以股市价格为例,使用指数加权平均使得算法专注于未来走势而非噪声。最小值分量被放大,振荡分量逐渐消失。此外,如果后续更新过程中所得梯度指向类似方向,则学习率将增加,进而实现更快收敛并减少振荡。然而,动量梯度下降的不足之处在于,每当临近最小点,动量就会增加。如果动量增加过大,算法将无法停在正确位置。

RMSProp

RMSProp(Root Mean Squared Propagation)是另一种改善梯度下降性能的策略,是最常用的优化器。该算法也使用指数加权平均。而且,它具备自适应性──其允许单独调整模型各参数学习率。后续参数值基于为特定参数计算的之前梯度值。

运用图 6 及上述公式,大家来思考下该策略背后的逻辑。顾名思义,每次迭代我们都要计算特定参数的成本函数的导数平方。此外,使用指数加权平均对近期迭代获取值求平均。最终,在更新网络参数之前,相应的梯度除以平方和的平方根。这表示梯度越大,参数学习率下降越快;梯度越小,参数学习率下降越慢。该算法用这种方式减少振荡,避免支配信号而产生的噪声。为了避免遇到零数相除的情况(数值稳定性),我们给分母添加了极小值 ɛ。

必须承认,在本篇文章的写作过程中,我有两次异常兴奋的时刻──本文所提及优化器的快速革新让我震惊不已。第一次是当我发现标准梯度下降和小批量梯度下降训练时间的差异。第二次就是现在,比较 RMSprop 与我知道的所有优化器。然而,RMSprop 也有缺点。由于每次迭代过程中公式的分母都会变大,学习率会逐渐变小,最终可能会使模型完全停止。

图 7. 优化器对比。

Adam

最后,我再说说 ADAM。与 RMSProp 类似,ADAM 应用广泛且表现不俗。它利用了 RMSProp 的最大优点,且与动量优化思想相结合,形成快速高效的优化策略。上图展示了本文讨论的几类优化器在处理函数困难部分的优化过程。Adam 的优异表现一目了然。


不幸的是,随着优化方法有效性的提高,计算复杂度也会增加。上面列了 10 个描述优化过程单次迭代的矩阵公式。我知道那些数学基础薄弱的读者情绪肯定不高。但是不要担心,它们并不是什么新内容。这里的公式和前文给出的动量梯度下降和 RMSProp 一样。不过这里我们需要一次性运用这两个策略的思路。

总结

希望本文能够深入浅出地解释所有难点。在这篇文章的写作过程中,我明白了选择合适优化器的重要性。理解上述算法才能自如地运用优化器,理解每个参数如何改变整个模型的性能。


原文链接:https://towardsdatascience.com/how-to-train-neural-network-faster-with-optimizers-d297730b3713

工程Adam梯度下降优化器
5
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

导数技术

导数(Derivative)是微积分中的重要基础概念。当函数y=f(x)的自变量x在一点x_0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x_0) 或 df(x_0)/dx。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

梯度下降技术

梯度下降是用于查找函数最小值的一阶迭代优化算法。 要使用梯度下降找到函数的局部最小值,可以采用与当前点的函数梯度(或近似梯度)的负值成比例的步骤。 如果采取的步骤与梯度的正值成比例,则接近该函数的局部最大值,被称为梯度上升。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

随机梯度下降技术

梯度下降(Gradient Descent)是遵循成本函数的梯度来最小化一个函数的过程。这个过程涉及到对成本形式以及其衍生形式的认知,使得我们可以从已知的给定点朝既定方向移动。比如向下朝最小值移动。 在机器学习中,我们可以利用随机梯度下降的方法来最小化训练模型中的误差,即每次迭代时完成一次评估和更新。 这种优化算法的工作原理是模型每看到一个训练实例,就对其作出预测,并重复迭代该过程到一定的次数。这个流程可以用于找出能导致训练数据最小误差的模型的系数。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

噪音技术

噪音是一个随机误差或观测变量的方差。在拟合数据的过程中,我们常见的公式$y=f(x)+\epsilon$中$\epsilon$即为噪音。 数据通常包含噪音,错误,例外或不确定性,或者不完整。 错误和噪音可能会混淆数据挖掘过程,从而导致错误模式的衍生。去除噪音是数据挖掘(data mining)或知识发现(Knowledge Discovery in Database,KDD)的一个重要步骤。

目标函数技术

目标函数f(x)就是用设计变量来表示的所追求的目标形式,所以目标函数就是设计变量的函数,是一个标量。从工程意义讲,目标函数是系统的性能标准,比如,一个结构的最轻重量、最低造价、最合理形式;一件产品的最短生产时间、最小能量消耗;一个实验的最佳配方等等,建立目标函数的过程就是寻找设计变量与目标的关系的过程,目标函数和设计变量的关系可用曲线、曲面或超曲面表示。

微积分技术

微积分(Calculus)是高等数学中研究函数的微分(Differentiation)、积分(Integration)以及有关概念和应用的数学分支。它是数学的一个基础学科。内容主要包括极限、微分学、积分学及其应用。微分学包括求导数的运算,是一套关于变化率的理论。它使得函数、速度、加速度和曲线的斜率等均可用一套通用的符号进行讨论。积分学,包括求积分的运算,为定义和计算面积、体积等提供一套通用的方法 。

动量技术

优化器的一种,是模拟物理里动量的概念,其在相关方向可以加速SGD,抑制振荡,从而加快收敛

优化器技术

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。 优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。

推荐文章
暂无评论
暂无评论~