消失的梯度问题(vanishing gradient problem):
更深层的神经网络可以学到不同抽象程度的概念,但随着深度的增加不同层的学习速率会显著不同,接近输出层的学习速率比较合适时前面的层学习太慢,有时被困住.
产生vanishing gradient problem的原因
假设每层只有一个神经元:
激活函数选sigmoid函数
神经元j输入输出分别为:
zj=wjaj−1+bj
aj=σ(zj)
则,对 b1 的一个小变化引起C的变化为:
∂C∂b1≈ΔCΔb1
b1 的变化引起 a1 的变化为:
a1=σ(z1)=σ(w1a0+b1)
Δa1≈∂w1a0+b1∂b1Δb1=σ′(z1)Δb1
a1 的变化引起 z2 的变化为:
z2=w2a1+b2
Δz2≈∂z2∂a1Δa1=w2Δa1
把以上 a1 的变化代入 z2 的变坏:
Δa1≈σ′(z1)w2Δb1
依次类推至 z3 z4 的变化一直到输出层,得到:
ΔC≈σ′(z1)w2σ′(z2)w3σ′(z3)w4σ′(z4)∂C∂a4Δb1
等式两边同时除以 b1 的变化,得到:
∂C∂b1≈σ′(z1)w2σ′(z2)w3σ′(z3)w4σ′(z4)∂C∂a4
由sigmoid函数的导数 σ′ 的图像可以看出,函数的最大值 σ′(0)=0.25 ;
σ′
的图像:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-4, 4, 0.01)
y = np.exp(-x)/((1+np.exp(-x))**2)
plt.plot(x, y, 'b')
plt.title('derivative of sigmoid function')
plt.show()
按平时随机从高斯分布N(0,1)中随机产生权重的方法,大部分 |w|<1 , |wjσ′(zj)|<14 ;
则由
∂C∂b1≈σ′(z1)w2σ′(z2)w3σ′(z3)w4σ′(z4)∂C∂a4
以及
∂C∂b3≈σ′(z3)w4σ′(z4)∂C∂a4
可以看出层数越多连续乘积越小.
采用ReLU解决vanishing gradient problem
若要克服vanishing gradient 问题需要 |wjσ′(zj)|>1 .我们可以对w赋较大的值,但是 σ′(z) 也取决于w: σ′(z)=σ′(wa+b) .所以让w大的时候还不能让 σ′(wa+b) 变小.因此只要是sigmoid函数的神经网络都会造成gradient更新的时候极其不稳定,造成vanishing gradient 问题.
采用修正线性单元ReLU(rectified linear unit):max(0,x+N(0,1))
ReLU图像为:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(-10,10,0.1)
y = [max(0,i) for i in x]
plt.plot(x, y,'g')
plt.grid()
plt.title('ReLU')
plt.axis('equal')
plt.show()
sigmoid与ReLU主要区别:
sigmoid函数的gradient会随着x增大或减小和消失;
ReLU函数不会,
ReLU(x)′={0,ifx<0; 1,ifx>0}
故 Rectified Linear Unit在神经网络中不会产生vanishing gradient 问题.