https://blog.csdn.net/yhily2008/article/details/80790476
https://zhuanlan.zhihu.com/p/33006526
在神经其网络的参数训练过程中,BP(Back Propagation)算法非常重要。BP神经网络工作流程分两步:(1)正向传播输入信号,输出分类信息(对于有监督学习而言,基本上都可归属于分类算法);(2)反向传播误差信息,调整网络的权值(通过微调网络参数,让下一轮的输出更加准确)。
产生梯度消失的根源是:深度神经网络的反向传播
我们构建深度神经网络是为了拟合由输入到输出的映射关系,
将损失函数计算的偏差通过梯度反向传播的方式来更新网络的权重,
拟合从输入到输出映射关系的最优的模型的过程就是为网络节点找到合适的参数的过程。
最优模型的条件下loss达到最小值。数学中计算函数最小值的方法适用于此,梯度下降法
以下从两个角度来分析梯度消失和梯度爆炸产生的原因:深层网络和选择了不合适的激活函数。
图片来自:https://zhuanlan.zhihu.com/p/33006526
f 表示每一层的激活函数,那么输出节点可以表示为,fi+1 = f(fi*wi+1) 目标基于梯度下降的方法,按负梯度的方向对权值进行调整。
权值调整量的表达式为(α表示学习率):
根据链式求导法逐层计算。
如果△w值大于1,随着网络层数的不断加深,最终梯度将以指数形式增加(梯度爆炸)
如果△w值小于1,随着网络层数的不断加深,最终梯度将以指数形式减少(梯度消失)
总结:
对于深层的神经网络,不同层的学习率是不同的,从后向前调节,开始阶段,学习率较大;传递到输入层阶段,学习率较小。
梯度消失和梯度爆炸现象产生的根本原因就是梯度反向传播这一训练法则。
彻底消除梯度消失和梯度爆炸,只有改变深度学习梯度反向传播的算法。
Hinton提出capsule的原因就是为了彻底抛弃目前基于反向传播的深度学习算法,如果真能大范围普及,那真是一个革命。
https://zhuanlan.zhihu.com/p/33006526
提出的解决方法都只是减少梯度消失梯度爆炸现象。
在深度神经网络中,激活函数的作用是增加网络的非线性关系自,对于复杂的模型,提高网络的泛化能力。
https://www.cnblogs.com/itmorn/p/11132494.html#ct2
sigmoid激活函数及其导数的表达式的表达式:
Sigmoid函数及其导数的图像:
由函数图像可知,函数梯度不超过0.25,那么随着网络深度的增加,根据上文所述梯度反向传播原理,会出现梯度消失的现象。
tanh激活函数及其导数的表达式的表达式:
tanh函数的图像:
tanh函数导数的图像:
tanh函数导数图像可知,导数的最大值为1,减少梯度消失的效果优于Sigmoid函数。
此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
来自https://zhuanlan.zhihu.com/p/33006526
https://blog.csdn.net/y12345678904/article/details/79581550
梯度裁剪方法是,设置一个阈值,如果梯度超过这个阈值,就将该梯度投射到一个比较小的尺度上。映射的表达式为(其中g表示梯度,θ表示阈值):
良好的权重初始化策略能够缓解梯度爆炸的现象。例如可以使用权重L1正则化、L2正则化。
https://www.cnblogs.com/itmorn/p/11132494.html#ct2
Relu激活函数及其导数的表达式:
对应函数图像及其导数的图像:
Relu解决梯度消失梯度爆炸现象的原理:如果激活函数的导数等于1,则说明不存在梯度消失、梯度爆炸的现象。每一层网络都具有相同的更新速度。
从图像可以看出,Relu激活函数的导数,在正数部分恒等于1,所以不会存在梯度消失梯度爆炸的现象。同时,存在的问题就是在负数部分激活函数的导数恒等于0,会使一部分神经元无法激活。
LeakyRelu函数及其导数的表达式:
LeakyRelu函数及其导数对应的图像:
LeakyRelu与Relu相比解决了0区间的影响。由图像可知,LeakyRelu函数的导数在正数部分恒等于1,负数部分等于一个常数,这部分神经元也能够被激活。
eLU也是为了解决Relu激活函数负数部分导数恒等于0的问题。
eLU激活函数的表达式为:
eLU激活函数及其导数的图像:
BatchNormalization将每层输出的神经元强制规范化到服从标准正态分布的情况,
这些规范化后的结果作为激活函数的输入,能够较大概率落在激活函数的敏感区域,即使输入到激活函数的值发生很小的变化,也会导致损失函数具有较大变化,使梯度变大,能够防止梯度消失现象。
经典的ResNet的shortcut结构图如下图所示:
这些残差边(shortcut)在梯度方向传播的过程中
由于残差边,反向梯度传播过程中又一个1,所以不会产生梯度消失的现象。shortcut机制可以无损的传播梯度,值为1;主干网络的梯度反向传播才会经过有权值的网络层,所以只有所有主干网络的梯度值都为-1,才会产生梯度消失的现象。
感谢:
https://www.cnblogs.com/itmorn/p/11132494.html#ct2
https://zhuanlan.zhihu.com/p/33006526
https://blog.csdn.net/y12345678904/article/details/79581550