DL相比于过去的人工神经网络,特点在于深,但深层的神经网络往往会遭遇数值稳定性问题,如某参数值为0.2或5,30层后变成 0. 2 30 0.2^{30} 0.230或 5 30 5^{30} 530。一个非常小,接近于0,这就是梯度消失;一个非常大,超过计算机能表示的范围,这就是梯度爆炸。
梯度爆炸、消失
以MLP为例,计算第
l
l
l层输出:
H
(
l
)
=
X
W
(
1
)
W
(
2
)
…
W
(
l
)
\boldsymbol{H}^{(l)}=\boldsymbol{X} \boldsymbol{W}^{(1)} \boldsymbol{W}^{(2)} \ldots \boldsymbol{W}^{(l)}
H(l)=XW(1)W(2)…W(l)
当经过很多层的累积效果后,就会出现数值不稳定的情况,这边是梯度爆炸(explosion)和消失(vanishing)。记得,之前学过梯度爆炸可以用梯度裁剪(clipping)的方式解决,梯度消失在RNN中出现比较多,gru和lstm等RNN模型有解决的方法。
随机初始化参数的原因
还是以MLP为例,统一参数为相同值的结果就是当隐层的每个神经元的激活函数相同时,其反向传播梯度是一样的,这样所有单元参数更新时还是一样的值。这相当于一个神经元的作用。因此需要随机初始化权重参数。
pytorch默认初始化:nn.init()
Xavier初始化
U
(
−
6
a
+
b
,
6
a
+
b
)
U(-\sqrt{\frac{6}{a+b}}, \sqrt{\frac{6}{a+b}})
U(−a+b6,a+b6)
这些参数初始化方法好像都有些道道,我还不懂。。。
其他环境影响
协方差偏移是指测试时输入与原来训练集的特征有差异,比如训练用的是真实世界的猫,测试用的是卡通猫;
标签偏移是指测试集出现了训练集中没有的类;
概念偏移是指同一个东西不同的叫法,好比可乐,中国人叫可乐,外国人叫drink。
有些话说
一些问题:
- 梯度爆炸和消失是什么?如何避免?
- 神经元激活函数都一样的情况下,参数初始化一样会发生什么事情?