深度学习常用的优化算法包括:梯度下降,随机梯度下降,小批量随机梯度下降,动量法,AdaGrad,RMSProp,Adam。这些优化算法又涉及到指数加权移动平均。下面先介绍什么是指数加权移动平均。
1. 指数加权移动平均
指数加权移动平均是几个概念拼到一起的,包括加权平均与移动平均。
加权平均:平均分为算术平均和加权平均,算术平均指各项的权重都相等。加权平均各项权重不等。
移动平均:移动平均常用于时间序列的平均计算。例如,取前n个时刻的值取平均。相当于有一个窗口在不断向前滑动。
指数加权平均:每一项的权重不等,并且是指数函数的形式。尝试用的形式如下:
v
t
=
γ
v
t
−
1
+
(
1
−
γ
)
g
t
(1)
v_t=\gamma v_{t-1}+(1-\gamma)g_t\tag1
vt=γvt−1+(1−γ)gt(1)
v
t
v_t
vt是当前时刻的指数加权移动平均值。
g
t
g_t
gt是当前时刻的值。一般令
v
0
=
0
v_0=0
v0=0。则
v
1
,
v
2
,
v
3
v_1,v_2,v_3
v1,v2,v3分别为:
v
1
=
(
1
−
γ
)
g
1
v
2
=
γ
v
1
+
(
1
−
γ
)
g
2
=
γ
(
1
−
γ
)
g
1
+
(
1
−
γ
)
g
2
v
3
=
γ
v
2
+
(
1
−
γ
)
g
3
=
γ
2
(
1
−
γ
)
g
1
+
γ
(
1
−
γ
)
g
2
+
(
1
−
γ
)
g
3
(2)
v_1=(1-\gamma)g_1\\ v_2=\gamma v_1+(1-\gamma)g_2=\gamma(1-\gamma)g_1+(1-\gamma)g_2\\ v_3=\gamma v_2+(1-\gamma)g_3=\gamma^2(1-\gamma)g_1+\gamma(1-\gamma)g_2+(1-\gamma)g_3\tag2
v1=(1−γ)g1v2=γv1+(1−γ)g2=γ(1−γ)g1+(1−γ)g2v3=γv2+(1−γ)g3=γ2(1−γ)g1+γ(1−γ)g2+(1−γ)g3(2)
可以看到每一个时刻的滑动平均都是观察到当前值的加权平均,并且权重呈指数衰减。距离当前时刻越远权重越小。
2. 梯度下降/随机梯度下降/小批量随机梯度下降
梯度下降:使用所有训练样本,完成一次梯度更新。每次更新的时间复杂度o(N)。
随机梯度下降:每次使用一条样本完成一次梯度更新。每次更新的时间复杂度o(1)。
小批量随机梯度下降:每次使用batch(n个)个样本完成一次梯度更新。每次更新的时间复杂度o(n)。
更新公式:
x
t
=
x
t
−
1
−
η
g
t
(3)
x_t=x_{t-1}-\eta g_t\tag3
xt=xt−1−ηgt(3)
3. 动量法
动量法结合物理学动量的思想,让参数更新的方向不仅取决于当前梯度,还取决于历史梯度方向。更新公式:
v
t
=
γ
v
t
−
1
+
η
g
t
x
t
=
x
t
−
1
−
v
t
(4)
v_t=\gamma v_{t-1}+\eta g_t\\ x_t=x_{t-1}-v_t\tag4
vt=γvt−1+ηgtxt=xt−1−vt(4)
动量法的优势:
- 普通的梯度下降由于学习率固定,收敛速度会慢,有时甚至陷入局部最优。如果考虑历史梯度,会引导参数朝最优值更快收敛。并且减小陷入局部最优的风险。
- 当某一参数在一段时间内梯度方向不一样(来回振荡),使用动量法,其真实参数更新幅度会变小。反之,最近一段时间的梯度方向一致时,其真实更新幅度会变大,起到加速作用。
- 一般来说,迭代初期,梯度方向比较一致,动量法会起到加速作用;迭代后期,梯度方向会趋于不一致,在收敛值附件振荡,动量法会起到减速作用,增加稳定性。
4. AdaGrad
问题:当x1和x2(不同维度的参数)的梯度值差别较大时,使用相同的学习率更新参数会存在问题:参数在梯度较大的维度上需要使用足够小的学习率来保证不发散,但参数在梯度较小的维度上又需要足够大的学习率避免收敛过慢。
AdaGrad的主要思想是特征每个维度的权重更新时,使用不同的学习率。根据参数在每个维度梯度值的大小来调整各个维度学习率的大小。AdaGrad引入梯度平方累积变量
s
t
s_t
st。
s
t
=
s
t
−
1
+
g
t
⊙
g
t
x
t
=
x
t
−
1
−
η
s
t
+
ϵ
⊙
g
t
(5)
s_t=s_{t-1}+g_t\odot g_t\\ x_t=x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t\tag5
st=st−1+gt⊙gtxt=xt−1−st+ϵη⊙gt(5)
5. RMSProp
AdaGrad算法存在问题,梯度平方累计变量
s
t
s_t
st时不断增大的,学习率一致降低的。如果学习率在迭代过程中下降的过快,且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,很难在继续收敛。RMSProp在AdaGrad算法基础上做了一些调整。使用指数加权移动平均对之前的t梯度平方进行衰减,避免
s
t
s_t
st一直增大。
s
t
=
γ
s
t
−
1
+
(
1
−
γ
)
g
t
⊙
g
t
x
t
=
x
t
−
1
−
η
s
t
+
ϵ
⊙
g
t
(6)
s_t=\gamma s_{t-1}+(1-\gamma)g_t\odot g_t\\ x_t=x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t\tag6
st=γst−1+(1−γ)gt⊙gtxt=xt−1−st+ϵη⊙gt(6)
6. Adam
Adam算法是平时使用最多的优化算法,结合了动量法的思想和RMSProp的思想。
动量法的思想:结合历史梯度信息,调整当前参数的优化方向。维护动量变量
v
t
v_t
vt。
v
t
=
β
1
v
t
−
1
+
(
1
−
β
1
)
g
t
(7)
v_t=\beta_1 v_{t-1}+(1-\beta_1)g_t\tag7
vt=β1vt−1+(1−β1)gt(7)
RMSProp的思想:为每一维特征的参数配置不同的学习率。维护梯度平方累计变量
s
t
s_t
st。
s
t
=
β
2
s
t
−
1
+
(
1
−
β
2
)
g
t
⊙
g
t
(8)
s_t=\beta_2s_{t-1}+(1-\beta_2)g_t\odot g_t\tag8
st=β2st−1+(1−β2)gt⊙gt(8)
为
v
t
,
s
t
v_t,s_t
vt,st使用偏差修正:
当时间步较小时,各时间步的权重之和也会较小,为了消除这种影响,对于每个时间步的 v t v_t vt再除以 1 − β 1 t 1-\beta_1^t 1−β1t。从而使每个时间步的梯度权重之和为1。
除以 1 − β 1 t 1-\beta_1^t 1−β1t的原因:
- 在时间步t可以得到 v t = ( 1 − β 1 ) ∑ i = 1 t β i t − i g i v_t=(1-\beta_1)\sum_{i=1}^t\beta_i^{t-i}g_i vt=(1−β1)∑i=1tβit−igi。
- 所有时间步的权重和为 ( 1 − β 1 ) ∑ i = 1 t β i t − i (1-\beta_1)\sum_{i=1}^t\beta_i^{t-i} (1−β1)∑i=1tβit−i
( 1 − β 1 ) ∑ i = 1 t β i t − i = ( 1 − β 1 ) ( 1 + β i 1 + β 1 2 + . . . + β 1 t − 1 ) (9) (1-\beta_1)\sum_{i=1}^t\beta_i^{t-i}=(1-\beta_1)(1+\beta_i^1+\beta_1^2+...+\beta_1^{t-1})\tag9 (1−β1)i=1∑tβit−i=(1−β1)(1+βi1+β12+...+β1t−1)(9)
上式第二项是等比数列的前n项和公式。等比数列递推公式和前n项和公式分别为:
a
n
=
a
1
×
q
n
−
1
s
n
=
a
1
×
(
1
−
q
n
)
1
−
q
(10)
a_n=a_1\times q^{n-1}\\ s_n=\frac{a_1\times(1-q^n)}{1-q}\tag{10}
an=a1×qn−1sn=1−qa1×(1−qn)(10)
可得:
(
1
+
β
i
1
+
β
1
2
+
.
.
.
+
β
1
t
−
1
)
=
1
−
β
1
t
1
−
β
1
(11)
(1+\beta_i^1+\beta_1^2+...+\beta_1^{t-1})=\frac{1-\beta_1^t}{1-\beta_1}\tag{11}
(1+βi1+β12+...+β1t−1)=1−β11−β1t(11)
带入(9)式可得:
(
1
−
β
1
)
∑
i
=
1
t
β
i
t
−
i
=
1
−
β
1
t
(12)
(1-\beta_1)\sum_{i=1}^t\beta_i^{t-i}=1-\beta_1^t\tag{12}
(1−β1)i=1∑tβit−i=1−β1t(12)
可得到偏差修正的
v
^
t
,
s
^
t
\hat v_t,\hat s_t
v^t,s^t为:
v
^
t
=
v
t
1
−
β
1
t
s
^
t
=
s
t
1
−
β
2
t
(13)
\hat v_t=\frac{v_t}{1-\beta_1^t}\\ \hat s_t=\frac{s_t}{1-\beta_2^t}\tag{13}
v^t=1−β1tvts^t=1−β2tst(13)
使用偏差修正的
v
^
t
,
s
^
t
\hat v_t,\hat s_t
v^t,s^t进行参数更新:
x
t
=
x
t
−
1
−
η
s
^
t
+
ϵ
v
^
t
(14)
x_t=x_{t-1}-\frac{\eta}{\sqrt{\hat s_t}+\epsilon}\hat v_t\tag{14}
xt=xt−1−s^t+ϵηv^t(14)