深度学习权重初始化
https://zhuanlan.zhihu.com/p/565740768
什么样的初始化是好的?
https://zhuanlan.zhihu.com/p/138064188
正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变的好处是什么?
防止出现极端值导致梯度消失或梯度爆炸
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初始值
https://blog.csdn.net/xxy0118/article/details/84333635
6. 偏置初始化
通常偏置项初始化为0,或比较小的数,如:0.01。
7. fan_in与fan_out
专门针对卷积神经网络的初始化方法
推荐模型参数初始化
- bias:一般初始化为0
- embedding:使用均匀分布[-a, a]初始化
- DNN参数:
-
# Xavier 正态分布初始化器。它从以 0 为中心,标准差为 stddev = sqrt(2 / (fan_in + fan_out)) 的截断正态分布中抽取样本 tf.keras.initializers.glorot_normal(seed=None) # Xavier 均匀分布初始化器,它从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / (fan_in + fan_out)) keras.initializers.glorot_uniform(seed=None) # He 正态分布初始化器,从以 0 为中心,标准差为 stddev = sqrt(2 / fan_in) 的截断正态分布中抽取样本 keras.initializers.he_normal(seed=None) # He 均匀方差缩放初始化器,从 [-limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / fan_in) keras.initializers.he_uniform(seed=None)
https://www.tensorflow.org/api_docs/python/tf/keras/initializers/HeNormal
参考博客
https://blog.csdn.net/manong_wxd/article/details/78734725