0%

梯度消失和梯度爆炸

周末刷知乎看到一个问题,关于如何理解梯度消失和梯度爆炸的。有个回答讲的比较好,就和 sigmoid 函数一起总结一下吧。

梯度消失和爆炸

梯度消失和梯度爆炸本质就是激活函数(的导数)和权重相互作用产生的联合效果,这个很重要,因为很多人以为梯度消失和爆炸是只存在某些激活函数中,其实不然。梯度消失和爆炸不单单是激活函数的问题, 不管你用 sigmoid/tanh 还是 ReLU 都有可能发生梯度消失/爆炸,只是发生的频繁程度不同。

我们知道,神经网络的每层计算可以看做矩阵相乘之后接一个非线性映射也就是激活函数,可以表示为:

求导以后就是:

其中等式右边第一项是对角阵,表示激活函数的导函数,假如激活函数是 sigmoid 函数,则对角阵中每个元素都小于 1 ,会产生压缩的效果;而第二项特征值的大小与 W 本身有关,既可能收缩也可能扩张。

假如 W 的所有特征值都小于 1,那么此时两项相乘也是收缩的效果;反之,两项的乘积有可能(注意不是一定)产生扩张的效果。多层累积以后,就有可能发生梯度消失和梯度爆炸。 因为 sigmoid 函数的导数值域小于 1,所以很依赖 W 的值,因此容易产生梯度消失,tanh 同理。但是并不是说一定会梯度消失。如果使用的激活函数的导数值域大于 1,则容易产生梯度爆炸,但是不一定会。ReLU 梯度等于 1,看上去比较合适。

sigmoid 求导

为什么 sigmoid 函数的导数小于 1 呢?求导就明白了。

sigmoid 函数:

求导:

因为 sigmoid 函数的值域: $0 < f(x) < 1$ ,因此 $0 < f’(x) < 1$。