一句话定义:批大小(Batch Size)是训练神经网络时,一次前向传播和反向传播同时处理的样本数量。一次喂 32 张图片,批大小就是 32。
打个比方:刷题
假设你在备考,每做完一道题就立刻对答案、调整复习重点。问题是单道题太没代表性——碰上一道偏题,你可能整晚都在补一个根本不重要的知识点。这就是批大小等于 1:梯度抖动剧烈,训练容易来回横跳。
反过来,做完整套卷子再统一对答案,"我哪里弱"这个判断就靠谱得多。批大小变大,就是让模型每走一步之前多看点样本,把这一步的方向算得更准。但代价是桌上摊的卷子变多了——对应到机器上就是显存。
它到底影响什么
训练稳定性:反向传播算出的梯度,实际上是这一批样本梯度的平均值。批越大,这个平均值越接近全体数据的真实方向,噪声越小,曲线越平滑,训练越稳。
学习率上限:批小、梯度噪声大,学习率开大就容易发散;批大、方向准,就敢用更大的学习率。批大小和学习率通常是绑在一起调的,批大小翻倍而学习率不动,结果往往变差。至于具体该按线性还是平方根缩放,属于经验性做法,以自己任务上的实验为准。
显存占用:激活值、梯度等中间结果大致随批大小线性增长。实际调参时第一个撞上的天花板通常是显存,而不是算力。
但批也不是越大越好。批太大可能损失一些泛化能力,而且每一步耗时更长;步数少了、每步慢了,总时间未必省。小批量自带的噪声,本身还有一点正则化的味道。
几个容易混淆的邻居
| 概念 | 含义 | 单位 |
|---|---|---|
| 批大小 | 一次更新看多少样本 | 样本数 |
| 迭代 / 步(step) | 参数更新一次 | 次 |
| 轮次(epoch) | 整个数据集完整过一遍 | 遍 |
换算关系大致是:一个 epoch 的步数 ≈ 样本总数 ÷ 批大小。
还有两个常被提起的做法:
- 随机梯度下降(SGD) 指批大小为 1;批量梯度下降 指一批就是全量数据。实践中几乎都用中间路线,叫小批量(Mini-batch)。
- 梯度累积(Gradient Accumulation):显存不够时,把一个大 batch 拆成几份小的依次算梯度、累加起来,再统一更新一次,效果上等效于大 batch,代价是训练更慢。
对你的实际意义
做训练的人:把批大小和学习率当成一个组合来调,别单独动其中一个;显存不够时,先考虑梯度累积或降批大小配小学习率;在多卡分布式训练里,真正起作用的是所有卡加起来的全局批大小,只看单卡数字容易误判。
不碰训练的人:理解这一点就够了——模型的显存占用和每步耗时,很大程度由"一次喂多少、每条多长"决定,这也是大模型训练成本高昂的直接原因之一。
