一、When Gradient Is Small: Local Minimum and Saddle Point
1、为什么你的训练损失会停留在一定的数值?
- 原因1:达到了局部最小,意味着网络训练已经达到了收敛的情况;
- 原因2:达到了鞍点(saddle point),此时的梯度也是0,故网络损失可能不会再继续下降;
2、判断鞍点
首先,就要知晓损失函数的形状,但是我们无法知道完成的损失函数的形状,因为参数可能很多,模型比较复杂,但是如果给定某一组参数
θ
′
\theta^\prime
θ′,在其附近的损失函数,是有办法被写出来的:
L
(
θ
)
≈
L
(
θ
′
)
+
(
θ
−
θ
′
)
T
g
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
,
L(\theta)\approx L(\theta^\prime)+(\theta-\theta^\prime)^Tg+\frac 12(\theta-\theta^\prime)^TH(\theta-\theta^\prime),
L(θ)≈L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′),
上述公式的来源是泰勒展开,其中,
g
g
g表示的是一个向量,就是对所有
θ
i
\theta_i
θi所算得的
g
r
a
d
i
e
n
t
gradient
gradient,计算方法如下:
g
=
∇
L
(
θ
′
)
g
i
=
∂
L
(
θ
′
)
∂
θ
i
,
g=\nabla L(\theta^\prime)\qquad g_i=\frac {\partial L(\theta^\prime)}{\partial\pmb{\theta}_i},
g=∇L(θ′)gi=∂θθθi∂L(θ′),
其中,
H
H
H是一个矩阵,计算方法如下:
H
i
j
=
∂
2
L
(
θ
′
)
∂
θ
i
∂
θ
j
,
H_{ij}=\frac {\partial^2L(\theta^\prime)}{\partial\pmb{\theta}_i\partial\pmb{\theta}_j},
Hij=∂θθθi∂θθθj∂2L(θ′),
如果,此时的训练的损失已经进入"收敛"状态,此时
g
r
a
d
i
e
n
t
gradient
gradient为0,即
(
θ
−
θ
′
)
T
g
(\theta-\theta^\prime)^Tg
(θ−θ′)Tg该项此时为0,所以我们只需要看余项来对损失函数的形状进行判别即可,即
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
,
L(\theta)\approx L(\theta^\prime)+\frac 12(\theta-\theta^\prime)^TH(\theta-\theta^\prime),
L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′),
为了符号撰写的方便,这里用
v
v
v来表示
(
θ
−
θ
′
)
(\theta-\theta^\prime)
(θ−θ′),由此有
- 若对于所有的 v v v而言,有 v T H v > 0 v^THv>0 vTHv>0,即在 θ ′ \theta^\prime θ′附近,所有的 L ( θ ) L(\theta) L(θ)都大于 L ( θ ′ ) L(\theta^\prime) L(θ′),所以其是局部最小;
- 若对于所有的 v v v而言,有 v T H v < 0 v^THv<0 vTHv<0,即在 θ ′ \theta^\prime θ′附近,所有的 L ( θ ) L(\theta) L(θ)都小于 L ( θ ′ ) L(\theta^\prime) L(θ′),所以其是局部最大;
- 若对于部分 v v v,有 v T H v > 0 v^THv>0 vTHv>0,另外一部分有 v T H v < 0 v^THv<0 vTHv<0,则其表示为鞍点;
但是这里你无法带入所有的
v
v
v,只需要计算
H
H
H的特征值都大于0即可,numpy中计算特征值的函数为np.linalg.eig(H)
;
3、逃离鞍点
设
u
u
u为
H
H
H的一个特征向量,
λ
\lambda
λ为
u
u
u的特征值,此时寻找到一个
λ
<
0
\lambda<0
λ<0那么有
v
T
H
v
→
u
T
H
u
=
u
T
(
λ
u
)
=
λ
u
T
u
=
λ
∣
∣
u
∣
∣
2
,
v^THv→u^THu=u^T(\lambda u)=\lambda u^Tu=\lambda ||u||^2,
vTHv→uTHu=uT(λu)=λuTu=λ∣∣u∣∣2,
此时,
λ
<
0
\lambda<0
λ<0,则
u
T
H
u
<
0
u^THu<0
uTHu<0,所以
L
(
θ
′
)
+
1
2
u
T
H
u
=
L
(
θ
)
<
L
(
θ
′
)
L(\theta^\prime)+\frac 12u^THu=L(\theta)<L(\theta^\prime)
L(θ′)+21uTHu=L(θ)<L(θ′),所以只需要让此时的
θ
\theta
θ沿着
u
u
u更新参数即可:
θ
−
θ
′
=
u
θ
=
θ
′
+
u
,
\theta-\theta^\prime=u\qquad\theta=\theta^\prime+u,
θ−θ′=uθ=θ′+u,
但是,实际上并没有这么做(讲了这么半天结果没人这么干…),李老师的意思是卡在了鞍点并没有那么可怕,那么平时我们遇到情况更多的是高维鞍点;
4、笔者注
在我刚开始接触机器学习与深度学习的时候,对于该领域中的维度有一段时间我理解的不是很明白,经过了一段时间的学习,我稍稍加深了一点对于该名词的理解,当然这可能也比较浅薄,但我希望能加深大家对其的理解:
对于某一个函数,比如 y = a x + b y=ax+b y=ax+b中,在深度学习领域中,我们常将其写成 y = θ 0 x + θ 1 y=\theta_0x+\theta_1 y=θ0x+θ1,其中, θ 0 \theta_0 θ0就是我们常说的偏置(bias),对于这样的一个函数,我们会称其为参数量居于二维空间之中,因为函数中我们要学习的参数只有 θ 0 \theta_0 θ0与 θ 1 \theta_1 θ1两个,而稍微扩展一点,对于一个简单的线性分类器来说,如 y = θ 0 x + θ 1 + θ 2 + . . . + θ n − 1 y=\theta_0x+\theta_1+\theta_2+...+\theta_{n-1} y=θ0x+θ1+θ2+...+θn−1而言,其参数量就属于 N N N维空间之中。
课程中,李老师说到对于低纬的局部最优,可能在高维看上去不过是一个鞍点而已,我们可以这么理解:当我们在一张纸上画一条二次曲线(如 y = a x 2 y=ax^2 y=ax2),并将该张纸揉得很杂乱,对于那张纸而言 ( 0 , 0 ) (0,0) (0,0)这个点永远是局部最小值的点,但是对于现实的三维世界而言,由于我们把其揉的很乱,肯定纸张中有部分是低于 ( 0 , 0 ) (0,0) (0,0)那个点,有部分是 ( 0 , 0 ) (0,0) (0,0)那个点的,我们要找的,则是三维空间中最低(即全局最优解)的那个点。
所以,这样我们也就可以理解为什么,我们倾向于让模型更加复杂,让模型拥有更多的参数,但是如此一来会带来的种种其他问题,解决方法就需要用到我们以后学得的更优异的数学模型和网络构架(如resNet)了。