优化器

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

来源:维基百科
简介

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。

优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。在keras中也有SGD,RMSprop,Adagrad,Adadelta,Adam等:下面就将介绍几个典型的优化器算法。

Gradient Descent Variance(梯度下降变形)

1.Batch gradient descent (BGD)/Vanilla gradient descent

梯度更新规则:BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:

缺点:

  • 由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型.
  • Batch gradient descent对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
  • 选择合适的学习速度是很困难的。学习速率太小会导致收敛速度慢,而学习速率太大,会阻碍收敛,导致损失函数在最小值上下波动,甚至发散。

2. Stochastic gradient descent(SGD)/incrementalgradient descent

梯度更新规则:和BGD的一次用所有数据计算梯度相比,SGD每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样BGD在计算梯度时会出现冗余,而SGD一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

缺点:但是SGD因为更新比较频繁,会造成cost function有严重的震荡。BGD可以收敛到局部极小值,当然SGD的震荡可能会跳到更好的局部极小值处。当我们稍微减小learning rate,SGD和BGD的收敛性是一样的。

3. Mini-batch gradient descent梯度更新规则:MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。

超参数设定值:n一般取值在50~256缺点:不过Mini-batch gradient descent不能保证很好的收敛性,

  1. learning rate如果选择的太小,收敛速度会很慢,如果太大,loss function就会在极小值处不停地震荡甚至偏离。

有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。

  1. 此外,这种方法是对所有参数更新时应用同样的learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
  2. 另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。

Gradient descent optimization algorithms

1.Momentum

SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:

2. Nesterov accelerated gradient

梯度更新规则:用θ−γv_t−1来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上

超参数设定值:γ 仍然取值 0.9 左右。

3. Adagrad

这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了SGD的鲁棒性,例如识别Youtube视频里面的猫,训练GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。梯度更新规则:

4.Adadelta

这个算法是对Adagrad的改进,和Adagrad相比,就是分母的G换成了过去的梯度平方的衰减平均值,

5. RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的.

梯度更新规则:RMSprop 与 Adadelta 的第一种形式相同:

超参数设定值:Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。

6. Adam

Adaptive Moment Estimation (Adam)一种计算每个参数的自适应学习速率的方法。Adam算法像是RMSprop and momentum两个算法的结合。除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:

如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的mt和vt来抵消这些偏差:

梯度更新规则:

超参数设定值:建议β1=0.9,β2=0.999,ϵ=10e−8

7. AdaMax

Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。

Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:

可以看出,Adamax学习率的边界范围更简单

Adamax的学习率边界范围更简单

8. Nadam

Nadam (Nesterov-accelerated Adaptive Moment Estimation)是对Adam and NAG两个算法的结合。我们需要修改momentum term mt。

9. AMSGrad

在Adam方法收敛到一个次优解时,会观察到一些小批次样本贡献了大幅且有效的信息梯度,但是这种情况很少发生,指数平均后减小了它们的影响,导致模型收敛性差。作者给出了一个简单的凸优化问题,可以看到Adam方法中也存在这种现象。

作者Reddi等人(2018)提出了一种新算法AMSGrad来解决这个问题,它使用过去平方梯度的最大值来更新参数,而不是先前的指数平均。AMSGrad方法的更新过程如下,这里不带有偏差校正估计。

实验表明,在小数据集和CIFAR-10数据集上,这种方法的性能比Adam方法更好。

选择规则建议

  • 如果数据是稀疏的,就用自适用方法,即Adagrad, Adadelta, RMSprop, Adam。RMSprop, Adadelta, Adam在很多情况下的效果是相似的。
  • Adam就是在RMSprop的基础上加了bias-correction和momentum。
  • 随着梯度变的稀疏,Adam比RMSprop效果会好。
  • 整体来讲,Adam是最好的选择。
  • 很多论文里都会用SGD,没有momentum等。SGD虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
  • 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法

【描述来源:论文, URL:https://zh.wikipedia.org/wiki/%E6%9C%80%E4%BC%98%E5%8C%96

发展历史

1847, Augustin-Louis Cauchy, 在Méthode générale pour la résolution des systèmes d'équations simultanées. pp. 536–538中提出提出GD。

随后,随机梯度下降(SGD)方法是1951年由Robbins和Monro提出的[1],至今已有60年历史。在当前的深度学习研究中,这种方法至关重要,一般被用在反向传播过程中。1952年,J. Kiefer and J. Wolfowitz 也提出了SGD的方法随机逼近是一种参数的估计方法。它是在有随机误差干扰的情况时,用逐步逼近的方式估计参数的方法。

1983年,Yurii Nesterov提出Nesterov accelerated gradient算法。

1986年,momentum算法在Rumelhart, Hinton和Williams关于反向传播学习的开创性论文中首次出现。

2011年,Duchi, J., Hazan, E.,对随机梯度算法进行修改提出提出Adagrad算法。

2012年,Matthew D. Zeiler.提出了Adadelta算法,对Adagrad算法进行改进。

2014年,近年来,研究人员提出一些新的优化算法,使用了不同方程来更新模型参数。Kingma, D. P., & Ba, J. 提出Adam算法,可看作是目前最常用的优化算法之一。这表明,从机器学习工作者的角度来说,深度学习优化中的最佳方法在很大程度上是保持不变的。

2016年,Dozat, T.将momentum算法应用于Adam算法中,提出Nadam算法。

2018年,在Adam方法收敛到一个次优解时,观察到一些小批次样本贡献了大幅且有效的信息梯度,但是这种情况很少发生,指数平均后减小了它们的影响,导致模型收敛性差。Reddi等人提出AMSGrad算法对SGD算法进行改进.

主要事件

年份事件相关论文
1951Robbins, H., & Monro, S.提出SGD算法Robbins, H., & Monro, S. (1951). A stochastic approximation method. The annals of mathematical statistics, 400-407.
2011Duchi, J., Hazan, E.,对随机梯度算法进行修改提出提出Adagrad算法Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive subgradient methods for online learning and stochastic optimization. Journal of Machine Learning Research, 12(Jul), 2121-2159.
2012Zeiler, M. D.对Adagrad提出AdaDelta算法Zeiler, M. D. (2012). ADADELTA: an adaptive learning rate method. arXiv preprint arXiv:1212.5701.
2014Kingma, D. P., & Ba, J.提出经典的Adam 算法Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980.
2016Ruder, S.对多种梯度下降算法进行综述回顾Ruder, S. (2016). An overview of gradient descent optimization algorithms. arXiv preprint arXiv:1609.04747.

发展分析

瓶颈

2000年,美国克莱数学研究所公布了世界七大数学难题,又称千禧年大奖难题。其中优化问题中的P与NP问题被列为这七大世界难题之首,从而大大激发了对这一问题的研究热情。它计算的时间是它的致命的问题。对于TSP问题,它的复杂度是按照指数的增长形式的,那是如何的可怕。

对于梯度下降算法来说,它比较普遍的问题有

  • 靠近极小值时收敛速度减慢。
  • 直线搜索时可能会产生一些问题。
  • 可能会“之字形”地下降。

未来发展方向

虽然梯度下降算法不能保证找到最优值,但是它一直尽可能找到最优解,然而,如何避免只能找到局部最优解依旧是需要持续研究的问题。

除此之外,无论哪一种梯度下降算法来说,参数的设置也是比较重要的,找到每一种算法的合适的参数也是研究的重点。

Contributor: Ruiying Cai

相关人物
简介
相关人物