Lecture 2: What to do if my network fails to train
文章目录
Chapter 2 What to do if my network fails to train
本章不讨论 o v e r f i t t i n g overfitting overfitting 出现的情况,仅讨论在做 o p t i m i z a t i o n optimization optimization 时如何将 g r a d i e n t d e s c e n t gradient\ descent gradient descent 做得更好。
为什么 Optimization 会失败?

在利用 n e u r a l n e t w o r k neural\ network neural network 的时候,可能会出现上图中的两种情况。上图中蓝线,认为 t r a i n i n g l o s s training\ loss training loss 下降得不够多,不能充分体现神经网络的优势;上图中橙线, t r a i n i n g l o s s training\ loss training loss 从始至终都降不下来。
出现这两种情况的原因是 Loss Function \text{Loss Function} Loss Function 对参数求导已经趋于 0 0 0 (即梯度趋近于 0 \bf 0 0),这时我们往往想到 c r i t i c a l p o i n t critical\ point critical point,即 l o c a l m i n i m a local\ minima local minima(局部最小值)和 s a d d l e p o i n t saddle\ point saddle point(鞍点)。

当陷入局部最小值时,此时的梯度已经很难做出调整;当位于鞍点时,我们还有路可走,远离当前的鞍点。那么如何区分这两种情况呢?
区分 l o c a l m i n i m a local\ minima local minima 和 s a d d l e p o i n t saddle\ point saddle point
利用泰勒级数逼近 L o s s Loss Loss

当我们到达 c r i t i c a l p o i n t critical\ point critical point 时,上图绿框部分为 0 0 0(梯度为 0 \bf 0 0),而从红色框中的这一项我们能判断出 e r r o r s u r f a c e error\ surface error surface 的形状,从而判断当前的 c r i t i c a l p o i n t critical\ point critical point 属于哪一类型。

在critical point
,为了更简单地表示,做了如下的数学变换:

结论如下:

