在训练神经网络时:
梯度累积的核心思想:
把多个小 batch 的梯度加起来,等价于在一个大 batch 上算梯度
for each batch:
前向
计算 loss
反向(算梯度)
更新参数假设:
→ 等效 batch size = 16
for i in range(accumulation_steps):
前向
计算 loss
loss = loss / accumulation_steps
反向(梯度累加,不更新)
更新参数(每 accumulation_steps 次)
清空梯度accumulation_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
pred = model(x)
loss = criterion(pred, y)
loss = loss / accumulation_steps
loss.backward()
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()⚠️ 注意:
loss / accumulation_steps 是为了保持梯度尺度一致step()✅ 数学上近似等价
⚠️ 不完全一样
✅ 显存不足但想用大 batch
✅ 大模型(LLM)微调
✅ 多卡训练补充手段
梯度累积 = 把多次前向反向的梯度攒起来再更新参数,用时间换显存。
如果你愿意,我也可以讲: