概述
以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)归一初始化,各层输入归一化,使得可以收敛的网络的深度提升为原来的十倍。
最后
以上就是温婉西装为你收集整理的如何避免梯度爆炸梯度消失的全部内容,希望文章能够帮你解决如何避免梯度爆炸梯度消失所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复