#梯度怎么消失(爆炸)了,什么是梯度(爆炸)消失
首先,要回答这个问题,我们先要了解什么是反向传播
https://www.atatech.org/articles/157795
从上文可以看出,传统的反向传播优化参数时,在我们考虑一个参数对误差的贡献时,我们通过一个链式求导对其得出了解,那么这么一串链式求导,在越来越深的网络结构里就产生了一个问题,离输入口最近的参数往往有着非常长的链式求导,然鹅,很多时候并不是越长,越深就越好,由于每一层求导都极有可能是小于零的数,那么很容易的,离输入口最近的参数所得出的纠正数往往就是及其的小,那么我们每一轮迭代都是基于反向传播的结果的,这样基本上就等于在反向传播的时候,比较靠前的参数就得不到修正,那么我们不禁会担心深层的网络里前面多层的参数都不到个卵,那迭代那么多次还有什么球用。
这就是梯度消失,简单来说,网络深了,传统反向传播导致离输入层近的参数在迭代的时候学不到东西,既然学不到东西,搞那么深的网络就没有什么用,但是网络已经搞深了,大家都很尴尬。
反过来看,如果每一层都是>1的数,那么链式乘积就会很大,搞的一点点小问题就要对参数进行很大的调整,然鹅越调越不熟练,一样很尴尬,这是梯度爆炸的问题
#梯度消失(爆炸)怎么解
##调整激活函数
如上文所说,反向传播时导数小于1是导致梯度消失的非常重要的一个因素,所以我们第一个要考虑的问题就是,导数小于1是如何产生的
一个比较大的原因是神经网络的激活函数,常见的sigmod和tahn函数,偏导的范围在1/4-0 以及 1-0之间,所以层数高了,自然容易尴尬。通用的解法是使用relu函数,leakrelu函数等函数,以relu函数为例,其正数的偏导恒等为1,很好的解决了这个问题。当然,单调relu也会导致部分神经元在迭代过程中不可修复的失活。
##Batchnorm
我们再来仔细回顾一下在对目标变量求导过程中的一个细节
![3f2c6de54c476311cba416e626752b87.png](https://i-blog.csdnimg.cn/blog_migrate/15b56ad26a2189b68d54e2d2f2bf13da.png)
,在求偏导过程中,w越大,就越容易爆炸,越小,就越容易消失。而导致w偏于特别大和特别小的一个原因是各个输入的绝对量级差的很大,所以通过对输入进行强制的归一化,通过把输入值强行拉入一个正太分布的区间,我们可以制约w的分布,减少梯度消失活爆炸的可能
##Attention机制,LSTM和RES结构
这个我们会专门列一栏详细介绍,在这里我们不做赘述