深度神经网络之初始化

参考: https://www.leiphone.com/news/201703/3qMp45aQtbxTdzmK.html
有关Xavier的推导,请见:https://zjuturtle.com/2018/05/10/xavier-init/
https://www.cnblogs.com/hejunlin1992/p/8723816.html

在深度神经网络中,权重的初始化十分重要,对模型的收敛速度和模型质量有重大的影响。

首先,来一个宏观的认识。在Relu激活函数的网络里,推荐使用Xavier Initialization的变种。
以全连接层中的权重为例:

import numpy as np
W = np.random.randn(node_in,node_out)/np.sqrt(node_in/2)

其中 n o d e _ i n n o d e _ o u t 分别为输入神经元的个数、输出神经元的个数。

注 : Batch Normalization(BN)的使用可以使得权重初始化不用那么精心考虑。

下面,我们对权重初始化这个重要的工作进行详细阐述。
1. 权重初始化不可以全部为0
理由: 如果网络的权重一开始全部为0, 那么无法打破网络的对称性。简而言之,在同一个隐层中的所有神经元会一模一样,即:所有神经元 的输入和输出都一样。在这种情况下,网络进行优化时,同一个隐层中的参数的更新是一样的,意味着在下一轮的训练时,同一隐层所有的参数又保持一致。这不是我们想要的,我们希望同一隐层的神经元多样化,而不是完全相同。
2. Xavier initialization
其基本思想是保持输入和输出的方差一致。

    import numpy as np
    W =np.random.randn(node_in,node_out)/np.sqrt(node_in)

这里写图片描述
可以看到,多层网络之后的输出仍保持良好的分布,这有利于网络的优化。
3. He initialization
上面提到的Xavier initialization是在线性函数上推导得出的,对tanh有效。然而对于Relu,却不太好。
这里写图片描述
可以看到,随着网络层数的增加,输出值越来越趋近于0。

import numpy as np
W = np.random.randn(node_in,node_out)/np.sqrt(node_in/2)

这里写图片描述
可以看到,He initialization在Relu中效果不错。
4. Batch Normalization
Batch Normalization是一种巧妙而粗暴的方法来削弱bad initialization的影响,其基本思想是:If you want it, just make it!接下来,会专门设来讲。

猜你喜欢

转载自blog.csdn.net/yqmind/article/details/80794995