第三章:深度学习基础
3.1 局部极小值与鞍点
3.1.1 临界点及其种类
优化神经网络时,使用梯度下降法,遇到梯度为0的点,训练就停了下来,损失也不再下降。
这个梯度为0的点,可以称为临界点
。
临界点
可以细分为局部极小值
、局部极大值
和鞍点
。
如下图,左侧是局部极小值
,右侧是鞍点
。
鞍点
的特点是,它在某些方向上是极小值,在某些方向上是极大值。形似马鞍面。
3.1.2 判断临界值种类的方法
根据泰勒级数近似,我们可以得到损失函数
L
(
θ
)
L(\theta)
L(θ)在临界点
θ
′
\theta'
θ′附近的函数表示:
L
(
θ
)
≈
L
(
θ
′
)
+
(
θ
−
θ
′
)
T
g
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\boldsymbol{\theta}) \approx L\left(\boldsymbol{\theta}^{\prime}\right)+\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)^{\mathrm{T}} \boldsymbol{g}+\frac{1}{2}\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)^{\mathrm{T}} \boldsymbol{H}\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)
L(θ)≈L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′)
由于临界点的梯度为0,这个式子进一步可以化简为:
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\boldsymbol{\theta}) \approx L\left(\boldsymbol{\theta}^{\prime}\right)+\frac{1}{2}\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)^{\mathrm{T}} \boldsymbol{H}\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)
L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
根据高等代数的知识:
- 当海森矩阵 H \boldsymbol{H} H的特征值全为正,即 H \boldsymbol{H} H是正定矩阵,则右侧第二项为正,此时 θ ′ \theta' θ′是周围领域中对应 L ( θ ) L(\theta) L(θ)值最小的,即 θ ′ \theta' θ′是局部极小值点。
- 当海森矩阵 H \boldsymbol{H} H的特征值全为负,即 H \boldsymbol{H} H是负定矩阵,则右侧第二项为负,此时 θ ′ \theta' θ′是周围领域中对应 L ( θ ) L(\theta) L(θ)值最大的,即 θ ′ \theta' θ′是局部极大值点。
- 当海森矩阵 H \boldsymbol{H} H的特征值有正有负,则右侧第二项也会有正有负,此时 θ ′ \theta' θ′是鞍点。
值得注意的是,如果我们得到了 H \boldsymbol{H} H的一个负特征向量 u u u,就可以沿着 u u u的方向更新参数,例如 θ = θ ′ + u \theta=\theta'+u θ=θ′+u,这样损失会变小。
算海森矩阵和海森矩阵的特征值/向量的运算量会非常大,所以一般不会这么做来逃离鞍点。
3.1.3 逃离鞍点的方法
鞍点往往比局部极小值更常见
。这是因为在一个高维空间中,要让一个函数在某个点处,其每个方向上都是极小值是不容易的。往往存在一些维度方向上,这个点并非极小值。
这个结论也可以通过一些实验来得到验证,详细见书。
3.2 批量和动量
实际计算梯度时,考虑到显存。
一般会将
N
N
N个样本数据分为
L
L
L个批次。每个批次有
B
B
B个样本(这里假设
N
=
B
L
N=BL
N=BL)。
在一次迭代(iteration)更新中,只会取一批次的
B
B
B个样本计算损失和梯度,并更新参数。
一个回合(epoch)更新包含
L
L
L次这样的迭代更新,才会将所有
N
N
N个样本遍历一遍。
另外,数据分批的时候还会进行shuffle。有时甚至在每个回合更新前,都会进行shuffle。
3.2.1 批量大小对梯度下降法的影响
- 如果
B
=
N
,
L
=
1
B=N, L=1
B=N,L=1,即一次迭代更新使用全部样本,则称为
批量梯度下降法(Batch Gradient Descent, BGD)
。 - 如果
B
=
1
,
L
=
N
B=1, L=N
B=1,L=N,即一次迭代更新只使用1个样本,则称为
随机梯度下降法(Stochastic Gradient Descent, SGD)
。 - 如果
B
B
B是介于
1
1
1和
N
N
N之间的数,则称为
小批量梯度下降(Mini-batch Gradient Descent,MBGD)
。
在效率上
在一次迭代更新中,使用更多的样本,即使用更大的批量大小,是否会让这一次迭代花费的时间变长呢?
答案是当批量大小不大的时候,这并不会增加一次迭代花费的时间
。这是因为GPU有并行计算的能力。
从下面的图可以看出。当
B
=
1000
B=1000
B=1000以前时,一次迭代花费的时间并没有增加太多。
当 B B B继续增加时,一次迭代花费的时间会增加。这可能是因为GPU已经满负荷运行了。因此数据的处理并不是完全的并行。
但是在一个回合更行中,更大的批量大小
意味着遍历所有样本需要更少的迭代次数,这会导致更少的回合时间。
在性能上
大的
B
B
B意味着更新稳定,而小的
B
B
B则意味着梯度方向会有噪声。
但噪声一定程度上有利于算法逃离局部最小值点。
因为不同批次的损失函数有差异。某个点可能对某些批次的损失函数而言是局部最小值点,但对另外一些点而言并不是局部最小值点,这导致梯度下降算法能进一步寻找更小的损失
。
所以小的
B
B
B在训练集上会有更好的表现。
一些实验和论文表明小的
B
B
B在测试集上也有更好的表现。
一个可能的解释是误差表面有不同的局部极小值点,有些平坦,有些尖锐。平坦的局部极小值点附近,泛化性较好,即在训练集和测试集上的表现差不多(前提是测试集和训练集的分布差不多)。但是尖锐的局部极小值点附近,一点点的偏离都会使损失变大很多,这表现为泛化性差,即使测试集和训练集的分布差不多,在测试集上仍会有较大的损失
。
最后总结一下:
- 在一次迭代更新中,如果批量大小 B B B不大时,大 B B B对应的梯度下降算法耗时和小 B B B对应耗时基本相同。
- 但在一个回合的更新中,大 B B B对应的梯度下降算法耗时比小 B B B少很多。
- 训练中, B B B小意味着噪声更多, B B B大意味着更稳定。
- B B B小,在训练集和测试集上的表现都会更好。
3.2.2 动量法
动量法是另外一个可以对抗鞍点或局部最小值点的方法。它的核心是每次参数更新,不仅仅考虑梯度负方向,还考虑前一次参数更新方向。即第
i
i
i次参数更新向量
m
i
m_i
mi
m
i
=
λ
m
i
−
1
−
η
g
i
−
1
m_i=\lambda m_{i-1}-\eta g_{i-1}
mi=λmi−1−ηgi−1
可以看到,这种方法更新的方法,不仅仅考虑了现在的梯度,还考虑了考虑过去所有梯度的总和。