梯度累积技术是什么原理

GPU
小华
2026-09-16

梯度累积(Gradient Accumulation)是一种在深度学习训练中常用的技术,主要用来“用更小的显存跑更大的 batch size”。下面从原理到实现一步步说明。

1. 常规训练在做什么

假设:

  • batch_size = B
  • 模型参数:θ
  • 损失函数:L(θ)

常规训练每一步:

  1. B 个样本前向传播
  2. 计算损失 L
  3. 反向传播得到梯度 g = ∂L/∂θ
  4. 立即用优化器更新参数

θ = θ - η·g
这意味着:

  • 显存必须装下 B 个样本的计算图
  • 更新频率 = 每 B 个样本一次

2. 梯度累积的核心思想

把“算梯度”和“更新参数”拆开
不是每个 mini-batch 都更新,而是:

  • 连续算 K 个小 batch 的梯度
  • 把这些梯度加起来(或平均)
  • 累积够 K 次后,再用总梯度更新一次参数

等效 batch size 变成:

effective_batch_size = K × mini_batch_size

3. 数学原理

设:

  • 小 batch 大小:m
  • 累积步数:K
  • 总样本数:B = K × m

i 个小 batch 的梯度:

g_i = ∂L_i / ∂θ

梯度累积时:

G = Σ_{i=1}^{K} g_i     (或 G = (1/K) Σ g_i)

参数更新:

θ = θ - η · G

✅ 这等价于:用一个大小为 B 的 batch 算一次梯度再更新

4. 伪代码对比

普通训练

for x, y in dataloader:
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
optimizer.zero_grad()

梯度累积(K=4)

accum_steps = 4
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()

注意:

  • loss / accum_steps → 等效平均梯度
  • 只在累积结束时清零梯度

5. 为什么要使用梯度累积?

✅ 优点

  1. 显存友好
  • 小 batch 也能模拟大 batch
  1. 训练稳定
  • 大 batch 梯度更平滑
  1. 适合大模型 / 大模型微调
  • 如 LLM、ViT

❌ 代价

  • 更新频率降低
  • 相同 epoch 下,前向/反向次数不变,但更新次数变少
  • 总训练时间通常略长

6. 一个重要细节(Learning Rate)

如果你:

  • 用梯度累积把 batch 从 8 → 32

一般建议:

  • 学习率按比例放大(近似线性缩放规则)
  • 或保持原 LR 做实验对比

7. 一句话总结

梯度累积 = 把多个小 batch 的梯度先“存着”,攒够了再统一更新一次参数,从而用低显存实现大 batch 的效果。
如果你愿意,我也可以结合 PyTorch / Hugging Face Trainer / 分布式训练 给你讲更落地的用法。
亿速云提供售前/售后服务

售前业务咨询

售后技术保障

400-100-2938

7*24小时售后电话

官方微信小程序