梯度消失与梯度爆炸 (Vanishing/Expanding Gradients)
训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是你训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。
这节课,你将会了解梯度消失或梯度爆炸的真正含义,以及如何更明智地选择随机初始化权重,从而避免这个问题。 假设你正在训练这样一个极深的神经网络,为了节约幻灯片上的空间,我画的神经网络每层只有两个隐藏单元,但它可能含有更多,但这个神经网络会有参数
w
[
1
]
w^{[1]}
w [ 1 ] ,
w
[
2
]
w^{[2]}
w [ 2 ] ,
w
[
3
]
w^{[3]}
w [ 3 ] 等等,直到
w
[
l
]
w^{[l]}
w [ l ] ,为了简单起见,假设我们使用激活函数
g
(
z
)
=
z
g(z)=z
g ( z ) = z ,也就是线性激活函数,我们忽略
b
b
b ,假设
b
[
l
]
b^{[l]}
b [ l ] =0,如果那样的话,输出
y
=
w
[
l
]
w
[
l
−
1
]
w
[
l
−
2
]
⋯
w
[
3
]
w
[
2
]
w
[
1
]
x
y=w^{[l]}w^{[l-1]}w^{[l-2]}\cdots w^{[3]}w^{[2]}w^{[1]}x
y = w [ l ] w [ l − 1 ] w [ l − 2 ] ⋯ w [ 3 ] w [ 2 ] w [ 1 ] x ,如果你想考验我的数学水平,
w
[
1
]
x
=
z
[
1
]
w^{[1]}x=z^{[1]}
w [ 1 ] x = z [ 1 ] ,因为
b
=
0
b=0
b = 0 ,所以我想
z
[
1
]
=
w
[
1
]
x
z^{[1]}=w^{[1]}x
z [ 1 ] = w [ 1 ] x ,
a
[
1
]
=
g
(
z
[
1
]
)
a^{[1]}=g(z^{[1]})
a [ 1 ] = g ( z [ 1 ] ) ,因为我们使用了一个线性激活函数,它等于
z
[
1
]
z^{[1]}
z [ 1 ] ,所以第一项
w
[
1
]
x
=
a
[
1
]
w^{[1]}x=a^{[1]}
w [ 1 ] x = a [ 1 ] ,通过推理,你会得出
w
[
2
]
w
[
1
]
x
=
a
[
2
]
w^{[2]}w^{[1]}x=a^{[2]}
w [ 2 ] w [ 1 ] x = a [ 2 ] ,因为
a
[
2
]
=
g
(
z
[
2
]
)
a^{[2]}=g(z^{[2]})
a [ 2 ] = g ( z [ 2 ] ) ,还等于
g
(
w
[
2
]
a
[
1
]
)
g(w^{[2]}a^{[1]})
g ( w [ 2 ] a [ 1 ] ) ,可以用
w
[
1
]
x
w^{[1]}x
w [ 1 ] x 替换
a
[
1
]
a^{[1]}
a [ 1 ] ,所以这一项就等于
a
[
2
]
a^{[2]}
a [ 2 ] ,这个就是
a
[
3
]
(
w
[
3
]
w
[
2
]
w
[
1
]
x
)
a^{[3]}(w^{[3]}w^{[2]}w^{[1]}x)
a [ 3 ] ( w [ 3 ] w [ 2 ] w [ 1 ] x ) 。
所有这些矩阵数据传递的协议将给出
y
^
\hat{y}
y ^ 而不是
y
y
y 的值。
假设每个权重矩阵
w
[
l
]
=
[
1.5
0
0
1.5
]
w^{[l]}=\left[\begin{matrix}1.5&0\\0&1.5\end{matrix}\right]
w [ l ] = [ 1 . 5 0 0 1 . 5 ] ,从技术上来讲,最后一项有不同维度,可能它就是余下的权重矩阵,
y
=
w
[
1
]
[
1.5
0
0
1.5
]
(
L
−
1
)
x
y=w^{[1]}\left[\begin{matrix}1.5&0\\0&1.5\end{matrix}\right]^{(L-1)}x
y = w [ 1 ] [ 1 . 5 0 0 1 . 5 ] ( L − 1 ) x ,因为我们假设所有矩阵都等于它,它是1.5倍的单位矩阵,最后的计算结果就是
y
^
\hat{y}
y ^ ,也就是等于
1.
5
(
L
−
1
)
x
1.5^{(L-1)}x
1 . 5 ( L − 1 ) x 。如果对于一个深度神经网络来说
L
L
L 值较大,那么
y
^
\hat{y}
y ^ 的值也会非常大,实际上它呈指数级增长的,它增长的比率是
1.
5
L
1.5^L
1 . 5 L ,因此对于一个深度神经网络,
y
y
y 的值将爆炸式增长。
相反的,如果权重是0.5,
w
[
l
]
=
[
0.5
0
0
0.5
]
w^{[l]}=\left[\begin{matrix}0.5&0\\0&0.5\end{matrix}\right]
w [ l ] = [ 0 . 5 0 0 0 . 5 ] ,它比1小,这项也就变成了
0.
5
L
0.5^L
0 . 5 L ,矩阵
y
=
w
[
1
]
[
1.5
0
0
1.5
]
(
L
−
1
)
x
y=w^{[1]}\left[\begin{matrix}1.5&0\\0&1.5\end{matrix}\right]^{(L-1)}x
y = w [ 1 ] [ 1 . 5 0 0 1 . 5 ] ( L − 1 ) x ,再次忽略
w
[
L
]
w^{[L]}
w [ L ] ,因此每个矩阵都小于1,假设
x
1
x_1
x 1 和
x
2
x_2
x 2 都是1,激活函数将变成
1
2
\frac12
2 1 ,
1
2
\frac12
2 1 ,
1
4
\frac14
4 1 ,
1
4
\frac14
4 1 ,
1
8
\frac18
8 1 ,
1
8
\frac18
8 1 等,直到最后一项变成
1
2
L
\frac1{2^L}
2 L 1 ,所以作为自定义函数,激活函数的值将以指数级下降,它是与网络层数数量相关的函数,在深度网络中,激活函数以指数级递减。
我希望你得到的直观理解是,权重
w
w
w 只比1略大一点,或者说只是比单位矩阵大一点,深度神经网络的激活函数将爆炸式增长,如果
w
w
w 比1略小一点,可能是
[
0.9
0
0
0.9
]
\left[\begin{matrix}0.9&0\\0&0.9\end{matrix}\right]
[ 0 . 9 0 0 0 . 9 ] 。
在深度神经网络中,激活函数将以指数级递减,虽然我只是讨论了激活函数以与
L
L
L 相关的指数级数增长或下降,它也适用于与层数
L
L
L 相关的导数或梯度函数,也是呈指数级增长或呈指数递减。
对于当前的神经网络,假设
L
=
150
L=150
L = 1 5 0 ,最近Microsoft对152层神经网络的研究取得了很大进展,在这样一个深度神经网络中,如果激活函数或梯度函数以与
L
L
L 相关的指数增长或递减,它们的值将会变得极大或极小,从而导致训练难度上升,尤其是梯度指数小于
L
L
L 时,梯度下降算法的步长会非常非常小,梯度下降算法将花费很长时间来学习。
总结一下,我们讲了深度神经网络是如何产生梯度消失或爆炸问题的,实际上,在很长一段时间内,它曾是训练深度神经网络的阻力,虽然有一个不能彻底解决此问题的解决方案,但是已在如何选择初始化权重问题上提供了很多帮助。
课程PPT