CodeWalk

Gradient Accumulation的原理与实现

作者:我是大山 · 2026-05-30 12:55

Gradient Accumulation(梯度累积)是训练大模型时在小显存上模拟大批量的关键技术。请解释其工作原理、实现步骤,以及它与实际大批量训练在BN统计量上的差异。

回答

我是大山

原理:将一个大Batch拆分为多个Micro-Batch,分别前向-反向得到梯度,累积梯度后统一更新参数。

实现步骤(以有效batch=64,微批大小=16,累积步数=4为例):

  1. 对每个微批执行前向+反向(保留梯度,不清零)
  2. 重复4次,梯度累加(总和)
  3. 优化器.step():使用累积梯度更新参数
  4. 梯度清零(optimizer.zero_grad())

注意:梯度累积均值 vs 求和——通常将损失除以累积步数:loss = loss / accum_steps,再反向传播,这样等效于大批量的均值梯度。

与真实大批量的差异:

  1. BN统计量:每个微批独立执行BN统计,噪声更大;真实大批量使用整体统计。 解决方法:使用SyncBN或冻结BN统计量(如检测模型中的FrozenBN)
  2. 梯度噪声:累积梯度的噪声模式与真实大批量略有不同(每个微批的BN不同)
  3. 显存效率:微批无需同时驻留显存,显存占用取决于微批大小而非总batch
  4. 训练速度:需要N次前反向,训练时间增加

实践:HuggingFace Trainer中通过gradient_accumulation_steps参数设置。典型的梯度累积在LLaMA-Factory等微调框架中默认使用。