神经网络:权重的stddev作为层大小的函数。为什么?

时间:2017-05-30 00:24:47

标签: tensorflow neural-network

关于神经网络的快速问题。我理解为什么用一个小的随机值初始化权重。我打破了权重之间的关系,使它们具有非零损失梯度。我的印象是,只要领带被打破,小的随机值就没那么重要了。然后我读到了这个:

weights = tf.Variable(
    tf.truncated_normal([hidden1_units, hidden2_units],
                        stddev=1.0 / math.sqrt(float(hidden1_units))),
    name='weights')

设计人员不是像0.1那样分配一些小的常量stddev,而是努力将其设置为1 / sqrt下层的节点数。

stddev=1.0 / math.sqrt(float(hidden1_units))

为什么他们会这样做?

这更稳定吗?它会避免一些不必要的行为吗?它训练得更快吗?我应该在自己的NN中实施这种做法吗?

1 个答案:

答案 0 :(得分:2)

首先要记住,这些初始化和训练的目的是确保神经元,从而确保网络学到有意义的东西。

现在假设您正在使用sigmoid激活功能

enter image description here

正如您在上面所看到的,给定X的Y的最大变化接近中心,而极端变化非常小,,反向传播期间的梯度也是如此。

如果我们能以某种方式确保激活的输入位于sigmoid的良好区域,那么现在不是很好。

So the aim for input of a neuron (sigmoid activation) be:
Mean: Zero
Variance: small (also independent of number of input dim)

假设输入层暗淡为'n'

输入激活 n i = 1 w i x i < /子>
超出神经元 = sigmoid(输入到激活)

现在假设wi和xi各自独立,我们已将输入x i 归一化为N(0,1)。

所以,截至目前

X : 0 mean and 1 std
W : uniform (1/sqrt(n) , -1/sqrt(n)), assumed
    mean(W) = 0 and var(w) = 1/12(4/n) = 1/(3n) [check variance of uniform dist]

假设X和Y是独立的并且具有零均值
VAR(X + Y)= VAR(X)+ VAR(Y)。 对于所有(x i w i 的总和。
&安培;
VAR(X * Y)= VAR(X)* VAR(Y)。 对于x i w i

现在检查,

mean of input-to-activation: 0
variance of input-to-activation: n* (1/(3n)) = 1/3

所以现在我们处于sigmoid激活的良好区域,这意味着不是在极端。检查方差是否与输入数无关。

美丽不是吗?

但这不仅仅是初始化的一种方式,Bengio已经给出了初始化方法,它考虑了权重初始化的输入和输出层。 Read this for future details on both