自动微分与数值验证:机器求导不是黑箱
约 14 分钟
现代机器学习用自动微分计算复杂程序的导数。它不同于符号求导,也不同于有限差分:程序把基本运算组成计算图,按链式法则精确到浮点误差地传播导数。
前向与反向模式
前向模式随输入传播导数,适合输入少;反向模式从输出向输入传播伴随量,标量损失对大量参数求梯度时高效。反向传播就是反向自动微分的应用。
计算图与缓存
中间值在前向计算保存,反向使用局部导数相乘累积。原地修改、分支和循环需要框架明确追踪,不能假设任意代码都自然可导。
梯度检查
用中心有限差分与自动微分在随机方向比较。步长太大有截断误差,太小有舍入相消;在多个步长上观察误差先降后升,比只试一个值可靠。
不可导点
绝对值和ReLU在某点不可导,软件通常选择一个次梯度约定。返回数字不表示经典导数存在,分析时要知道框架定义。
梯度正确不等于模型正确
损失函数、数据和参数化若错误,自动微分仍会忠实给出错误目标的梯度。用小问题、单位和极限情况验证整个链。
还应检查梯度规模:长期接近零会使深层参数难学,过大则可能造成数值溢出。链式法则结构解释了梯度消失与爆炸为何发生,也指导归一化、残差连接和裁剪等工程手段。
练习:手画一个三层计算图,做反向传播,再用中心差分检查两个参数梯度。
小纸条
自动微分算出的梯度数值为什么不等于整个模型已经正确?