可以转换为对海森矩阵 H \bf H H 的研究:
- H \bf H H 是正定的,其所有特征值都为正,此时 L ( θ ′ ) L(\theta^{'}) L(θ′) 是局部最小;
- H \bf H H 是负定的,其所有特征值都为负,此时 L ( θ ′ ) L(\theta^{'}) L(θ′) 是局部最大;
- H \bf H H 的特征值有正有负,此时 L ( θ ′ ) L(\theta^{'}) L(θ′) 是鞍点。
举例
如下图所示,模型是 y = w 1 w 2 x y=w_1w_2x y=w1w2x,并且训练数据只有 ( x , y ^ ) = ( 1 , 1 ) (x,\hat y)=(1,1) (x,y^)=(1,1) 这一组。

通过计算不同 w 1 , w 2 w_1,\ w_2 w1, w2 时的 L o s s Loss Loss,画出如下的 e r r o r s u r f a c e error\ surface error surface, c r i t i c a l p o i n t critical\ point critical point 都用黑点标出:

如果不用上图这种穷搜法,应该如何判断呢?

- 写出 l o s s f u n c t i o n loss\ function loss function;
- 求偏导;
- 求驻点;
- 计算海森矩阵 H \bf H H;
- 计算海森矩阵 H \bf H H 的特征值(eigenvalue);
- 得结论。

遇到鞍点时,通过海森矩阵 H \bf H H 也许能找到更新方向。找到海森矩阵 H \bf H H 的一组特征值 λ < 0 \lambda<0 λ<0 与特征向量 u \bf u u,再通过上图的数学处理找到新的参数 θ = θ ′ + u \theta=\theta^{'}+\bf u θ=θ′+u 使得 L ( θ ) < L ( θ ′ ) L(\theta)<L(\theta^{'}) L(θ)<L(θ′)。
接上例,取 λ 2 = − 2 , u = ( 1 , 1 ) T \lambda_2=-2,\ {\bf u}={(1,1)}^{\rm T} λ2=−2, u=(1,1)T。我们应该沿着 u = ( 1 , 1 ) T {\bf u}={(1,1)}^{\rm T} u=(1,1)T 的方向更新参数,这样 L o s s Loss Loss 就会减小从而逃离鞍点,如下图所示。然而,这种方法在实际应用中很少用到。

l o c a l m i n i m a local\ minima local minima v.s. s a d d l e p o i n t saddle\ point saddle point
在更高的维度去找到解决 l o c a l m i n i m a local\ minima local minima 的方法。存在一种可能 —— 存在一点,该点在二维空间是 l o c a l m i n i m a local\ minima local minima,而在三维空间该点是 s a d d l e p o i n t saddle\ point saddle point,如下图所示。

在经验上,我们是支持 “参数(属性、维度)越多, l o c a l m i n i m a local\ minima local minima 就越少” 这一说法的。

Small Gradient

Batch and Momentum
回顾

Small Batch v.s. Large Batch

在不考虑并行计算的前提下,Full Batch 和 mini Batch 的优缺点如上图所示。
如下图所示,存在并行计算的情况下,大批次不一定需要更多的时间计算梯度(相比于小批次);小批次在一个 epoch 训练中可能需要更长的时间;


在实际情况中,大批次并没有像想象中的那么吃亏,反而效率更高;而采用小批次来训练,模型效果往往比大批次要好,如下图所示。

出现上述结果的可能原因如下图所示。

采用小批次训练,在 testing 时效果可能会更好,如下图所示。

原因是使用大批次时,如果存在下图所示的 s h a r p m i n i m a sharp\ minima sharp minima 此时在 testing 阶段会出现较大的误差

Summary

是否存在使用大批次结果又优秀的情况呢?

Momentum(动量)

如上图所示,在真实世界中,有一个小球从高处沿着一个斜坡落下,由于重力的原因小球能够一直沿着斜坡滚下去,哪怕遇到了凹陷( l o c a l m i n i m a local\ minima local minima)只要小球的速度够快,它就能离开当前凹陷( l o c a l m i n i m a local\ minima local minima)。那么,我们是否能够设计出一种参数更新策略来模仿这一物理现象呢?—— 我们引入 Momentum(动量)。
(Vanilla) Gradient Descent

如上图所示,为了更新参数 θ \theta θ,记参数初始值为 θ 0 \theta^0 θ0,计算此时的梯度 g 0 {\bold g}^0 g0,接下来沿着梯度 g 0 \bf {g}^0 g0 的反方向更新参数,即 θ 1 = θ 0 − η g 0 \theta^1=\theta^0-\eta {\bf g}^0 θ1=θ0−ηg0…,如此迭代更新下去。
Gradient Descent + Momentum

如上图所示,在引入动量后,为了更新参数 θ \theta θ,记参数初始值为 θ 0 , m 0 = 0 \theta^0,\ {\bf m}^0=0 θ0, m0=0,计算梯度 g 0 {\bold g}^0 g0,第一次参数 θ 0 \theta^0 θ0 更新与传统梯度下降策略一致(因为 m 0 = 0 , m 1 = λ m 0 − η g 0 , θ 1 = θ 0 + m 1 = θ 0 − η g 0 {\bf m}^0=0,\ {\bf m}^1=\lambda {\bf m}^0-\eta{\bold g}^0,\ \theta^1=\theta^0+{\bf m}^1=\theta^0-\eta{\bf g}^0 m0=0, m1=λm0−ηg0, θ1=θ0+m1=θ0−ηg0);接下来计算梯度 g 1 , m 2 = λ m 1 − η g 1 {\bold g}^1,\ {\bf m}^2=\lambda {\bf m}^1-\eta{\bf g}^1 g1, m2=λm1−ηg1,更新参数 θ 2 = θ 1 + m 2 \theta^2=\theta^1+{\bf m}^2 θ2=θ1+m2…,如此迭代更新下去。
也就是说,参数 θ \theta θ 的每一次更新,其方向由当前梯度的反方向( − g i -{\bf g}^i −gi)与引入的新参数 m i {\bf m}^i mi 共同决定(两个向量做向量加法)。也可以这么说,参数 θ \theta θ 的每一次更新,都考虑到了之前迭代更新中的每一个梯度(原因如下图所示, m i {\bf m}^i mi 是 g i {\bold g}^i gi 的线性组合)。

Adaptive Learning Rate
Training Stuck ≠ \ne = Small Gradient
我们总是习惯性地认为训练效果不佳是因为参数到达了 c r i t i c a l p o i n t critical\ point critical point 附近,而实际情况不总是如此
如下图所示,当 l o s s loss loss 不再大幅度地减少时,梯度的范数仍然再波动,不总是处于 S m a l l G r a d i e n t Small\ Gradient Small Gradient 的状态。出现这种状况的原因可能是遇到了下图左边的 e r r o r s u r f a c e error\ surface error surface;

Training can be difficult even without critical points

如上图 ① 所示,这是一个凸的 e r r o r s u r f a c e error\ surface error surface,我们期待参数从图中的黑点调整到图中橙色的×处。图 ② 和 ③ 分别采用了不同大小的学习率用梯度下降法来更新参数。当学习率较大时,数值震荡情况较为明显;当学习率较小时,虽然能较为稳定的趋近理想结果,但是效率低下。由此引出不同的参数需要不同的学习率
Different parameters need different learning rate

我们期待当梯度变化较为陡峭时,使用较小的学习率;而当梯度变化较为平坦时,使用较大的学习率。
我们先只考虑更新一个参数的情况,最初的
G
r
a
d
i
e
n
t
D
e
s
c
e
n
d
Gradient\ Descend
Gradient Descend:
θ
i
t
+
1
←
θ
i
t
−
η
g
i
t
g
i
t
=
∂
L
∂
θ
i
∣
θ
=
θ
t
\theta_i^{t+1}\leftarrow \theta_i^t-\eta {\bf g}_i^t\\ {\bf g}_i^t=\left.\frac{\partial L}{\partial \theta_i}\right|_{\theta=\theta_t}
θit+1←θit−ηgitgit=∂θi∂L∣
∣θ=θt
客制化学习率后:
θ
i
t
+
1
←
θ
i
t
−
η
σ
i
t
g
i
t
\theta_i^{t+1}\leftarrow \theta_i^t-\frac{\eta}{\sigma_i^t} {\bf g}_i^t
θit+1←θit−σitηgit
不同的参数会有不同的
σ
\sigma
σ,不同的迭代更新也会有不同的
σ
\sigma
σ。接下来,我们讨论计算
σ
\sigma
σ 的方法
Root Mean Square
一种常用的计算 σ \sigma σ 的方法是计算梯度的均方根

如下图所示,参数 σ \sigma σ 实现了梯度大时使用小学习率,梯度小时使用大学习率。图中蓝线,计算出的梯度小,等到更小的 σ \sigma σ,因此 η / σ \eta/\sigma η/σ 的值就大,即学习率大;图中绿线,计算出的梯度大,等到更大的 σ \sigma σ,因此 η / σ \eta/\sigma η/σ 的值就小,即学习率小。

e r r o r s u r f a c e error\ surface error surface 往往较为复杂,我们期待学习率能够动态地调整

RMSProp
为了实现学习率的动态调整,我们引入 RMSProp,与求梯度的均方根略有不同

通过引入参数 α , 0 < α < 1 \alpha,\ 0<\alpha<1 α, 0<α<1 来控制 σ \sigma σ 在多大程度上取决于现在算出来的梯度 g \bf g g

在坡度(梯度)较为陡峭(大)时,调小 α \alpha α,从而 σ \sigma σ 较大,得到更小的学习率;反之,同理。

Adam: RMSProp + Momentum
Original paper: Adam

接[上例](#Training can be difficult even without critical points),采用 Adagrad (即采用了均方根的方法),结果如下图所示:

图中红圈部分出现的原因: σ \sigma σ 的计算涉及到了全部的梯度,而最初的几个梯度波动较大,因此出现了这样的结果。如何避免?—— 引入 Learning Rate Scheduling
Learning Rate Scheduling
让学习率与训练时间相关联
θ
i
t
+
1
←
θ
i
t
−
η
t
σ
i
t
g
i
t
\theta_i^{t+1}\leftarrow \theta_i^t-\frac{\eta^t}{\sigma_i^t} {\bf g}_i^t
θit+1←θit−σitηtgit
Learning Rate Decay

Warm up

Summary of Optimization
