梯度消失和梯度爆炸是深度学习网络结构中经常提到的概念。都是梯度异常使得参数无法更新或者产生剧烈震荡,导致模型得不到正确参数。
有一点要清楚:在解释梯度消失和爆炸原因的时候,10个人中有8个人会仅仅提到激活函数,诚然激活函数确实有重要影响,但是梯度消失和爆炸其实是梯度和神经元权重值共同作用的结果,所以参数初始化也很重要,后面会给出具体解释。
神经网络一度倾向于做的很深、层数多,参数更新依赖于链式法则求导即多层梯度反向传播,因此多层神经网络实际表现为:(1)各层参数更新的速率不一样(2)网络靠近输出的层参数更新速度快、靠近输入的层参数更新很慢,有时候训练了好多轮、可能前几层的权重值没怎么变化(CNN中亲身实证)。所以,反向传播训练法则是有先天缺陷的,也因此带来梯度消失和爆炸的问题。
这里,以cnn卷积神经网络为例,以cnn中的BP算法更新梯度的方式来阐明梯度消失和爆炸问题,为了简化问题,这里以一个简单的3层神经网络,每层只含一个神经元为例来推导BP算法的梯度。
其中σ为sigmoid激活函数,C表示的是损失函数,前一层的输出和后一层的输入关系如公式1所示。我们可以推导出第一层参数b1 w1 的更新梯度,如下图所示。
看上面的公式有2点要说:
(1)梯度是激活函数导数和权重乘积的累乘,因此梯度消失与爆炸不仅仅是选取激活函数的问题。
(2)sigmoid激活函数的最大导数值为0.25,我们一般会使用0-1正态分布来初始化权重w,因此激活函数乘以权重仍然小于0.25,如果链式法则累成层数过大,最后就变无限逼近于0这就造成了梯度消失。因此要合理的选取激活函数,同时也要合理的初始化权重值。sigmoid激活函数属于饱和激活函数,目前神经网络中已经很少使用。