zt3ff3n 发表于 2022-1-17 22:10

机器学习中常用的优化器有哪些?

1 梯度下降算法

假设模型参数为,损失函数为,为关于的偏导数,也就是梯度,学习率为https://www.zhihu.com/equation?tex=%5Calpha,则使用梯度下降法更新参数为:

https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%2B1%7D+%3D+%5Ctheta_%7Bt%7D+-+%5Calpha%C2%B7%5Ctriangledown_%7B%5Ctheta%7DJ%28%5Ctheta%29+%5C%5C
梯度下降法目前主要分为三种方法,区别在于每次参数更新时计算的样本数据量不同:批量梯度下降法(BGD, Batch Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及小批量梯度下降法(Mini-batch Gradient Descent)。
样本集合:https://www.zhihu.com/equation?tex=D+%3D+%7B%28x%5E1%2C+y%5E1%29%2C+...%2C+%28x%5Ei%2C+y%5Ei%29%2C+...%2C+%28x%5En%2C+y%5En%29%7D,样本总数为https://www.zhihu.com/equation?tex=n
1.1 批量梯度下降法 BGD


https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%2B1%7D+%3D+%5Ctheta_%7Bt%7D+-+%5Calpha%C2%B7%5Cfrac%7B1%7D%7Bn%7D%C2%B7%5Csum_%7Bi%3D1%7D%5E%7Bi%3Dn%7D%5Ctriangledown_%7B%5Ctheta%7DJ_i%28%5Ctheta%2C+x%5Ei%2C+y%5Ei%29+%5C%5C
每进行一次参数更新,需要计算整个数据样本集,因此导致批量梯度下降法的速度会比较慢,尤其是数据集非常大的情况下,收敛速度就会非常慢,但是由于每次的下降方向为总体平均梯度,它得到的会是一个全局最优解。
1.2 随机梯度下降法 SGD

随机梯度下降法,不像BGD每一次参数更新,需要计算整个数据样本集的梯度,而是每次参数更新时,仅仅选取一个样本。

https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%2B1%7D+%3D+%5Ctheta_%7Bt%7D+-+%5Calpha%C2%B7%5Ctriangledown_%7B%5Ctheta%7DJ_i%28%5Ctheta%2C+x%5Ei%2C+y%5Ei%29+%5C%5C
BGD和SGD是两个极端,SGD由于每次参数更新仅仅需要计算一个样本的梯度,训练速度很快,即使在样本量很大的情况下,可能只需要其中一部分样本就能迭代到最优解,由于每次迭代并不是都向着整体最优化方向,导致梯度下降的波动非常大,更容易从一个局部最优跳到另一个局部最优,准确度下降。
1.3 小批量梯度下降法

小批量梯度下降法就是结合BGD和SGD的折中,对于含有n个训练样本的数据集,每次参数更新,选择一个大小为https://www.zhihu.com/equation?tex=m(m << n)的mini-batch数据样本计算其梯度,其参数更新公式如下:

https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%2B1%7D+%3D+%5Ctheta_%7Bt%7D+-+%5Calpha%C2%B7%5Cfrac%7B1%7D%7Bm%7D%C2%B7%5Csum_%7Bi%3Dx%7D%5E%7Bi%3Dx%2Bm-1%7D%5Ctriangledown_%7B%5Ctheta%7DJ_i%28%5Ctheta%2C+x%5Ei%2C+y%5Ei%29+%5C%5C

[*]选择合适的learning rate比较困难 ,学习率太低会收敛缓慢,学习率过高会使收敛时的波动过大
[*]所有参数都是用同样的learning rate
[*]SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点
2 动量优化法

动量优化方法引入物理学中的动量思想,加速梯度下降,有Momentum和Nesterov两种算法。当我们将一个小球从山上滚下来,没有阻力时,它的动量会越来越大,但是如果遇到了阻力,速度就会变小,动量优化法就是借鉴此思想,使得梯度方向在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能够加快收敛并且减少动荡。
2.1 Momentum

参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向,简言之就是通过积累之前的动量来加速当前的梯度。假设https://www.zhihu.com/equation?tex=m_t表示时刻的动量,https://www.zhihu.com/equation?tex=%5Cmu表示动量因子,通常取值0.9或者近似值,在SGD的基础上增加动量,则参数更新公式如下

https://www.zhihu.com/equation?tex=m_%7Bt%2B1%7D+%3D+%5Cmu%C2%B7m_t+%2B+%5Calpha%C2%B7%5Ctriangledown_%7B%5Ctheta%7DJ%28%5Ctheta%29+%5C%5C
在梯度方向改变时,https://www.zhihu.com/equation?tex=m_%7Bt%2B1%7D变小,https://www.zhihu.com/equation?tex=theta_%7Bt%2B1%7D的变化减小,momentum能够降低参数更新速度,从而减少震荡;在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。总而言之,momentum能够加速SGD收敛,抑制震荡。
2.2 Nesterov accelerated gradient

momentum保留了上一时刻的梯度,对其没有进行任何改变,NAG是momentum的改进,在梯度更新时做一个矫正,具体做法就是在当前的梯度上添加上一时刻的动量https://www.zhihu.com/equation?tex=%5Cmu%C2%B7m_t,梯度改变为https://www.zhihu.com/equation?tex=%5Ctriangledown_%7B%5Ctheta%7DJ%28%5Ctheta-%5Cmu%C2%B7m_t%29。

https://www.zhihu.com/equation?tex=m_%7Bt%2B1%7D+%3D+%5Cmu%C2%B7m_t+%2B+%5Calpha%C2%B7%5Ctriangledown_%7B%5Ctheta%7DJ%28%5Ctheta-%5Cmu%C2%B7m_t%29+%5C%5C


momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)
3 自适应学习率优化算法

