神经网络参数初始化方式

看了文章《Understanding the difficulty of training deep feedforward neural networks》,里面提出了两种参数初始化的方法:

以及normalized initialization——xavier方法:


最近做实验,发现网络的初始化太重要!其实神经网络本身就是一个dark box, 但是每一个参数怎么设置怎么调节是最有技术的。

几种可行的初始化方式:

1. pre-training+fine-tuning

如:先使用greedy layerwise auto-encoder做unsupervised pre-training,然后再做fine-tuning。

① pretraining: 将神经网络中的每一层取出,构造一个auto-encoder做训练,使得输入层和输出层保持一致。在这一过程中,参数得以更新,形成初始值

② fine-tuning:将pre-train过的每一层放回神经网络,利用pre-train阶段得到的参数初始值和训练数据对模型进行整体调整。在这一过程中,参数进一步被更新,形成最终模型。

2. random initialization: np.random.randn(m,n)

最常用的方法,但是也有弊端,一旦随机分布选择不当,就会陷入困境

3. Xavier initialization:

基本思想:保证输入和输出的方差一致,这样就可以避免所有输出值都趋向于0。虽然刚开始的推导基于线性函数,但是在一些非线性神经元也很有效。

tf.Variable(np.random.randn(node_in,node_out))/np.sqrt(node_in)

比较适合tanh

4. He initialization

RELU中非常适合:

tf.Variable(np.random.randn(node_in,node_out))/np.sqrt(node_in/2)

5. bengio还提出了一种

tf.Variable(np.random.randn(node_in,node_out))/np.sqrt((node_in+node_out)/2)

其实3、4、5三种方法都是Xavier的变体。

6. BN 其实不是初始化方法了,是一种巧妙而粗暴的削弱bad initialization的影响。


参考文章谷歌工程师:聊一聊深度学习的weight initialization 

以及 吴恩达的深度学习课程

你可能感兴趣的:(NN)