03 深度学习进阶本域第 2 篇
反向传播
让“求梯度”从数学苦役变成一次函数调用,这是深度学习真正起飞的那一刻
定义
反向传播是一种高效计算梯度的算法。它在计算图上先做一遍前向计算得到损失,再从输出往输入反向走一遍,用链式法则把“损失对每一层参数的偏导”逐层算出。有了它,无论网络有多少层、多少参数,一次反向扫描就能拿到全部梯度。
直观理解
把它想成一条工厂流水线:产品(输入)经过一道道工序(各层)变成成品(预测),质检再算出与标准的差距(损失)。要追溯“哪道工序该改多少”,就从最后一道往回查,把责任按贡献比例逐道分配。每一道工序只需知道“下游传回来的误差”,乘上自己那一环的局部导数,再往上游传——不必重算整条线。反向传播做的就是这件事,只不过每一步都用链式法则精确地完成。
一次训练迭代的两遍扫描:实线为前向(算出损失),虚线为反向(把梯度按链式法则逐层传回)
梯度沿深度衰减:同样 8 层,用 Sigmoid 时越靠近输入的层梯度越小(指数级);换成 ReLU 并把激活归一到稳定范围后,各层梯度可基本持平(纵轴为对数刻度)
- Sigmoid(深层衰减)
- ReLU + 归一化(保持稳定)
工作原理
- 01
前向计算:得到损失并缓存中间结果
按顺序逐层做线性变换与非线性,得到预测与一个标量损失,同时把每层的中间结果(激活值)缓存下来,供反向使用。
- 02
反向遍历:链式法则逐层求梯度
从损失出发,把“损失对该层输出的梯度”乘以该层的局部导数,得到“损失对该层输入的梯度”,再往上一层传。每一层只做一次局部乘法。
- 03
得到参数梯度:直接交给优化器
用缓存的输入与传回的梯度做一次外积(卷积网络中则是卷积),就得到损失对权重与偏置的梯度,直接交给梯度下降类优化器更新。
- 04
自动微分的意义:结构不再受限
框架把任意计算记录成图,反向传播全自动完成。正是这一步把人从手工推导偏导中解放出来,可以放心地设计任意深、任意结构的网络。
关键公式
∂L/∂W⁽ˡ⁾ = δ⁽ˡ⁾ (a⁽ˡ⁻¹⁾)ᵀ, δ⁽ˡ⁾ = ((W⁽ˡ⁺¹⁾)ᵀ δ⁽ˡ⁺¹⁾) ⊙ f′(z⁽ˡ⁾)应用场景
- 训练一切神经网络(CNN、RNN、Transformer)的公共引擎
- 与自动微分库(PyTorch、TensorFlow、JAX)绑定,构成标准训练循环
- 支撑微调与参数高效微调(如 LoRA),在已有权重上继续反传
- 分析梯度流:诊断梯度消失/爆炸,或绘制显著性图解释预测
常见误区
- 反向传播只负责“求梯度”,与优化算法(SGD、Adam)是两件事。前者给出方向,后者决定怎么用这个方向。
- 反向传播要保存前向的中间激活,显存随深度与批量增长;梯度检查点正是用“重算”换取“少存”的折中。
- 梯度是局部信息。它告诉你脚下最陡的方向,并不保证这个方向通往全局最优。
关键术语
- 计算图
- 把一次计算表示为节点与有向边的图,求导即在图上传播
- 链式法则
- 复合函数的导数等于各层局部导数之积
- 自动微分
- 让框架自动、精确地算出梯度,而非数值近似
- 梯度流
- 梯度沿网络逐层传播的大小与稳定性