在 tensorflow 上使用批量大小 'powers of 2' 会更快吗?

Is using batch size as 'powers of 2' faster on tensorflow?

我从某处了解到,如果您选择的批量大小是 2 的幂,训练速度会更快。这条规则是什么?这适用于其他应用程序吗?能否提供参考论文?

从算法上讲,使用较大的 mini-batches 可以减少随机梯度更新的方差(通过取 mini-batch 中梯度的平均值),这反过来又可以让你采取更大的步骤-大小,这意味着优化算法将取得更快的进展。

然而,在 objective 中达到一定精度所完成的工作量(根据梯度计算的数量)将是相同的:对于 n 的小批量大小,方差为更新方向将减少 n 倍,因此该理论允许您采用 n 倍大的步长,因此单步将带您大致达到与使用小批量的 SGD n 步相同的精度大小 1.

关于 tensorFlow,我没有找到你肯定的证据,它是一个已在 github 关闭的问题:https://github.com/tensorflow/tensorflow/issues/4132

请注意,将图像大小调整为 2 的幂是有意义的(因为池化通常在 2X2 windows 中完成),但这完全是另一回事。

我也听说过。这是一份关于 CIFAR-10 训练的白皮书,其中一些英特尔研究人员提出了这样的声明:

In general, the performance of processors is better if the batch size is a power of 2.

(参见:https://software.intel.com/en-us/articles/cifar-10-classification-using-intel-optimization-for-tensorflow。)

然而,尚不清楚优势有多大,因为作者没有提供任何训练持续时间数据:/

The notion comes from aligning computations (C) onto the physical processors (PP) of the GPU.

由于PP的数量通常是2的幂,使用不同于2的幂的C会导致性能不佳。

您可以看到 CPP 的映射是一堆大小为 PP 的切片。 假设您有 16 PP。 您可以在它们上映射 16 C:1 C 映射到 1 PP。 您可以在它们上映射 32 C :2 片 16 C ,1 PP 将负责 2 C.

这是由于 GPU 使用的 SIMD 范例。这通常称为数据并行性:所有 PP 同时在不同的数据上做同样的事情。