原文:

对有关超参数 batch size 的调整,进行相关记录,欢迎讨论。
batch size 是指当我们通过基于随机梯度下降的优化算法训练具有反向传播的神经网络时,每个 minibatch 中的训练示例数。

一,初步探讨

目前,可以考虑通过如下方式来初步计算出较好的批大小:

BatchSize=int((n×(1<<14)×SM)/(H×W×C))

batch size 的大小决定了深度学习训练过程中,完成每个 epoch 所需的时间和每次迭代(iteration)之间梯度的平滑程度。即:

batch size 越大,训练速度则越快,内存占用更大,而收敛速度变慢。

现有通用理论认为:GPU 对 2的幂次或8的倍数的 batch 可以发挥出更好的性能,因此,设置成16、32、64、128、256…,时,往往比设置成其他倍数展示出更优的表现。
(哈哈哈,感觉调参的玄学,不好琢磨啊)

(目前我认为,关于 batch size 大小选择为 2 的幂次 或者 8 的倍数,这样做主要是因为习惯,可以算作是一个现在常用的标准惯例,有其显著的优势即可以从计算角度来提高训练效率,而又并未有新的、可行的、有效的方法)。

那其中,究竟有什么不一样的理论基础呢?关于它,前辈们都有过什么样的想法呢?

二,理论基础

1, 内存对齐

选择批大小为 2 幂的主要依据之一是 CPU 和 GPU内存架构是以 2 的幂进行组织的(与内存架构相匹配,可能更适合计算…)。更准确地说,存在内存页的概念,即它本质上是一个连续的内存块。这导致,可以将一个或多个批次整齐地放在一个页面上,以帮助GPU进行并行处理。即:

我们选择批次大小为 2 可以获得更好的内存对齐。

2, 矩阵乘法 Tensor Core

矩阵维度的选择上,可以考虑不选择 2 的幂,而选择为 8 的倍数,这可能有利于在 具有Tensor Core 的 GPU 上进行混合精度训练。

为什么会是 8 的倍数?这与矩阵乘法有关。

在这里插入图片描述
将两个矩阵 A 和 B 相乘的一种方法,是计算矩阵 A 的行向量和矩阵 B 的列向量之间的点积。如下所示,这些是 k 元素向量对的点积:

在这里插入图片描述

当我们使用带有 Tensor Cores 的GPU,在 FP16 混合精度训练的情况下,8 的倍数对于效率来说是最佳的 。

一,基准验证

1, 小batch size基准

在 CIFAR-10 上训练 MobileNetV3 模型 10 个 epoch—— 图像大小调整为 224×224 以达到适当的 GPU 利用率。在这里,我使用 16 位原生自动混合精度训练在英伟达 V100 卡上运行训练,它更有效地使用了 GPU 的张量核心。
在这里插入图片描述
观察上表可知,当我们以批大小 128 作为参考点,在批大小为 127 和批大小为 129 时,确实会导致训练性能减慢。但,可以看到,差异很小,或许可忽略不计。

3, 最大batch size基准

研究 GPU 满负荷时的训练时间差异,将批量大小增加到512。观察上表,同样可以发现,作为 2 的幂(或 8 的倍数)的批大小确实会产生差异,但几乎不明显。

4, 多GPU训练

使用 DistributedDataParallel (DDP) 作为默认的多 GPU 训练策略。
在这里插入图片描述
观察上表可以发现,2 的幂和 8 的倍数的批量大小(256)并不比257快。

四, 结论

选择批大小作为 2 的幂或 8 的倍数,在实际中产生的差异很小,甚至可以忽略,即不会产生明显的差异。

不过,batch size 仍然是一个很重要的超参数,需要我们进行适当的、有效的调整。在研究基准和机器学习的实际应用上,有很多地方需要调整,而将批大小选择为 2 的幂,是通用的、是一个标准、是大家都认可的一个可行的做法,还有助于限制超参数搜索空间,且并未有更好的、实际的发现,因此,其有助于使事情变得更加简单和易于管理。

· 批大小的选择与神经网络架构和损失函数。
· 调整批大小与超参数优化搜索相关。(不过,如果因为内存限制而不能使用 512 的批大小,则不必降到 256。有限考虑 500 的批大小是完全可行的。)
· 较小的批次尺寸可能有助于泛化性能,而较大的可能可以提高精度、速度。

本文内容仅作学习分享,侵权请联系删除。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