1、梯度消失产生的原因

我们先来看一个最简单的神经网络,如上图:
c
=
σ
(
σ
(
σ
(
x
⋅
w
1
+
b
1
)
⋅
w
2
+
b
2
)
⋅
w
3
+
b
3
)
c = \sigma(\sigma(\sigma(x·w_1+b_1)·w_2+b_2)·w_3+b_3)
c=σ(σ(σ(x⋅w1+b1)⋅w2+b2)⋅w3+b3)
接下来我们来看看b1的梯度,假设 A = x ⋅ w 1 + b 1 , B = σ ( A ) ⋅ w 2 + b 2 , D = σ ( B ) ⋅ w 3 + b 3 A = x·w_1+b_1,B=\sigma(A)·w_2+b_2,D=\sigma(B)·w_3+b_3 A=x⋅w1+b1,B=σ(A)⋅w2+b2,D=σ(B)⋅w3+b3,那么 c = σ ( D ) c = \sigma(D) c=σ(D),则有:
d c d b 1 = d σ ( D ) d D ⋅ d D d σ ( B ) ⋅ d σ ( B ) d B ⋅ d B d σ ( A ) ⋅ d σ ( A ) d A ⋅ d A d b 1 \frac{dc}{db_1} = \frac{d\sigma(D)}{dD}·\frac{dD}{d\sigma(B)}·\frac{d\sigma(B)}{dB}·\frac{dB}{d\sigma(A)}·\frac{d\sigma(A)}{dA}·\frac{dA}{db_1} db1dc=dDdσ(D)⋅dσ(B)dD⋅dBdσ(B)⋅dσ(A)dB⋅dAdσ(A)⋅db1dA
= σ D ′ ⋅ w 3 ⋅ σ B ′ ⋅ w 2 ⋅ σ A ′ ⋅ 1 =\sigma^{'}_D·w_3·\sigma^{'}_B·w_2·\sigma^{'}_A·1 =σD′⋅w3⋅σB′⋅w2⋅σA′⋅1
= σ D ′ ⋅ w 3 ⋅ σ B ′ ⋅ w 2 ⋅ σ A ′ =\sigma^{'}_D·w_3·\sigma^{'}_B·w_2·\sigma^{'}_A =σD′⋅w3⋅σB′⋅w2⋅σA′
我们知道,卷积层都使用relu、leakrelu、elu等激活函数,但为什么不使用sigmoid作为卷积层的激活函数呢?我们假设
σ
(
x
)
\sigma(x)
σ(x)是sigmoid激活函数。
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x) = \frac{1}{1+e^{-x}}
σ(x)=1+e−x1
sigmoid函数值区间是(0,1),导数值区间是
(
−
∞
,
1
4
)
(-\infty,\frac{1}{4})
(−∞,41),这里就不做证明了。
那现在,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0 标准差为1 的高斯分布。因此所有的权重通常会满足 ∣ w i ∣ < 1 |w_i|<1 ∣wi∣<1。从而有 w i σ ′ < 1 4 w_i\sigma^{'} < \frac{1}{4} wiσ′<41。随着层数的增加,梯度越来越小,这就是消失的梯度出现的本质原因。
2、解决方案
上述说明梯度消失中有两个假设:
假设一:激活函数是sigmoid;
假设二:权重是均值为0,标准差为1的标准高斯分布;
那解决方案自然就是从这两个假设入手了。
2.1、relu、leakrelu、elu等激活函数
该解决方案是从假设一入手的,使用relu等激活函数,使得 σ ′ > = 1 \sigma^{'} >= 1 σ′>=1。
relu激活函数: r e l u ( x ) = m a x ( x , 0 ) relu(x) = max(x,0) relu(x)=max(x,0),即 r e l u ( x ) = { 0 , x < 0 x , x > = 0 relu(x) = \begin{cases} 0, & x<0 \\ x, & x>=0 \end{cases} relu(x)={0,x,x<0x>=0

优点:
- 解决了梯度消失、爆炸的问题 – 计算方便,计算速度快;
- 加速了网络的训练。
缺点:
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决);
- 输出不是以0为中心的。
leakRelu激活函数:
l
e
a
k
R
e
l
u
(
x
)
=
m
a
x
(
0
,
x
)
+
l
e
a
k
∗
m
i
n
(
0
,
x
)
leakRelu(x) = max(0, x) + leak*min(0,x)
leakRelu(x)=max(0,x)+leak∗min(0,x),
即
l
e
a
k
R
e
l
u
(
x
)
=
{
l
e
a
k
∗
x
,
x
<
0
x
,
x
>
=
0
leakRelu(x) = \begin{cases} leak*x, & x<0 \\ x, & x>=0 \end{cases}
leakRelu(x)={leak∗x,x,x<0x>=0

leakRelu解决了relu的0区间带来的影响,leak系数一般选择0.01或者0.02,或者通过学习而来。根据leak的选择,又可以分为LeakyReLU、PReLU和RReLU:
LeakyReLU:leak值固定;
PReLU:leak值根据数据变化;
RReLU:在指定范围内根据数据变化。
elu激活函数: e l u ( x ) = { a ⋅ ( e x − 1 ) , x < 0 x , x > = 0 elu(x) = \begin{cases} a·(e^x-1), & x<0 \\ x, & x>=0 \end{cases} elu(x)={a⋅(ex−1),x,x<0x>=0

elu也是为了解决relu的0区间带来的影响。
2.2、预训练+微调
该解决方案是从假设二入手的,使用预训练模型,预训练模型的权重已经非常接近真实权重了,然后再微调,从而不用担心梯度消失。
2.3、LSTM
LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。