这是Tensorflow截止到1.14版本OPTIMIZER_CLS_NAMES下的优化器列表。不同优化器有什么优缺点?我该选择哪一个优化器?本文将做一个详细的分析,并用可视化的方式对比展示不同优化器在若干场景下的训练梯度变化。

linear

  • SGD(1951) [1]
  • Momentum (1999)[2]
  • Ftrl(2011) [3]
  • Adagrad(2011)[4]
  • RMSProp(2012)[5]
  • Adam(2014)[6]

关于Optimizer本文只做简单的回顾,熟悉的可以直接移步到本文最后,看可视化分析。

可视化的代码后续会release到github上 // TODO 状态

Optimizer

SGD

Stochastic Gradient Descent是目前所有梯度优化的基础,公式简单,其中,$\theta$是目标优化函数的参数,$\eta$是学习率。

$$ \theta_t = \theta_{t-1} - v_t $$

公式里的$v_t$ 参数的更新值,在SGD里等于上一轮前向函数计算出的参数$\theta_{t-1}$的导数乘以学习率。

$$ v_t = \eta g_t $$

$$g_t = \nabla_{\theta_{t-1} } f(\theta_{t-1} )$$

但是,SGD并没能很好的保证收敛,主要有几个问题:

  • 难以经验化的设定learning rate。
  • 参数收敛有快有慢,但所有参数用相同的learning rate。
  • 容易陷入局部最优点。
  • 鞍点

Momentum

Momentum模拟物理上动量的概念,积累历史梯度运动方向的值叠加到原有的梯度更新值上,因此,梯度会以一定程度$\gamma$保持之前的运动趋势。对SGD的函数进行修改后的公式如下:

$$ v_t = \gamma v_{t-1} + \eta g_t $$

Momentum是一种让梯度优化突破局部最优的思想,后续的多种Optimizer都引入了Momentum的概念。

FTRL

FTRL是Google用于解决稀疏LR而提出的更新策略。非常适合稀疏场景下的LR或浅层网络。求解相比SGD更特殊,需要做二次的梯度优化,这里不多赘述。

Adagrad

Adagrad一言以蔽之:对不频繁的参数使用更大的更新值,而对于频繁出现的参数使用更小的更新值。

因此,Adagrad在处理sparse数据时会更好。因为对于sparse数据,神经网络中有大量的权重w系数是0,无法被更新,Adagrad可以为这些系数设置更大的更新权重。

Adagrad动态修改了学习率$\eta$:

$$v_t = \frac{\eta }{ \sqrt{G_{t} + \epsilon }} g_{t} $$

其中$G_{t} $是对角阵,对角${i,i}$上的元素表示截止到$t$时刻,参数向量$\theta$ 的第$i$个变量累计的梯度平方和。$\epsilon$是平滑项。

随着训练step变多,$G_t$的累积值也会越来越大,学习率会学来越小,最后趋向于0

RMSProp

RMSProp是Hitton在Coursera上课的时候提出来的。

由于Adagrad在训练后期$\eta$趋向于0,梯度不再更新,RMSProp做了改进,采用了指数移动平均(Expontential Decaying Average),将原先的对角矩阵$G_t$变为如下的形式:

$$G_t = \gamma G_t + (1-\gamma) g_t^2$$

RMSProp可以避免学习率归0的情况,前期有动量的抖动,后期趋于平缓

Adam

Adam算法比较有意思,可以理解为带有动量的RMSProp,它为每一个参数都设定了学习率,同时它还引入了二阶的梯度,用来调整参数学习率。可以理解为集大成者。

Adam引入了两个值, $m_t$是梯度的指数移动平均,$n_t$是梯度平方的指数移动平均。通过这两个值对每次的梯度更新做偏置校正(bias-corrected),是的Adam的学习比较平稳。

$$m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t$$

$$n_t = \beta_2 n_{t-1} + (1-\beta_2) g_t^2 $$

校正后:

$$\hat{m_t } = \frac{m_t } {1- \beta_1}$$

$$\hat{n_t } = \frac{n_t } {1- \beta_2}$$

