梯度下降优化算法综述(翻译)

原文链接:http://sebastianruder.com/optimizing-gradient-descent

原文题目:An overview of gradient descent optimization algorithms

博文地址:http://blog.csdn.net/wangxinginnlp/article/details/50974594

梯度下降是最流行的优化算法之一并且目前为止是优化神经网络最常见的算法。与此同时,每一个先进的深度学习库都包含各种算法实现的梯度下降(比如lasagne‘scaffe‘s,
和 keras‘的文档)。然而,这些算法经常作为黑盒优化程序使用,所以难以感受到各种算法的长处和不足。

此博文旨在为你提供对不同梯度算法的直观感受,以期会帮助你更好地使用不同的梯度下降算法。首先,我们会罗列各种梯度下降算法的变种并简单地总结算法训练阶段的挑战。然后,我们会通过展示解决问题的动机和依据这些动机来推导更新法则,以介绍最常见的优化算法。我们也顺带罗列下并行分布式环境下的算法和体系结构。最后,我们会讨论其他有利于梯度下降优化算法的策略。

梯度下降是一种以通过在目标函数梯度的反向上更新模型参数,来最小化模型参数的目标函数的方法。学习速率决定了我们前往(局部)极小值的步长。换言之,我们沿着目标函数所构造曲面的斜面按向下的方向走动,直到我们到达山谷。如果你对梯度下降不熟悉,你可以点击此处点击打开链接去了解一篇关于优化神经网络的介绍。

梯度下降算法变种

存在三种梯度下降的变种,他们不同之处在于我们在计算目标函数梯度时所用数据量的多少。依据数据的规模,我们在更新参数的准确性和执行一次更新所用时间之间进行一种折中。

批量梯度下降

普通的梯度下降,也称批量梯度下降,利用所有的训练数据计算目标函数的梯度。

由于我们每进行一次参数更新需要计算整体训练数据的梯度,批量梯度下降会变得很慢并且一遇到内存吃不下数据就挂了。同时批量梯度下降也无法支持模型的在线更新,例如,新的样本不停的到来。

代码中,批量梯度下降大概长这样:

<span style="font-size:14px;"><span style="font-size:14px;">for i in range(nb_epochs):
  params_grad = evaluate_gradient(loss_function, data, params)
  params = params - learning_rate * params_grad</span></span>

对于一个预先定义迭代轮数,我们首先以整体数据计算损失函数的梯度向量weights_grad关于参数向量params。值得注意的是先进的深度学习库提供对一些参数进行自动求导可以有效地计算梯度。如果你是自己来推梯度,梯度检查是一个不错的注意。(点击点击打开链接查看关于如何正确地检查梯度的建议)

我们随后以梯度的反方向更新我们的参数,此时学习速率决定着我们每次执行多大的更新。批量梯度下降可以保证在convex error surfaces 条件下取得全局最小值,在non-convex surfaces条件下取得局部极小值。

随机梯度下降

随机梯度下降(SGD)以一个训练样例和标签进行一次参数更新。

由于在每次参数更新前对相似的样例进行梯度重复计算, 批量梯度下降会在大数据集上进行冗余计算。SGD通过每次计算一个样例的方式避开这种冗余。因此,SGD速度会更快并支持在线学习。

SGD频繁的执行更新所伴随的高方差(a high variance)会导致目标函数如图1所示的剧烈波动。

图1. SGD波动

批量梯度下降收敛到盆面的极小值,SGD的波动一方面能够使(损失函数)跳到一个全新并且可鞥呢更优的局部极小值,另一方面这种波动由于一直overshooting终究会很难收敛到确切的极小值。然而,(实验)表明当我们慢慢地减小学习速率时SGD表现出和批量梯度下降同样的收敛行为,几乎确定地在non-convex and convex
optimization中各自收敛到一个局部或者全局极小值在。

SGD的代码片段简单在训练实例上套一个循环并评估每一个训练样例的梯度。值得注意的是我们在每轮迭代时候会打乱训练数据,相关解释见点击打开链接