在机器学习中,学习率是一个非常重要的超参数,但是学习率是非常难确定的,虽然可以通过多次训练来确定合适的学习率,但是一般也不太确定多少次训练能够得到最优的学习率,玄学事件,对人为的经验要求比较高,所以是否存在一些策略自适应地调节学习率的大小,从而提高训练速度。 目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
定义参数:全局学习率,一般会选择https://www.zhihu.com/equation?tex=%5Cdelta%3D0.01;一个极小的常量,通常取值https://www.zhihu.com/equation?tex=%5Cepsilon%3D10e%5E%7B-8%7D,目的是为了分母不为0; 梯度加速变量(gradient accumulation variable)。
3.1 AdaGrad


https://www.zhihu.com/equation?tex=r+%5Cleftarrow+r+%2B+g%5E2+%5C%5Chttps://www.zhihu.com/equation?tex=%5CDelta%5Ctheta+%5Cleftarrow+%5Cfrac%7B%5Cdelta%7D%7B%5Csqrt%7Br%2B%5Cepsilon%7D%7D%C2%B7g+%5C%5Chttps://www.zhihu.com/equation?tex=%5Ctheta+%5Cleftarrow+%5Ctheta+-+%5CDelta+%5Ctheta+%5C%5C
从上式可以看出,梯度加速变量为时刻前梯度的平方和,https://www.zhihu.com/equation?tex=r%3D%5Csum_%7Bi%3D1%7D%5E%7Bi%3Dt%7D%7Bg_i%5E2%7D,那么参数更新量https://www.zhihu.com/equation?tex=%5CDelta%5Ctheta+%3D+%5Cfrac%7B%5Cdelta%7D%7B%5Csqrt%7B%5Csum_%7Bi%3D1%7D%5E%7Bi%3Dt%7D%7Bg_i%5E2%7D%2B%5Cepsilon%7D%7D%C2%B7g,https://www.zhihu.com/equation?tex=%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Csum_%7Bi%3D1%7D%5E%7Bi%3Dt%7D%7Bg_i%5E2%7D%2B%5Cepsilon%7D%7D看成一个约束项regularizer. 在前期,梯度累计平方和比较小,也就是相对较小,则约束项较大,这样就能够放大梯度, 参数更新量变大; 随着迭代次数增多,梯度累计平方和也越来越大,即r也相对较大,则约束项变小,这样能够缩小梯度,参数更新量变小。
缺点: 1、仍需要手工设置一个全局学习率, 如果设置过大的话,会使regularizer过于敏感,对梯度的调节太大 2、中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习
3.2 Adadelta

Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值

