问题引出
在前面,我们介绍了反向传播算法,其最终极的含义就是计算偏导数
∂
C
∂
ω
j
k
l
\frac{\partial C}{\partial\omega_{jk}^{l}}
∂ωjkl∂C和
∂
C
∂
b
j
l
\frac{\partial C}{\partial b_{j}^{l}}
∂bjl∂C,其中
∂
C
∂
ω
j
k
l
=
α
k
l
−
1
⋅
δ
j
l
\frac{\partial C}{\partial\omega_{jk}^{l}}=\alpha_k^{l-1}\cdot\delta_j^l
∂ωjkl∂C=αkl−1⋅δjl,
δ
l
=
(
(
ω
l
+
1
)
T
δ
l
+
1
)
σ
′
(
z
l
)
\delta^l=((\omega^{l+1})^T\delta^{l+1})\sigma^{\prime}(z^l)
δl=((ωl+1)Tδl+1)σ′(zl),将
∂
C
∂
ω
\frac{\partial C}{\partial\omega}
∂ω∂C用
δ
l
\delta^l
δl展开,可以想象一下,这会有很多的
σ
′
(
z
)
ω
\sigma^{\prime}(z)\omega
σ′(z)ω连乘。
其中:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)=\frac{1}{1+e^{-z}}
σ(z)=1+e−z1,计算得到:
σ
′
(
z
)
=
σ
(
z
)
(
1
−
σ
(
z
)
)
\sigma^{\prime}(z)=\sigma(z)(1-\sigma(z))
σ′(z)=σ(z)(1−σ(z))
梯度消失
利用google搜索(1/(1+exp(-x)))(1-1/(1+exp(-x)))
得到
σ
′
(
z
)
\sigma^{\prime}(z)
σ′(z)的图像:
该函数的最大值为
1
4
\frac{1}{4}
41,我们假设
ω
\omega
ω都是一个合适的数,使
∣
σ
′
(
z
)
ω
∣
<
1
|\sigma^{\prime}(z)\omega|\lt 1
∣σ′(z)ω∣<1,可以想象,网络越深,连乘的次数越多,得到的
∂
C
∂
ω
\frac{\partial C}{\partial\omega}
∂ω∂C越小,极端情况下
∂
C
∂
ω
\frac{\partial C}{\partial\omega}
∂ω∂C可能趋近于0,这就是梯度消失。
梯度爆炸
既然梯度消失时令
∂
C
∂
ω
\frac{\partial C}{\partial\omega}
∂ω∂C越来越小,相反的梯度爆炸就是让
∂
C
∂
ω
\frac{\partial C}{\partial\omega}
∂ω∂C可能趋近于0越来越大,只要
∣
σ
′
(
z
)
ω
∣
>
1
|\sigma^{\prime}(z)\omega|\gt 1
∣σ′(z)ω∣>1就是有可能的。回忆一下梯度下降算法中
ω
\omega
ω的更新方法:
ω
k
→
ω
k
′
=
ω
k
−
η
∂
C
∂
ω
k
\omega_k \rightarrow \omega_k^{\prime}=\omega_k-\eta\frac{\partial C}{\partial \omega_k}
ωk→ωk′=ωk−η∂ωk∂C
想想一下,如果
η
∂
C
∂
ω
k
\eta\frac{\partial C}{\partial \omega_k}
η∂ωk∂C比原本的
ω
k
\omega_k
ωk都还要大了,那这个梯度就向反方向更新了,模型无法收敛,这就是梯度爆炸。
总结一下,其实梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应,越乘越小或越乘越大。
如何解决
规避梯度消失和梯度爆炸的方法有:
- 预训练和微调
- 梯度阈值
主要是针对梯度爆炸,它设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。 - 正则化
也是针对梯度爆炸的,主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生,常用的正则化方法有 L1 正则和 L2 正则。 - 激活函数
通过之前的分析,我们发现梯度问题是由 s i g m o d sigmod sigmod函数的导数引起的,我们可以选其他的激活函数代替 s i g m o d sigmod sigmod函数,如 r e l u relu relu、 t a n h tanh tanh,其中 r e l u relu relu函数在正数部分的导数为1,不会导致梯度问题。
注: t a n h ′ ( z ) = 1 − t a n h ( z ) 2 tanh^{\prime}(z)=1-tanh(z)^2 tanh′(z)=1−tanh(z)2,其最大值为1,也有可能出现梯度问题。 - BN方法
BN(Batch Normalization)就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。 - LSTM
通过各种是遗忘门、输入门和输出门决定需要丢弃和记忆哪些信息。能防止梯度问题。
其他
那深度神经网络难以训练的根本是因为梯度消失或梯度爆炸问题吗?不是,而是因为退化,具体来讲就是权重矩阵的退化,导致模型的有效自由度减少。
矩阵的条件数可以表示为:
κ
(
A
)
=
σ
m
a
x
(
A
)
σ
m
i
n
(
A
)
\kappa (A)=\frac{\sigma_{max}(A)}{\sigma_{min}(A)}
κ(A)=σmin(A)σmax(A)
其中
σ
m
a
x
(
A
)
\sigma_{max}(A)
σmax(A)和
σ
m
i
n
(
A
)
\sigma_{min}(A)
σmin(A)分别是
A
A
A的极大和极小奇异值。
随着相乘矩阵的数量(网络深度)的增加,矩阵的乘积变得更加退化,积矩阵的奇异值变得越来越集中,因此其条件数变得越来越大,越来越病态。
若一个矩阵的条件数越小,那么求解这个矩阵的线性方程组就越稳定,不会因为一点扰动导致这个线性方程组的解变化很大。可逆矩阵为非退化矩阵,不可逆矩阵为退化矩阵。
感谢阅读。
如果觉得文章对你有所帮助,欢迎打赏哦~