TensorFlow优化器一次一个或批量

时间:2017-11-26 15:21:48

标签: tensorflow

我在TensorFlow优化器中看到的示例包含如下代码:

pred = tf.tensordot(x, w, 1) + b
cost = tf.reduce_sum((pred-y)**2 / n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

...

for epoch in range(epochs):
    for (x1, y1) in zip(train_x, train_y):
        optimizer.run({x: x1, y: y1})

这会导致每个训练案例的Python循环迭代的开销。我决定尝试这种方式:

for epoch in range(epochs):
    optimizer.run({x: train_x, y: train_y})

它似乎同样有效,并且可能更快。

有什么理由我不知道一次一个地做这个吗?或者确实应该使用批处理方式,因为它是免费的加速?

1 个答案:

答案 0 :(得分:1)

您的第一个变体是在每个数据对上单独优化。这是批量大小为1的随机梯度下降。这很可能很慢,因为它原谅了矢量计算的任何可能性,例如:如果你使用GPU。

您的第二个变体是在每个步骤中使用整个数据集,因此它是真实的(非随机的)梯度下降。这对于庞大的数据集来说是不切实际的,许多作者说它的收敛速度也较慢。

一个很好的折衷方案是小批量批处理,批量大小大于1,但比总数据集小得多。你可以从值100开始。期望比其他方法更好的收敛。

在张量流程中,通过以下调用支持迷你批处理:     https://www.tensorflow.org/api_docs/python/tf/train/batch
这支持按所需大小(例如100)的顺序拆分数据。