1、什么是优化器
优化器用来寻找模型的最优解。
2、常见优化器
2.1. 批量梯度下降法BGD(Batch Gradient Descent)
2.1.1、BGD表示
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
-
假设要学习训练的模型参数为W,代价函数为J(W),则代价函数关于模型参数的偏导数即相关梯度为ΔJ(W),学习率为ηt,则使用梯度下降法更新参数为:
Wt+1=Wt−ηtΔJ(Wt)
其中,Wt表示tt时刻的模型参数。 - 从表达式来看,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。
- 基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。
2.1.2、BGD优缺点
-
训练速度慢:每走一步都要要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本。会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。
-
容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点。落入鞍点,梯度为0,使得模型参数不在继续更新。
2.2、随机梯度下降(SGD)
2.2.1、SGD表示
和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况,那么可能只用其中部分的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。缺点是SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。所以虽然训练速度快,但是准确度下降,并不是全局最优。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
2.2.2、SGD优缺点
优点:
-
引入噪声,增加模型的鲁棒性。虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。
- 应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
缺点:
- SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
- 此外,SGD也没能单独克服局部最优解的问题。
- SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。
- BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。
- 当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
2.3、批量梯度下降MBGD(Mini-Batch Gradient Descent)
2.3.1、MBGD梯度下降表示
梯度更新规则:
MBGD 每一次利用一小批样本,即 n(50-256) 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
2.3.2、MBGD优缺点
优点:
- 批量梯度下降法比标准梯度下降法训练时间短,且每次下降的方向都很正确。
- 可以降低参数更新时的方差,收敛更稳定。
- 可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
缺点:
- 不能保证很好的收敛。不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)
- 可能陷入鞍点或局部最小点。对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
- 应用同样的 learning rate,不能适应所有的参数。如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。
2.4、动量梯度下降法Momentum(Batch Gradient Descent Momentum)
2.4.1、Momentum描述
SGD的梯度下降过程,类似于一个小球从山坡上滚下,它的前进方向由当前山坡的最大倾斜方向与之前的下降方向共同决定,小球具有初速度(动量),不只被梯度制约。SGDM克服了之前SGD易震荡的缺点。使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。
2.4.2、Momentum优缺点
优点:
1、引入积攒的历史梯度信息动量加速参数更新
2、一定程度解决了SGD易震荡的问题
缺点:
1、全过程使用了相同的学习率
2、在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。
2.5、牛顿加速梯度NAG(Nesterov accelerated gradient)
2.5.1、NAG描述
NAG是Momentum动量算法的变种。更新模型参数表达式如下:
- Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子。
- 理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。计算Wt−αvt−1可以表示小球下一个位置大概在哪里。从而可以提前知道下一个位置的梯度,然后使用到当前位置来更新参数。
2.5.2、NAG优缺点
优点
在momentun SGD基础上添加了一个校正因子,避免盲目跟从梯度下降方向
缺点
固定学习率
2.6、AdaGrad
自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。这类算法可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性。
AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。
梯度更新规则:
- 从表达式可以看出,对出现比较频繁的特征,Adagrad给予越来越小的学习率,而对于比较少的特征,会给予较大的学习率。因此Adagrad适用于数据稀疏或者分布不平衡的数据集。
2.6.2、Adagrad优缺点
优点:
Adagrad适用于数据稀疏或者分布不平衡的数据集
Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;
缺点:
随着迭代次数增多,学习率会越来越小,最终会趋近于0。
2.7、RMSProp
2.7.1、RMSProp描述
RMSProp是对Adagrad的一个改进,它解决了Adagrad优化过程中学习率 η 单调减少问题。Adadelta不再对过去的梯度平方进行累加,而是改用加权平均
2.7.2、RMSProp优缺点
优点
不再对过去的梯度平方进行累加,通过指数衰减平均值,解决了Adagrad学习率单调递减问题
缺点
需指定全局学习率
2.8、AdaDelta算法
2.8.1、AdaDelta描述
思想:AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法结合两种算法每次参数的更新步长
2.8.2、AdaDelta优缺点
优点
结合adgrad和rmsprob算法,通过前t-1累加梯度指定学习率,无需指定全局学习率
缺点
在优化前期和中期效果较好,后期在局部最小点震荡。
2.9、Adam
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum,除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值
3、选择策略
-
如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
- RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。
- Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,
- 随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
- 整体来讲,Adam 是最好的选择。
- 很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
- 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。
参考博文
https://blog.csdn.net/weixin_40170902/article/details/80092628(优化器详细介绍,公式及优缺点)
https://zhuanlan.zhihu.com/p/58236906 (优化器详细介绍)
https://www.cnblogs.com/guoyaohua/p/8542554.html (BGD,SGD,MSGD讲的比较详细的博文)
https://www.jiqizhixin.com/graph/technologies/fa50298e-1a85-4af0-ae96-a82708f4b610(提出了几点选择规则)