- 在深度学习中的各种操作实际上是矩阵乘法操作,使用乘法操作就容易造成数值的消失和爆炸,就是一个非常小的数乘以一个非常小的数可能就下溢了,一个大的数乘以一个大的数字就上溢了,并且由于梯度的原因,即使不溢出也会很难收敛。
- 所以问题就变为了如何找到
sweet point
,这样就会加速收敛。
推理过程
- 假设我们有一个
100
层的网络,没有激活函数,因此每个网络的参数是一个矩阵,假设我们已经将参数scale
到均值0
方差1
。 - 我们的输入是
a
,因此到最终输出结果要和这100
个矩阵做矩阵乘法,我们接下来可以看到从一个标准的正态分布中初始化不是一个好的选择,可以看到经过100
次乘法以后已经Nan
了。
- 可以看到在
29
层的时候就已经数值爆炸了,因此使用标准的正太分布初始化的值太大了。
-
当初始化的值太小了,会数值消失,尽管此时的均值仍是0,标准差是0.1。
- 令
y
表示网络的输出,输入x
和使用标准正太分布初始化的权重矩阵a
的乘积的标准差与输入连接数(此处是512
)的平方根非常相近。因此如果我们对权重矩阵的所有值除以他连接数目的根号(√512
)那么就可以保证输出y
的方差是1
。
- 因此这次的权重矩阵再次规范化以后得到的值就是连乘后不会让输出爆炸和消失的数值,可以看到尽管是
100
层的网络但是还是没有数值爆炸或者数值消失。
Xavier Initialization
- 在使用了比如
sigmoid
和tanh
这样的对称的激活函数,初始化的时候就要更加的小心了,因为经过这些激活函数一样,只有很小的部分是在激活区里面,其他地方都很平(在饱和区里面),因此梯度信息就会非常趋近于0
,因此难以训练。
-
Glorot and Bengio
提出了一种叫做Xavier initialization
的初始化方法,这种初始化的方式是从下面的上下界中进行随机均匀初始化,ni
是输入的连接数目,ni+1
是输出的连接数目。
-
可以看到这样的方法和之前的方法表现是差不多的。
kaiming Initialization
- 当我们使用
relu
作为激活函数的时候,可以看到使用标准的正太分布初始化的方差与输入连接数目除以二(512/2
)的平方根很接近。
- 在实验中可以发现使用何凯明初始化100层的网络可以
prevent activation outputs from exploding or vanishing
- 使用的是
relu
激活函数,如果使用Xavier
初始化方式的话直接爆炸。
- 可以看到一个
30
层的CNN
网络,使用Xavier
初始化几乎不能学习。