深度学习的几种权重初始化

       因为梯度是指数级变化的,所以深度神经网络很容易出现梯度消失或者梯度爆炸的问题。针对这个问题的很有效的方法是更加谨慎地选择随机初始化参数。

      主要讨论四种权重初始化方法:把w初始化为0、对w随机初始化、Xavier initialization、He initialization(在ReLu网络中最常用)

  1. 把w初始化为0

         parameters= np.zeros()

         如果只是在线性回归的话这样初始化是可以的,但是在神经网络中把w初始化为0是不可以的,因为这样会导致每一层的神经网络学习到的东西是一样的,并且在bp的时候每一层内的神经元也是相同的。

     2.对w随机初始化

        parameters= np.random.randn()*0.01

        早期最常用的方法,乘以0.01是因为要把w随机初始化到一个相对比较小的值。但是随机初始化也有缺点,np.random.randn()其实是一个均值为0,方差为1的高斯分布中采样。当神经网络的层数增多时,会发现越往后面的层的激活函数(如使用tanH)的输出值几乎都接近于0,这会导致梯度消失。

     3.Xavier initialization

      parameters= np.random.randn()* np.sqrt(1 / layers_dims[l - 1])  # layers_dims[l - 1]是前一层神经元的数量

      Xavier initialization就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。这种方法适用于激活函数是tanh,但不适合于激活函数是ReLu。

     4.He initialization   

     parameters= np.random.randn()* np.sqrt(2 / layers_dims[l - 1])

     这种方法是由何恺明大神提出的,吴恩达老师也经常使用的方法。在激活函数是ReLu中,效果很好,是目前权重初始化最常用的方法。

      实际上,以上这些公式只是给出了权重初始化的一个起点,给出了初始化权重矩阵的默认值,可以给公式添加一个乘数参数,将该参数作为调参的一部分,虽然这个调参应该优先级很低。

    注:使用Batch Normalization Layer可以有效降低深度网络对weight初始化的依赖。

发布了43 篇原创文章 · 获赞 111 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Amigo_1997/article/details/99058711