深度学习:常用优化器Optimizer简介
- 随机梯度下降SGD
- 带动量的随机梯度下降SGD-Momentum
- SGDW
- Adam
- AdamW
随机梯度下降SGD
梯度下降算法是使权重参数沿着整个训练集的梯度方向下降,但往往深度学习的训练集规模很大,计算整个训练集的梯度需要很大的计算量,为了减少计算量加速训练,在此基础上演化出随机梯度下降算法(SGD),沿着随机选取的小批量数据的梯度方向下降。
假设权重记作
w
w
w,学习率为
α
\alpha
α,随机选取小批量样本计算梯度
d
w
dw
dw,模型在更新权重的公式如下:
w
t
+
1
=
w
t
−
α
×
d
w
t
w_{t+1} = w_t - \alpha \times dw_t
wt+1=wt−α×dwt
带动量的随机梯度下降SGD-Momentum
虽然随机梯度下降是一种很受欢迎的优化方法,但其学习过程有时比较慢,引入动量momentum旨在提高收敛速度和收敛精确度,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。
动量是深度学习训练中,一个用于更新模型参数的超参数,假设记作mu,则引入动量的随机梯度下降算法公式为:
v
t
=
m
u
×
v
t
−
1
−
α
t
×
d
w
t
v_t = mu \times v_{t-1} - \alpha_t \times dw_t
vt=mu×vt−1−αt×dwt
w
t
+
1
=
w
t
+
v
t
w_{t+1} = w_t + v_t
wt+1=wt+vt
其中,v初始化为0,mu一般的取值为0.5、0.9、0.99等。
要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。前者能够加速收敛,后者能够减小摆动,提高收敛精确度。
SGDW
weight decay(权值衰减)的使用既不是为了提高收敛精确度也不是为了提高收敛速度,其最终目的是防止过拟合。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度防止过拟合,若weight decay很大,则复杂的模型损失函数的值也就大。
SGDW 即 SGD+ Weight decate。SGDW直接将正则项的梯度加入反向传播的公式中,而不是loss函数。
详细算法可参照:
Adam
Adam是一种自适应优化器,对超参数的选择较为鲁棒。SGD-Momentum在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。Adam则是把一阶动量和二阶动量都用起来了。
一阶动量:
m
t
=
β
1
×
m
t
−
1
+
(
1
−
β
1
)
×
d
w
t
m_t = \beta_1 \times m_{t-1} + (1-\beta_1) \times dw_t
mt=β1×mt−1+(1−β1)×dwt
二阶动量:
v
t
=
β
2
×
v
t
−
1
+
(
1
−
β
2
)
×
d
2
w
t
v_t = \beta_2 \times v_{t-1} + (1-\beta_2) \times d^2w_t
vt=β2×vt−1+(1−β2)×d2wt
β
1
\beta_1
β1和
β
2
\beta_2
β2是Adam的两个超参数。
详细算法可参照Adam原始论文:
AdamW
AdamW在Adam的基础上发展而来的一种自适应优化器。AdamW 即 Adam + Weight decate ,效果与 Adam + L2正则化相同,但是计算效率更高,因为L2正则化需要在loss中加入正则项,之后再算梯度,最后在反向传播,而AdamW直接将正则项的梯度加入反向传播的公式中,省去了手动在loss中加正则项这一步。
详细算法可参照AdamW原始论文: