什么是神经网络中的批量大小?
批量大小定义将通过网络传播的样本数量。
例如,假设您有 1050 个训练样本,并且您希望将 a 设置batch_size
为 100。该算法从训练数据集中获取前 100 个样本(从第 1 个到第 100 个)并训练网络。接下来,它获取第二个 100 个样本(从第 101 个样本到第 200 个样本)并再次训练网络。我们可以继续执行此过程,直到我们通过网络传播所有样本。最后一组样本可能会出现问题。在我们的示例中,我们使用了 1050,它不能被 100 整除而没有余数。最简单的解决方案就是获取最后的 50 个样本并训练网络。
使用批量大小 < 所有样本数的优点:
它需要更少的内存。由于您使用较少的样本训练网络,因此整个训练过程需要较少的内存。如果您无法将整个数据集放入机器的内存中,这一点尤其重要。
通常,使用小批量的网络训练速度更快。那是因为我们在每次传播后更新权重。在我们的示例中,我们传播了 11 个批次(其中 10 个有 100 个样本,1 个有 50 个样本),在每个批次之后,我们都更新了网络的参数。如果我们在传播过程中使用所有样本,我们将只对网络参数进行 1 次更新。
使用批量大小<所有样本数的缺点:
- 批次越小,梯度的估计就越不准确。在下图中,您可以看到小批量梯度(绿色)的方向与全批量梯度(蓝色)的方向相比波动更大。
随机只是一个batch_size
等于 1 的小批量。在这种情况下,梯度比小批量梯度更频繁地改变其方向。
在神经网络术语中:
- 一个epoch =所有训练示例的一次前向传递和一次反向传递
- 批量大小= 一次前向/后向传递中的训练示例数。批处理大小越大,您需要的内存空间就越多。
- 迭代次数=传递次数,每次传递使用 [batch size] 示例数。需要明确的是,一次传球 = 一次向前传球 + 一次向后传球(我们不将向前传球和向后传球算作两次不同的传球)。
示例:如果您有 1000 个训练示例,并且批量大小为 500,则需要 2 次迭代才能完成 1 个 epoch。
仅供参考:权衡批量大小与训练神经网络的迭代次数
这个问题已经被问过一段时间了,但我认为人们仍在纠结这个问题。对我来说,它有助于了解数学背景以了解批处理以及 itdxer 的答案中提到的优点/缺点来自哪里。因此,请将此作为对已接受答案的补充解释。
将梯度下降视为一种优化算法,以最小化您的损失函数. 梯度下降中的更新步骤由下式给出
为简单起见,我们假设您只有 1 个参数 (),但您总共有 1050 个训练样本 () 由 itdxer 建议。
全批梯度下降
在批量梯度下降中,首先计算一批训练样本的梯度(由下面等式中的总和表示,这里批量包含所有样本= full-batch),然后更新参数:
这就是 OP 的维基百科摘录中描述的内容。对于大量训练样本,更新步骤变得非常昂贵,因为必须为每个加法评估梯度。
随机梯度下降
在随机梯度下降中,计算一个训练样本的梯度并立即更新参数。对所有训练样本重复这两个步骤。
for each sample j compute:
一个更新步骤的成本较低,因为仅针对单个训练样本 j 评估梯度。
两种方法之间的区别
更新速度:批量梯度下降趋于收敛更慢,因为在更新之前必须为所有训练样本计算梯度。在相同数量的计算步骤内,随机梯度下降已经多次更新参数。但是我们为什么还要选择批量梯度下降呢?
收敛方向:更快的更新速度是以降低“准确性”为代价的。由于在随机梯度下降中,我们只合并一个训练样本来估计梯度,它不像批量梯度下降那样直接收敛。可以说,与 BGD 相比,SGD 中每个更新步骤中的信息量较低。
itdxer 的回答很好地描述了不太直接的收敛。Full-Batch 具有最直接的收敛途径,而 mini-batch 或随机波动更大。同样对于 SDG,理论上可能会发生,即解决方案永远不会完全收敛。
内存容量:正如 itdxer 指出的那样,将训练样本作为批次提供需要内存容量来加载批次。批次越大,需要的内存容量就越大。
概括
在我的示例中,我使用了梯度下降并且没有特定的损失函数,但概念保持不变,因为计算机上的优化基本上总是包含迭代方法。
因此,通过批处理,您可以影响训练速度(较小的批处理大小)与梯度估计精度(较大的批处理大小)。通过选择批量大小,您可以定义在更新参数之前组合多少训练样本来估计梯度。
当使用 CPU 或 GPU 解决优化问题时,您会在某些输入数据上迭代地应用算法。在每个迭代中,您通常会更新问题的度量,对数据进行一些计算。现在,当您的数据量很大时,完成每次迭代可能需要相当长的时间,并且可能会消耗大量资源。因此,有时您选择将这些迭代计算应用于数据的一部分以节省时间和计算资源。这部分是 batch_size,这个过程被称为(在神经网络术语中)批处理数据处理。当您将计算应用于所有数据时,您就可以进行在线数据处理。我猜这个术语来自 60 年代,甚至更早。有没有人记得. .bat DOS 文件?但当然,这个概念意味着要使用的线程或数据的一部分。