神经网络的梯度消失和梯度爆炸
1.引言
梯度消失和梯度爆炸是如何产生的
大家都应该都听过BP算法,对的,它就是深度神经网络的老祖宗。
深度神经网络的深度可以理解成网络层数,可以把神经网络理解成一个黑盒子,当一个输入经过一个黑盒子(network)就得到了一个输出,也可以把这个黑盒子理解成一个很复杂的函数(function)。
那我们从简单的BP算法开始分析,从而理解梯度消失和梯度爆炸的产生。
BP算法的基础其实就是导数的链式法则,就是有很多乘数因子会连接在一起。
上图的四个乘积(偏导)因子可以理解成四层网络,当乘积因子(网络层)个数太多时
1)当乘积因子<1的相乘,梯度后向传播到输入层时,就所剩无几,就会出现梯度消失。
2)当乘积因子>1的相乘,梯度后向传播到输入层时,则会出现梯度爆炸。
2 主流解决方式
1)预训练模型加微调
2)权重剪切+正则
- 梯度:设梯度阈值
- 正则:L1/L2
3)relu、leakrelu、srelu等激活函数
- leakrelu解决了0区间带来的影响,而且包含了relu的所有优点
4)BN/GN
5) 高速网络的思想(门)
- cnn:ResNet DesseNet Inception
- rnn: lstm
简单罗列了五条,其实在实际生产中,要想用好这几条可并非易事
1.2.1 预训练模型
预训练模型在CNN深层网络训练成为越来越成为不可或缺的部分
预训练模型本质是继续训练,为什么这么说,拿resnet50来说。如果你自己搭建了一个resnet50这么深的网络,就笔者经验而言,你指望前面四点防止梯度消失和梯度爆炸基本是不可能,只有在准备好预训练模型之后才去做上述的处理。
预训练模型做了什么呢?
提供可训练的合理的W B值
既然是继续训练,当然还有加速收敛
1.2.2 高速网络
深度学习模型发展方向大致为两个,要么网络变深,要么网络变宽。
但是网络变深并非易事,在resnet问世之前,随着网络加深,却获得了比较浅的网络更高的错误率,
resnet(残差网络)的思想使得这种模型退化的问题得到有效解决。
Resnet
resnet是何老师的作品,网络结构如下:
模型增加一个identity mapping(恒等映射),将原始所需要学的函数F(x)转换成F(x)+x,作者认为这两种表达的效果相同,但是优化的难度后者更低.
DenseNet
DenseNet其实是resnet的变种,我也不明白这种改进就能拿2017的best paper,让我不禁感概神经网络进化真是缓慢,还有创新的方向并非易事,什么时候能出一个CNN ,RNN,GAN这种级别的网络,甚至更牛逼的。
DenseBlock
DenseBlock块其实是resnet块的更复杂形式,resnet最多只有两个输入,而DenseBlock可最多连i-1个输入
DenseNet实际上是多个DenseBlock连接而成,单个Denseblock中,假设每一个非线性变换H的输出为K个feature map, 那么第i层网络的输入便为K0+(i-1)×K, 这里我们可以看到DenseNet和现有网络的一个主要的不同点:DenseNet可以接受较少的特征图数量作为网络层的输出,如下图所示
Inception
那么解决深度学习 参数过多、和梯度消失问题,方法当然就是增加网络深度和宽度的同时减少参数,Inception就是在这样的情况下应运而生。
lstm
lstm本质是三个门:输入,输出,遗忘门。结构此处不作阐述,可以去网上找找这种结构学习。