gd-sgd
梯度下降(gradien descent)
以下的近似:
f ( x + ϵ ) ≈ f ( x ) + ϵ f ′ ( x ) . f(x + \epsilon) \approx f(x) + \epsilon f'(x) . f(x+ϵ)≈f(x)+ϵf′(x).
接下来,找到一个常数 η > 0 \eta > 0 η>0,使得 ∣ η f ′ ( x ) ∣ \left|\eta f'(x)\right| ∣ηf′(x)∣足够小,那么可以将 ϵ \epsilon ϵ替换为 − η f ′ ( x ) -\eta f'(x) −ηf′(x)并得到
f
(
x
−
η
f
′
(
x
)
)
≈
f
(
x
)
−
η
f
′
(
x
)
2
.
f(x - \eta f'(x)) \approx f(x) - \eta f'(x)^2.
f(x−ηf′(x))≈f(x)−ηf′(x)2.
学习率
η
\eta
η太大,overshoot
随机梯度下降(stochastic gradient descent)
在深度学习里,目标函数通常是训练数据集中有关各个样本的损失函数的平均。那么目标函数定义为
f ( x ) = 1 n ∑ i = 1 n f i ( x ) . f(\boldsymbol{x}) = \frac{1}{n} \sum_{i = 1}^n f_i(\boldsymbol{x}). f(x)=n1i=1∑nfi(x).
目标函数在 x \boldsymbol{x} x处的梯度计算为
∇ f ( x ) = 1 n ∑ i = 1 n ∇ f i ( x ) . \nabla f(\boldsymbol{x}) = \frac{1}{n} \sum_{i = 1}^n \nabla f_i(\boldsymbol{x}). ∇f(x)=n1i=1∑n∇fi(x).
如果使用梯度下降,每次自变量迭代的计算开销为 O ( n ) \mathcal{O}(n) O(n),它随着 n n n线性增长。因此,当训练数据样本数很大时,梯度下降每次迭代的计算开销很高。
随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引 i ∈ { 1 , … , n } i\in\{1,\ldots,n\} i∈{1,…,n},并计算梯度 ∇ f i ( x ) \nabla f_i(\boldsymbol{x}) ∇fi(x)来迭代 x \boldsymbol{x} x:
x ← x − η ∇ f i ( x ) . \boldsymbol{x} \leftarrow \boldsymbol{x} - \eta \nabla f_i(\boldsymbol{x}). x←x−η∇fi(x).
momentum动量法
解决:水平方向和竖直方向梯度相差太大,不容易接近最优解
方法:依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能。
在时间步
0
0
0,动量法创建速度变量
v
0
\boldsymbol{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
,
\begin{aligned} \boldsymbol{v}_t &\leftarrow \gamma \boldsymbol{v}_{t-1} + \eta_t \boldsymbol{g}_t, \\ \boldsymbol{x}_t &\leftarrow \boldsymbol{x}_{t-1} - \boldsymbol{v}_t, \end{aligned}
vtxt←γvt−1+ηtgt,←xt−1−vt,
我们对动量法的速度变量做变形:
v
t
←
γ
v
t
−
1
+
(
1
−
γ
)
(
η
t
1
−
γ
g
t
)
.
\boldsymbol{v}_t \leftarrow \gamma \boldsymbol{v}_{t-1} + (1 - \gamma) \left(\frac{\eta_t}{1 - \gamma} \boldsymbol{g}_t\right).
vt←γvt−1+(1−γ)(1−γηtgt).
速度变量
v
t
\boldsymbol{v}_t
vt实际上对序列
{
η
t
−
i
g
t
−
i
/
(
1
−
γ
)
:
i
=
0
,
…
,
1
/
(
1
−
γ
)
−
1
}
\{\eta_{t-i}\boldsymbol{g}_{t-i} /(1-\gamma):i=0,\ldots,1/(1-\gamma)-1\}
{ηt−igt−i/(1−γ):i=0,…,1/(1−γ)−1}做了指数加权移动平均。
相比于小批量随机梯度下降,动量法在每个时间步的自变量更新量近似于将前者对应的最近 1 / ( 1 − γ ) 1/(1-\gamma) 1/(1−γ)个时间步的更新量做了指数加权移动平均后再除以 1 − γ 1-\gamma 1−γ。所以,在动量法中,自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于过去的各个梯度在各个方向上是否一致。在本节之前示例的优化问题中,所有梯度在水平方向上为正(向右),而在竖直方向上时正(向上)时负(向下)。这样,我们就可以使用较大的学习率,从而使自变量向最优解更快移动。
其中,动量超参数
γ
\gamma
γ满足
0
≤
γ
<
1
0 \leq \gamma < 1
0≤γ<1。当
γ
=
0
\gamma=0
γ=0时,动量法等价于小批量随机梯度下降。
指数加权移动平均(exponentially weighted moving average)
y
t
=
γ
y
t
−
1
+
(
1
−
γ
)
x
t
.
y_t = \gamma y_{t-1} + (1-\gamma) x_t.
yt=γyt−1+(1−γ)xt.
我们可以对 y t y_t yt展开:
y t = ( 1 − γ ) x t + γ y t − 1 = ( 1 − γ ) x t + ( 1 − γ ) ⋅ γ x t − 1 + γ 2 y t − 2 = ( 1 − γ ) x t + ( 1 − γ ) ⋅ γ x t − 1 + ( 1 − γ ) ⋅ γ 2 x t − 2 + γ 3 y t − 3 … \begin{aligned} y_t &= (1-\gamma) x_t + \gamma y_{t-1}\\ &= (1-\gamma)x_t + (1-\gamma) \cdot \gamma x_{t-1} + \gamma^2y_{t-2}\\ &= (1-\gamma)x_t + (1-\gamma) \cdot \gamma x_{t-1} + (1-\gamma) \cdot \gamma^2x_{t-2} + \gamma^3y_{t-3}\\ &\ldots \end{aligned} yt=(1−γ)xt+γyt−1=(1−γ)xt+(1−γ)⋅γxt−1+γ2yt−2=(1−γ)xt+(1−γ)⋅γxt−1+(1−γ)⋅γ2xt−2+γ3yt−3…
令 n = 1 / ( 1 − γ ) n = 1/(1-\gamma) n=1/(1−γ),那么 ( 1 − 1 / n ) n = γ 1 / ( 1 − γ ) \left(1-1/n\right)^n = \gamma^{1/(1-\gamma)} (1−1/n)n=γ1/(1−γ)。因为
lim n → ∞ ( 1 − 1 n ) n = exp ( − 1 ) ≈ 0.3679 , \lim_{n \rightarrow \infty} \left(1-\frac{1}{n}\right)^n = \exp(-1) \approx 0.3679, n→∞lim(1−n1)n=exp(−1)≈0.3679,
所以当 γ → 1 \gamma \rightarrow 1 γ→1时, γ 1 / ( 1 − γ ) = exp ( − 1 ) \gamma^{1/(1-\gamma)}=\exp(-1) γ1/(1−γ)=exp(−1),如 0.9 5 20 ≈ exp ( − 1 ) 0.95^{20} \approx \exp(-1) 0.9520≈exp(−1)。如果把 exp ( − 1 ) \exp(-1) exp(−1)当作一个比较小的数,我们可以在近似中忽略所有含 γ 1 / ( 1 − γ ) \gamma^{1/(1-\gamma)} γ1/(1−γ)和比 γ 1 / ( 1 − γ ) \gamma^{1/(1-\gamma)} γ1/(1−γ)更高阶的系数的项。例如,当 γ = 0.95 \gamma=0.95 γ=0.95时,
y t ≈ 0.05 ∑ i = 0 19 0.9 5 i x t − i . y_t \approx 0.05 \sum_{i=0}^{19} 0.95^i x_{t-i}. yt≈0.05i=0∑190.95ixt−i.
AdaGrad
方法:根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
思路:状态变量
s
t
\boldsymbol{s}_t
st是截至时间步
t
t
t所有小批量随机梯度
g
t
\boldsymbol{g}_t
gt按元素平方和。
问题:不断迭代,学习率不断下降,后期可能仍为找到有用解。
AdaGrad算法会使用一个小批量随机梯度 g t \boldsymbol{g}_t gt按元素平方的累加变量 s t \boldsymbol{s}_t st:
s t ← s t − 1 + g t ⊙ g t , \boldsymbol{s}_t \leftarrow \boldsymbol{s}_{t-1} + \boldsymbol{g}_t \odot \boldsymbol{g}_t, st←st−1+gt⊙gt,
接着,我们将目标函数自变量中每个元素的学习率通过按元素运算重新调整一下:
x t ← x t − 1 − η s t + ϵ ⊙ g t , \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \frac{\eta}{\sqrt{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t, xt←xt−1−st+ϵη⊙gt,
其中 η \eta η是学习率, ϵ \epsilon ϵ是为了维持数值稳定性而添加的常数,如 1 0 − 6 10^{-6} 10−6。这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。
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 . \boldsymbol{s}_t \leftarrow \gamma \boldsymbol{s}_{t-1} + (1 - \gamma) \boldsymbol{g}_t \odot \boldsymbol{g}_t. st←γst−1+(1−γ)gt⊙gt.
和AdaGrad算法一样,RMSProp算法将目标函数自变量中每个元素的学习率通过按元素运算重新调整,然后更新自变量
x t ← x t − 1 − η s t + ϵ ⊙ g t , \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \frac{\eta}{\sqrt{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t, xt←xt−1−st+ϵη⊙gt,
AdaDelta
有意思的是,AdaDelta算法没有学习率这一超参数。
用来两个EMA。
Adam
在Adam算法中,我们对变量 v t \boldsymbol{v}_t vt和 s t \boldsymbol{s}_t st均作偏差修正:
v ^ t ← v t 1 − β 1 t , \hat{\boldsymbol{v}}_t \leftarrow \frac{\boldsymbol{v}_t}{1 - \beta_1^t}, v^t←1−β1tvt,
s ^ t ← s t 1 − β 2 t . \hat{\boldsymbol{s}}_t \leftarrow \frac{\boldsymbol{s}_t}{1 - \beta_2^t}. s^t←1−β2tst.
v t \boldsymbol{v}_t vt即小批量随机梯度 g t \boldsymbol{g}_t gt的指数加权移动平均:
v t ← β 1 v t − 1 + ( 1 − β 1 ) g t . \boldsymbol{v}_t \leftarrow \beta_1 \boldsymbol{v}_{t-1} + (1 - \beta_1) \boldsymbol{g}_t. vt←β1vt−1+(1−β1)gt.
和RMSProp算法中一样,给定超参数
0
≤
β
2
<
1
0 \leq \beta_2 < 1
0≤β2<1(算法作者建议设为0.999),
将小批量随机梯度按元素平方后的项
g
t
⊙
g
t
\boldsymbol{g}_t \odot \boldsymbol{g}_t
gt⊙gt做指数加权移动平均得到
s
t
\boldsymbol{s}_t
st:
s t ← β 2 s t − 1 + ( 1 − β 2 ) g t ⊙ g t . \boldsymbol{s}_t \leftarrow \beta_2 \boldsymbol{s}_{t-1} + (1 - \beta_2) \boldsymbol{g}_t \odot \boldsymbol{g}_t. st←β2st−1+(1−β2)gt⊙gt.
由于我们将
v
0
\boldsymbol{v}_0
v0和
s
0
\boldsymbol{s}_0
s0中的元素都初始化为0,
在时间步
t
t
t我们得到
v
t
=
(
1
−
β
1
)
∑
i
=
1
t
β
1
t
−
i
g
i
\boldsymbol{v}_t = (1-\beta_1) \sum_{i=1}^t \beta_1^{t-i} \boldsymbol{g}_i
vt=(1−β1)∑i=1tβ1t−igi。将过去各时间步小批量随机梯度的权值相加,得到
(
1
−
β
1
)
∑
i
=
1
t
β
1
t
−
i
=
1
−
β
1
t
(1-\beta_1) \sum_{i=1}^t \beta_1^{t-i} = 1 - \beta_1^t
(1−β1)∑i=1tβ1t−i=1−β1t。需要注意的是,当
t
t
t较小时,过去各时间步小批量随机梯度权值之和会较小。例如,当
β
1
=
0.9
\beta_1 = 0.9
β1=0.9时,
v
1
=
0.1
g
1
\boldsymbol{v}_1 = 0.1\boldsymbol{g}_1
v1=0.1g1。为了消除这样的影响,对于任意时间步
t
t
t,我们可以将
v
t
\boldsymbol{v}_t
vt再除以
1
−
β
1
t
1 - \beta_1^t
1−β1t,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。