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 三者关系一览
为了让你看得更清楚,我画了一张图:
这张图应该很直观了。从上到下,就是数据流动的过程:全部数据 → 分成多个 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 到底怎么影响显存峰值,以及如何调参才能既快又省显存。
想要更多资料,联系可可