1. Batch Size 基础概念:训练神经网络的“一口饭”

大家好,我是你们的老朋友。今天咱们聊聊 Batch Size 这个最基础、但也最容易被忽视的概念。

说实话,我见过不少新手一上来就把 Batch Size 设成 32 或者 64,问为什么?答曰“大家都这么设”。嗯,这其实是个坑。我自己刚入行那会儿也踩过,后来在调一个图像分类模型时,发现 Batch Size 从 32 改到 128,显存直接爆了,但训练速度反而没快多少。从那以后,我才开始认真琢磨这玩意儿到底是怎么回事。

1.1 什么是 Batch Size?

Batch Size,直译过来就是“批次大小”。说白了,就是每次喂给神经网络的数据样本数量。

你想想看,训练一个模型就像教一个学生做题。你不能把整个题库(全部训练数据)一次性全塞给他,那样他脑子会炸——显存也会炸。你也不能一道题一道题地教(Batch Size = 1),那样效率太低,而且模型学得也不稳定。

所以,我们折中一下:每次拿一小批题目(比如 32 道)给他做,做完一次更新一次模型参数。这一小批题目的数量,就是 Batch Size。

核心定义:Batch Size 是每次前向传播 + 反向传播时,一次性输入到网络中的样本数量。

举个例子:假设你有 10000 张猫狗图片要训练分类模型。如果你设 Batch Size = 64,那么每次训练迭代,模型会同时看 64 张图片,计算这 64 张图片的平均损失,然后更新一次参数。

1.2 Batch Size 与 Epoch 的关系

这两个概念经常被搞混,我简单梳理一下。

Epoch(轮次):完整遍历一遍全部训练数据,就叫一个 Epoch。

怎么理解呢?还是刚才那个例子:10000 张图片,Batch Size = 64。那么一个 Epoch 需要多少个 Batch?

总样本数 = 10000
Batch Size = 64
每个 Epoch 的 Batch 数 = ceil(10000 / 64) = 157 个 Batch

注意这里用了 ceil 向上取整。为什么?因为 10000 / 64 = 156.25,最后那 0.25 个 Batch 也得凑成一个完整的 Batch 啊。我习惯的做法是,在最后一个 Batch 里,如果样本不够,就重复采样或者直接丢弃——具体看你的数据加载器怎么配置。

所以,Epoch 和 Batch Size 的关系就是:

  • Batch Size 越大,每个 Epoch 需要的迭代次数越少
  • Batch Size 越小,每个 Epoch 需要的迭代次数越多
  • 总训练 Epoch 数不变的情况下,Batch Size 决定了你总共要做多少次参数更新

我的经验:我曾经在训练一个 NLP 模型时,把 Batch Size 从 32 改到 128,Epoch 数没变,结果模型收敛速度明显变慢。后来才发现,虽然每个 Epoch 的迭代次数少了,但每次参数更新的“质量”也变了。这个后面会细讲。

1.3 Batch Size 与 Iteration 的关系

Iteration(迭代)这个词,其实更简单。

Iteration:一次参数更新,就叫一次 Iteration。也就是处理完一个 Batch 的数据,做一次前向传播 + 反向传播 + 参数更新。

所以,它们的关系就是:

  • 1 个 Iteration = 处理 1 个 Batch 的数据
  • 1 个 Epoch = 若干个 Iteration(具体数量 = 总样本数 / Batch Size)
  • 总 Iteration 数 = Epoch 数 × 每个 Epoch 的 Iteration 数

用公式表示就是:

总 Iteration 数 = Epoch 数 × ceil(总样本数 / Batch Size)

举个例子,假设总样本 10000,Batch Size = 64,训练 10 个 Epoch:

总 Iteration 数 = 10 × ceil(10000 / 64) = 10 × 157 = 1570 次

也就是说,你的模型参数会被更新 1570 次。

注意:很多框架(比如 PyTorch 的 DataLoader)默认会丢弃最后一个不完整的 Batch。如果你设了 drop_last=True,那么每个 Epoch 的 Iteration 数就是 floor(总样本数 / Batch Size),而不是 ceil。这个细节容易导致训练步数对不上,我踩过这个坑。

1.4 三者关系一览

为了让你看得更清楚,我画了一张图:

Batch Size、Epoch、Iteration 关系图 全部训练数据(10000 张图片) 1 个 Epoch = 完整遍历 1 次全部数据 拆分成 157 个 Batch(Batch Size = 64) 每个 Batch 处理 = 1 次 Iteration(参数更新 1 次) 总 Iteration 数 = Epoch 数 × 每个 Epoch 的 Batch 数 = 10 × 157 = 1570 次

这张图应该很直观了。从上到下,就是数据流动的过程:全部数据 → 分成多个 Epoch → 每个 Epoch 拆成多个 Batch → 每个 Batch 做一次 Iteration。

1.5 实际训练中的选择建议

说了这么多理论,你可能想问:那我到底该设多大的 Batch Size?

嗯,这个问题没有标准答案。但我可以给你一些参考:

场景 推荐 Batch Size 原因
小数据集(< 1万样本) 16 - 64 数据量小,Batch Size 太大容易过拟合
中等数据集(1万 - 10万) 32 - 128 平衡训练速度和模型稳定性
大数据集(> 10万) 64 - 512 数据量大,可以承受更大的 Batch Size
显存受限 1 - 32 没办法,硬件限制,只能用小 Batch
分布式训练 32 - 1024(每卡) 多卡并行时,每卡的 Batch Size 可以小一些

避坑指南:我曾经在一个图像分割任务中,把 Batch Size 从 8 改到 16,结果显存直接翻倍,模型训练到一半就 OOM 了。后来才发现,图像分割模型本身就很吃显存,Batch Size 每增加一倍,显存占用几乎线性增长。所以,Batch Size 的选择,第一限制因素永远是显存。

1.6 小结

好了,这一章的内容就这些。总结一下:

  • Batch Size:每次喂给模型的数据量,决定了单次训练的计算量和显存占用
  • Epoch:完整遍历一次全部数据,是训练轮次的单位
  • Iteration:一次参数更新,是训练步数的单位
  • 三者关系:Epoch × (总样本数 / Batch Size) = 总 Iteration 数

记住,Batch Size 不是越大越好,也不是越小越好。它需要在显存、训练速度、模型收敛质量之间找到一个平衡点。后面几章,我会带你深入看看 Batch Size 到底怎么影响显存峰值,以及如何调参才能既快又省显存。

想要更多资料,联系可可