神经网络VD问题

综述

随着神经网络每层的学习速度其实是不一样的,并且随着层数增加这个问题就越来越明显。一般来说,接近输出层学习速率快,前面的层数学习慢,并随着层数增加学习越来越慢。这种情况我们称为梯度消失(vanishing gradient problem)。下面我们就来分析一下为什么会出现这种情况,并给出解决方案。

理论推导

若有一个神经网络如下:

神经网络VD问题

神经网络有6层,其中每层都有一个神经元。要想知道为什么层数增加训练的越来越慢自然而然的想到考察一下梯度与变量间的变化关系,因此首先来考察一下b与梯度的变化关系。
下面就是理论上的推导了:

假设:

Cb1ΔCΔb1

那么:

Δa1Δb1σ(w1a0+b)b1

Δa1σ(w1a0+b)b1Δb1

Δa1σ(z)(z)zb1Δb1

Δa1σ(z)1Δb1

注:σ(z)表示对z求导。

此时我们得出了b1的变化对z1的影响,而a1的变化又会对z2产生影响因为z2=w2a1+b2那么此时:

Δz2z2a1Δa1=w2Δa1

综合上面的分析把a1的变化代入z2的变化得到:

Δz2w2σ(z)Δb1

依次类推的到:

ΔCw2σ(z1)σ(z2)....σ(z4)ca4Δb1

注:有人可能要问怎么简单的就出来了C了呢?其实这个问题要看一下最初始神经网络的推导:
Cb=Caazzb

前面推导出了azzb现在我只需要把推导出的代入后面两部分,加上变换就可以了。

等式两边同时除以Δb1得到:

ΔCΔb1w2σ(z1)σ(z2)....σ(z4)Ca4

到现在终于推导完成了,长舒一口气。。。。
下面分析一下这个变化中的值,首先我们在初始w时,我们一般初始化为绝对值小于1的数。再来看导数部分:
神经网络VD问题
观察导数图像发现,最大值为0.25。于是对于这个连乘公式,里面的数都小于1.随着层数增加,最终的变化率将越来越小。以至于趋近于零。

解决VD问题

经过上文理论推导,我们发现这个问题中核心是**函数。sigmod的导数最大值1/4成为连乘越来越小的关键。自然我们也想另外选取**函数来解决这个问题。下面祭出核心大杀器:
Rectified linear unit(ReLU)
线性整流函数f(x) = max(0,x),我们对比一下几个函数的图像:
神经网络VD问题

观察ReLU发现在x>0时函数的导数是个常数,而sigmod随着延伸越来越平缓最终导数为0.所以不会出现VD问题了。

我们选择**函数的时候选择这个函数就可以咯。