深度学习优化算法总结

 

前言

本文讨论的优化问题指的是,给定目标函数f(x),咱们须要找到一组参数x(权重),使得f(x)的值最小。算法

如下内容假设读者已经了解机器学习基本知识,和梯度降低的原理。机器学习

 

SGD

SGD指stochastic gradient descent,即随机梯度降低。是梯度降低的batch版本。函数

对于训练数据集,咱们首先将其分红n个batch,每一个batch包含m个样本。咱们每次更新都利用一个batch的数据,而非整个训练集。即:性能

其中,η为学习率,gt为x在t时刻的梯度。 学习

这么作的好处在于:大数据

  • 当训练数据太多时,利用整个数据集更新每每时间上不显示。batch的方法能够减小机器的压力,而且能够更快地收敛。
  • 当训练集有不少冗余时(相似的样本出现屡次),batch方法收敛更快。以一个极端状况为例,若训练集前一半和后一半梯度相同。那么若是前一半做为一个batch,后一半做为另外一个batch,那么在一次遍历训练集时,batch的方法向最优解前进两个step,而总体的方法只前进一个step。

 

Momentum

SGD方法的一个缺点是,其更新方向彻底依赖于当前的batch,于是其更新十分不稳定。解决这一问题的一个简单的作法即是引入momentum。优化

momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在必定程度上保留以前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,能够在必定程度上增长稳定性,从而学习地更快,而且还有必定摆脱局部最优的能力:spa

其中,ρ 即momentum,表示要在多大程度上保留原来的更新方向,这个值在0-1之间,在训练开始时,因为梯度可能会很大,因此初始值通常选为0.5;当梯度不那么大时,改成0.9。η 是学习率,即当前batch的梯度多大程度上影响最终更新方向,跟普通的SGD含义相同。ρ 与 η 之和不必定为1。blog

 

Nesterov Momentum

这是对传统momentum方法的一项改进,由Ilya Sutskever(2012 unpublished)在Nesterov工做的启发下提出的。内存

  Nesterov Momentum

首先,按照原来的更新方向更新一步(棕色线),而后在该位置计算梯度值(红色线),而后用这个梯度值修正最终的更新方向(绿色线)。上图中描述了两步的更新示意图,其中蓝色线是标准momentum更新路径。

公式描述为:

 

Adagrad 

Adagrad实际上是对学习率进行了一个约束。即:

此处,对g_t从1到t进行一个递推造成一个约束项regularizer,-\frac{1}{\sqrt{\sum_{r=1}^t(g_r)^2+\epsilon}},\epsilon用来保证分母非0

特色:

  • 前期g_t较小的时候, regularizer较大,可以放大梯度
  • 后期g_t较大的时候,regularizer较小,可以约束梯度
  • 适合处理稀疏梯度

缺点:

  • 由公式能够看出,仍依赖于人工设置一个全局学习率 
  • \eta设置过大的话,会使regularizer过于敏感,对梯度的调节太大
  • 中后期,分母上梯度平方的累加将会愈来愈大,使gradient\to0,使得训练提早结束

 

Adadelta 

Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,可是进行了计算上的简化。Adagrad会累加以前全部的梯度平方,而Adadelta只累加固定大小的项,而且也不直接存储这些项,仅仅是近似计算对应的平均值。即:

n_t=\nu*n_{t-1}+(1-\nu)*g_t^2

\Delta{\theta_t} = -\frac{\eta}{\sqrt{n_t+\epsilon}}*g_t

在此处Adadelta其实仍是依赖于全局学习率的,可是做者作了必定处理,通过近似牛顿迭代法(求根点)以后:

E|g^2|_t=\rho*E|g^2|_{t-1}+(1-\rho)*g_t^2

\Delta{x_t}=-\frac{\sqrt{\sum_{r=1}^{t-1}\Delta{x_r}}}{\sqrt{E|g^2|_t+\epsilon}}

其中,E表明求指望。 

此时,能够看出Adadelta已经不用依赖于全局学习率了。 

特色:

  • 训练初中期,加速效果不错,很快 
  • 训练后期,反复在局部最小值附近抖动

 

RMSprop 

RMSprop能够算做Adadelta的一个特例: 

\rho=0.5时,E|g^2|_t=\rho*E|g^2|_{t-1}+(1-\rho)*g_t^2就变为了求梯度平方和的平均数。

若是再求根的话,就变成了RMS(均方根): 

RMS|g|_t=\sqrt{E|g^2|_t+\epsilon}

此时,这个RMS就能够做为学习率\eta的一个约束:

\Delta{x_t}=-\frac{\eta}{RMS|g|_t}*g_t

特色:

  • 其实RMSprop依然依赖于全局学习率 
  • RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于两者之间
  • 适合处理非平稳目标- 对于RNN效果很好

 

Adam 

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每一个参数的学习率。Adam的优势主要在于通过偏置校订后,每一次迭代学习率都有个肯定范围,使得参数比较平稳。公式以下:

m_t=\mu*m_{t-1}+(1-\mu)*g_t

n_t=\nu*n_{t-1}+(1-\nu)*g_t^2

\hat{m_t}=\frac{m_t}{1-\mu^t}

\hat{n_t}=\frac{n_t}{1-\nu^t}

\Delta{\theta_t}=-\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\epsilon}*\eta

其中,m_tn_t分别是对梯度的一阶矩估计和二阶矩估计,u和v为衰减率,u一般为0.9,v一般为0.999,能够看做对指望E|g_t|E|g_t^2|的估计;\hat{m_t}\hat{n_t}是对m_tn_t的校订,这样能够近似为对指望的无偏估计。能够看出,直接对梯度的矩估计对内存没有额外的要求,并且能够根据梯度进行动态调整,而-\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\epsilon}对学习率造成一个动态约束,并且有明确的范围。

特色:

  • 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优势 
  • 对内存需求较小 
  • 为不一样的参数计算不一样的自适应学习率 
  • 也适用于大多非凸优化- 适用于大数据集和高维空间

 

性能比较

损失曲面的轮廓和不一样优化算法的时间演化(Contours of a loss surface and time evolution of different optimization algorithms)

 

 

 

 

参考:

[1] Optimization Algorithms for Deep Learning

[2] Adam — latest trends in deep learning optimization

[3] Intro to optimization in deep learning: Momentum, RMSProp and Adam

[4] Gradient Descent based Optimization Algorithms for Deep Learning Models Training

相关文章
相关标签/搜索