关于神经网络的快速问题。我理解为什么用一个小的随机值初始化权重。我打破了权重之间的关系,使它们具有非零损失梯度。我的印象是,只要领带被打破,小的随机值就没那么重要了。然后我读到了这个:
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中实施这种做法吗?
答案 0 :(得分:2)
首先要记住,这些初始化和训练的目的是确保神经元,从而确保网络学到有意义的东西。
现在假设您正在使用sigmoid激活功能
正如您在上面所看到的,给定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