<span style="font-size:14px;"><span style="font-size:14px;"><for i in range(nb_epochs):
  np.random.shuffle(data)
  for example in data:
    params_grad = evaluate_gradient(loss_function, example, params)
    params = params - learning_rate * params_grad</span></span>

Mini-batch gradient descent

Mini-batch gradient descent 吸收了上述两个算法的长处,利用小批量训练样例执行一次更新。

以这种方式,它可以 a) 减小参数更新的方差,导致更平稳的收敛。b) 利用先进深度学习库中常见的高度优化矩阵操作来高效地计算小批量的梯度。普通小批量的规模在50到256之间,但在不同的应用中会变化。Mini-batch gradient desent 是训练神经网络的经典选择,采用mini-bathes时常常也会称为SGD。注意在后文中SGD改进中,为简单起见,我们省略参数

代码中,我们每轮迭代的mini-bathes规模设置为50。

<span style="font-size:14px;"><span style="font-size:14px;">for i in range(nb_epochs):
  np.random.shuffle(data)
  for batch in get_batches(data, batch_size=50):
    params_grad = evaluate_gradient(loss_function, batch, params)
    params = params - learning_rate * params_grad</span></span>

挑战

然而,普通的mini-batch gradient descent不能保证较好的收敛性,这一点引出了下述挑战:

  1. 选择一个合适的学习速率是很难的。学习速率太小会导致收敛慢,太大会阻碍收敛并导致损失函数在极小值周围波动甚至背离。
  2. 尝试通过设置调度在训练时候调整训练速率,比如,模拟退火按照预先定义好的调度算法或者当相邻的迭代中目标变化小于一个阈值时候减小学习速率。但是这些调度和阈值需要预先设置,无法对数据集特征进行自适应。
  3. 除此之外,对所有的参数更新都按照同一个学习速率也是一个问题。如果我们的数据很稀疏并且我们的特征出现的次数不同,我们可能不会希望所有的参数以某种相同的幅度进行更新,而是针对很少出现的特征进行一次大幅度更新。
  4. 在神经网络中常见的极小化highly non-convex error functions的一个关键挑战是避免步入大量的suboptimal local minima。Dauphin等人认为实践中的困难来自saddle points而非local minima。所谓saddle points是指那些维度梯度不一致的点。这些saddle
    points经常被一个相等误差的平原包围,导致SGD很难摆脱,因为梯度在所有方向都近似于0。

梯度下降优化算法

下面我们会概述一些深度学习社区广泛采用的以解决上述挑战的算法。我们不会讨论那些实践中对高维数据集合计算上不可行的算法,比如二阶方法(比如牛顿法)。

Momentum

SGD不那么容易越过ravines,所谓ravines也就是那些surface curves在某个维度比其他维度梯度大得多的地方,这些地方经常在局部极小值周围出现。在这种情况下,SGD会像图2一般沿着slopes of the ravine振荡中前进,在底部磨磨蹭蹭地朝局部最优走。

图2. 不带Momentum的SGD

图3. 带有Momentum的SGD

Momentum是一种帮助SGD在相关方向进行加速并抑制振荡的方法,如图3所示。它通过向当前更新向量中加入上一时刻的更新向量的部分实现上述功能。

注意,有些实现中会对等式中的符号进行变动。momentum term  一般设置为0.9或类似值。

我们向山下丢一个小球就会涉及使用到momentum。小球在向山下滚动时候会积累动量滚动地越来越快(如果存在空气阻力,会一直加速到终端速度terminal velocity)。相同的事情会发生在参数更新上:momentum term会在更新方向相同的维度加速,会在更新方向不同的维度上减速。最终,我们更快地收敛并减少振荡。

Nesterov accelerated gradient

然而,我们并不满意于滚动的小球仅仅只是盲目地沿着斜面slope滚动。我们希望有一个更加聪明的小球,一个知道自己能否认识到自己选择道路的小球,这种小球会在斜面slope再次上倾的时候放慢自己的速度。

