我们需要牢记参数初始化的目的是为了让神经网络在训练过程中学习到有用的信息,这意味着参数梯度不应该为0。而我们知道在全连接的神经网络中,参数梯度和反向传播得到的状态梯度以及入激活值有关——激活值饱和会导致该层状态梯度信息为0,然后导致下面所有层的参数梯度为0;入激活值为0会导致对应参数梯度为0。所以如果要保证参数梯度不等于0,那么参数初始化应该使得各层激活值不会出现饱和现象且激活值不为0。我们把这两个条件总结为参数初始化条件:
- 初始化必要条件一:各层激活值不会出现饱和现象。
- 初始化必要条件二:各层激活值不为0。
下面讨论几种常见的初始化方式:
一、随机正态分布
用10层神经网络,每一层的参数都是随机正态分布
1.1 设均值为0,标准差为0.01
tf.Variable(np.random.randn(node_in, node_out).astype('float32')) * 0.01
#10层神经网络
data = tf.constant(np.random.randn(2000, 800).astype('float32'))
layer_sizes = [800 - 50 * i for i in range(0, 10)]
num_layers = len(layer_sizes)
fcs = []
for i in range(0, num_layers - 1):
X = data if i == 0 else fcs[i - 1]
node_in = layer_sizes[i]
node_out = layer_sizes[i + 1]
W = tf.Variable(np.random.randn(node_in, node_out).astype('float32')) * 0.01
fc = tf.matmul(X, W)
# fc = tf.contrib.layers.batch_norm(fc, center=True, scale=True,
# is_training=True)
fc = tf.nn.tanh(fc)
fcs.append(fc)
#
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('input mean {0:.5f} and std {