在对模型优化时,希望通过梯度下降法使得模型的损失函数降低。目前主要的梯度下降法有 SGD、Momentum、Adagrad、RMSProp、Adam几种,接下来将详细讨论这几种方法以及他们的优缺点。
1 SGD
随机选取一个样本的损失来近似整体样本的平均损失,SGD在进行参数更新时的计算方式为
Θ
t
=
Θ
t
−
1
−
α
g
t
\Theta_t = \Theta_{t-1} - \alpha g_t
Θt=Θt−1−αgt
其优点在于:
- 收敛速度快。
其缺陷在于:
- 容易收敛到局部最优,或被困在鞍点。
- 对初始学习率的选择依赖度较高,因该算法参数的更新幅度固定,无法主动随着迭代次数更新。
- 各方向学习率相同,但在实际情形中这种方式并不合理。
2 Momentum
对于鞍点或是局部最优点,因各方向在该点的梯度均为0,因此SGD算法没有能力从该点逃离。为了解决这一缺陷,Momentum算法被提出。
Momentum算法模拟物理学中的动量这一概念,它模拟的是物体运动的惯性。即参数在更新时,在一定程度上保留之前更新的方向,对当前的更新方向进行微调。
记
g
t
g_t
gt 为当前时刻的梯度,Momentum在进行参数更新时的计算方式为
v
t
=
γ
v
t
−
1
+
α
g
t
v_t = \gamma v_{t-1} + \alpha g_t
vt=γvt−1+αgt
Θ t = Θ t − 1 − v t \Theta_t = \Theta_{t-1} - v_t Θt=Θt−1−vt
对比SGD算法,其优点在于:
- 参数的更新方向与上一时刻一致时,能增大参数的更新幅度,模型能学习的更快。
- 同时,该方法具有一定摆脱局部最优的能力。
- 对初始学习率的选择要求没那么高。
其缺陷在于:
- 没解决各方向学习率相同的问题。
3 Adagrad
Adagrad算法是针对SGD在各方向学习率相同的缺点进行的改进,该算法在进行参数更新时的计算方式为
Θ
t
,
i
=
Θ
t
−
1
,
i
−
α
G
t
,
i
+
ϵ
g
t
,
i
\Theta_{t,i} = \Theta_{t-1,i} - \frac{\alpha}{\sqrt{G_{t,i}+\epsilon}}g_{t,i}
Θt,i=Θt−1,i−Gt,i+ϵαgt,i
G t , i = ∑ k = 1 t g k , i 2 G_{t,i} = \sum_{k=1}^t{g_{k,i}^2} Gt,i=k=1∑tgk,i2
其中
- 下标 i i i 表示参数的第 i i i 个方向。
- G t , i G_{t,i} Gt,i 表示参数此前 t t t 轮在第 i i i 个方向上梯度平方和。
- 引入 ϵ \epsilon ϵ 是为了防止出现分母为0的情况。
该算法的缺陷在于:
- 缺乏摆脱局部困境的能力。
- 随着 G t G_t Gt 的累积,训练中后期分母将越来越大、从而梯度趋近于0,使得训练提前结束。
4 RMSProp
RMSProp算法是针对Adagrad梯度下降过快的缺陷进行的改进,该算法在进行参数更新时的计算方式为
Θ
t
=
Θ
t
−
1
−
α
G
t
+
ϵ
g
t
,
i
\Theta_{t} = \Theta_{t-1} - \frac{\alpha}{\sqrt{G_{t}+\epsilon}}g_{t,i}
Θt=Θt−1−Gt+ϵαgt,i
G t = 0.9 E t − 1 [ g 2 ] + 0.1 g t 2 G_t = 0.9E_{t-1}[g^2] + 0.1g_t^2 Gt=0.9Et−1[g2]+0.1gt2
E t − 1 [ g 2 ] = 1 t − 1 ∑ i = 1 t − 1 g i 2 E_{t-1}[g^2] = \frac{1}{t-1} \sum_{i=1}^{t-1}{g_i^2} Et−1[g2]=t−11i=1∑t−1gi2
- RMSProp引入 E t − 1 [ g 2 ] E_{t-1}[g^2] Et−1[g2] 计算前 t − 1 t-1 t−1 轮梯度平方的平均值。
- 如此,仅仅计算各方向梯度在之前时刻的平均值,可缓解梯度下降过快的现象。
5 Adam
Adam将Momentum和RMSProp两种方式进行结合,使得参数更新时既有一定惯性沿着之前的方向,同时更新时可在各方向有不同的更新幅度。
该算法在进行参数更新时的计算方式为
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_t = \beta_1m_{t-1} + (1-\beta_1)g_t
mt=β1mt−1+(1−β1)gt
m ^ t = m t 1 − β 1 = β 1 1 − β 1 m t + g t \hat{m}_t = \frac{m_t}{1-\beta_1} = \frac{\beta_1}{1-\beta_1}m_t+g_t m^t=1−β1mt=1−β1β1mt+gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2v_{t-1} + (1-\beta_2)g_t^2 vt=β2vt−1+(1−β2)gt2
v ^ t = v t 1 − β 2 = β 2 1 − β 2 v t + g t 2 \hat{v}_t = \frac{v_t}{1-\beta_2} = \frac{\beta_2}{1-\beta_2}v_t+g_t^2 v^t=1−β2vt=1−β2β2vt+gt2
Θ t = Θ t − 1 − α v ^ t + ϵ m ^ t \Theta_t = \Theta_{t-1} - \frac{\alpha}{\sqrt{\hat{v}_t+\epsilon}} \hat{m}_t Θt=Θt−1−v^t+ϵαm^t
- m t , v t m_t, v_t mt,vt 分别是对梯度的一阶矩估计和二阶矩估计。
- m ^ t , v ^ t \hat m_t, \hat v_t m^t,v^t 是对 m t , v t m_t, v_t mt,vt 的修正。
- Adam算法的提出者建议 β 1 , β 2 \beta_1, \beta_2 β1,β2 的默认值为0.9和0.999, ϵ \epsilon ϵ 默认为 1 0 − 8 10^{-8} 10−8。
- 在数据比较稀疏的时候,adaptive的方法能得到更好的效果。