神经网络中有梯度消失和梯度爆炸的问题,激活函数选择不当会产生梯度消失的问题;RNN网络本身就有梯度消失和爆炸的问题,所以才有了后来的LSTM以及具有较少参数的GRU。梯度消失一般的解决办法改变网络架构、参数初始化、以及改变步长。

激活函数

Sigmoid激活函数和Tanh激活函数都有梯度消失的问题,因为函数f(z)中z非常大或非常小的时候,f(z)的导数将会无限的接近0,这时使用反向传播算法进行训练神经网络会产生训练速度非常慢的现象。
Sigmoid激活函数:
梯度消失问题 - 图1
Sigmoid激活函数的导数
梯度消失问题 - 图2
Tanh激活函数:
梯度消失问题 - 图3
Tanh激活函数的导数:
梯度消失问题 - 图4
正是由于Sigmoid函数和Tanh函数有梯度消失的问题,所以才有了后面的Relu函数。
Relu函数的特性:

  1. 单边抑制性,可以提供网络的稀疏表达能力。
  2. 不需要计算指数,减少了计算的复杂度。
  3. 非饱和性可以解决梯度消失的问题,提供了相对宽的激活边界。
  4. 单边抑制性也导致了神经元死亡的问题产生,因为该函数会导致负梯度在该Relu单元时被置为0,则会导致流经该神经元的梯度永远为0,也就无法参与训练。

由于Relu激活函数的神经元死亡问题,因此才有了LRelu(Leaky Relu)函数,当z<0时,值不为0,而是一个斜率为a的线性函数,其中a非常小。这样即保证了单边抑制性,也保证了神经元不会死亡。由于a选择很困难,因此PRelu产生,其中参数a伴随着神经网络一起学习。还有一种Random Relu,在训练过程中对参数a进行满足某种分布的随机采样;测试的时候才固定下来。

RNN梯度消失

RNN网络梯度消失是因为循环神经网络隐层输出需要不断地累乘,作为下一次隐层地输入。当隐层输出小的时候,不断相乘最终会变为0;当隐层输出比较大的时候,不断相乘最终会变得非常大。这样也会导致梯度变得非常大或者非常小,因此为了解决这类问题,才有了门控制网络LSTM和GRU.
LSTM通过把累乘变成累加进行解决,GRU只是在LSTM的基础之上减少了遗忘门,根据输入门和遗忘门的互补关系,把输入门和遗忘门进行了耦合。

解决办法

梯度消失可以使用BN或者LN进行正则化来缓解、使用Relu函数。
LSTM和GRU只是缓解了梯度消失问题,对于梯度爆炸问题可以使用梯度截断的方法。