7.2.4 随机梯度下降
在深度学习中,目标函数通常是训练数据集中有各个样本损失函数的平均。
损失函数:
f
(
x
)
=
1
n
∑
i
=
1
n
f
i
(
x
)
f(x)= \frac{1}{n}\sum_{i=1}^nf_i(x)
f(x)=n1i=1∑nfi(x)
- n是训练数据样本数
- x是模型的参数向量
随机梯度下降(stochastic gradient descent, SGD)减小了每次迭代的计算开销。 而随机梯度下降在每次迭代中只随机采样⼀个样本来计算梯度
7.3 小批量随机梯度下降
使用一个小批量的平均梯度来更新参数
7.4 动量法
目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。
7.4.1 梯度下降的问题
如果自变量的迭代方向仅仅取决于自变量当前的位置,在不同的维度/方向上,权重跟新的量级可能有很大的差异。
7.4.2 动量法
设时间
t
t
t的自变量为
x
t
x_t
xt,学习率为
η
t
\eta_t
ηt。在时间步0,动量法创建速度变量
v
0
v_0
v0,并将其元素初始化成0,在时间步
t
>
0
t > 0
t>0,动量法对每次迭代的步骤做如下修改:
v
t
←
γ
v
t
−
1
+
η
t
g
t
,
x
t
←
x
t
−
1
−
v
t
v_t \leftarrow \gamma v_{t-1}+\eta_t g_t, \\ x_t \leftarrow x_{t-1} - v_t
vt←γvt−1+ηtgt,xt←xt−1−vt
γ
\gamma
γ范围是
[
0
,
1
)
[0,1)
[0,1),当
γ
=
0
\gamma = 0
γ=0时,动量法等价于小批量随机梯度下降。
相比于小批量随机梯度下降,动量法在每个时间步的自变量更新量近似于将前者对应的最近 1 1 − γ \frac{1}{1- \gamma} 1−γ1个时间步的更新做了指数加权移动平均后再除以 1 − γ 1-\gamma 1−γ。所以,在动量法中,自变量在各个方向上的移动幅度不仅取决于当前速度,还取决于过去的各个梯度在各个方向上是否一致。
小结
- 动量法使用了指数加权移动平均的思想。它将过去时间步的梯度做了加权平均,且权重按时间步指数衰减。
- 动量法使得相邻时间步的自变量更新在方向上更加一致。
7.5 AdaGrad算法
动量法依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能。
AdaGrad算法:根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
7.5.1 算法
AdaGrad算法会使用一个小批量随机梯度
g
t
g_t
gt按元素平方的累加变量
s
t
s_t
st。在时间步0,AdaGrad将
s
0
s_0
s0中每个元素初始化为0。在时间步
t
t
t,首先将小批量随机梯度
g
t
g_t
gt按元素平方后累加到变量
s
t
s_t
st:
s
t
←
s
t
−
1
+
g
t
⨀
g
t
s_t \leftarrow s_{t-1} + g_t \bigodot g_t
st←st−1+gt⨀gt
接着,将目标函数自变量中每个元素的学习率通过按元素运算重新调整以下:
x t ← x t − 1 − η s t + ϵ ⨀ g t x_t \leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t + \epsilon}} \bigodot g_t xt←xt−1−st+ϵη⨀gt
- η \eta η: 学习率
- ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 6 10^{-6} 10−6
- 开方,除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。
7.5.2 特点
小批量随机梯度按元素平方的累加变量 s t s_t st出现在学习率的分母项中。如果目标函数有关自变量中某个元素的偏导数一直都比较大,那么该元素的学习率将下降较快;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么该元素的学习率将下降较慢。然而,由于 s t s_t st一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用得解。
小结
- AdaGrad算法在迭代过程中不断调整学习率,并让目标函数自变量中每个元素都分别有自己的学习率
- 使用AdaGrad算法时,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。
7.6 RMSProp算法
为了解决AdaGrad算法的缺点。提出RMSProp算法对AdaGrad算法做了一点小小的修改。
RMSProp:指数加权平均移动AdaGrad
7.6.1 算法
不同于AdaGrad算法里状态变量 s t s_t st是截止时间步所有小批量随机梯度 g t g_t gt按元素平方和 ,RMSProp算法将这些梯度按元素平方做指数加权移动平均。给定超参数 0 ≤ γ < 1 0 \leq \gamma < 1 0≤γ<1 ,RMSProp算法在时间步 t > 0 t>0 t>0计算
s t ← γ s t − 1 + ( 1 − γ ) g t ⨀ g t x t ← x t − 1 − η s t + ϵ ⨀ g t s_t \leftarrow \gamma s_{t-1}+(1-\gamma)g_t \bigodot g_t \\ x_t \leftarrow x_{t-1} - \frac{\eta}{\sqrt{s_t + \epsilon}} \bigodot g_t st←γst−1+(1−γ)gt⨀gtxt←xt−1−st+ϵη⨀gt
- η \eta η: 学习率
- ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 6 10^{-6} 10−6
因为RMSProp算法的状态变量 s t s_t st是对平方项 g t ⨀ g t g_t \bigodot g_t gt⨀gt的指数加权移动平均,所有可以看作最近 1 / ( 1 − γ ) 1/(1-\gamma) 1/(1−γ)个时间步的小批量随机梯度平方项的加权平均。这样,自变量每个元素的学习率在迭代过程中就不再一直降低或不变了。
7.7 AdaDelta算法
7.7.1 算法
AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度
g
t
g_t
gt按元素平方的指数加权移动平均变量
s
t
s_t
st。在时间步0,它的所有元素被初始化为0。给定超参数
0
≤
0
<
1
0 \leq 0 < 1
0≤0<1(对应RMSProp算法中的
γ
\gamma
γ),在时间步
t
>
0
t > 0
t>0,同RMSProp算法一样计算
s
t
←
ρ
s
t
−
1
+
(
1
−
ρ
)
g
t
⨀
g
t
s_t \leftarrow \rho s_{t-1} + (1-\rho)g_t \bigodot g_t
st←ρst−1+(1−ρ)gt⨀gt
与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量
Δ
x
t
−
1
\Delta x_{t-1}
Δxt−1,其元素同样在时间步0时被初始化为0。使用
Δ
x
t
−
1
\Delta x_{t-1}
Δxt−1来计算自变量的变化量:
g
t
′
←
Δ
x
t
−
1
+
ϵ
s
t
+
ϵ
⨀
g
t
g^{'}_t \leftarrow \sqrt{\frac{\Delta x_{t-1} + \epsilon}{s_t + \epsilon}} \bigodot g_t
gt′←st+ϵΔxt−1+ϵ⨀gt
- ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 5 10^{-5} 10−5
更新自变量:
x
t
←
x
t
−
1
−
g
t
′
x_t \leftarrow x_{t-1} - g^{'}_t
xt←xt−1−gt′
最后,使用
Δ
x
t
\Delta x_t
Δxt来记录自变量的变化量
g
t
′
g_t^{'}
gt′按元素平方的指数加权移动平均:
Δ
x
t
←
ρ
Δ
x
t
−
1
+
(
1
−
ρ
)
g
t
′
⨀
g
t
′
\Delta x_t \leftarrow \rho \Delta x_{t-1} + (1 - \rho)g_t^{'} \bigodot g_t^{'}
Δxt←ρΔxt−1+(1−ρ)gt′⨀gt′
AdaDelta算法与RMSProp算法的不同之处是使用了 Δ x t − 1 + ϵ \sqrt{\Delta x_{t-1} + \epsilon} Δxt−1+ϵ来代替超参数 η \eta η。
小结
- AdaDelta算法没有学习率超参数,它通过使用有关自变量的更新量的平方的指数加权移动平均来代替RMSProp算法中的学习率。
7.8 Adam算法
Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。
7.8.1 算法
Adam算法使用了动量变量 v t v_t vt和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量 s t s_t st,并在时间步0将它们中每个元素初始化为0。给定超参数 0 ≤ β 1 < 1 0\leq \beta_1 < 1 0≤β1<1(建议0.9),时间步 t t t的动量变量 v t v_t vt即小批量随机梯度 g t g_t gt的指数加权移动平均:
v
t
←
β
1
v
t
−
1
+
(
1
−
β
1
)
g
t
v_t \leftarrow \beta_1 v_{t-1} + (1-\beta_1)g_t
vt←β1vt−1+(1−β1)gt
给定超参数
0
≤
β
2
<
1
0 \leq \beta_2 < 1
0≤β2<1(建议0.999),将小批量随机梯度按元素平方后的项
g
t
⨀
g
t
g_t \bigodot g_t
gt⨀gt作指数加权移动平均得到
s
t
s_t
st:
s
t
←
β
2
s
t
−
1
+
(
1
−
β
2
)
g
t
⨀
g
t
s_t \leftarrow \beta_2 s_{t-1}+(1- \beta_2)g_t \bigodot g_t
st←β2st−1+(1−β2)gt⨀gt
当时间步很小时,因为初始
v
0
,
s
0
v_0,s_0
v0,s0都设为0,迭代初期的梯度很小。为了消除这个影响, 引入偏差修正。对于任意时间步
t
t
t,将
v
t
v_t
vt再除以
1
−
β
1
t
1-\beta^t_1
1−β1t,从而使过去各时间步小批量随机梯度权值之和为1。对变量
v
t
,
s
t
v_t,s_t
vt,st作偏差修正:
v
t
^
←
v
t
1
−
β
1
t
s
t
^
←
s
t
1
−
β
2
t
\hat{v_t} \leftarrow \frac{v_t}{1-\beta^t_1} \\ \hat{s_t} \leftarrow \frac{s_t}{1-\beta^t_2}
vt^←1−β1tvtst^←1−β2tst
Adam算法使用以上偏差修正后的变量
v
t
^
,
s
t
^
\hat{v_t}, \hat{s_t}
vt^,st^,将模型参数中每个元素的学习率通过按元素运算重新调整:
g
t
′
←
η
v
t
^
s
t
^
+
ϵ
g^{'}_t \leftarrow \frac{\eta \hat{v_t}}{\sqrt{\hat{s_t}}+\epsilon}
gt′←st^+ϵηvt^.
- η \eta η: 学习率
- ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 8 10^{-8} 10−8
和AdaGrad算法,RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。最后,使用
g
t
′
g^{'}_t
gt′迭代自变量:
x
t
←
x
t
−
1
−
g
t
′
x_t \leftarrow x_{t-1} - g^{'}_t
xt←xt−1−gt′
- Adam算法在RMProp算法的基础上对小批量随机梯度也做了指数加权移动平均
- Adam算法使用了偏差修正。