我正在阅读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中有数百万的权重。
答案 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})
。*代表逐元素乘法。
因此,如果您查看如何计算激活,则为零权重 防止激活增加或减少。全零权重 意味着零激活。
还有其他方法来计算没有此问题的渐变!