为什么梯度下降会更新0值权重?

时间:2016-12-02 01:33:33

标签: machine-learning neural-network tensorflow theory gradient-descent

我正在阅读this question并且讨论对我有意义:当所有权重都初始化为零时,梯度下降无法判断错误的来源,因此无法更新权重。

我不明白为什么我无法凭经验看到这一点。我正在运行以下代码(runnable here):

w = tf.Variable(tf.zeros([2,1]))
b = tf.Variable(tf.zeros([1]))

x = tf.placeholder(tf.float32, shape=[1, 2])
y = tf.placeholder(tf.float32, shape=[1])

pred = tf.sigmoid(tf.matmul(x, w) + b)

loss = tf.reduce_mean(tf.square(pred - y))

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    for i in range(100):
        for x_ex, y_ex in dataset:
            sess.run(train_step, feed_dict={x: x_ex, y: y_ex})
            print(sess.run(w))

我看到的输出就像:

[[ 0.]
 [ 0.]]
[[ 0.02530853]
 [ 0.        ]]
[[ 0.02530853]
 [ 0.02499614]]
[[-0.00059909]
 [-0.00091148]]
[[-0.00059909]
 [-0.00091148]]
[[ 0.02472398]
 [-0.00091148]]
[[ 0.02472398]
 [ 0.02410331]]

如果权重开始为零,为什么梯度下降能够更新它们呢?

作为一个后续问题,如果权重随机初始化为正数,但该权重的最佳值为负数,我们是否只需要相信在更新步骤中优化程序不会意外更新重量为0(从而停止重量的可更新性)?我知道重量+更新步骤正好为0的几率几乎可以忽略不计,但它仍然可能是一个问题,特别是在NN中有数百万的权重。

1 个答案:

答案 0 :(得分:0)

这不一定是梯度下降的问题,而是如何用反向传播计算偏导数。

  

bp如何计算第l层中权重的偏导数:   δ/δΘ^{l}_{ij}=a^l_jδ^{l+1}_i激活'a'正在应用非线性   函数g(例如sigmoid,tanh,ReLU)到神经元的输出:   a^l_j=g(Θ^{l−1}a^{l−1})并且delta是向后传播的差异   来自后续层:δ^l=(Θ^l)^Tδ^{l+1}.∗g′(Θ^{l−1}a^{l−1})

     

。*代表逐元素乘法。

     

因此,如果您查看如何计算激活,则为零权重   防止激活增加或减少。全零权重   意味着零激活。

还有其他方法来计算没有此问题的渐变!