先修知识:
- 牛顿法和拟牛顿法 可以看我之前写的文章:https://blog.csdn.net/weixin_41332009/article/details/113112026
1. 梯度下降法(Gradient Descent)
梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent)。
1.1 标准梯度下降法(GD)
- 假设要学习训练的模型参数为W,loss为J(W),则loss关于模型参数的偏导数,即梯度为,学习率为η,则使用梯度下降法更新参数为:
若参数是多元()的,则梯度为:
- 从表达式来看,模型参数的更新调整,与loss关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。
- 基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。可以形象的表示为:
上图中,红色部分代表损失函数 J(W) 比较大的地方,蓝色部分是损失函数小的地方。我们需要让J(W)的值尽量的低,也就是达到深蓝色的部分。w1,w2表示W向量的两个维度。
评价:标准梯度下降法主要有两个缺点:
- 训练速度慢:每走一步都要在整个训练集上计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每次迭代都要遍历所有的样本,会使得训练过程及其缓慢。
- 容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点。落入鞍点,梯度为0,使得模型参数不在继续更新。
1.2 随机梯度下降法(SGD)
每次只取一个样本计算梯度,并更新权重。这里虽然引入了随机性和噪声,但期望仍然等于正确的梯度下降。
评价:
- 优点:
- 虽然SGD需要走很多步,但是计算梯度快。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。
- 应用大型数据集时,训练速度很快。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
- 缺点:
- SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
- 此外,SGD也没能单独克服局部最优解的问题。
1.3 小批量梯度下降(BGD)
- 每次批量输入BATCH_SIZE个样本,模型参数的调整更新与全部BATCH_SIZE个输入样本的代价函数之和有关。即每次权值调整发生在批量样本输入之后,而不需要遍历整个数据集。这样就会大大加快训练速度。
- 基本策略可以理解为,在下山之前掌握了附近的地势情况,选择总体平均梯度最小的方向下山。
评价:
- 批量梯度下降法比标准梯度下降法训练时间短,且每次下降的方向都很正确。
关于梯度下降的Q/A
Q: 梯度下降法找到的一定是下降最快的方向么?
A:梯度下降法并不是下降最快的方向,它只是目标函数在当前的点的切平面(当然高维问题不能叫平面)上下降最快的方向。在实际使用中,牛顿方向(考虑海森矩阵)才一般被认为是下降最快的方向,可以达到superlinear的收敛速度。梯度下降类的算法的收敛速度一般是linear甚至sublinear的。关于牛顿法在这里:https://blog.csdn.net/weixin_41332009/article/details/113112026
但是为什么在一般问题里梯度下降比牛顿类算法更常用呢?因为对于规模比较大的问题,Hessian计算是非常耗时的;同时对于很多对精度需求不那么高的问题,梯度下降的收敛速度已经足够了。而这也motivate了一类quasi-Newton算法,可以在规避Hessian计算的前提下达到于牛顿类算法差不多的收敛速度。
非线性规划当前的一个难点在于处理非凸问题的全局解,而搜索全局解这个问题一般的梯度下降也无能为力。
Q: 牛顿法和梯度下降法对比:
A: a)从收敛速度上看 ,牛顿法是二阶收敛,梯度下降是一阶收敛,前者牛顿法收敛速度更快。但牛顿法仍然是局部算法,只是在局部上看的更细致: 梯度法仅考虑方向,牛顿法不但考虑了方向还兼顾了步子的大小,其对步长的估计使用的是二阶逼近。
b) 牛顿法每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
2. 动量优化法
动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。
2.1 momentum
和SGD不同的是,Momentum的“梯度”不仅包含了这一步实际算出来的梯度,还包括了上一次的梯度“惯性”
特点:
- 下降初期时,使用上一次参数更新,下降方向一致
- 下降中后期时,在局部最小值来回震荡的时候,,但是由于具有上一次的动量,所以能够跳出陷阱
- 在梯度改变方向的时候,由于具有上一次的动量,所以会“往回掰”一点,抑制震荡。
总而言之,momentum项能够在原先方向加速SGD,抑制振荡,从而加快收敛
由于当前梯度的改变会受到上一次梯度改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。
2.2 NAG
- 牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum动量算法的变种
nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。
所以,加上nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。如下图:
momentum首先计算一个梯度(短的蓝色向量),然后在原先梯度的方向(惯性)进行一个大的跳跃(长的蓝色向量)
nesterov项首先在原先梯度的方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色向量)
3. 自适应学习率优化算法
自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。
目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
3.1 AdaGrad算法
Adagrad其实是对学习率进行了一个约束。即:
(更正:应是)
特点:
- 前期较小的时候,learning rate较大,能够放大梯度
- 后期较大的时候,learning rate较小,能够约束梯度
缺点:
- 由公式可以看出,仍依赖于人工设置一个全局学习率
- 一开始分母太小,所以lr太大,对梯度的调节太大
- 中后期,分母上梯度平方的累加将会越来越大,使学习率趋近于0,使得训练提前结束
3.2 RMSProp算法
思想:
- RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,避免了学习率越来越低的的问题。
- RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
3.3 AdaDelta算法
思想:AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法结合两种算法每次参数的更新步长即:
从表达式可以看出,AdaDelta不需要设置一个默认的全局学习率。
评价:
- 在模型训练的初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。
- 在模型训练的后期,模型会反复地在局部最小值附近抖动。
4. Adam算法
思想:
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定
范围。
算法描述:
评价:Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,
各种优化器的比较
终于结束的漫长的理论分析,下面对各种优化器做一些有趣的比较。
1. 可视化比较
(1) 示例一
上图描述了在一个曲面上,6种优化器的表现,从中可以大致看出:
① 下降速度:
- 三个自适应学习优化器Adagrad、RMSProp与AdaDelta的下降速度明显比SGD要快,其中,Adagrad和RMSProp齐头并进,要比AdaDelta要快。
- 两个动量优化器Momentum和NAG由于刚开始走了岔路,初期下降的慢;随着慢慢调整,下降速度越来越快,其中NAG到后期甚至超过了领先的Adagrad和RMSProp。
② 下降轨迹:
- SGD和三个自适应优化器初期轨迹大致相同。两个动量优化器初期走了“岔路”,后期也调整了过来。
(2) 示例二
上图在一个存在鞍点的曲面,比较6中优化器的性能表现,从图中大致可以看出:
- 三个自适应学习率优化器没有进入鞍点,其中,AdaDelta下降速度最快,Adagrad和RMSprop则齐头并进。
- 两个动量优化器Momentum和NAG以及SGD都顺势进入了鞍点。但两个动量优化器在鞍点抖动了一会,就逃离了鞍点并迅速地下降,后来居上超过了Adagrad和RMSProp。
- 很遗憾,SGD进入了鞍点,却始终停留在了鞍点,没有再继续下降。
(3) 示例三
上图比较了6种优化器收敛到目标点(五角星)的运行过程,从图中可以大致看出:
① 在运行速度方面
- 两个动量优化器Momentum和NAG的速度最快,其次是三个自适应学习率优化器AdaGrad、AdaDelta以及RMSProp,最慢的则是SGD。
② 在收敛轨迹方面
- 两个动量优化器虽然运行速度很快,但是初中期走了很长的”岔路”。
- 三个自适应优化器中,Adagrad初期走了岔路,但后来迅速地调整了过来,但相比其他两个走的路最长;AdaDelta和RMSprop的运行轨迹差不多,但在快接近目标的时候,RMSProp会发生很明显的抖动。
- SGD相比于其他优化器,走的路径是最短的,路子也比较正。
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