假设:
则:
每 4 次 forward+backward 才更新一次参数
等效 batch size = 8 × 4 = 32⚠️ 注意:
accum_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
pred = model(x)
loss = criterion(pred, y) / accum_steps # 关键:除以步数
loss.backward()
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()✅ 适用于:
training_args = TrainingArguments(
per_device_train_batch_size=8,
gradient_accumulation_steps=4,
...
)✅ 自动处理:
{
"gradient_accumulation_steps": 4
}accum_steps = 4
for i, batch in enumerate(dataloader):
outputs = model(**batch)
loss = outputs.loss / accum_steps
accelerator.backward(loss)
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()→ 学习率效果会“看起来不对”
→ 等于没累积
→ 小 batch 下 BN 统计不稳定,可用:
公式:
accum_steps = target_batch / per_device_batch例如:
如果你告诉我:
我可以直接给你可复制的完整训练代码。