Code前端首页关于Code前端联系我们

主流梯度下降优化算法简介:达到最先进的水平?

terry 2年前 (2023-09-27) 阅读数 61 #数据结构与算法

梯度下降优化算法概述

我们通常所说的训练神经网络就是最小化损失函数的过程。损失函数的值衡量模型在给定数据集下的表现(拟合)能力。

主流梯度下降优化算法介绍:达到 state-of-art?

图1

如损失函数J 如图 1所示,B点是函数的最低点。如果A点是初始值,那么优化器的作用就是引导初始值A点到最低的B点。那么如何才能让这个过程更快地完成呢?

了解梯度下降!

三维空间中的任意点都可以找到切平面。在高维的例子中,也可以找到与其相切的超平面。那么切平面上的每个点都有不同的方向,但只有一个方向可以使函数值增加最快。我们称这个方向为梯度方向,而这个梯度方向的反方向就是函数值下降最快的方向。这就是梯度下降的过程。

基于以上概念,我们进一步理解批量梯度更新BGD。顾名思义,它一次性计算所有样本以获得梯度值,然后更新参数。该方法非常简单,对于凸函数可以收敛到全局最优值,对于非凸函数可以收敛到局部最优值。同时它的缺点也很明显:占用内存巨大、计算时间长、处理大量数据时无法在线更新。

面对BGD的瓶颈,SGD诞生了。它一次仅更新一个样本。与BGD相比,它具有更快的收敛速度,并且可以在线更新,从而提供了跳出局部最优的可能性。但是,SGD 无法使用矩阵运算来加速计算过程。考虑到以上两种方法的优缺点,就有了小批量梯度下降算法(MBGD),每次只选择固定的小批量数据进行梯度更新。

基于梯度的更新也意味着面临一些挑战:

  • 很难选择合适的初始学习率。如果学习率太大,会阻碍收敛,导致损失函数在最小值附近振荡,甚至偏离最小值;
  • 不是凸损失函数优化过程中存在大量局部最优解或鞍点;
  • 参数更新使用相同的学习率。

针对上述挑战,这里有一些优化算法

如果我们把梯度下降法看成是球从斜坡向山谷运动的过程,那么球在滚动时就有一定的初速度。在下落过程中,球积累的动能越来越大。球的速度也会越来越大,朝着谷底跑得更快。受此启发,我们有了Momentum

主流梯度下降优化算法介绍:达到 state-of-art?

如上式中所补充,动力学方法加上了梯度值与衰减率 ? 的乘积。到当前的梯度值,这样就可以不断累加上一次的梯度值。衰减率?一般小于或等于0.9。 SGD算法在用动量项更新模型参数时,对于当前梯度方向与上次梯度方向相同的参数,会加大更新强度;对于当前梯度方向与上次梯度方向不同的参数,进行取消更新,即减慢当前梯度方向的更新。因此,与SGD相比,动力学方法可以更快地收敛并减少振荡

在动量法中,如果球向下滚动并遇到上升,其速度会降低。因此,更好的方法是在遇到上涨之前放慢速度。这就是NAG的总体思路。与动力学方法相比,NAG在计算参数梯度时从损失函数中减去动量项。该方法相当于估计下一个参数位置。地点。公式如下:

主流梯度下降优化算法介绍:达到 state-of-art?

如图 2 如图所示,蓝色部分为标准动量法更新过程。首先,它计算当前梯度,然后在累积梯度中进行大幅跳跃。 NAG首先进行一次大跳跃(图中棕色向量),然后计算跳跃后的梯度(下图中红色向量)并进行修正,得到正确的梯度下降方向,即下图中绿色向量。这可以避免振荡情况,例如应用于 RNN 时。

主流梯度下降优化算法介绍:达到 state-of-art?

图2

学习率能否根据参数的重要性自适应? Adagrad背后的想法是在学习过程中自动调整学习率。对于出现频率较低的参数使用较大的学习率,对于出现频率较高的参数使用较小的学习率。 adagrad公式如下:

主流梯度下降优化算法介绍:达到 state-of-art?

主流梯度下降优化算法介绍:达到 state-of-art?

主流梯度下降优化算法介绍:达到 state-of-art?

主流梯度下降优化算法介绍:达到 state-of-art?表示当前参数的梯度值。 Adagrad计算步骤t之前累积的梯度平方和作为学习率的分母。

Adagrad在数据分布稀疏的场景下能够更好地利用稀疏梯度信息,并且能够比SGD算法更有效地收敛。它的缺陷也非常明显。随着时间的增加,它的分母项变得越来越大,最终导致学习率收缩到太小而无法有效更新。