Nesterov accelerated gradient (NAG) 是一种能够给我们momentum term带来这种先见之明的方法。我们清楚我们会使用momentum term 来更新参数。计算 会让我们看到更新后参数的近似值(完整的更新还需要考虑梯度),让我们大致知道参数朝那地方更新。我们现在可以通过计算下一个位置参数的梯度(而不是当前位置的参数)
进行提前准备:

我们再次将momentum term  设置在0.9的附近。不同于Momentum方法先计算当面的梯度(图4中蓝色小向量)后在更新过的累积梯度方向上进行一个大跨越(蓝色大向量),NAG先在上一个累积梯度方向进行跳跃(棕色向量),测量下梯度然后进行一个修正(绿色向量)。这种预期式的更新防止我们走的太快并增加反应能力,显著提高了RNN在一些任务上的性能。

图4. Nesterov更新

点击点击打开链接参考对于NAG背后直觉的另外一种解释,同时Ilya Sutskever在他博士论文中给出更详细的综述。

现在我们可以让我们的更新适应于损失函数所构造的斜面slope的同时加快SGD的速度。我们也希望我们的更新适应于单独的参数,按照参数自身的重要性来进行大幅度或者小幅度的更新。

Adagrad

Adagrad是一个基于梯度优化的算法:它让学习速率自适应于参数,对低频参数进行大幅度更新而对高频参数进行小幅度更新。因为这一点,它非常适合于处理稀疏数据。Dean等人发现Adagrad大大地提高了SGD的鲁棒性并在谷歌的大规模神经网络训练中采用了它进行参数更新,其中包含了在Youtube视频中进行猫脸识别。此外,由于低频词(参数)需要更大幅度的更新,Pennington等人在GloVe
word embeddings的训练中也采用了Adagrad。

之前,我们每次更新都涉及所有的参数且每个参数  采用相同的速率。由于Adagrad在时刻 对每个参数  采用了不同的学习速率,我们先展示Adagrad的per-parameter
更新然后对他们进行向量化。简答起见, 表示损失函数中参数  在时刻  的梯度。

SDG算法时刻  对参数  进行更新则表示为:

在这个更新规则中,Adagrad利用过去时刻算好了的梯度对不同时刻  不同参数 的学习速率  进行调整:

是一个对角矩阵,其中每个对角元素是参数  到时刻  为止所有时刻梯度的平方之和, 是平滑项以避免分母为0。有趣的是,如果不用平方根操作,算法性能会变差很多。

由于  的对角包含着所有参数过去时刻的平方之和,我们可以通过在  和   执行element-wise
matrix-vector multiplication来向量化我们的操作:

Adagrad的一个优点就是不用进行人工调整学习速率。许多实现中都是使用缺省的0.01进行赋值。

Adagrad的一个主要弱点就是它在分母中累加梯度的平方:由于每次加入的是一个正数,累加的和在训练阶段一直增加。这会导致学习速率一直变小最终变得无限小,在学习速率无限小的地方Adagrad算法无法取得额外的知识。下面这个算法就是为了克服这个缺陷而产生的。

Adadelta

Adadelta是Adagrad的一种扩展,以缓解Adagrad学习速率单调递减问题的算法。Adadelta不是对过去所有时刻的梯度平凡进行累加,而是将累加时刻限制在窗口大小为的  区间。

梯度累加没有采用简单的存储前个时刻的梯度平方,而是递归使的定义为过去所有时刻梯度平方的decaying
average。时刻  
的running average  仅仅依赖于之前average和当前的梯度:

类似momentum term,我们将  取值在0.9附近。 简洁起见,我们从参数更新向量 角度重写普通SGD的参数更新:

Adagrad中我们推导的参数更新向量现在就以下述形式出现:

现在我们简单地将对角矩阵  替换为过去时刻梯度平方的decaying
average 

由于分母是root mean squared (RMS) error criterion of the gradient, 则上面公式可以替换为:

作者注意到

补充的中文博客:

  1. http://www.cnblogs.com/neopenx/p/4768388.html
  2. http://blog.csdn.net/luo123n/article/details/48239963 [部分公式有错误]
时间: 2024-10-06 15:02:06

