四种权重初始化方法:

  • 把w初始化为0
  • 对w随机初始化
  • Xavier initialization
  • He initialization
  1. 把w初始化为0:

缺点:

  1. 因为如果把w初始化为0,那么每一层的神经元学到的东西都是一样的(输出是一样的)。
  2. 在梯度回传阶段,同一层内的所有神经元都是相同的,这样的话神经网络就没有意义了,相当于每一层只有一个神经元。因为在前项传播时,同层的所有神经元都相同,w也相同,在回传计算的梯度时,w的梯度也相同,同层内的神经元同步更新,数值都一样。
  1. 对w随机初始化
缺点:
假如,x和a均服从(0,1)分布,随着网络变身,输出的数据的方差会变大,导致后面的层爆掉。如下,每项x都与a中的512个数相乘,得到的数据分布为(0, 255),偏差很大。

pytorch 神经网络权重初始化 神经网络的权重初始化_初始化


pytorch 神经网络权重初始化 神经网络的权重初始化_输入输出_02


解决:


为了使得输入输出数据分布一致,对于每个a,除以512如下


pytorch 神经网络权重初始化 神经网络的权重初始化_pytorch 神经网络权重初始化_03


如果单纯的没有激活函数,上述方法可以保证输入输出分布一致,但是在加入激活函数后,上述办法无法解决,从而有了Xavier 初始化

  1. Xavier initialization
在我们假设的100层网络的每一层之后添加一个双曲正切激活函数,然后看看当我们使用我们自己的权值初始化方案时发生了什么,其中层权值按1/√n.进行缩放。

pytorch 神经网络权重初始化 神经网络的权重初始化_pytorch 神经网络权重初始化_04


可以看出(0,1)+缩放在加入激活函数的情况下,无法实现输入输出数据分布一致,从而提出了Xavier 初始化

pytorch 神经网络权重初始化 神经网络的权重初始化_激活函数_05


其中,nᵢ是传入网络连接的数量叫“扇入”,nᵢ₊₁是从那层出去的网络连接的数量,也被称为“扇出”。


缺点:


Xavier初始化可以解决关于0对称且在[-1,1]内部有输出(如softsign和tanh)的激活函数,但是cv中常用的relu激活函数,不是关于0对称的,做了一下实验发现均方值为√512/√2,导致输入输出分布也不一致


pytorch 神经网络权重初始化 神经网络的权重初始化_激活函数_06

  1. He initialization
使用relu时,发现均方值为√512/√2,为了变为1,在初始化a时,先乘√2/√512,就得到了he 初始化

pytorch 神经网络权重初始化 神经网络的权重初始化_输入输出_07


参考:

神经网络中的权值初始化:从最基本的方法到xavier、he初始化方法一路走来的历程

参考:

深度学习中神经网络的几种权重初始化方法