转载自:机器学习:各种优化器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的值是预测值y '与实际值y之间损失L的均值。利用网络的权值W和偏置b,在正向传播过程中得到y '值。通过优化算法更新可训练参数W和b的值,从而使代价函数J的值最小化。
梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:
假设要学习训练的模型参数为W,代价函数为J(W),则代价函数关于模型参数的偏导数即相关梯度为ΔJ(W),学习率为,则使用梯度下降法更新参数为:
(表示t时刻的模型参数)
从表达式来看,模型参数的更新调整,与代价函数中关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。可以形象的表示为:
标准梯度下降法主要有两个缺点:
假设批量训练样本总数为n,每次输入和输出的样本分别为,模型参数为,代价函数为,每输入一个样本i代价函数关于的梯度为,学习率为,则使用批量梯度下降法更新参数表达式为:
( 表示t时刻的模型参数。)
从表达式来看,模型参数的调整更新与全部输入样本的代价函数的和(即批量/全局误差)有关。即每次权值调整发生在批量样本输入之后,而不是每输入一个样本就更新一次模型参数。这样就会大大加快训练速度。基本策略可以理解为“在下山之前掌握了附近的地势情况,选择总体平均梯度最小的方向下山”。
批量梯度下降法优缺点:
批量梯度下降法比标准梯度下降法训练时间短,且每次下降的方向都很正确。
对比批量梯度下降法,假设从一批训练样本n中随机选取一个样本。模型参数为,代价函数为,梯度为,学习率为,则使用随机梯度下降法更新参数表达式为:
其中,, 表示随机选择的一个梯度方向,表示t时刻的模型参数。,这里虽然引入了随机性和噪声,但期望仍然等于正确的梯度下降。
基本策略可以理解为随机梯度下降像是一个盲人下山,不用每走一步计算一次梯度,但是他总能下到山底,只不过过程会显得扭扭曲曲。
随机梯度下降法优缺点:
动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。
NAG在Tensorflow中与Momentum合并在同一函数tf.train.MomentumOptimizer中,可以通过参数配置启用。
使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。
从训练集中取一个大小为n的小批量样本,对应的真实值分别为,则Momentum优化表达式为:
其中,表示t时刻积攒的加速度。α表示动力的大小,一般取值为0.9(表示最大速度10倍于SGD)。其中,, 表示随机选择的一个梯度方向。表示t时刻模型参数。
动量主要解决SGD的两个问题:
理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。
牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum动量算法的变种。更新模型参数表达式如下:
其中,表示t时刻积攒的加速度,α表示动力的大小,一般取值为0.9(表示最大速度10倍于SGD),表示t时刻模型参数,表示代价函数关于的梯度。
Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子。
理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。计算可以表示小球下一个位置大概在哪里。从而可以提前知道下一个位置的梯度,然后使用到当前位置来更新参数。
在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从(k步后)改进到。然而,在随机梯度情况下,Nesterov动量对收敛率的作用却不是很大。
自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。
目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。
AdaGrad算法优化策略一般可以表示为:
假定一个多分类问题,i表示第i个分类,t表示第t次迭代同时也表示分类i累计出现的次数。表示初始的学习率取值一般为0.01,ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。表示t时刻即第tt迭代模型的参数,表示t时刻,指定分类i,代价函数关于的梯度。
从表达式可以看出,对出现比较多的类别数据,AdaGrad给予越来越小的学习率,而对于比较少的类别数据,会给予较大的学习率。因此AdaGrad适用于数据稀疏或者分布不平衡的数据集。
AdaGrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。
RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。
RMSProp算法的一般策略可以表示为:
其中,表示t时刻即第t次迭代模型的参数,表示t次迭代代价函数关于的梯度大小,表示前t次的梯度平方的均值。α表示动力(通常设置为0.9),表示全局初始学习率。ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。
RMSProp借鉴了Adagrad的思想,观察表达式,分母为。由于取了个加权平均,避免了学习率越来越低的的问题,而且能自适应地调节学习率。RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法结合两种算法每次参数的更新步长即:
AdaDelta算法策略可以表示为:
其中为第t次迭代的模型参数,为代价函数关于的梯度。表示前t次的梯度平方的均值。表示前t−1次模型参数每次的更新步长累加求根。
从表达式可以看出,AdaDelta不需要设置一个默认的全局学习率【AdaDelta公式中没有出现,但是AdaGrad算法和RMSProp更新步长中有学习率参数】。
评价:
首先,Adam中动量直接并入了梯度一阶矩(指数加权)的估计。其次,相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。
Adam算法策略可以表示为:
其中,和分别为一阶动量项和二阶动量项。为动力值大小通常分别取0.9和0.999;,分别为各自的修正值。表示t时刻即第t次迭代模型的参数,为代价函数关于的梯度;ϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。
评价:Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
终于结束的漫长的理论分析,下面对各种优化器做一些有趣的比较。
(1) 示例一
上图描述了在一个曲面上,6种优化器的表现,从中可以大致看出:
(2) 示例二
上图在一个存在鞍点的曲面,比较6中优化器的性能表现,从图中大致可以看出:
(3) 示例三
上图比较了6种优化器收敛到目标点(五角星)的运行过程,从图中可以大致看出:
① 在运行速度方面
② 在收敛轨迹方面
那种优化器最好?该选择哪种优化算法?目前还没能够达达成共识。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