梯度累积(Gradient Accumulation)是一种在深度学习训练中常用的技巧,主要用来在不增加显存占用的前提下,模拟更大的 batch size。下面从几个角度说明为什么需要它。
1. 显存限制:无法使用大 batch size
现代神经网络(尤其是大模型)通常:
- 模型参数多
- 激活值占用显存大
- 优化器状态(如 Adam 的动量)也占显存
如果你的 GPU 显存有限:
- 直接设大 batch size → OOM(显存溢出)
- 设小 batch size → 训练不稳定、泛化差
梯度累积的作用:
把多个小 batch 的梯度“攒起来”,再统一更新一次参数
这样:
- 每次只存一个小 batch 的激活
- 等效 batch size =
batch_size × accumulation_steps
2. 大 batch 的训练优势
大 batch size 通常带来:
- 梯度估计更准
- 损失曲面更平滑
- 收敛更稳定
- 很多论文的标准实验设置就是大 batch
但硬件不支持怎么办?
→ 梯度累积是“软件层的大 batch”
3. 多卡 / 分布式训练中的补充手段
即使在多 GPU 上:
- 数据并行受单卡显存限制
- 梯度累积可以进一步放大全局 batch
例如:
- 8 卡 × batch 4 × 累积 4 = 等效 batch 128
4. 训练超大模型(LLM)几乎是必备
在 LLM 训练中:
- 单卡 batch 可能只有 1~2
- 不累积根本达不到稳定训练所需规模
- 框架(如 DeepSpeed、Megatron)都内置支持
5. 简单示例(伪代码)
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
loss = model(x, y)
loss = loss / accumulation_steps
loss.backward()
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()
总结一句话
梯度累积 = 用时间换空间,用多次小步模拟一次大步更新。
如果你愿意,我也可以讲:
- 梯度累积对学习率的影响
- 和 gradient checkpointing 的区别
- 在 Hugging Face / PyTorch 中的具体用法