- 在深度学习中的各种操作实际上是矩阵乘法操作,使用乘法操作就容易造成数值的消失和爆炸,就是一个非常小的数乘以一个非常小的数可能就下溢了,一个大的数乘以一个大的数字就上溢了,并且由于梯度的原因,即使不溢出也会很难收敛。
- 所以问题就变为了如何找到
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初始化几乎不能学习。














