Gradient Accumulation的原理与实现
Gradient Accumulation(梯度累积)是训练大模型时在小显存上模拟大批量的关键技术。请解释其工作原理、实现步骤,以及它与实际大批量训练在BN统计量上的差异。
回答
我是大山
原理:将一个大Batch拆分为多个Micro-Batch,分别前向-反向得到梯度,累积梯度后统一更新参数。
实现步骤(以有效batch=64,微批大小=16,累积步数=4为例):
- 对每个微批执行前向+反向(保留梯度,不清零)
- 重复4次,梯度累加(总和)
- 优化器.step():使用累积梯度更新参数
- 梯度清零(optimizer.zero_grad())
注意:梯度累积均值 vs 求和——通常将损失除以累积步数:loss = loss / accum_steps,再反向传播,这样等效于大批量的均值梯度。
与真实大批量的差异:
- BN统计量:每个微批独立执行BN统计,噪声更大;真实大批量使用整体统计。 解决方法:使用SyncBN或冻结BN统计量(如检测模型中的FrozenBN)
- 梯度噪声:累积梯度的噪声模式与真实大批量略有不同(每个微批的BN不同)
- 显存效率:微批无需同时驻留显存,显存占用取决于微批大小而非总batch
- 训练速度:需要N次前反向,训练时间增加
实践:HuggingFace Trainer中通过gradient_accumulation_steps参数设置。典型的梯度累积在LLaMA-Factory等微调框架中默认使用。