梯度累积(Gradient Accumulation)和微批次(Micro-batch)本质上是同一件事的两种说法,核心目的都是:在显存有限的情况下,用多次小批次(micro-batch)模拟大批次(global batch)训练。
梯度累积 = 使用多个微批次(micro-batch)不断累加梯度,再统一更新参数
| 概念 | 角色 |
| 微批次 | 数据切分单位 |
| 梯度累积 | 训练策略 |
| 全局批次(global batch) | micro-batch × 累积步数 |
假设:
Global batch (64)
├── Micro-batch 1 (16)
├── Micro-batch 2 (16)
├── Micro-batch 3 (16)
└── Micro-batch 4 (16)for micro-batch in micro-batches:
前向计算
反向计算(得到梯度)
梯度累加到 buffer(不更新参数)
# 累积完成后
更新参数
清空梯度accumulation_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(data_loader):
pred = model(x)
loss = criterion(pred, y)
loss = loss / accumulation_steps # 可选:归一化
loss.backward() # 梯度累加
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()| 对比项 | 梯度累积 | 数据并行 |
|---|---|---|
| 是否多卡 | ❌ | ✅ |
| 是否增加显存 | ❌ | ✅ |
| 本质 | 时间换空间 | 空间换时间 |
| 梯度同步 | 单卡内部 | 多卡之间 |
✅ 不会,只是数值累加,等价于一次大 batch 的反向传播
✅ 推荐做法,但不是必须
微批次是“怎么切数据”,梯度累积是“怎么用这些数据训练”;两者结合,使小显存也能跑大 batch。
如果你愿意,我可以: