Batch Size
批大小是模型每次更新权重时处理的训练样本数量。它决定 GPU 内存用量、训练速度和梯度噪声。
批次大小是模型在更新模型权重之前一次处理的训练样本数量。训练不会一次性将整个训练数据集输入神经网络,而是将其拆分成多个批次。对于每个批次,模型会进行预测,损失函数会对预测结果进行评分,反向传播会计算梯度,优化器则执行一次更新。批次大小是一个超参数,同时决定三件事:训练所需的 GPU 内存、每个轮次的运行速度,以及每次梯度估计的噪声大小。
批次大小如何影响训练#
每个批次都会为优化算法提供一个针对整个数据集的梯度估计;批次越大,估计就越精确。下面的 PyTorch 代码片段通过对不同大小的随机批次进行多次采样,并计算每个样本梯度的平均值,直接测量这种精度:
import torch
torch.manual_seed(0)
# Per-sample gradients of a squared-error loss for 10,000 samples
x = torch.randn(10_000)
y = 2 * x + torch.randn(10_000)
w = torch.tensor(0.0)
per_sample_grads = 2 * (w * x - y) * x
# Estimate the gradient from 1,000 random batches at each batch size
for batch_size in (8, 64, 512):
idx = torch.randint(0, len(x), (1000, batch_size))
batch_grads = per_sample_grads[idx].mean(dim=1)
print(f"batch {batch_size:3d}: gradient std {batch_grads.std():.3f}")梯度估计的离散程度从批次大小为 8 时的 2.248,降至 64 时的 0.771 和 512 时的 0.267。批次大小每增加 8 倍,噪声就会减少约 2.9 倍,接近 √8;这符合独立样本取平均值时的规律。
这种噪声决定了小批次与大批次之间的权衡:
- 小批次(例如 8 到 32):更新噪声较大,每个轮次的步数较多。这种噪声起到温和的正则化作用,通常有助于随机梯度下降(SGD)提升泛化能力;小批次也能在配置较低的硬件上运行,但由于 GPU 会部分闲置,每个轮次耗时更长。
- 大批次(例如 256 及以上):梯度平滑,每个轮次的步数较少,硬件利用率高。正如 Keskar 等人的研究所发现的那样,非常大的批次往往会收敛到泛化能力较差的尖锐极小值;而且由于每个轮次的步数较少,需要按比例提高学习率,并设置预热阶段。使用这种线性缩放规则,Goyal 等人在 256 个 GPU 上以 8,192 的批次大小,用一小时在 ImageNet 上训练了 ResNet-50,并达到了与小批次训练相当的准确率。
内存限制与梯度累积#
GPU 内存必须容纳模型权重、优化器状态,以及反向传播所需的中间激活值;激活值占用的内存会随批次大小和图像分辨率线性增长。批次无法装入内存时,训练会因内存不足(OOM)错误而停止。混合精度训练可将激活值内存大致减半;梯度累积则会在每次权重更新前累加多个小批次的梯度,以达到更大的有效批次大小。
Ultralytics YOLO训练内置了这项功能:它会持续累积梯度,直到处理约 64 张图像,即标称批次大小 nbs;因此预热结束后,默认的 batch=16 会每四个批次更新一次权重。设置 batch=-1 会运行 AutoBatch,选择能够装入约 60% 可用 CUDA 内存的最大批次;在 CPU 和 Apple MPS 设备上则会回退到批次大小 16。
from ultralytics import YOLO
# 加载预训练的 YOLO26n 模型
model = YOLO("yolo26n.pt")
# batch=-1 会让 AutoBatch 根据可用 GPU 内存选择批次大小
# 使用整数(batch=16)指定固定大小,或使用浮点数(batch=0.70)指定内存占比
results = model.train(data="coco8.yaml", epochs=5, batch=-1)训练开始前,AutoBatch 会以 1 到 16 的批次大小运行 YOLO26 模型(在 16 GB 或更大显存的 GPU 上最高可达 64),根据测得的内存用量拟合一条直线,并求出达到目标占比的批次大小。
批次大小与相关术语的比较#
- 轮次与迭代:一个轮次是对整个数据集进行一次遍历;一次迭代则是一次权重更新。每个轮次的迭代次数等于数据集大小除以批次大小并向上取整,因此,批次大小为 100 时,1,000 张图像需要 10 次迭代。
- 小批次:在大多数深度学习资料中,这是批次的同义词。严格来说,批量梯度下降每次更新使用整个数据集,随机梯度下降每次使用一个样本,小批量梯度下降介于两者之间;几乎所有现代网络都采用这种方式训练。
- 批归一化:使用当前批次的均值和方差对激活值进行归一化的层,因此批次特别小时,其统计量会变得不可靠。组归一化不受这种依赖影响;据报告,在 ImageNet 上以批次大小 2 训练 ResNet-50 时,其错误率比批归一化低 10.6%。
- 推理批次大小:部署时,批处理会在推理延迟与吞吐量之间进行权衡。将多个摄像头的帧分组可以提高每秒处理的图像数量,但每帧都要等待批次填满。










