梯度消失与梯度爆炸
What?
- 反向传播(用于优化神网参数):根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。
- 采取反向传播的原因:首先,深层网络由许多线性层和非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 f ( x ) f(x) f(x)(非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数。
- 梯度消失和爆炸:层数比较多的神经网络模型在使用梯度下降法对误差进行反向传播时会出现梯度消失和梯度爆炸问题。梯度消失问题和梯度爆炸问题一般会随着网络层数的增加变得越来越明显。
Why?
激活函数角度分析:对于激活函数进行求导,如果此部分大于1,那么层数增多时候,最终的求出梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出梯度更新信息将会以指数形式衰减,即发生梯度消失。
以Sigmoid:
S
(
x
)
=
1
1
+
e
−
x
S(x)=\frac{1}{1+e^{-x}}
S(x)=1+e−x1为例:
对Sigmoid函数求导时,其结果
f
′
(
x
)
=
f
(
x
)
(
1
−
f
(
x
)
)
≤
0.025
f'(x)=f(x)(1-f(x))\le0.025
f′(x)=f(x)(1−f(x))≤0.025:
初始化权值 ∣ w ∣ |w| ∣w∣过大时,导致 ∣ σ ′ ( z ) w ∣ > 1 |\sigma'(z)w|>1 ∣σ′(z)w∣>1.
How?
如何确定是否出现梯度问题?
- 模型无法从训练数据中获得更新(如低损失)。
- 模型不稳定,导致更新过程中的损失出现显著变化。
- 训练过程中,模型损失变成NaN。
Activation Function
- Relu: 让激活函数导数为1;
R e l u ( x ) = m a x ( x , 0 ) = { 0 , x < 0 x , x > 0 } Relu(x)=max(x,0)= \left\{ \begin{array}{cc} 0,x<0\\ x,x>0 \end{array} \right\} Relu(x)=max(x,0)={0,x<0x,x>0} - LeakyRelu: 解决了Relu中0区间带来的影响;
- ELU: 同为解决0区间问题,相对更耗时;
e l u ( x ) = { x , i f x > 0 α ( e x − 1 ) , o t h e r w i s e } elu(x)= \left\{ \begin{array}{cc} x,if\,x>0\\ \alpha(e^x-1),otherwise \end{array} \right\} elu(x)={x,ifx>0α(ex−1),otherwise}
Pre-train & Fine-tunning
其基本思想是每次训练一层隐藏节点,将上一层隐藏层的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这就是逐层训练。在预训练完成后,再对整个网络进行“微调” (fine-tunning)。此思想相当于先寻找局部最优,然后整合起来寻找全局最优。
LSTM
在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,使用长短期记忆(LSTM)型神经元结构可以减少梯度爆炸问题,采用LSTM单元是适合循环神经网络的序列预测的最新最好实践。
Gradient Clipping
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。
Weight Regularization
检查网络权重大小,惩罚产生较大权重的损失函数。该过程称为权重正则化,通常使用的是
L
1
L_1
L1惩罚项或
L
2
L_2
L2惩罚项。
L
o
s
s
=
(
y
−
W
T
x
)
2
+
α
∣
∣
W
∣
∣
2
Loss=(y-W^Tx)^2+\alpha||W||^2
Loss=(y−WTx)2+α∣∣W∣∣2
残差结构
残差网络通过加入shortcut connections,变得更容易被优化,包含一个shortcut connections的几层网络被称为一个残差块(residual block)。
相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处,如下式:
∂
l
o
s
s
∂
x
l
=
∂
l
o
s
s
∂
x
L
⋅
∂
x
L
∂
x
l
=
∂
l
o
s
s
∂
x
L
⋅
(
1
+
∂
∂
x
l
∑
i
=
1
L
−
1
F
(
x
i
,
W
i
)
)
\frac{\partial{loss}}{\partial{x_l}}=\frac{\partial{loss}}{\partial{x_L}}\cdot\frac{\partial{x_L}}{\partial{x_l}}=\frac{\partial{loss}}{\partial{x_L}}\cdot(1+\frac{\partial}{\partial{x_l}}\sum^{L-1}_{i=1}F(x_i,W_i))
∂xl∂loss=∂xL∂loss⋅∂xl∂xL=∂xL∂loss⋅(1+∂xl∂i=1∑L−1F(xi,Wi))
式子的第一个因子表示损失函数到达L的梯度,小括号中的1表明短路机制可以无损地传播梯度,而另一个残差梯度则需要经过带有weights的层。
BN
BN的基本思想:因为深层神经网络在做非线性变换前的激活输入值(
x
=
w
u
+
b
x=wu+b
x=wu+b),随着网络深度增加其分布逐渐发生偏移或变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(sigmoid),所以这导致反向传播时低层神经网络梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN通过把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,这样使得激活输入值落在非线性函数对输入比较敏感的(线性)区域。BN为了保证非线性的获得,对变换后神经元加入scale和shift参数,等价于往非线性函数的非线性区域偏移。
在正向传播的时候,通过可学习的
γ
\gamma
γ与
β
\beta
β求出新的分布值,在反向传播的时候,通过链式求导方式,求出
γ
\gamma
γ与
β
\beta
β以及相关权值。