首页 > 编程知识 正文

梯度下降法优点(梯度下降算法发)

时间:2023-05-04 10:38:34 阅读:102554 作者:907

00-1010神经网络的训练是损失函数最小化的过程,损失函数的值衡量模型在给定数据集中的性能(拟合)能力。

图1

损耗函数j如图1所示。B点是函数的最低点,A点是初始值。那么优化器的作用就是引导初始值点A到最低点点B,那么如何让这个过程执行得更快呢?

血统。找出答案!

三维空间中的任意一点都可以找到与其相切的平面,高维情况下也可以找到与其相切的超平面。那么切平面上任意一点都有各种方向,但只有一个方向能使函数值上升最快。这个方向叫做梯度方向,这个梯度方向的反方向就是函数值下降最快的方向,就是梯度下降的过程。

基于以上概念,我们可以了解更多关于批量梯度更新BGD。顾名思义,就是一次计算所有样本得到梯度值,然后更新参数。这个方法很简单。对于凸函数可以收敛到全局最优,对于非凸函数可以收敛到局部最优。同时其缺点也很明显:内存消耗巨大,计算时间长,大数据量下无法在线更新。

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

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

很难选择合适的初始学习率。如果学习率过高,会阻碍收敛,导致损失函数在最小值附近振荡甚至偏离最小值。非凸损失函数优化过程中存在大量的局部最优解或鞍点;参数以相同的学习速率更新。针对以上挑战,这里有一些优化算法。

如果我们把梯度下降法看作球从山坡到山谷的过程,那么球以一定的初速度滚动。在下落的过程中,球积累的动能越来越大,球的速度也会越滚越大,更快地跑到谷底。受此启发,出现了动量,即动量法。

如上式所示,动量法是将前一个梯度值和衰减率的乘积加到当前梯度值上,使最后一个梯度值可以连续累加。其中衰减率通常小于或等于0.9。带动量项的SGD算法在更新模型参数时,对于当前梯度方向与上一个梯度方向相同的参数,更新力度会加大。但是,当前梯度方向与上一个梯度方向不同的参数会减少,也就是说,当前梯度方向的更新会变慢。因此,与SGD相比,动量法收敛速度更快,振荡更小。

动量法中,滚下来的球遇到上坡会减速,所以最好在遇到上坡之前减速。这是NAG的大致思路。与动量法相比,NAG在计算参数梯度时从损失函数中减去动量项,相当于预测下一个参数的位置。公式如下:

如图2所示,蓝色部分是标准动量更新过程。首先,它会计算当前梯度,然后是累积梯度的大跳跃。NAG先进行一个大的跳跃(图中的棕色向量),然后计算跳跃后的梯度(下图中的红色向量)并进行修正,得到真实的梯度下降方向,也就是下图中的绿色向量。这可以避免振荡的情况,比如应用到RNN。

图2

我们可以根据参数的重要性来调整学习速率吗?Adagrad的想法是在学习过程中自动调整学习速率。对低频参数使用较高的学习速率,对高频参数使用较低的学习速率。阿达格勒公式如下

mage/33db9def3d1c4a1ab7409958009ddce5.png?from=pc">

表示当前参数的梯度值,Adagrad 计算第 t 步之前累加的梯度平方和,以此作为学习率的分母。

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

Adagrad 的在日常利用率较高,同时也存在着很多「坑」希望大家尽量避免。以 TensorFlow 为例,θ 是防被除零的项,但 TensorFlow 只提供了累积梯度平方和的初始值,并且默认为 0.1。如果我们设置的较小时,会导致初始学习率偏大。实际使用中,可以调整此参数可能有意外收获。

Adadelta 是 Adagrad 的一种改进算法,更新过程中参照了xlmdyet法。

首先了解一下xlmdyet法(二阶优化方法),它利用 Hessian 矩阵的逆矩阵替代人工设置的学习率,在梯度下降的时候可以完美的找出下降方向,不会陷入局部最小值。

但是它的缺点十分明显,求逆矩阵的时间复杂度近似 O(n3),计算代价太高,不适合大数据。

上文指出 Adagrad 随着时间增加导致学习率不断变小导致过早收敛,Adadelta 采用梯度平方的指数移动平均数来调节学习率的变化:

但论文中认为这个参数的更新没有遵循参数的单元假设,于是作者第二次尝试采用梯度平方的指数移动平均数来调整得到了:

Adagrad 最大的变化是没有学习率的设置,但是到训练后期进入局部最小值雷区之后就会反复在局部最小值附近抖动。

RMSprop 是 AdaDelta 的一个特例,它由 hxdlh Hinton 在公开课中提出,采用梯度平方的指数移动平均数来调整,当参数更新较大时会对它进行「惩罚」,它的公式如下:

RMSprop 相对 Adagrad 梯度下降得较慢,被广泛应用在 CNN 领域。RMSprop 在 Inception v4 内取衰减因子 =0.9,参数 ε = 1.0 。

Adam 算法可以看作是 RMSprop 和动量法的结合体:

其中,

是指数移动平均数,可以看成是动量法的过程;

则是梯度平方的指数移动平均数,也就是 RMSProp 的过程。由于基于指数移动平均数的方式存在偏差,特别是在下降初期 m 和 v 被初始化为0并且接近 1 时。为此,引入偏差修正过程:

最后利用偏差修正后的

更新模型参数:

Adam 即 Adaptive Moment Estimation(自适应矩估计),类比于动量法的过程也就是有偏一阶矩估计过程,RMSprop 则对应于有偏二阶矩估计。在日常使用中,往往采用默认学习率 0.001 就可以取得不错的结果。

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

由于 Adam 可能导致不收敛,或者收敛局部最优点,因此谷歌在 ICLR 2018 提出了 AMSGrad,该论文中提到这样一个问题:

对于 SGD 和 AdaGrad 可以保证学习率总是衰减的, 而基于滑动平均的方法则未必。实际上,以 Adam 为代表的自适应算法存在两个主要问题:

可能不收敛可能收敛于局部最优点

RMSprop 会对最近增加的值提出比较大的更新,随着步数梯的增加慢慢消散它的作用;Adagrad 以梯度的平方进行累积,所以说基于滑动平均的方法不一定能够保证走势衰减。那么怎么确保学习率得到衰减?

AMSGrad 在二阶局部更新过程中通过取当前值与上一次的值的最大值用于计算∆,确保学习率的衰减。

图 3

以上就是现有的主流梯度下降优化算法,总结一下以上方法,如图 3 所示,SDG 的值在鞍点中无法逃离;动量法会在梯度值为0时添加动能之后跳过该点;而 Adadelta 虽然没有学习率但在收敛过程非常快。

最后我们思考一个问题:怎么用现有的优化算法达到 state-of-art?

抛砖引玉,期待你们的更优答案:

1.SGD + Momentum

被大量用在CNN 、NLP 问题上

2.Adam + SGD

Adam加速收敛过程,可能陷入到局部最小值或无法收敛,此时用小学习率 SGD 帮助 adam 跳出局部最小值。

参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。