深度学习--采用ReLU解决消失的梯度问题(vanishing gradient problem)

消失的梯度问题(vanishing gradient problem):

更深层的神经网络可以学到不同抽象程度的概念,但随着深度的增加不同层的学习速率会显著不同,接近输出层的学习速率比较合适时前面的层学习太慢,有时被困住.

产生vanishing gradient problem的原因

假设每层只有一个神经元:

深度学习--采用ReLU解决消失的梯度问题(vanishing gradient problem)_第1张图片
激活函数选sigmoid函数
神经元j输入输出分别为:

 zj=wjaj1+bj

 aj=σ(zj)

则,对 b1 的一个小变化引起C的变化为:

Cb1ΔCΔb1

b1 的变化引起 a1 的变化为:

 a1=σ(z1)=σ(w1a0+b1)

 Δa1w1a0+b1b1Δb1=σ(z1)Δb1

a1 的变化引起 z2 的变化为:

 z2=w2a1+b2

 Δz2z2a1Δa1=w2Δa1

把以上 a1 的变化代入 z2 的变坏:

 Δa1σ(z1)w2Δb1

依次类推至 z3   z4 的变化一直到输出层,得到:

 ΔCσ(z1)w2σ(z2)w3σ(z3)w4σ(z4)Ca4Δb1

等式两边同时除以 b1 的变化,得到:

 Cb1σ(z1)w2σ(z2)w3σ(z3)w4σ(z4)Ca4

由sigmoid函数的导数  σ 的图像可以看出,函数的最大值  σ(0)=0.25 ;

 σ 的图像:
深度学习--采用ReLU解决消失的梯度问题(vanishing gradient problem)_第2张图片

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

则由

 Cb1σ(z1)w2σ(z2)w3σ(z3)w4σ(z4)Ca4

以及

 Cb3σ(z3)w4σ(z4)Ca4

可以看出层数越多连续乘积越小.

采用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图像为:

深度学习--采用ReLU解决消失的梯度问题(vanishing gradient problem)_第3张图片

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 问题.

你可能感兴趣的:(深度学习)