深度学习权重初始化

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

https://blog.csdn.net/BVL10101111/article/details/70787683

https://zhuanlan.zhihu.com/p/39015193

posted @ 2019-07-23 19:52  AI_Engineer  阅读(396)  评论(0)    收藏  举报