Adagrad 的日常使用率很高,但也有很多“坑”希望您能够避免。以TensorFlow为例,θ是一个防止被零除的项,但TensorFlow只为梯度平方和的累积和提供一个初始值,默认为0.1。如果我们设置得小,初始学习率就会太大。在实际使用中,调整该参数可能会产生意想不到的结果。

Adadelta是Adagrad的改进算法。更新过程参考牛顿法。

主流梯度下降优化算法介绍:达到 state-of-art?

首先我们来了解一下牛顿法(二阶优化法)。它使用Hessian矩阵的逆矩阵来代替人为设置的学习率。它可以完美地找到梯度下降时的下降方向,而不会陷入局部极小值。

但是他的缺点却非常明显。求逆矩阵的时间复杂度约为O(n3)。计算成本太高,不适合大数据。

上面注意到Adagrad会导致学习率随着时间的增加而变小,导致过早收敛。 Adadelta使用平方梯度的指数移动平均来调整学习率:参数的变化,因此作者第二次尝试使用梯度的指数移动平均来调整它方形梯度:

主流梯度下降优化算法介绍:达到 state-of-art?

Adagrad最大的变化是没有有学习率设置,但是训练后期遇到局部最小值雷区后,总是会围绕局部最小值抖动。

RMSprop 是 AdaDelta 的一个特例。这是 Geoff Hinton 在一次公开课上提出的。它使用梯度平方的指数移动平均值来进行调整。如果参数更新量较大,则受到“惩罚”。其公式如下:

主流梯度下降优化算法介绍:达到 state-of-art?

RMSprop 的梯度下降速度比 Adagrad 慢,广泛应用于 CNN 领域。 Inception v4 中 RMSprop 取衰减因子 ?=0.9,参数 ε = 1.0。

Adam 该算法可以看作是RMSprop和动力学方法的结合:

主流梯度下降优化算法介绍:达到 state-of-art?

主流梯度下降优化算法介绍:达到 state-of-art?

其中,主流梯度下降优化算法介绍:达到 state-of-art?是指数移动平均线,可以看作是动力学方法的一个过程; 主流梯度下降优化算法介绍:达到 state-of-art?是二次梯度指数移动平均,也就是RMSProp的过程。由于基于指数移动平均的方法存在偏差,特别是在回归早期,当 m 和 v 初始化为 0 且接近 1 时。为此,引入偏差校正过程:

主流梯度下降优化算法介绍:达到 state-of-art? 最后,偏差为修正后的主流梯度下降优化算法介绍:达到 state-of-art?主流梯度下降优化算法介绍:达到 state-of-art?用于更新模型参数:

主流梯度下降优化算法介绍:达到 state-of-art?

Adam是自适应矩估计,类似于动力学方法的过程。它是有偏一阶矩估计过程,RMSprop对应有偏二阶矩估计。在日常使用中,使用默认的学习率0.001往往可以取得不错的效果。

Adam计算效率高,适合稀疏数据&大规模数据场景。可以将更新步长限制在合理的范围内,且参数更新不受梯度缩放变换的影响。但它可能导致不收敛或收敛到局部最优。 =

由于Adam会导致不收敛或者收敛到局部最优,Google在ICLR 2018上提出了AMSGrad。论文中提到了这样一个问题:保证学习率总是衰减,但是基于滑动的方法平均值不一定。事实上,以 Adam 为代表的自适应算法主要存在两个问题:

  • 无法收敛
  • 能够收敛到局部最优点

RMSprop 会对最近增加的值进行比较大的更新,因为增加梯级的数量逐渐失去作用; Adagrad 累加梯度的平方,因此基于移动平均线的方法并不一定保证趋势衰减。那么如何保证学习率被削弱呢?

主流梯度下降优化算法介绍:达到 state-of-art?

AMSGrad 使用当前值和前一个值的最大值来计算 Δ?在二阶局部更新过程中保证学习率的阻尼。

主流梯度下降优化算法介绍:达到 state-of-art?

图3

以上是现有主流的梯度下降优化算法。总结以上方法,如如图3所示,SDG的值无法逃逸于鞍点;动量法如果梯度值为0则增加动能跳过此点;而Adadelta没有学习率,但收敛过程非常快。

最后,我们思考一个问题:我们如何利用现有的优化算法来达到最先进的水平?

我期待您的更好答案:

1.SGD +动量

它广泛用于CNN和NLP问题。局部最小值或无法收敛。这时,使用较小的学习率SGD来帮助Adam跳出局部极小值。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门