而梯度更新的$v_t$ 被定义为:

$$v_t = \frac{\eta \hat{m_t}}{\sqrt{ \hat{n_t}}+\epsilon} $$

可视化

通过曲面上的梯度更新,可以更加直观的得到一些结论。

二次曲面

曲面公式: $z = x^2$

power2

  • 简单的曲面上,Adam和Adagrad收敛速度比SGD还慢(Adagrad可以调大learning rate加快收敛)。
  • RMSProp在训练后期会持续抖动。

椭球面

曲面公式: $ z = \sqrt{ x^2 + 0.5y^2 }$

ellipse

俯视图:

image-20190823175948939

  • Adam和Adagrad近乎直线的朝着目标点下降,而其他Optimizer都会有一定的偏移,这是因为这两个优化器对参数使用了不同的learning rate,以优化目标指向最优点。
  • FTRL有明显的折角,这是因为其稀疏优化公式带来的。
  • RMSProp和Momentum的前期趋势近似,本质上都考虑了0.9的动量,后期螺旋下降。
  • Adam到达最优点后冲出去了,这Momentum机制的影响。

局部最优点

曲面公式:$z = -x(x-0.5)(x+0.5)$

localmin

  • 设定合适的动量衰减(Momentum Decay),带有Momentum机制的Optimizer可以一定程度上越过局部最优: Momentum & RMSProp。
  • 当然,如果动量衰减过大,也可能越不过局部最优: Adam。

鞍点

曲面公式:$z = x^2 - y^2$ ; 初始化点略有偏移: $x= -10^{-2}; y=-10^{-7}$。

saddle

  • Adam,RMSProp,Adagrad三个Optimizer最快,因为在到达近似平滑的点后,这三者还能有抖动。
  • SGD在这里就几乎不动了。

非光滑曲面

曲面公式:$z = |x| + 0.3|y|$ 。

sparse

中间时刻的俯视图:

image-20190823172726356

  • Adam和Adagrad优化方向指向最优点,这和椭球面的情况类似,本质上是不同维度参数有不同的learning rate。
  • FTRL在这里首先快速的到达$y$方向上的最优,这现象和SGD为代表的Optimizer相反,他们先到达$x$最优
  • FTRL到达$y$最优后,紧接着沿着$x$最优方向优化,也最快到达最优点,在稀疏数据上的优势明显。
  • SGD到达$x$最优点后,开始了折返,而Momentum、RMSProp、Adam均冲过了最优点。

多近似鞍点

曲面公式:$z = 0.4(|x| + |y|) + 0.03 (sin(10x) + sin(10y))$

flow

俯视图:

flow_down

关于Adagrad的特别说明

上面的几张图中,Adagrad看似收敛很慢,但其实这样的对比对于Adagrad来说有点不太公平。

Adagrad的初始learning rate可以配置很高,而上述的对比都是在同一learning rate上进行。并且,Adagrad这种稳定的特性使得其适用于线上海量稀疏数据场景,通过每天的滑动窗口持续训练,Adagrad可以获得更好的效果。


  1. Robbins, Herbert, and Sutton Monro. “A stochastic approximation method.” The annals of mathematical statistics(1951): 400-407.

  2. Qian, Ning. “On the momentum term in gradient descent learning algorithms.” Neural networks 12.1 (1999): 145-151.

  3. McMahan, H. Brendan. “Follow-the-regularized-leader and mirror descent: Equivalence theorems and l1 regularization.” (2011).

  4. Duchi, John, Elad Hazan, and Yoram Singer. “Adaptive subgradient methods for online learning and stochastic optimization.” Journal of Machine Learning Research 12.Jul (2011): 2121-2159.

  5. Tieleman, Tijmen, and Geoffrey Hinton. “Lecture 6.5-rmsprop: Divide the gradient by a running average of its recent magnitude.” COURSERA: Neural networks for machine learning 4.2 (2012): 26-31.

  6. Kingma, Diederik P., and Jimmy Ba. “Adam: A method for stochastic optimization.” arXiv preprint arXiv:1412.6980(2014).