在本文中,我们试图更好地理解批量大小对训练神经网络的影响。具体而言,我们将涵盖以下内容:
什么是Batch Size? 为什么Batch Size很重要? 小批量和大批量如何凭经验执行? 为什么大批量往往性能更差,如何缩小性能差距?
什么是Batch Size?
训练神经网络以最小化以下形式的损失函数:
theta 代表模型参数 m 是训练数据样本的数量 i 的每个值代表一个单一的训练数据样本 J_i 表示应用于单个训练样本的损失函数
通常,这是使用梯度下降来完成的,它计算损失函数相对于参数的梯度,并在该方向上迈出一步。随机梯度下降计算训练数据子集 B_k 上的梯度,而不是整个训练数据集。
为什么Batch Size很重要?
Keskar 等人指出,随机梯度下降是连续的,且使用小批量,因此不容易并行化 。使用更大的批量大小可以让我们在更大程度上并行计算,因为我们可以在不同的工作节点之间拆分训练示例。这反过来可以显着加快模型训练。
然而,较大的批大小虽然能够达到与较小的批大小相似的训练误差,但往往对测试数据的泛化效果更差 。训练误差和测试误差之间的差距被称为“泛化差距”。因此,“holy grail”是使用大批量实现与小批量相同的测试误差。这将使我们能够在不牺牲模型准确性的情况下显着加快训练速度。
实验是如何设置的?
Batch Size如何影响训练?
训练损失减少的越慢。
最小验证损失越高。
每个时期训练所需的时间越少。
收敛到最小验证损失所需的 epoch 越多。
with tf.distribute.MirroredStrategy().scope(): # Create, compile, and fit model # ...
为什么较小的批量性能更好?
按层与初始权重的距离,批大小 32 和 256 的比较
Median batch update norm for batch size 32: 3.3e-3Median batch update norm for batch size 256: 1.5e-3
假设 2:小批量训练找到更平坦的最小值
通过提高学习率可以提高大批量的性能吗
大多数情况下,答案是肯定的。如果我们看上面的图,调整学习率有助于缩小批量大小 32 与其他批量大小之间在与初始权重的距离方面的差距。(请注意,128 似乎是一个异常,其中增加学习率会降低距离——为什么会出现这种情况,有待未来调查。)