我遇到了pythonic隐喻发布的相同问题,这里描述了: Why does TensorFlow example fail when increasing batch size? 我已经阅读了它及其很好的答案,但还有一些问题。
让我再次描述一下这个问题:
我在查看http://www.tensorflow.org/tutorials/mnist/beginners/index.md并发现在这部分:
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
将批量大小从100更改为等于或大于209会使模型无法收敛。
cross_entropy在这里用作损失函数:
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
在前面提到的帖子中,我找到了一些很好的答案,提出了三种方法:
1)dga提到将学习率从0.01
降低到0.005
2)colah提到在计算cross_entropy时将reduce_sum
更改为reduce_mean
3)Muaaz提到在计算cross_entropy时将log(y)
更改为log(y + 1e-10)
他们都工作!该模型采用3种方式中的任何一种后收敛。
但我的进一步问题是:
根据第三种方式,失败的原因是log(0)
发生。这实际上是通过在训练期间打印出最小值来证明的。发生log(0)
,然后cross_entropy变为Nan
。
但如何解释第一和第二种方式?他们为什么工作? y是一个矩阵,包含每个输入案例的概率为数字' 0' 9'因此预期越来越多的y元素在训练继续时变为0。无论是方式1还是方式2都无法阻止它。
他们的魔力是什么?