https://www.zhihu.com/equation?tex=n_t+%5Cleftarrow+v%C2%B7n_%7Bt-1%7D%2B%281-v%29%C2%B7g_t%5E2+%5C%5Chttps://www.zhihu.com/equation?tex=%5CDelta%5Ctheta+%5Cleftarrow+%5Cfrac%7B%5Cdelta%7D%7B%5Csqrt%7Bn_t%2B%5Cepsilon%7D%7D%C2%B7g_t+%5C%5C
从上式中可以看出,Adadelta其实还是依赖于全局学习率,用https://www.zhihu.com/equation?tex=E%5Bg%5E%7B2%7D%5D_%7Bt%7D代替https://www.zhihu.com/equation?tex=n_t


最终

https://www.zhihu.com/equation?tex=%5CDelta%5Ctheta+%5Cleftarrow+%5Cfrac%7B%5Csum_%7Bi%3D1%7D%5E%7Bi%3Dt-1%7D%7B%5CDelta%5Ctheta_i%7D%7D%7B%5Csqrt%7BE%5Bg%5E%7B2%7D%5D_%7Bt%7D%2B%5Cepsilon%7D%7D%C2%B7g_t+%5C%5C
此时可以看出Adadelta已经不依赖全局learning rate了。
特点: 1、训练初中期,加速效果不错,很快。 2、训练后期,反复在局部最小值附近抖动。
3.3 RMSprop

RMSProp算法修改了AdaGrad的梯度平方和累加为指数加权的移动平均,使得其在非凸设定下效果更好。设定参数:全局初始率, 默认设为0.001; decay rate https://www.zhihu.com/equation?tex=%5Crho,默认设置为0.9,一个极小的常量,通常为10e-6。


特点: 1、其实RMSprop依然依赖于全局学习率 [公式] 2、RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间 3、适合处理非平稳目标(包括季节性和周期性)——对于RNN效果很好
3.4 Adam: Adaptive Moment Estimation

Adam中动量直接并入了梯度一阶矩(指数加权)的估计。其次,相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。 默认参数值设定为:https://www.zhihu.com/equation?tex=%5Cbeta_1%3D0.9%2C+%5Cbeta_2%3D0.999%2C+%5Cepsilon%3D10%5E%7B-8%7D。

https://www.zhihu.com/equation?tex=m_t%5Cleftarrow%5Cbeta_1%C2%B7m_%7Bt-1%7D%2B%281-%5Cbeta_1%29%C2%B7g_t+%5C%5Chttps://www.zhihu.com/equation?tex=v_t%5Cleftarrow%5Cbeta_2%C2%B7v_%7Bt-1%7D%2B%281-%5Cbeta_2%29%C2%B7g_t%5E2+%5C%5Chttps://www.zhihu.com/equation?tex=%5Chat%7Bm_t%7D%5Cleftarrow%5Cfrac%7Bm_t%7D%7B1-%5Cbeta_1%5Et%7D+%5C%5Chttps://www.zhihu.com/equation?tex=%5Chat%7Bv_t%7D%5Cleftarrow%5Cfrac%7Bv_t%7D%7B1-%5Cbeta_v%5Et%7D+%5C%5Chttps://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%2B1%7D%3D%5Ctheta_t-%5Cfrac%7B%5Cdelta%7D%7B%5Cepsilon%2B%5Csqrt%7B%5Chat%7Bv_t%7D%7D%7D%C2%B7%5Chat%7Bm_t%7D+%5C%5C
其中,分别是对梯度的一阶矩估计和二阶矩估计;https://www.zhihu.com/equation?tex=%5Chat%7Bm_t%7D%2C+%5Chat%7Bv_t%7D是对的偏差校正,这样可以近似为对期望的无偏估计.
特点: 1、Adam梯度经过偏置校正后,每一次迭代学习率都有一个固定范围,使得参数比较平稳。 2、结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点 3、为不同的参数计算不同的自适应学习率 4、也适用于大多非凸优化问题——适用于大数据集和高维空间。
欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~
页: [1]
查看完整版本: 机器学习中常用的优化器有哪些?