Batch、Epoch、Iteration 是什么?Batch Size 大小有什么影响?
简化版
三个训练中的基本概念:Epoch(轮)= 把整个训练集完整过一遍;Batch(批)= 把训练集切成的小份,每次用一批数据算梯度、更新一次参数;Iteration(迭代)= 一次参数更新 = 处理一个 batch。关系:每个 epoch 的 iteration 数通常为 ceil(N/B),若 drop_last=true 则为 floor(N/B)。Batch Size(批大小) 是每批的样本数,影响很大:大 batch——梯度估计准、训练稳、能充分利用 GPU 并行(快),但占显存多、泛化可能略差(容易收敛到「尖锐极小值」);小 batch——梯度噪声更大,可能带来正则效应,但泛化并非必然更优,省显存,但训练慢、不稳定。常用折中是 mini-batch(如 32、64、128、256)。
详细版
三个概念:
| 概念 | 含义 |
|---|---|
| Epoch | 整个训练集被完整训练一遍 |
| Batch | 训练集切分出的一小份数据 |
| Iteration | 处理一个 batch = 一次参数更新 |
换算关系:
每个 epoch 的 iteration 数 = 按是否保留最后不足一批计算 `ceil(N/B)` 或 `floor(N/B)`
总迭代次数 = epoch 数 × 每 epoch 迭代数
例:10000 样本、batch size=100 → 每 epoch 100 次迭代;训练 10 个 epoch = 1000 次迭代。
Batch Size 的影响:
| 大 batch | 小 batch | |
|---|---|---|
| 梯度估计 | 准、稳 | 有噪声 |
| 训练速度 | 快(GPU 并行充分) | 慢 |
| 显存占用 | 大 | 小 |
| 泛化 | 可能略差(尖锐极小值) | 常更好(噪声起正则作用) |
| 收敛 | 稳但可能陷次优 | 抖动但可能找到更平坦解 |
完整版教学
一、三个概念——训练的基本节奏
训练神经网络不是一次把所有数据喂进去,而是分批、多轮地进行。三个概念描述了这个节奏:
- Epoch(轮次):把整个训练集完整地过一遍叫一个 epoch。训练通常要很多个 epoch(如 50、100),让模型反复看数据、逐步学好。
- Batch(批):一个 epoch 里,训练集被切成很多小批(batch),模型每次只用一批数据算梯度、更新一次参数。
- Iteration(迭代):处理一个 batch、完成一次参数更新,就是一次 iteration。
二、换算关系
三者的关系是固定的:
每个 epoch 的迭代次数 = 按是否保留最后不足一批计算 `ceil(N/B)` 或 `floor(N/B)`
例子:训练集有 10000 个样本,batch size = 100:
- 一个 epoch 需要
10000 / 100 = 100次迭代(处理 100 个 batch,每个 batch 更新一次参数)。 - 如果训练 10 个 epoch,总共
10 × 100 = 1000次迭代(参数被更新 1000 次)。
注意区分:epoch 是「过几遍数据」,iteration 是「更新几次参数」——一个 epoch 里参数被更新很多次(等于 batch 数),别把它们搞混。
三、为什么要分 batch——三种梯度下降
「一次用多少数据算梯度」对应三种梯度下降:
- 批量梯度下降(BGD):每次用全部训练数据算梯度。梯度最准,但每步都要过全量数据、慢且吃内存,大数据不可行。
- 随机梯度下降(SGD,单样本):每次只用一个样本。快、更新频繁,但梯度噪声大、震荡。
- 小批量梯度下降(Mini-batch):每次用一小批(如 32~256 个)。兼顾稳定和效率,还能充分利用 GPU 的并行计算——这是深度学习的标准做法(平时说的 SGD 其实多指 mini-batch)。
所以「分 batch」是在「梯度准确性」和「计算效率」之间取平衡。
四、Batch Size 太大:稳但可能泛化差、吃显存
大 batch size(如 512、1024 甚至更大):
- 梯度估计更准、训练更稳(用更多样本平均,噪声小)。
- 充分利用 GPU 并行,每步处理更多数据、单位时间吞吐高。
- 缺点:
- 占用显存大——batch size 常受显存上限制约。
- 泛化可能略差:大 batch 改变梯度噪声和有效更新次数;若学习率、训练步数等不重调,泛化可能变化,“尖锐极小值”只是常见解释之一。需要配合更大学习率、warmup、线性缩放规则等技巧才能保持泛化。
五、Batch Size 太小:泛化好但慢、不稳
小 batch size(如 8、16、32):
- 梯度有噪声(样本少、估计不准),更新方向抖动。
- 但这种噪声有正则化效果——帮助模型跳出尖锐极小值、找到更平坦的解,泛化常常更好。
- 省显存。
- 缺点:训练慢(GPU 并行没吃满、更新频繁但每步信息少)、收敛过程抖动、不稳定。
六、怎么选 Batch Size
- 常用值:32、64、128、256——2 的幂(利于硬件对齐),是效率和泛化的常见折中。
- 受显存限制:显存不够就减小 batch size,或用梯度累积(累积多个小 batch 的梯度再更新,模拟大 batch)。
- 增大 batch 时通常要重新调学习率:常用「线性缩放规则」——在线性缩放适用的区间,可把 batch size 与学习率近似同比放大,并配 warmup;超出临界 batch 后不再保证有效,并配 warmup。
- 权衡:追求训练速度/吞吐 → 大 batch;追求泛化、显存紧 → 小 batch。没有绝对最优,需实验。
七、非整除数据与梯度累积怎么计算
设训练集 N=103、batch size B=32。保留尾批时,一个 epoch 有 ceil(103/32)=4 次迭代,批大小依次是 32、32、32、7;若 drop_last=true,则只有 3 次迭代且每轮暂时不使用最后 7 个样本。数据加载器通常会在下一轮重新打乱,所以“暂时丢弃”不一定永远丢同一批。
| 配置 | 优化器更新次数/epoch | 每次统计特点 |
|---|---|---|
| B=32,保留尾批 | 4 | 最后一批统计噪声更大 |
| B=32,丢尾批 | 3 | 批形状固定,但每轮少看7个样本 |
| micro-batch=8,累积4步 | 约4 | 有效 batch 约32,BN 仍按8统计 |
梯度累积要先把损失按累积步数正确缩放,再累计若干 micro-batch 后调用一次 optimizer step。它能模拟较大的梯度平均并节省激活显存,但不能完全复制大 batch:BatchNorm 统计、随机增强和优化器更新频率仍可能不同。
易错点:一次 iteration 通常指一次优化器更新;用了梯度累积后,一个 micro-batch 的前后向不一定等于一次 iteration。
八、常见误区与追问
- 误区:每个 epoch 的迭代数永远等于 N 除以 B。 不能整除时要看尾批是否保留,并明确使用 ceil 还是 floor。
- 误区:梯度累积与物理大 batch 在所有方面完全等价。 BN 统计、随机层和通信时机可能不同。
- 追问:为什么分布式训练要区分全局 batch? 全局 batch 等于每设备 batch×设备数×累积步数,学习率通常按全局值调。
- 追问:大 batch 一定吞吐更高吗? 达到硬件饱和前通常提高,之后可能受显存、通信和内存带宽限制。
- 追问:该按 epoch 还是 step 配学习率调度? 先确认调度器定义;数据规模或 batch 改变时,按 step 的计划更容易保持更新预算一致。
九、加强记忆
Epoch = 整个训练集过一遍;Batch = 训练集切出的一小份;Iteration = 处理一个 batch = 一次参数更新。换算:每 epoch 迭代数 = 样本总数 / batch size(10000 样本、batch 100 → 每 epoch 100 次迭代)。分 batch 是在梯度准确性和效率间平衡,mini-batch(32~256)是标准做法。Batch Size 影响:大 batch——梯度准、稳、快(GPU 并行充分),但吃显存、泛化可能略差(尖锐极小值),需配大学习率+warmup;小 batch——梯度有噪声、慢、不稳,但噪声起正则作用、泛化常更好、省显存。选择:常用 2 的幂、受显存限制(不够用梯度累积)、大 batch 配大学习率。