跳到正文

张量与自动微分:先证明梯度链是对的

14 分钟

D2L代码看似从模型开始,真正地基是张量形状、广播、设备与自动微分。形状能运行不代表语义正确;批次、通道、时间和特征轴一旦混淆,模型可能安静地学错目标。

形状契约

为每个函数写输入输出轴含义,例如[batch,time,feature]。在关键边界断言维度、dtype、设备和有限值,避免广播把一维偏置沿错误轴扩展。

计算图

前向操作建立图,反向按链式法则累积梯度。同一参数被多路径使用时梯度相加;多数框架默认梯度累积,每轮优化前要清零,否则无意跨批累积。

原地操作与detach

原地修改可能破坏反向所需中间值;detach切断图,适合日志或固定目标,却会让上游参数收不到梯度。每次切断都要有算法理由。

梯度检查

在小型双精度问题上用中心差分与自动微分比较。步长太大有截断误差,太小有舍入相消;观察多个步长,而非只看一次“差不多”。

数值健康

训练前记录激活与梯度分布,检查NaN、Inf、全零和异常大值。梯度正确只证明实现了当前损失,不证明损失或标签定义正确。

练习:手写一个两层网络损失,用有限差分检查三个参数,并故意detach观察哪个梯度消失。

小纸条

自动微分得到非零梯度为什么仍不能证明训练目标写对了?