学习需要,总结一些常用优化器。
目录
- 前言
- 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]多种梯度下降优化算法总结分析