qinghuan
← 模型训练与评估契约目录

MODEL TRAINING / 补充讲义 5 / 7

梯度累积与参数更新次数

在同初始权重的线性模型上比较一次大批更新与微批累积,检查尾组和故障路径。

已有epoch、batch 与 step 计数只生成读取和更新计划。本节在固定的小模型上进一步检查:多次反向传播累积的梯度,是否对应同一组样本的一次更新。

同一组参数上先累积,再更新

梯度累积将多个微批次的梯度相加,随后执行一次参数更新。中途清梯度会丢掉前面的贡献,中途更新参数则会改变后续梯度的计算位置。官方等大微批次示例先将各批平均损失除以累积次数,再进行反向传播。PyTorch 梯度累积示例

本节的等价性只讨论独立样本、等大微批次、无批次依赖层和随机层的固定简单模型。它不保证任意多次小步更新等价于一次大步更新,也不保证完整训练轨迹或效果相同。

练习一 对照一次大批更新与两次反向

固定一份线性分类模型初始权重与 4 条样本,使用 CPU float32、无类别权重、无忽略标签,以及无动量和权重衰减的 SGD。

路径反向传播安排参数更新
A4 条一次前向,平均交叉熵反向一次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 复核累积、缩放与步进段落。