- 反向:计算梯度的方向是从网络的输出层向输入层逐层回溯。
- 传播:将最终的预测误差沿着网络连接分配(传播) 给每一个贡献了该误差的权重。
为什么需要反向传播?
想象一个拥有百万个权重的深度网络,如果使用最笨的“有限差分法”(给每个权重加一个微小扰动,看损失变化),计算一次梯度就需要进行百万+1次前向传播,这在计算上是不可行的。

反向传播利用链式法则,通过一次前向传播和一次反向传播,就能高效地计算出损失函数对所有权重的梯度,计算复杂度大致仅为两次前向传播。
基本原理分解(三步走)
我们结合一个简单的三层网络(输入层、隐藏层、输出层)来看。
前向传播
这是基础,输入数据通过网络层层传递,得到最终预测。
- 输入
x,乘以权重W1,加上偏置b1,得到隐藏层输入z1 = W1*x + b1。 - 对
z1应用激活函数(如Sigmoid、ReLU),得到隐藏层激活值a1 = σ(z1)。 a1作为下一层输入,乘以权重W2,加上偏置b2,得到输出层输入z2 = W2*a1 + b2。- 对
z2应用输出层激活函数(如Softmax用于分类),得到最终预测y_pred = f(z2)。 - 计算损失函数
L,比较y_pred和真实标签y_true(如交叉熵损失、均方误差)。
至此,我们知道了网络的“表现”有多差(损失值L)。
反向传播(误差反向流动)
这是关键,我们利用链式法则,从后往前计算损失对每个参数的梯度。
核心思想:从损失函数开始,向后逐层询问“谁影响了你的结果?你该为它的误差负多少责任?”。
计算输出层梯度:
- 首先计算损失
L对网络最终输出y_pred的梯度:∂L/∂y_pred,这取决于损失函数。 - 然后计算
y_pred对其输入z2的梯度:∂y_pred/∂z2,这取决于输出层激活函数。 - 根据链式法则,损失对
z2的梯度为:δ2 = ∂L/∂z2 = (∂L/∂y_pred) * (∂y_pred/∂z2)这个δ2通常被称为输出层的“误差项”或“δ项”。
计算隐藏层参数 W2 和 b2 的梯度:
z2 = W2 * a1 + b2。∂L/∂W2 = δ2 * ∂z2/∂W2 = δ2 * a1.T(注意维度,a1.T是a1的转置)∂L/∂b2 = δ2 * ∂z2/∂b2 = δ2(因为∂z2/∂b2 = 1) 现在我们已经知道如何更新输出层的权重和偏置了。
将误差继续反向传播到隐藏层:
- 我们需要计算损失对隐藏层激活值
a1的梯度:∂L/∂a1 = δ2 * ∂z2/∂a1 = W2.T * δ2 - 然后计算
a1对其输入z1的梯度:∂a1/∂z1 = σ'(z1),即激活函数的导数。 - 再次使用链式法则,得到损失对
z1的梯度(隐藏层的误差项):δ1 = ∂L/∂z1 = (∂L/∂a1) * (∂a1/∂z1) = (W2.T * δ2) ⊙ σ'(z1)表示逐元素相乘(Hadamard积)。
计算输入层参数 W1 和 b1 的梯度:
z1 = W1 * x + b1。∂L/∂W1 = δ1 * ∂z1/∂W1 = δ1 * x.T∂L/∂b1 = δ1 * ∂z1/∂b1 = δ1
至此,我们得到了损失函数 L 对网络中所有权重 (W1, b1, W2, b2) 的梯度 (∂L/∂W1, ∂L/∂b1, ∂L/∂W2, ∂L/∂b2)。
参数更新(梯度下降)
利用计算出的梯度,使用优化算法(如随机梯度下降SGD)更新参数:
W = W - η * ∂L/∂W
b = b - η * ∂L/∂b
η 是学习率,控制每次更新的步长。
更新后,网络在新的参数下,预测误差(损失)有望减小。
关键点总结与图示
graph LR
A[输入 x] --> B[前向传播<br>计算预测 y_pred 和 损失 L]
B --> C{反向传播<br>核心:链式法则}
C --> D[1. 计算输出层梯度 δ2]
D --> E[2. 计算 W2/b2 的梯度]
D --> F[3. 误差传至隐藏层, 计算 δ1]
F --> G[4. 计算 W1/b1 的梯度]
E & G --> H[参数更新<br>W = W - η * ∂L/∂W]
H --> I[重复迭代<br>直到模型收敛]
- 计算图与链式法则:反向传播可以看作在由计算操作(加法、乘法、激活函数)构成的图上,应用链式法则进行求导。
- 本地性:每个神经元或层在反向传播时,只需要来自后一层(更靠近输出层)的“误差项”
δ和其在前向传播时自己存储的中间变量(如a1,z1),就能计算自己的梯度并向前传递误差,这使得算法非常模块化和高效。 - 重用前向传播结果:反向传播中大量使用前向传播计算并保存的中间值(如
a1,z1),避免了重复计算。 - 梯度下降的引擎:反向传播本身只计算梯度,不更新参数,它是梯度下降优化算法的“引擎”,为其提供方向指导。
一个生动的比喻
把神经网络想象成一个复杂的多层流水线,最终产品(预测)有一个质量检测得分(损失函数值)。
- 前向传播:是生产流程,原材料(输入数据)经过每一道工序(网络层)的处理,最终产出产品。
- 反向传播:是质量问题溯源,质检员(损失函数)发现产品不合格(误差大),他并不直接知道第一道工序哪里出了问题,而是:
- 先检查最后一道工序(输出层)的问题和责任(
δ2)。 - 然后问最后一道工序:“你的问题,有多少是上一道工序(隐藏层)送给你的半成品造成的?”(计算
∂L/∂a1)。 - 接着去问责上一道工序,根据它接收的原料和加工记录,确定它的责任(
δ1)。 - 如此层层回溯,直到找到第一道工序(输入层)的责任。
- 先检查最后一道工序(输出层)的问题和责任(
- 参数更新:根据每道工序的责任大小(梯度),调整该工序的机器设置(权重),使下次生产时质量更好。
希望这个解释能帮助你透彻地理解反向传播的精髓!