深度学习笔记-14.各种优化器Optimizer的总结与比较

转载自:机器学习:各种优化器Optimizer的总结与比较,我觉得单纯的看印象可能不太深,所以采用边看边手动记录一遍的方式以加深印象!里面的公式自己又手动敲了一遍。

目录

一、优化器的作用:

二、各种优化器介绍

2.1 梯度下降法(Gradient Descent)

2.1.1 标准梯度下降法(GD)

2.1.2. 批量梯度下降法(BGD)

2.1.3 随机梯度下降法(SGD)

2.2 动量优化法

2.2.1 Momentum

2.2.2 NAG

2.3 自适应学习率优化算法

2.3.1 AdaGrad算法

2.3.2 RMSProp算法

2.3.3  AdaDelta算法

2.3.4  Adam算法

三、各种优化器的比较

3.1 可视化比较

四、优化器的选择

 

一、优化器的作用:

用来计算更新影响模型训练模型输出网络参数,使其逼近或达到最优值,从而最小化(或最大化)代价函数。

在深度学习中,可通过优化代价函数J来训练神经网络。代价函数为:

                                                       J(W,b)=\sum_{i=1}^{m}L(y^{'i},y^i)

代价函数J的值是预测值y '与实际值y之间损失L的均值。利用网络的权值W和偏置b,在正向传播过程中得到y '值。通过优化算法更新可训练参数W和b的值,从而使代价函数J的值最小化。

 

二、各种优化器介绍

2.1 梯度下降法(Gradient Descent)

梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:

  • 标准梯度下降法(GD, Gradient Descent),
  • 随机梯度下降法(SGD, Stochastic Gradient Descent),
  • 批量梯度下降法(BGD, Batch Gradient Descent)。

2.1.1 标准梯度下降法(GD)

假设要学习训练的模型参数为W,代价函数为J(W),则代价函数关于模型参数的偏导数即相关梯度为ΔJ(W),学习率为\eta _t,则使用梯度下降法更新参数为:
                                             W_{t+1}=W_{t}-\eta _{t}\Delta J(W_{t})              (W_{t}表示t时刻的模型参数)
从表达式来看,模型参数的更新调整,与代价函数中关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。可以形象的表示为:

深度学习笔记-14.各种优化器Optimizer的总结与比较_第1张图片

标准梯度下降法主要有两个缺点:

  1. 训练速度慢:每走一步都要要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本。会使得训练过程极其缓慢,需要花费很长时间才能得到收敛解。
  2. 容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点。落入鞍点,梯度为0,使得模型参数不在继续更新。
     

2.1.2批量梯度下降法(BGD)

假设批量训练样本总数为n,每次输入和输出的样本分别为X^{(i)},Y^{(i)},模型参数为W,代价函数为J(W),每输入一个样本i代价函数关于W的梯度为\Delta J_{i}(W_{t},X^{i},Y^{i}),学习率为\eta _{t},则使用批量梯度下降法更新参数表达式为:
                                        W_{t+1}=W_{t}-\eta _{t}\sum_{i=1}^{n}\Delta J_{i}(W_{t},X^{(i)},Y^{(i)})  ( W_{t}表示t时刻的模型参数。)
从表达式来看,模型参数的调整更新与全部输入样本的代价函数的和(即批量/全局误差)有关。即每次权值调整发生在批量样本输入之后,而不是每输入一个样本就更新一次模型参数。这样就会大大加快训练速度。基本策略可以理解为“在下山之前掌握了附近的地势情况,选择总体平均梯度最小的方向下山”。
批量梯度下降法优缺点:

批量梯度下降法比标准梯度下降法训练时间短,且每次下降的方向都很正确。

2.1.3 随机梯度下降法(SGD)

对比批量梯度下降法,假设从一批训练样本n中随机选取一个样本i_{s}。模型参数为W,代价函数为J(w),梯度为\Delta J(W),学习率为\eta _{t},则使用随机梯度下降法更新参数表达式为:
                                             W_{t+1}=W_{t}-\eta _{t}g_{t}
其中,g_{t}=\Delta J_{i_{s}}(W_{t};X^{i_{s}};Y^{i_{s}})i_{s}\epsilon \left \{ 1,2,...,n \right \}表示随机选择的一个梯度方向W_{t}表示t时刻的模型参数。E(g_{t})=\Delta J(W_{t}),这里虽然引入了随机性和噪声,但期望仍然等于正确的梯度下降。
基本策略可以理解为随机梯度下降像是一个盲人下山,不用每走一步计算一次梯度,但是他总能下到山底,只不过过程会显得扭扭曲曲。

深度学习笔记-14.各种优化器Optimizer的总结与比较_第2张图片

随机梯度下降法优缺点:

  • 优点:虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
  • 缺点:SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。此外,SGD也没能单独克服局部最优解的问题。

2.2 动量优化法

动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。

NAG在Tensorflow中与Momentum合并在同一函数tf.train.MomentumOptimizer中,可以通过参数配置启用。

2.2.1 Momentum

使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD
从训练集中取一个大小为n的小批量\left \{X ^{(1)},X ^{(2)},...,X ^{(n)} \right \}样本,对应的真实值分别为Y^{(i)},则Momentum优化表达式为:
                                                  \left\{\begin{matrix} v_{t}=\alpha v_{t-1}+\eta _{t}\Delta J(W_{t};X^{i_{s}};Y^{i_{s}}) \\\\ W_{t+1}=W_{t}-v_{t} \end{matrix}\right.
其中,v_{t}表示t时刻积攒的加速度。α表示动力的大小,一般取值为0.9(表示最大速度10倍于SGD)。其中,g_{t}=\Delta J_{i_{s}}(W_{t};X^{i_{s}};Y^{i_{s}})i_{s}\epsilon \left \{ 1,2,...,n \right \}表示随机选择的一个梯度方向W_{t}表示t时刻模型参数。
动量主要解决SGD的两个问题:

  • 一是随机梯度的方法(引入的噪声);
  • 二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。

理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。

2.2.2 NAG

牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum动量算法的变种。更新模型参数表达式如下:

                                                   \left\{\begin{matrix} v_{t}=\alpha v_{t-1}+\eta _{t}\Delta J(W_{t}-\alpha v_{t-1}) \\\\ W_{t+1}=W_{t}-v_{t} \end{matrix}\right.

其中,v_{t}表示t时刻积攒的加速度,α表示动力的大小,一般取值为0.9(表示最大速度10倍于SGD),W_{t}表示t时刻模型参数,\Delta J(W_{t}-\alpha v_{t-1})表示代价函数关于W_{t}的梯度

Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子
理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。计算W_t-\alpha v_{t-1}可以表示小球下一个位置大概在哪里。从而可以提前知道下一个位置的梯度,然后使用到当前位置来更新参数。
在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从O(1/k)(k步后)改进到O(1/k^{2})。然而,在随机梯度情况下,Nesterov动量对收敛率的作用却不是很大。

2.3 自适应学习率优化算法

自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。 
目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。

2.3.1 AdaGrad算法

AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。

AdaGrad算法优化策略一般可以表示为:

                                      W_{t+1}=W_{t}-\frac{\eta _{0}}{\sqrt{\sum_{t^{'}=1}^{t}(g_{t^{'}})}+\varepsilon }\bigodot g_{t,i}

假定一个多分类问题,i表示第i个分类,t表示第t次迭代同时也表示分类i累计出现的次数。\eta _{0}表示初始的学习率取值一般为0.01,ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。W_{t}表示t时刻即第tt迭代模型的参数,g_{t,i}=\Delta J(W_{t,i})表示t时刻,指定分类i,代价函数J(\cdot )关于W的梯度。
从表达式可以看出,对出现比较多的类别数据,AdaGrad给予越来越小的学习率,而对于比较少的类别数据,会给予较大的学习率。因此AdaGrad适用于数据稀疏或者分布不平衡的数据集
AdaGrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。

2.3.2 RMSProp算法

RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。

RMSProp算法的一般策略可以表示为:

                                                 \left\{\begin{matrix} E[g^{2}]_t=\alpha E[g^2]_{t-1}+(1-\alpha )g_{t}^{2} \\ \\W_{t+1}=W_t-\frac{\eta _{0}}{\sqrt{{E[g^2]}_t+\epsilon }}\bigodot g_t \end{matrix}\right.

其中,W_t表示t时刻即第t次迭代模型的参数,g_{t}=\Delta J(W_t)表示t次迭代代价函数关于W的梯度大小,E[g^2]_t表示前t次的梯度平方的均值。α表示动力(通常设置为0.9),\eta _0表示全局初始学习率。ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。
RMSProp借鉴了Adagrad的思想,观察表达式,分母为\sqrt{{E[g^2]}_t+\epsilon}由于取了个加权平均避免了学习率越来越低的的问题而且能自适应地调节学习率。RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

2.3.3  AdaDelta算法

AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法结合两种算法每次参数的更新步长即:

                                          \Delta W_{AdaGrad,t}=-\frac{\eta _{0}}{\sqrt{\sum_{t^{'}=1}^{t}(g_{t^{'}})}+\varepsilon }\bigodot g_{t}

                                           \Delta W_{RMSRrop,t}=-\frac{\eta _{0}}{\sqrt{{E[g^2]}_t+\epsilon }}\bigodot g_t

AdaDelta算法策略可以表示为:

                                                 \left\{\begin{matrix} E[g^{2}]_t=\alpha E[g^2]_{t-1}+(1-\alpha )g_{t}^{2} \\\\ \Delta W_t=-\frac{\sqrt{\sum_{i=1}^{t-1}\Delta W_i}}{\sqrt{E[g^2]_t+\epsilon }} \\ \\W_{t+1}=W_t+\Delta W_t \end{matrix}\right.

其中W_t为第t次迭代的模型参数,g_{t}=\Delta J(W_t)为代价函数关于W的梯度。E[g^2]_t表示前t次的梯度平方的均值。\sqrt{\sum_{i=1}^{t-1}\Delta W_i}表示前t−1次模型参数每次的更新步长累加求根
从表达式可以看出,AdaDelta不需要设置一个默认的全局学习率【AdaDelta公式中没有出现\eta _0,但是AdaGrad算法和RMSProp更新步长中有学习率参数】

评价:

  • 在模型训练的初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。
  • 在模型训练的后期,模型会反复地在局部最小值附近抖动。

2.3.4  Adam算法

首先,Adam中动量直接并入了梯度一阶矩(指数加权)的估计。其次,相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。

Adam算法策略可以表示为:

                                                 \left\{\begin{matrix} m_t=\beta _1m_{t-1}+(1-\beta _1)g_t \\\\ v_t=\beta _2v_{t-1}+(1-\beta _2)g_{t}^{2} \\\\ \hat{m_t}=\frac{m_t}{1-\beta _{1}^{t}},\hat{v_t}=\frac{v_t}{1-\beta _{2}^{t}} \\\\ W_{t+1}=W_t-\frac{\eta }{\sqrt{\hat{v_t}}+\varepsilon }\hat{m_t} \end{matrix}\right.

其中,m_tv_t分别为一阶动量项和二阶动量项\beta _1,\beta _2为动力值大小通常分别取0.9和0.999\hat{m_t},\hat{v_t}分别为各自的修正值。W_t表示t时刻即第t次迭代模型的参数,g_{t}=\Delta J(W_t)为代价函数关于W的梯度;ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。

评价:Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。

 

三、各种优化器的比较

终于结束的漫长的理论分析,下面对各种优化器做一些有趣的比较。

3.1 可视化比较

(1) 示例一

深度学习笔记-14.各种优化器Optimizer的总结与比较_第3张图片

上图描述了在一个曲面上,6种优化器的表现,从中可以大致看出:

  • ① 下降速度:三个自适应学习优化器Adagrad、RMSProp与AdaDelta的下降速度明显比SGD要快,其中,Adagrad和RMSProp齐头并进,要比AdaDelta要快。两个动量优化器Momentum和NAG由于刚开始走了岔路,初期下降的慢;随着慢慢调整,下降速度越来越快,其中NAG到后期甚至超过了领先的Adagrad和RMSProp。
  • ② 下降轨迹:SGD和三个自适应优化器轨迹大致相同。两个动量优化器初期走了“岔路”,后期也调整了过来。

(2) 示例二

深度学习笔记-14.各种优化器Optimizer的总结与比较_第4张图片

上图在一个存在鞍点的曲面,比较6中优化器的性能表现,从图中大致可以看出:

  • 三个自适应学习率优化器没有进入鞍点,其中,AdaDelta下降速度最快,Adagrad和RMSprop则齐头并进。
  • 两个动量优化器Momentum和NAG以及SGD都顺势进入了鞍点。但两个动量优化器在鞍点抖动了一会,就逃离了鞍点并迅速地下降,后来居上超过了Adagrad和RMSProp。
  • 很遗憾,SGD进入了鞍点,却始终停留在了鞍点,没有再继续下降。
     

(3) 示例三

深度学习笔记-14.各种优化器Optimizer的总结与比较_第5张图片

上图比较了6种优化器收敛到目标点(五角星)的运行过程,从图中可以大致看出:

① 在运行速度方面

  • 两个动量优化器Momentum和NAG的速度最快,其次是三个自适应学习率优化器AdaGrad、AdaDelta以及RMSProp,最慢的则是SGD。

② 在收敛轨迹方面

  • 两个动量优化器虽然运行速度很快,但是初中期走了很长的”岔路”。
  • 三个自适应优化器中,Adagrad初期走了岔路,但后来迅速地调整了过来,但相比其他两个走的路最长;AdaDelta和RMSprop的运行轨迹差不多,但在快接近目标的时候,RMSProp会发生很明显的抖动。
  • SGD相比于其他优化器,走的路径是最短的,路子也比较正。
     

四、优化器的选择

那种优化器最好?该选择哪种优化算法?目前还没能够达达成共识。Schaul et al (2014)展示了许多优化算法在大量学习任务上极具价值的比较。虽然结果表明,具有自适应学习率的优化器表现的很鲁棒,不分伯仲,但是没有哪种算法能够脱颖而出。
目前,最流行并且使用很高的优化器(算法)包括SGD、具有动量的SGD、RMSprop、具有动量的RMSProp、AdaDelta和Adam。在实际应用中,选择哪种优化器应结合具体问题;同时,也优化器的选择也取决于使用者对优化器的熟悉程度(比如参数的调节等等)。

Tensorflow中封装了一系列的优化器:

1. tf.train.GradientDescentOptimizer
2. tf.train.AdadeltaOptimizer
3. tf.train.AdagradOptimizer
4. tf.train.AdagradDAOptimizer
5. tf.train.MomentumOptimizer
6. tf.train.AdamOptimizer
7. tf.train.FtrlOptimizer
8. tf.train.ProximalGradientDescentOptimizer
9. tf.train.ProximalAdagradOptimizer
10. tf.train.RMSPropOptimizer

你可能感兴趣的:(#,DL学习笔记)