Epoch、Batch 与 Iteration
Batch 是一次输入样本组,iteration 是一次训练计算,epoch 是完整遍历训练集。
学习目标
- 十条样本、四条一批、两批一更新
- 增大 batch 后 epoch 不变,更新次数也不变吗?
- 说明:ceil(批次数/K) 只在明确处理最后不足 K 批的累积组时才是更新次数。
为什么需要这个概念
epoch 通常指遍历训练数据一次,batch 是一次取出的样本组,iteration 通常指处理一个批次。优化器更新次数需单独计算,尤其在梯度累积或跳过更新时。
学习前需要掌握
背景与问题
“训练了十轮”并不足以比较实验:数据集大小、批量大小和梯度累积设置不同,实际更新次数会相差很多,学习率计划也可能因此跑错。
概念定义
epoch 通常指遍历训练数据一次,batch 是一次取出的样本组,iteration 通常指处理一个批次。优化器更新次数需单独计算,尤其在梯度累积或跳过更新时。
直观理解
epoch 像把一摞卡片看完一遍,batch 是每次拿起的一把,参数更新则是看完多少把后才做一次笔记。
核心原理
若 N 条样本按大小 B 分组,保留尾批时批次数为 ceil(N/B),丢弃尾批时为 floor(N/B)。最后一个 batch 可能更小,所以求 epoch 平均损失时不能把各批均值等权平均。
累积 K 个 micro-batch 的梯度再更新,可在有限显存下扩大有效 batch。损失归一化应与目标样本均值一致;遇到不完整累积组,应明确是否仍更新以及如何缩放。使用 BatchNorm 时,微批统计也不会自动等同于一个大批。
调度器若按真实更新推进,不能在每个 micro-batch 后无条件 step。流式数据、采样有放回或 IterableDataset 中,“一轮”可能不是严格看过每条样本一次,实验记录应写清定义。
数学表达
核心公式
epoch 通常指遍历训练数据一次,batch 是一次取出的样本组,iteration 通常指处理一个批次。优化器更新次数需单独计算,尤其在梯度累积或跳过更新时。
变量含义
N训练样本数Bbatch size
计算步骤
- 1三个 batch 大小依次为 4、4、2。
- 2前两批更新一次,尾批再更新一次。
代码对应位置
示例 1十条样本、四条一批、两批一更新的最小验证:使用完整构造输入核对十条样本、四条一批、两批一更新,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | 训练样本数 |
B | batch size |
完整数值示例
十条样本、四条一批、两批一更新
已知条件
- N=10,batch_size=4,drop_last=False
- 累积两个 batch 后更新,末尾剩余梯度也更新
计算步骤
- 三个 batch 大小依次为 4、4、2。
- 前两批更新一次,尾批再更新一次。
计算结果
一次 epoch 有 3 次批处理与 2 次参数更新。
处理前后对比
- ceil(批次数/K) 只在明确处理最后不足 K 批的累积组时才是更新次数。
案例推演与判断
如果把最后两条直接丢弃,每轮只见 8 条样本;若同时 shuffle,每轮被丢弃的样本可能不同,但样本预算仍改变。若保留尾批却不在 epoch 末处理残余梯度,又会浪费尾批的训练计算。
微批损失按本组总样本数归一化时,前一组是 8 条,后一组是 2 条。简单对所有批损失都除以 2,会使尾组更新相对偏小。
计算与实现步骤
- 三个 batch 大小依次为 4、4、2。
- 前两批更新一次,尾批再更新一次。
代码实现
示例 1
十条样本、四条一批、两批一更新的最小验证
example_01.py用途:使用完整构造输入核对十条样本、四条一批、两批一更新,输出只表示本例计算。
from torch.utils.data import DataLoader, TensorDataset
import torch
dataset = TensorDataset(torch.arange(10))
loader = DataLoader(dataset, batch_size=4, drop_last=False)
sizes = [len(batch[0]) for batch in loader]
updates = (len(loader) + 2 - 1) // 2
print("batch sizes:", sizes)
print(f"iterations={len(loader)} updates={updates}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对十条样本、四条一批、两批一更新,输出只表示本例计算。
Step 1 · 1–8 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from torch.utils.data import DataLoader, TensorDataset
import torch
dataset = TensorDataset(torch.arange(10))
loader = DataLoader(dataset, batch_size=4, drop_last=False)
sizes = [len(batch[0]) for batch in loader]
updates = (len(loader) + 2 - 1) // 2
print("batch sizes:", sizes)
print(f"iterations={len(loader)} updates={updates}")预期输出或运行结果
batch sizes: [4, 4, 2] iterations=3 updates=2
常见错误 · 3 条
- SGD 等于 batch=1
- 忽略尾批
- 梯度累积仍逐 batch step
实际应用
- 设定训练预算
- 对齐梯度累积与学习率调度
常见错误
- SGD 等于 batch=1
- 忽略尾批
- 梯度累积仍逐 batch step
常见问题
增大 batch 后 epoch 不变,更新次数也不变吗?
通常会减少。每轮取出的批次数更少,因此固定 epoch 不代表固定更新预算,应结合样本数、更新数和计算时间比较。
这个示例能说明什么边界?
ceil(批次数/K) 只在明确处理最后不足 K 批的累积组时才是更新次数。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。