上篇文章发现一个新的问题,越往外越接近输出层,学习效率比较高
这篇文章来讨论一下如何解决这个问题
Exploding gradient problem:
修正以上问题:
(1)初始化比较大的权重:比如w1=w2=w3=w4=100
(2)初始化b,使
σ
′
(
z
j
)
\sigma'(z_j)
σ′(zj)不要太小
比如为了让
σ
′
\sigma'
σ′最大(也就是=1/4),我们可以通过调节b,让z=0:
b1=-100a0
z1=100a0±100a0=0
这种情况下:
w
j
σ
′
(
z
j
)
w_j\sigma'(z_j)
wjσ′(zj)=1001/4=25
每层是前一层的25倍,又出现了exploding的问题
从根本上来讲,不是vanishing或者exploding的问题,而是后面层的梯度是前面层的累积的乘积,所以神经网络非常不稳定,唯一可能的情况是以上的连续乘积刚好平衡大约等于1,但是这种几率非常小
所以,这是一个不稳定的梯度问题,通常有多层,每层网络都以非常不同的速率学习
总体来说,vanishing problem具有普遍性:
如果想要克服vanishing problem,需要
w
j
σ
′
(
z
j
)
w_j\sigma'(z_j)
wjσ′(zj)的绝对值大于1,我们可以尝试赋值w很大,但是问题是
σ
′
(
z
)
\sigma'(z)
σ′(z)也取决于w:
σ
′
(
z
)
=
σ
′
(
w
a
+
b
)
\sigma'(z)=\sigma'(wa+b)
σ′(z)=σ′(wa+b)
所以我们要让w大的时候,还得注意不能让
σ
′
(
w
a
+
b
)
\sigma'(wa+b)
σ′(wa+b)变小,这种情况非常少见,除非输入值在一个非常小的区间内
刚才的例子只是每层一个神经元的情况:
在每层多个神经元的情况下:
在l层的gradient(L层神经网络):
矩阵和向量的表示,与之前类似
所以只要是Sigmoid函数的神经网络都会造成gradient更新的时候极其不稳定,造成vanishing 或者 exploding的问题
综上所述,训练深度神经网络中有很多难点:
这篇文章:(1)神经网络的不稳定性
(2)activation方程的选择
(3)初始化权重和偏向的方法
(4)具体更新过程
(5)hyper-parameter的选择
这些目前都是当前学术界研究的课堂,已经取得一些有效的解决方法。
解决vanishing gradient方法:
Sigmoid unit:
Tanh unit:
Rectified linear unit(ReLU):
我们把
叫做 stepped sigmoid
把:
叫做 softplus function
softplus 函数可以被 max 函数模拟:max(0,x+N(0,1))
max函数叫做 Rectified Linear Function (ReL)
Sigmoid和ReL方程主要区别:
Sigmoid函数值在[0,1]之间,ReL函数值在[0,∞],所以sigmoid函数适合来描述概率,而ReL函数适合用来描述实数
Sigmoid函数的gradient会随着x增大或减小和消失,但是ReL函数不会:
gradient=0 (if x<0),gradient=1 (if x>0)
Rectified Linear Unit在神经网络中的优势:
不会产生vanishing gradient问题。