梯度下降优化算法综述(翻译)的相关文章

梯度下降优化算法综述

本文翻译自Sebastian Ruder的"An overview of gradient descent optimization algoritms",作者首先在其博客中发表了这篇文章,其博客地址为:An overview of gradient descent optimization algoritms,之后,作者将其整理完放在了arxiv中,其地址为:An overview of gradient descent optimization algoritms,在翻译的过程中以

机器学习最常用优化之一——梯度下降优化算法综述

转自:http://www.dataguru.cn/article-10174-1.html 梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法.几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现.但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释.这篇文章旨在提供梯度下降算法中的不同变种的介绍,帮助使用者根据具体需要进行使用. 这篇文章首先介绍梯度下降算法的三种框架,然后介绍它们所存在的

梯度下降优化方法 与 自动控制 的关系

梯度下降的各种优化算法下面参考文献表述都很全面了,不在赘述,主要谈谈个人理解 其实对SGD的优化,跟自动控制中的PID思路其实是一样的 P(Propotion)比例项即当前偏差 I(Intergration)积分项即偏差的累积 D(differentiation)微分项即偏差的变化 SGD加入微分项,即对梯度中与此前优化的方向相同的方向进行加权,相反的方向进行降权,即Monentum,可以防止每次迭代下降梯度在某个方向上反复震荡 SGD加入积分项,即对梯度中累积优化多的方向进行降权,累积优化少的

梯度下降优化线性回归

一.理论 二.数据集 6.1101,17.592 5.5277,9.1302 8.5186,13.662 7.0032,11.854 5.8598,6.8233 8.3829,11.886 7.4764,4.3483 8.5781,12 6.4862,6.5987 5.0546,3.8166 5.7107,3.2522 14.164,15.505 5.734,3.1551 8.4084,7.2258 5.6407,0.71618 5.3794,3.5129 6.3654,5.3048 5.130

梯度优化算法总结(转载)以及solver中相关参数解释

原文地址:http://sebastianruder.com/optimizing-gradient-descent/ 如果熟悉英文的话,强烈推荐阅读原文,毕竟翻译过程中因为个人理解有限,可能会有谬误,还望读者能不吝指出.另外,由于原文太长,分了两部分翻译,本篇主要是梯度下降优化算法的总结,下篇将会是随机梯度的并行和分布式,以及优化策略的总结. 梯度下降是优化中最流行的算法之一,也是目前用于优化神经网络最常用到的方法.同时,每个优秀的深度学习库都包含了优化梯度下降的多种算法的实现(比如, las

NN优化方法对比:梯度下降、随机梯度下降和批量梯度下降

1.前言 这几种方法呢都是在求最优解中经常出现的方法,主要是应用迭代的思想来逼近.在梯度下降算法中,都是围绕以下这个式子展开: 其中在上面的式子中hθ(x)代表,输入为x的时候的其当时θ参数下的输出值,与y相减则是一个相对误差,之后再平方乘以1/2,并且其中 注意到x可以一维变量,也可以是多维变量,实际上最常用的还是多维变量.我们知道曲面上方向导数的最大值的方向就代表了梯度的方向,因此我们在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,可以有效的找到全局的最优解.这个θ的更新过程可以描

(2)Deep Learning之线性单元和梯度下降

往期回顾 在上一篇文章中,我们已经学会了编写一个简单的感知器,并用它来实现一个线性分类器.你应该还记得用来训练感知器的『感知器规则』.然而,我们并没有关心这个规则是怎么得到的.本文通过介绍另外一种『感知器』,也就是『线性单元』,来说明关于机器学习一些基本的概念,比如模型.目标函数.优化算法等等.这些概念对于所有的机器学习算法来说都是通用的,掌握了这些概念,就掌握了机器学习的基本套路. 线性单元是什么? 感知器有一个问题,当面对的数据集不是线性可分的时候,『感知器规则』可能无法收敛,这意味着我们永

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

优化算法—梯度下降

转自:https://www.cnblogs.com/shixiangwan/p/7532858.html 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战. 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent) 随机梯度下降