反向传播计算了什么
沿计算图理解链式法则如何把输出误差传回参数,并辨清反向传播与优化器的职责。
反向传播计算了什么
反向传播是一种高效计算梯度的方法。它沿计算图从输出向输入应用链式法则,得到损失对各参数的偏导数。它回答参数发生微小变化时损失如何变化,但不负责选择参数更新步长,也不保证训练会找到全局最优解。
前向计算留下依赖关系
网络训练先进行前向传播:输入经过层和运算得到预测,再由预测与目标计算损失。每个中间值都依赖上游节点,整个过程可以表示为有向计算图。加法、乘法、激活和归一化都是图中的局部运算。
反向计算需要前向阶段的部分中间值,因此训练通常比纯推理占用更多内存。框架会记录自动微分所需的运算关系;若在图外修改张量或错误切断梯度,参数就可能得不到预期更新信号。
链式法则连接局部导数
对复合函数求导时,链式法则把输出对中间量的导数与中间量对输入的导数相乘。反向传播从损失的导数开始,逐个节点计算局部导数并传给其输入。这样不必为每个参数重复完成整条计算。
同一中间量若影响多个下游分支,返回的梯度需要相加。参数在多个时间步或多个位置共享时,也要累积所有使用位置的贡献。忽略累积会得到不完整梯度。
梯度不是参数更新规则
反向传播结束后得到梯度,优化器才根据梯度、学习率以及可能的动量或自适应统计更新参数。随机梯度下降、Adam 等优化方法使用梯度的方式不同。把两者混称,会掩盖训练不稳定究竟来自求导、优化设置还是数据。
梯度指出局部最陡变化方向,只描述当前位置附近。非凸目标中可能存在鞍点、平坦区和多个可行解,因此一次正确求导并不能保证最终泛化表现。
深层计算存在数值困难
多个很小的局部导数连乘会造成梯度消失,多个较大导数连乘则可能造成梯度爆炸。激活函数、参数初始化、归一化、残差连接和梯度裁剪可以缓解不同问题,但都需要结合网络和数据验证。
浮点精度也会影响结果。混合精度训练通常需要损失缩放等措施,避免微小梯度下溢。出现非有限损失时,应检查输入范围、除零、对数定义域和学习率,而不是只降低精度要求。
梯度检查用于验证实现
对小规模模型,可以用参数的微小扰动计算有限差分,并与反向传播梯度比较。数值差分计算昂贵且受步长与舍入误差影响,适合检查实现,不适合替代训练中的自动微分。
反向传播的可靠性还依赖损失和计算图确实表达了任务。即使梯度完全正确,错误标签、数据泄漏或不合适目标仍会训练出无效模型。求导验证、优化诊断和任务评价需要分别进行。
资料依据
- Ian Goodfellow、Yoshua Bengio、Aaron Courville:《Deep Learning》在线版,https://www.deeplearningbook.org/
- Stuart Russell、Peter Norvig:《Artificial Intelligence: A Modern Approach》第四版资料站,https://aima.cs.berkeley.edu/