如何避免梯度爆炸梯度消失

以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算法对整个网络进行训练。虽然也解决了一些问题,但并没有特别火。事实上,预训练+微调的训 练方式可被视为是将大量参数分组,对每组先找到局部看起来较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优。这样就在利用了模型大量参数所提供的自由度的同时,有效地节省了训练开销。
2)第二个阶段开始的标志就是relu, dropout等小技巧,第二波深度学习算法已经基本抛弃了预训练的做法。引入RELU代替sigmoid激活函数。

3)深度残差学习(deepresidual learning)进一步避免了梯度消失(其实是把高阶特征和低阶做融合)。

4归一初始化,各层输入归一化,使得可以收敛的网络的深度提升为原来的十倍。







你可能感兴趣的:(深度学习)