M3-003M3: Deep Learning FoundationsBackprop & AutodiffMedium
Mastery:
Backprop & Autodiff: 解释梯度累加(gradient accumulation),它等价于什么。
📐 Mathematical Definition
⚡ Executive Summary
Core Concept: 多步前向反向累加梯度后再更新;等价于更大 batch,但 BN 统计仍按 micro-batch 计算。
📌 Key Takeaways
- •显存受限时模拟大 batch
- •注意 BN/LN 的统计量范围差异
📐 Mathematical Derivations
机制:把一个大的 global batch 切成 m 个 micro-batch,逐个做前向与反向并<strong>累加</strong>梯度(不清零),累积 m 步后再执行一次优化器更新(并清零)。数学上等价于用 global batch 计算的平均梯度(因为梯度的平均 = 各 micro-batch 梯度的平均),故<strong>有效 batch size = micro_batch × accum_steps</strong>。<strong>与数据并行的差异</strong>:数据并行在多卡上<strong>同时</strong>计算再 all-reduce 求和(吞吐高、需多卡);梯度累加在单卡上<strong>串行</strong>计算再累加(吞吐不变、省显存)。两者可叠加(每卡内累加 + 跨卡 all-reduce)。<strong>关键差异(易错点)</strong>:<strong>BatchNorm 的统计量</strong>——梯度累加时 BN 的 batch 统计量是按 <strong>micro-batch</strong> 计算的(而非 global batch),故与真正的 global batch 训练有差异;若需一致应改用 <strong>SyncBN</strong>(跨卡同步)或 LN(无 batch 依赖)。
🏭 Production Trade-offs
实践要点:① <strong>学习率需重新调</strong>——有效 batch 变大后梯度噪声减小,通常可用更大学习率(线性缩放规则 η∝batch,或平方根缩放);故改变 accum_steps 后应重新调学习率。② <strong>与检查点的配合</strong>——两者都省显存但机制不同:检查点省<strong>激活</strong>显存,累加省<strong>优化器更新频率</strong>(不直接省显存,但允许用更大 micro-batch?不,累加是为了用小 micro-batch 模拟大 batch)。实际上累加主要用于'显存只能放小 batch 但需要大 batch 的梯度质量'。③ <strong>与学习率调度的交互</strong>——累加步数影响'每多少 micro-step 更新一次',故调度器应按<strong>优化器步数</strong>(而非 micro-step)计步,否则学习率调度会错位(这是实现中常见的 bug)。④ <strong>梯度裁剪的位置</strong>——应在<strong>累加完成后</strong>对总梯度裁剪(而非每个 micro-batch),否则等价于对更小的梯度裁剪(改变有效阈值)。⑤ <strong>实践建议</strong>——先确定目标有效 batch(由泛化需求决定),再根据显存选 micro-batch,最后算 accum_steps;同时监控'更新/参数比'(健康范围约 10⁻³)确认学习率合适。⑥ <strong>数值精度</strong>——累加应在 FP32 中进行(BF16 累加会累积误差)。
⚠️ Common Interview Pitfalls
- ✕累加时用 micro-batch 的 BN 统计却当作 global batch
- ✕按 micro-step 而非优化器步数计学习率调度
🎯 Interviewer Follow-ups
- ?与梯度检查点如何配合?
- ?为什么大 batch 常需调学习率?
📚
Associated Knowledge Base Guides & Mindmaps
Explore the comprehensive technical article, exam cards, and global architecture tree.