产生原因
因为神经网络用到的sigmoid的特点,它会将+∞~-∞之间的输入压缩到0~1之间。当input的值更新时,output会有很小的更新。
又因为上一层的输出将作为后一层的输入,而输出经过sigmoid后更新速率会逐步衰减,直到输出层只会有微乎其微的更新。
从数学的角度出发。知sigmoid导数在0的位置取最大值1/4。当我们使用均值为0,方差为1的高斯分布初始化参数w,有|w|<1.
随网络层数加深,w的变化幅度会呈1/4的指数衰减,使得最后学不到东西,造成梯度弥散。
同样,当|w|>1,w变化幅度会指数递增,最后造成梯度爆炸。
解决办法
1.使用relu函数:
这个比sigmoid要好一些,但是有时还是会产生梯度消失
2.加入BN(Batch Normalization)层
BN层作用:
(1)加速收敛
(2)控制过拟合,可以少用或不用Dropout和正则
(3)降低网络对初始化权重不敏感
(4)允许使用较大的学习率
为什么LSTM可以解决梯度弥散?
LSTM相对普通RNN多了加和,也就是多了三个门(输入门,输出门,遗忘门)为避免梯度消散提供了可能。