假设:
batch_size = BθL(θ)常规训练每一步:
B 个样本前向传播Lg = ∂L/∂θθ = θ - η·g
这意味着:
B 个样本的计算图B 个样本一次把“算梯度”和“更新参数”拆开
不是每个 mini-batch 都更新,而是:
K 个小 batch 的梯度K 次后,再用总梯度更新一次参数等效 batch size 变成:
effective_batch_size = K × mini_batch_size设:
mKB = K × m第 i 个小 batch 的梯度:
g_i = ∂L_i / ∂θ梯度累积时:
G = Σ_{i=1}^{K} g_i (或 G = (1/K) Σ g_i)参数更新:
θ = θ - η · Gfor x, y in dataloader:
pred = model(x)
loss = criterion(pred, y)
loss.backward()
optimizer.step()
optimizer.zero_grad()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 → 等效平均梯度如果你:
一般建议:
梯度累积 = 把多个小 batch 的梯度先“存着”,攒够了再统一更新一次参数,从而用低显存实现大 batch 的效果。
如果你愿意,我也可以结合 PyTorch / Hugging Face Trainer / 分布式训练 给你讲更落地的用法。