直接回答:一个 epoch 指完整遍历一遍训练集;每次迭代(iteration 或 step)取一个 batch 的样本做前向、反向传播并更新一次参数。因此一个 epoch 的迭代数等于样本总数除以 batch size。三者是理解训练日志、估算训练时间和复现论文配置的基础词汇,也是排查"为什么我的 loss 曲线噪声这么大"这类问题的起点。
展开解析:batch size 是最重要的超参数之一。小 batch 梯度估计噪声大,噪声本身有类似正则的效果,泛化往往更好,但硬件吞吐低、收敛慢;大 batch 梯度估计准、GPU 利用率高,但容易收敛到尖锐极小值、出现"泛化缺口",实践上需要按线性缩放规则同步放大学习率,并配合几千步的学习率 warmup 才能稳定。显存不够时用梯度累积模拟大 batch:等效 batch = 单步 batch × 累积步数 × 数据并行卡数。注意梯度累积与真正的大 batch 并不完全等价——BatchNorm 的统计量仍按单步小 batch 计算,学习率的等效缩放也只是近似;大模型时代改用 LayerNorm 后这一差异基本消失。
accum_steps = 4 # 梯度累积:等效 batch 放大 4 倍
for i, (x, y) in enumerate(loader):
loss = model(x, y).loss / accum_steps
loss.backward()
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()
追问方向:为什么大 batch 要配合线性放大学习率?warmup 解决的具体问题是什么?batch size 与学习率调度、训练总步数如何联动设计?(约 500 字)