学习需要,总结一些常用优化器。
目录
- 前言
- SGD:随机梯度下降
- BGD:批量梯度下降
- MBGD:小批量梯度下降
- Momentum
- AdaGrad
- RMSprop
- Adam: Adaptive Moment Estimation
- AdamW
- 参考文章
前言
优化器的本质是使用不同的策略进行参数更新。常用的方法就是梯度下降,那梯度下降是指在给定待优化的模型参数 θ ∈ R d \theta \in R^d θ∈Rd,和目标函数 J ( θ ) J(\theta) J(θ),算法通过沿梯度 ∇ J ( θ ) \nabla J(\theta) ∇J(θ)的反方向更新权重 θ \theta θ,来最小化目标函数。
学习率 μ \mu μ决定了每一时刻的更新步长。对于每一个时刻 t ,我们可以用下述公式描述梯度下降的流程:
θ t + 1 = θ t − μ ∇ J ( θ ) \theta_{t+1} = \theta_{t} - \mu \nabla J(\theta) θt+1=θt−μ∇J(θ)
梯度下降法目前主要分为三种方法,区别在于每次参数更新时计算的样本数据量不同:批量梯度下降法(BGD, Batch Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及小批量梯度下降法(Mini-batch Gradient Descent)。
SGD:随机梯度下降
随机梯度下降是指在一个批次的训练样本中,我随机挑选一个样本计算其关于目标函数的梯度,然后用此梯度进行梯度下降。
设选择的样本为 ( x i , y i ) (x^i,y^i) (xi,yi),首先计算其梯度 ∇ J ( θ , x i , y i ) \nabla J(\theta,x^i,y^i) ∇J(θ,xi,yi),然后进行权值更新:
θ t + 1 = θ t − μ ∇ J ( θ , x i , y i ) \theta_{t+1} = \theta_{t} - \mu \nabla J(\theta,x^i,y^i) θt+1=θt−μ∇J(θ,xi,yi)
SGD的优点是实现简单、效率高,缺点是收敛速度慢、容易陷入局部最小值;迭代次数多
BGD:批量梯度下降
与SGD对应的,BGD是对整个批次的训练样本都进行梯度计算。
设批样本为 { ( x 1 , y 1 ) , . . . , ( x n , y n ) } \{(x^1,y^1),..., (x^n,y^n)\} {(x1,y1),...,(xn,yn)},首先计算所有的样本梯度的平均值 1 n ∑ i = 1 n ∇ J ( θ , x i , y i ) \frac{1}{n} \sum _{i=1} ^{n} \nabla J(\theta,x^i,y^i) n1∑i=1n∇J(θ,xi,yi),然后进行梯度更新:
θ t + 1 = θ t − μ 1 n ∑ i = 1 n ∇ J ( θ , x i , y i ) \theta_{t+1} = \theta_{t} - \mu \frac{1}{n} \sum _{i=1} ^{n} \nabla J(\theta,x^i,y^i) θt+1=θt−μn1i=1∑n∇J(θ,xi,yi)
BGD得到的是一个全局最优解,但是每迭代一步,都要用到训练集的所有数据,如果样本数巨大大,那上述公式迭代起来则非常耗时,模型训练速度很慢;迭代次数少
MBGD:小批量梯度下降
是BGD和SGD的折中,从训练样本中选取一小批样本进行梯度计算,然后更新梯度:
θ t + 1 = θ t − μ 1 b ∑ i = 1 b ∇ J ( θ , x i , y i ) \theta_{t+1} = \theta_{t} - \mu \frac{1}{b} \sum _{i=1} ^{b} \nabla J(\theta,x^i,y^i) θt+1=θt−μb1i=1∑b∇J(θ,xi,yi)
Momentum
指数加权移动平均是一种常用的序列数据处理方式,用于描述数值的变化趋势,本质上是一种近似求平均的方法。计算公式如下:
v t = β v t − 1 + ( 1 − β ) θ t v_t=βv _{t−1}+(1−β)θ_t vt=βvt−1+(1−β)θt
v t v_t vt 表示第t个数的估计值, β \beta β为一个可调参数,能表示 v t − 1 v_{t-1} vt−1 的权重, θ t \theta_t θt 表示第t个数的实际值
Momentum就是在普通的梯度下降法中引入指数加权移动平均,即定义一个动量,它是梯度的指数加权移动平均值,然后使用该值代替原来的梯度方向来更新。定义的动量为:
v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ t ) v_t=βv _{t−1}+(1−β)\nabla_{ \theta} J(\theta_t) vt=βvt−1+(1−β)∇θJ(θt)
因此梯度下降表达式为:
θ t + 1 = θ t − η v t \theta_{t+1}=\theta_{t} - η v_t θt+1=θt−ηvt
普通的随机梯度下降法中,由于无法计算损失函数的确切导数,嘈杂的数据会使下降过程并不朝着最佳方向前进,使用加权平均能对嘈杂数据进行一定的屏蔽,使前进方向更接近实际梯度。此外,随机梯度下降法在局部极小值极有可能被困住,但Momentum由于下降方向由最近的一些数共同决定,能在一定程度反应总体的最佳下降方向,所以被困在局部最优解的可能会减小。
AdaGrad
Adagrad是对学习率进行了一个约束,对于经常更新的参数,由于已经积累了大量关于它的知识,不希望被单个样本影响太大,所以希望学习速率慢一些;对于偶尔更新的参数,由于了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即需要学习率大一些。
该方法开始使用二阶动量,才意味着“自适应学习率”优化算法时代的到来。二阶动量是用来度量历史更新频率的,即迄今为止所有梯度值的平方和。二阶动量越大,学习率就越小,这一方法在稀疏数据场景下表现非常好。
v t = ∑ i = 1 n g t 2 v_{t} = \sum _{i=1} ^{n} g^2_t vt=i=1∑ngt2
θ t + 1 = θ t − η v t + ϵ \theta_{t+1}=\theta_{t} - \frac{η}{\sqrt{v_t+ \epsilon}} θt+1=θt−vt+ϵη
缺点:
仍需要手工设置一个全局学习率 , 如果 设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习
RMSprop
RMSProp算法修改了AdaGrad的梯度平方和累加为指数加权的移动平均,还将学习速率除以平方梯度的指数衰减平均值,使得其在非凸设定下效果更好。设定参数:全局初始率η默认设为0.001,decay rate β \beta β,默认设置为0.9,一个极小的常量 ,通常为10e-6。E是取期望的意思。
E [ g 2 ] t = β E [ g 2 ] t + ( 1 − β 1 ) g t 2 E[g^2]_t = \beta E[g^2]_t+(1-\beta _{1})g^2_{t} E[g2]t=βE[g2]t+(1−β1)gt2
θ t + 1 = θ t − η E [ g 2 ] t + ϵ g t \theta_{t+1}=\theta_{t} - \frac{η}{\sqrt{E[g^2]_t}+ \epsilon}g_t θt+1=θt−E[g2]t+ϵηgt
Adam: Adaptive Moment Estimation
对AdaGrad的优化,一种通过计算模型参数的梯度以及梯度平方的加权平均值(一阶动量和二阶动量),来调整模型的参数。
g t = ∇ θ J ( θ t ) g_t = \nabla_{ \theta} J(\theta_t) gt=∇θJ(θt)
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta _{ 1}m_{t-1} + (1-\beta _{1})g_{t} mt=β1mt−1+(1−β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta _{2}v_{t-1} + (1-\beta _{2})g^2_{t} vt=β2vt−1+(1−β2)gt2
m t ^ = m t 1 − β 1 t \hat{m_t}=\frac{m_t}{1-\beta^t_{1}} mt^=1−β1tmt
v t ^ = v t 1 − β 2 t \hat{v_t}=\frac{v_t}{1-\beta^t_{2}} vt^=1−β2tvt
θ t + 1 = θ t − η v t ^ + ϵ m t ^ \theta_{t+1}=\theta_{t} - \frac{η}{\sqrt{\hat{v_t}}+ \epsilon}\hat{m_t} θt+1=θt−vt^+ϵηmt^
其中,各个变量含义如下:
g t g_t gt:模型参数在第t次迭代时的梯度,
m t 和 v t m_t和v_t mt和vt:模型参数在第t次迭代时的一阶动量和二阶动量,
β 1 和 β 2 \beta _{1}和\beta _{2} β1和β2:超参数(默认是0.9和0.999),
β 1 t 和 β 2 t \beta _{1}^{t}和\beta _{2}^{t} β1t和β2t: β 1 \beta _{1} β1和 β 2 \beta _{2} β2的t次方。
m t ^ \hat{m_t} mt^和 v t ^ \hat{v_t} vt^ t是梯度的偏差纠正后的移动平均值
Adam优化器的主要优点是它能够自适应地调整每个参数的学习率,从而提高模型的收敛速度和泛化能力。
AdamW
Adam 虽然收敛速度快,但没能解决参数过拟合的问题。学术界讨论了诸多方案,其中包括在损失函数中引入参数的 L2 正则项。这样的方法在其他的优化器中或许有效,但会因为 Adam 中自适应学习率的存在而对使用 Adam 优化器的模型失效(因为正则项同时存在于adam的分子和分母,参考adam的公式,这样正则就抵消了)。AdamW就是在Adam+L2正则化的基础上进行改进的算法。
以往的L2正则是直接加在损失函数上,比如加入正则,损失函数变化如下:
L l 2 ( θ ) = L ( θ ) + 1 2 λ ∣ ∣ θ ∣ ∣ 2 L_{l_2}(\theta)=L(\theta) + \frac{1}{2}λ||\theta||^2 Ll2(θ)=L(θ)+21λ∣∣θ∣∣2
图片中红色是上述的Adam+L2 regularization的方式,绿色就是adamw即Adam + weight decay的方式。
为什么这么做?bert给出的解释是
参考文章
[1] 梯度下降优化算法Momentum
[2]多种梯度下降优化算法总结分析