已有epoch、batch 与 step 计数只生成读取和更新计划。本节在固定的小模型上进一步检查:多次反向传播累积的梯度,是否对应同一组样本的一次更新。
同一组参数上先累积,再更新
梯度累积将多个微批次的梯度相加,随后执行一次参数更新。中途清梯度会丢掉前面的贡献,中途更新参数则会改变后续梯度的计算位置。官方等大微批次示例先将各批平均损失除以累积次数,再进行反向传播。PyTorch 梯度累积示例
本节的等价性只讨论独立样本、等大微批次、无批次依赖层和随机层的固定简单模型。它不保证任意多次小步更新等价于一次大步更新,也不保证完整训练轨迹或效果相同。
练习一 对照一次大批更新与两次反向
固定一份线性分类模型初始权重与 4 条样本,使用 CPU float32、无类别权重、无忽略标签,以及无动量和权重衰减的 SGD。
| 路径 | 反向传播安排 | 参数更新 |
|---|---|---|
| A | 4 条一次前向,平均交叉熵反向一次 | 1 次 |
| B | 拆成两个等大的微批,每批平均损失除以 2 后反向 | 两批结束后 1 次 |
两条路径从相同权重开始。路径 B 只在整个累积窗口开始前清梯度,不在两个微批之间清理或更新。先比较 step() 之前的累计梯度,再比较更新后的参数;提前约定浮点容差,并保存最大误差。分别计数两条路径的优化器更新,必须都是一次。
练习二 注入故障,再检查尾组
给循环增加 backward、zero_grad 和 step 三个计数器。分别故意在每个微批次前清梯度、每批立即更新,记录它们与正确路径的差异,不能只看最后还能打印一个 loss 就算通过。
再准备 3 个微批次,计划每 2 批累积一次。明确选择处理最后一个微批还是丢弃,并记录实际样本数和更新数;不能只用整除条件而静默遗失尾组。如果处理尾组,归一化要对应这个窗口的真实有效样本,不能机械沿用完整窗口的除数。
AMP 需要保持同一个缩放单位
若以后引入自动混合精度,同一个有效批次内的梯度应保持相同缩放系数。累积完成后,再进行反缩放、非有限值检查、步进和缩放器更新;不能把已反缩放的梯度与后续仍被缩放的梯度直接相加。官方 AMP 边界
本节先完成普通精度实验,不要求现在加入 AMP。BatchNorm、随机操作、不等大微批次、加权或忽略目标、分布式训练均需另行确定归一化和对照条件。
来源与验收状态
前置可回看梯度缓冲清理。本节两项均为未运行设计,不能借用其他章节的运行结果声称已经通过。
PyTorch 2.14 梯度累积示例,页面创建与更新均标为 2026-05-07;原核查为 2026-10-26 12:09 JST,本次于 2026-10-30 复核累积、缩放与步进段落。