1. Batch Size 基础概念:什么是 Batch Size、Epoch、Iteration 的关系,为什么 Batch Size 如此重要
1.1 三个核心概念,一次讲透
咱们先聊点最基础的。你想想看,训练一个神经网络,就像教一个学生做题。
Batch Size 是什么?说白了,就是每次扔给模型多少样本,让它一口气学完再更新参数。我习惯叫它「一口吃多少」。
Epoch 呢?就是整个训练集从头到尾跑了一遍。好比你把整本习题集都过了一遍。
Iteration 更简单——模型更新一次参数,就算一次迭代。一次迭代里,模型吃一个 batch 的数据,算一次损失,做一次反向传播。
它们仨的关系,用一个公式就能说清:
总迭代次数 = (样本总数 / Batch Size) × Epoch 数
举个例子。假设你有 1000 张猫狗图片,Batch Size 设为 100。那么一个 Epoch 就需要 10 次迭代。跑 5 个 Epoch,总共就是 50 次迭代。
嗯,这里要注意:如果样本总数不能被 Batch Size 整除,最后一个 batch 会小一些。我刚开始做项目时,就因为这个踩过坑——最后一个 batch 太小,梯度估计不准,模型训练直接崩了。
1.2 为什么 Batch Size 如此重要?
这个问题,我当年面试时被问过。当时我答得磕磕绊绊,现在回头看,其实核心就三点。
核心影响一:训练速度
Batch Size 越大,硬件利用率越高。GPU 喜欢一次性处理大批量数据,并行计算效率拉满。但也不是越大越好——显存就那么大,你塞不下。
核心影响二:梯度质量
小 batch 的梯度噪声大,像喝醉了走路,歪歪扭扭但偶尔能跳出局部最优。大 batch 的梯度更稳,但容易陷在鞍点出不来。
核心影响三:泛化能力
我做过对比实验:同样跑 100 个 Epoch,Batch Size=32 的模型在测试集上比 Batch Size=512 的高了 2 个点。为什么?小 batch 的随机性相当于隐式的正则化。
1.3 一张图看懂核心逻辑
我画了张流程图,帮你理清 Batch Size 在整个训练流程中的位置:
1.4 不同 Batch Size 的实战对比
我整理了一张表,方便你直观感受不同 Batch Size 带来的差异:
| Batch Size | 训练速度 | 梯度稳定性 | 泛化能力 | 显存占用 | 典型场景 |
|---|---|---|---|---|---|
| 1(在线学习) | 极慢 | 极不稳定 | 好(噪声大) | 极低 | 流式数据、在线学习 |
| 2-16(小 batch) | 慢 | 不稳定 | 较好 | 低 | 小数据集、调试阶段 |
| 32-128(中等 batch) | 快 | 稳定 | 好 | 中等 | 大部分 CV、NLP 任务 |
| 256-1024(大 batch) | 很快 | 很稳定 | 一般 | 高 | 大规模分布式训练 |
| >1024(超大 batch) | 极快 | 过于稳定 | 差 | 极高 | 需要特殊学习率策略 |
💡 我的个人经验
做 CV 分类任务时,我习惯从 Batch Size=64 开始调。如果显存够,就试试 128。如果模型收敛慢,就降到 32。这个区间最稳,踩坑最少。
1.5 避坑指南:我踩过的三个坑
坑一:盲目追求大 batch
我曾经在 ResNet-50 上把 Batch Size 从 64 提到 512,想着训练能快 8 倍。结果呢?模型根本不收敛。后来加了 warmup 和线性缩放学习率才救回来。
坑二:忽略最后一个 batch
数据集 1001 张图,Batch Size 设 100。最后一个 batch 只有 1 张图。BN 层直接炸了——方差算出来是 0。我那次排查了整整一下午。
坑三:小 batch 配大学习率
小 batch 的梯度噪声本来就大,你再配个大学习率,模型直接原地起飞。我建议小 batch 配小学习率,大 batch 配大学习率,但别超过 0.01 的基准太多。
1.6 一句话总结
Batch Size 就是训练速度和模型质量之间的天平。太小了慢,太大了傻。32 到 128 是黄金区间,从那里开始调,准没错。
想要更多资料,联系可可