梯度降低优化算法概述

感谢阅读「美图数据技术团队」的原创文章,关注咱们持续获取美图最新数据技术动态。

平时咱们说的训练神经网络就是最小化损失函数的过程,损失函数的值衡量了模型在给定数据集下的表现(拟合)能力。算法

clipboard.png

损失函数 J 如上图所示,B 点为函数最低点,设 A 点为初始值,那么优化器的做用就是指引初始值 A 点走向最低点 B 点,那么如何让这个过程执行的更加迅速呢?网络

梯度降低了解一下!函数

位于三维空间里的任意一个点均可以找到与之相切的平面,在高维的状况下也能找到超平面与其相切。那么在相切平面上的任意一个点都有多种方向,但只有一个方向能使该函数值上升最快,这个方向咱们称之为梯度方向,而这个梯度方向的反方向就是函数值降低最快的方向,这就是梯度降低的过程。学习

基于以上概念咱们进一步了解批量梯度更新 BGD,顾名思义,它就是一次性把全部样本同时计算以后获得梯度值,而后更新参数。这种方法十分简便,它对凸函数能够收敛到全局最优值,对于非凸函数则收敛到局部最优值。与此同时它缺点显而易见:在大数据量下内存占用巨大、计算时间久,而且没法进行在线更新。大数据

面对 BGD 的瓶颈 SGD 应运而生,它每次只更新一个样本,相对比于 BGD ,它的收敛速度更快而且能够在线更新,有机会跳出局部最优。但 SGD 没法利用矩阵操做加速计算过程,考虑到上述两种方法的优缺点,就有了小批量梯度降低算法(MBGD),每次只选取固定小批量数据进行梯度更新。优化

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

  • 选择恰当的初始学习率很困难,学习率太大会妨碍收敛,致使损失函数在最小值附近振荡甚至偏离最小值;
  • 非凸的损失函数优化过程存在大量的局部最优解或鞍点;
  • 参数更新采用相同的学习率。

针对上述挑战,接下来为你们列举一些优化算法。3d

若是咱们把梯度降低法看成小球从山坡到山谷的一个过程,那么在小球滚动时是带有必定的初速度,在下落过程,小球积累的动能愈来愈大,小球的速度也会越滚越大,更快的奔向谷底,受此启发就有了动量法 Momentumblog

clipboard.png

如上公式所示,动量法在当前梯度值的基础上再加上一次的梯度值与衰减率 𝛾 的乘积,这样能够不断累积上一次的梯度值。其中衰减率 𝛾 通常小于等于 0.9。加上动量项的 SGD 算法在更新模型参数时,对于当前梯度方向与上一次梯度方向相同的参数,则会加大更新力度;而对于当前梯度方向与上一次梯度方向不一样的参数,则会进行消减,即在当前梯度方向的更新减慢了。所以,相较于 SGD,动量法能够收敛得更快,而且减小震荡。ip

在动量法中,小球下滚过程若是遇到上坡则会减少速度,那么更好的作法应该是遇到上坡以前就减慢速度。这就是 NAG 的大体思想,相较于动量法,NAG在计算参数的梯度时,在损失函数中减去了动量项,这种方式至关于预估了下一次参数所在的位置。公式以下:
clipboard.png

以下图所示,蓝色部分是标准的动量法更新过程,首先它会计算当前梯度,接着是累积梯度的大跳跃。而 NAG 则先来一个大跳跃(图中褐色向量),而后在跳跃后的地方计算梯度(下图红色向量)进行修正获得真正的梯度降低方向,即下图中的绿色向量。这样可能会避免产生振荡的情形,如应用于 RNN。

clipboard.png

那可否根据参数的重要性自适应学习率呢?Adagrad 的提出思想是:在学习的过程当中自动调整学习率。对于出现频率低的参数使用较大的学习率,出现频率高的参数使用较小的学习率。Adagrad 公式以下:

clipboard.png

clipboard.png

clipboard.png

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

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

Adagrad 的在平常利用率较高,同时也存在着不少「坑」但愿你们尽可能避免。以 TensorFlow 为例,θ 是防被除零的项,但 TensorFlow 只提供了累积梯度平方和的初始值,而且默认为 0.1。若是咱们设置的较小时,会致使初始学习率偏大。实际使用中,能够调整此参数可能有意外收获。

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

clipboard.png

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

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

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

clipboard.png

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

clipboard.png

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

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

clipboard.png

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

Adam 算法能够看做是 RMSprop 和动量法的结合体:

clipboard.png

clipboard.png

其中,mt 是指数移动平均数,能够当作是动量法的过程;vt 则是梯度平方的指数移动平均数,也就是 RMSProp 的过程。因为基于指数移动平均数的方式存在误差,特别是在降低初期 m 和 v 被初始化为0而且接近 1 时。为此,引入误差修正过程:

clipboard.png

最后利用误差修正后的 mt 和 vt 更新模型参数:

clipboard.png

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

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

因为 Adam 可能致使不收敛,或者收敛局部最优势,所以谷歌在 ICLR 2018 提出了 AMSGrad,该论文中提到这样一个问题:

对于 SGD 和 AdaGrad 能够保证学习率老是衰减的, 而基于滑动平均的方法则未必。实际上,以

Adam 为表明的自适应算法存在两个主要问题:

  • 可能不收敛
  • 可能收敛于局部最优势

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

clipboard.png

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

clipboard.png

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

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

抛砖引玉,期待大家的更优答案:

1.SGD + Momentum

被大量用在CNN 、NLP 问题上

2.Adam + SGD

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

相关文章
相关标签/搜索