1. Batch Size基础概念:什么是Batch Size、Epoch与Iteration的关系、为什么需要Batch训练
大家好,我是你们的老朋友。今天咱们来聊聊深度学习里最基础、也最容易被忽视的一个参数——Batch Size。
说实话,我刚开始做深度学习那会儿,对Batch Size的理解就是「一次扔进去多少张图」。后来踩了不少坑才发现,这个数字选得好不好,直接决定了模型能不能收敛、训练要花多久。
1.1 什么是Batch Size?
Batch Size,中文叫「批次大小」。说白了,就是每次参数更新前,模型一次性处理的样本数量。
举个例子:假设你有10000张猫狗图片要训练。如果Batch Size=32,那模型每次会从这10000张里随机挑32张,算完梯度,更新一次参数。然后再挑下一批32张,继续更新。
嗯,这里有个关键点:一次Batch,就是一次参数更新。不是一次看完所有数据,而是一批一批地看。
核心公式:
参数更新次数 = 总样本数 ÷ Batch Size
比如10000张图,Batch Size=32,那一次Epoch里参数会更新 10000/32 ≈ 313 次。
1.2 Epoch与Iteration的关系
这两个概念经常被新手搞混。我当年也犯过这个错——面试时被问到「一个Epoch有多少次Iteration」,我愣是答错了。
咱们直接上公式:
| 概念 | 定义 | 类比 |
|---|---|---|
| Epoch | 所有训练数据完整过一遍 | 把整本书从头到尾读一遍 |
| Iteration | 一次Batch的前向+反向传播 | 读一页书 |
| Batch Size | 一次Iteration用的样本数 | 一页书上有多少字 |
它们的关系很简单:
一个Epoch里的Iteration数 = 总样本数 ÷ Batch Size
举个例子:
- 训练集有50000张图
- Batch Size设为64
- 那么一个Epoch = 50000/64 ≈ 782次Iteration
- 如果你训练10个Epoch,总Iteration数 = 782 × 10 = 7820次
我的小习惯:每次写训练脚本,我都会先算一下这个数。不是为了炫技,而是为了估算训练时间。比如一次Iteration跑0.1秒,一个Epoch就是78秒,10个Epoch就是13分钟。心里有数,干活不慌。
1.3 为什么需要Batch训练?
你可能会问:为什么不一次把所有数据都扔进去?或者一次只扔一张?
好问题。咱们分别看看这两种极端情况:
方案一:全量训练(Batch Size = 全部样本)
也叫「批量梯度下降」。理论上梯度最准,但实际中几乎没人用。为什么?
- 内存爆炸:100万张图一次加载,显存直接爆掉。我在项目里试过一次,RTX 3090直接报OOM。
- 更新太慢:算完一次梯度要等所有数据都过一遍。等得黄花菜都凉了。
- 容易陷入局部最优:全量梯度太「稳」了,反而跳不出坑。
方案二:单样本训练(Batch Size = 1)
也叫「随机梯度下降」。每次只用一个样本更新参数。
- 噪声太大:梯度方向忽左忽右,收敛路径像喝醉了酒。
- 训练不稳定:Loss曲线像心电图,上蹿下跳。
- 硬件利用率低:GPU一次处理一张图,算力浪费严重。
方案三:Mini-Batch训练(Batch Size = 16/32/64/128)
这才是工业界的主流做法。说白了就是取个折中:
- 梯度更稳:比单样本稳定,比全量灵活
- 内存可控:32张图,大多数显卡都能hold住
- 并行效率高:GPU天生适合批量处理
避坑指南:我曾经在一个图像分割项目里,把Batch Size从32改成64,结果模型直接不收敛了。排查了半天才发现,Batch Size变大后,学习率没跟着调。记住:Batch Size翻倍,学习率通常也要跟着翻倍,或者用线性缩放法则。
1.4 知识体系总览
为了让你更直观地理解这三者的关系,我画了张图:
从这张图可以看得很清楚:数据集 → 拆成多个Epoch → 每个Epoch拆成多个Iteration → 每个Iteration处理一个Batch。这就是深度学习训练的基本节奏。
1.5 实际项目中的选择建议
说了这么多理论,来点实际的。我根据经验总结了一个快速选择表:
| 场景 | 推荐Batch Size | 原因 |
|---|---|---|
| 小数据集(< 1万张) | 16-32 | 数据少,批次太大梯度更新次数太少 |
| 中等数据集(1万-10万) | 32-64 | 最常用的区间,平衡速度和稳定性 |
| 大数据集(> 10万) | 64-256 | 数据量大,可以适当加大批次 |
| 显存受限(4GB以下) | 8-16 | 先保证能跑起来,再谈效果 |
| 分布式训练 | 32-64 per GPU | 每个GPU单独算,再汇总梯度 |
我的经验:如果你实在不知道怎么选,先从32开始。32是个神奇的数字,大多数模型都能接受。然后观察Loss曲线:如果震荡太厉害,就减小;如果收敛太慢,就增大。调参这事儿,说白了就是试出来的。
好了,Batch Size的基础概念就聊到这儿。记住三个核心点:Batch Size是一次更新的样本数,Epoch是完整过一遍数据,Iteration是一次参数更新。搞清楚了这些,后面的调参才有根基。