- 梯度爆炸与梯度消失的原因:
简单地说,根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话( ),那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0( )。下面是数学推导推导。
假设网络输出层中的第 个神经元输出为,而要学习的目标为 。这里的 表示时序,与输入无关,可以理解为网络的第 层。
若采用平方误差作为损失函数,第 个输出神经元对应的损失为
将损失 对输出求偏导
根据链式法则,我们知道,第 层的梯度可以根据第 层的梯度求出来
这里用 表示第 层的第 个神经元, 表示第 层的第 个神经元。
进一步,第 层的梯度可以由第 层的梯度计算出来
这实际上是一个递归嵌套的式子,如果我们对 做进一步展开,可以得到式子
最终,可以一直展开到第 层。
把所有的加法都移到最外层,可以得到
表示的是第 层中神经元的下标(即第 层第 个神经元), 表示第 层的下标。 对应输出层, 对应第 层。实际上展开式就是从网络的第 层到 层,每一层都取出一个神经元来进行排列组合的结果。这个式子并不准确,因为 时实际是损失 对输出层的偏导,即
,
并没有应用权重,把它修正一下
这样,我们就得到了第 层和第 层的梯度之间的关系
在上面的式子中,由于加法项正负号之间可能互相抵消。因此,比值的量级主要受最后的乘法项影响。如果对于所有的 有
则梯度会随着反向传播层数的增加而呈指数增长,导致梯度爆炸。
如果对于所有的 有
则在经过多层的传播后,梯度会趋向于0,导致梯度消失。
2. 解决方法:
以sigmoid函数为例子,sigmoid函数使得输出在[0,1]之间。
事实上x到了一定大小,经过sigmoid函数的输出范围就很小了,参考下图
如果输入很大,其对应的斜率就很小,我们知道,其斜率(梯度)在反向传播中是权值学习速率。在深度网络中,如果网络的激活输出很大,其梯度就很小,学习速率就很慢。假设每层学习梯度都小于0.25,网络有n层,因为链式求导(第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n)的原因,第一层的梯度小于0.25的n次方,所以学习速率就慢,对于最后一层只需对自身求导1次,梯度就大,学习速率就快。这会造成的影响是在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义。
梯度消失的影响:
(1)浅层基本不学习,后面几层一直在学习,失去深度的意义。
(2)无法收敛。
如何解决:
(1)第一个阶段就是逐层预训练方法,为了解决深层神经网络的训练问题,一种有效的手段是采取无监督逐层训练(unsupervised layer-wise training)。其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这被称之为“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)训练。在使用无监督训练时,首先训练第一层,这是关于训练样本的RBM模型,可按标准的RBM进行训练;然后,将第一层预训练号的隐节点视为第二层的输入节点,对第二层进行预训练;各层预训练完成后,再利用BP算法对整个网络进行训练。虽然也解决了一些问题,但并没有特别火。事实上,“