什么样的初始化是好的?
正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变的好处是什么?
防止出现极端值导致梯度消失或梯度爆炸
1. 把权重初始化为0
从DNN的反向传播推导中,可以看到,当前层参数的梯度有后面一层权重的乘子项,也就是说权重初始化为0,会使梯度为0,权重得不到更新
2. 把权重初始化为小的随机数
如从均值为0,标准差是1的高斯分布中采样样,这样,参数的每个维度来自一个多维的高斯分布。
需要注意的是参数初始值不能取得太小,因为小的参数在反向传播时会导致小的梯度,对于深度网络来说,也会产生梯度弥散问题,降低参数的收敛速度。
缺点:
一个神经元输出的方差会随着输入神经元数量的增多而变大。对于有n个输入单元的神经元来说,考虑χ2分布,每个输入的方差是1/n时,总的方差是1。
3. 标准初始化
权重参数初始化从区间均匀随机取值。即从(-1/√d,1/√d)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量。
为什么要除以d?
这样可以确保神经元的输出有相同的分布,提高训练的收敛速度。
优点:
隐层的状态的均值为0,方差为常量1/3,和网络的层数无关,这意味着对于sigmoid函数来说,自变量落在有梯度的范围内。
4. Xavier初始化
如果前一层的节点数为n,则初始值使用如下均匀分布初始化:
Xavier初始值是以激活函数是线性函数为前提而推导出来的。因为sigmoid函数和 tanh函数左右对称,且中央附近可以视作线性函数,所以适合使用Xavier初始值。
5. He初始值
6. 偏置初始化
通常偏置项初始化为0,或比较小的数,如:0.01。
7. fan_in与fan_out
专门针对卷积神经网络的初始化方法