Skip to content

反向传播 (Backpropagation)

一句话定义:反向传播是一种高效计算梯度的算法。它利用链式法则 (Chain Rule),从输出层开始,一层层往回推导,算出每个参数对总误差的”贡献”(即梯度)。

如果说梯度下降是下山的动作,那么反向传播就是告诉你在当前位置,往哪个方向走才是下坡的地图。


想象一条很长的生产线(神经网络),有 10 道工序(层),每道工序都有一个工人(参数)。 最终产品出来后,发现质量不合格(Loss 很大)。

  1. 前向传播 (Forward): 原材料经过工序 1 -> 2 -> … -> 10,变成产品。
  2. 计算误差: 发现产品瑕疵。
  3. 反向传播 (Backward):
    • 质检员先找第 10 道工序的工人:“是你没弄好,你的责任是 0.5。”
    • 第 10 道工序工人说:“因为第 9 道给我的半成品就有问题,他的责任是 0.3。”
    • 第 9 道怪第 8 道…
    • 一直推回到第 1 道工序。

这样,每个人(参数)都知道了自己该负多少责任(梯度),下次生产时就根据这个责任进行调整(更新参数)。



⛓️ 交互演示:链式法则 (Interactive)

Section titled “⛓️ 交互演示:链式法则 (Interactive)”

理解链式法则是反向传播的数学基础。

⛓️ 链式法则可视化

x = 1.00g(x)u = 0.841f(u)y = 0.708
内层函数
u = g(x) = sin(x)
g'(x) = cos(x)
du/dx = 0.5403
外层函数
f(u) = u²
f'(u) = 2u
dy/du = 1.6829
链式法则
dy/dx = dy/du × du/dx
dy/dx = 0.9093
dy/dx = 1.683 × 0.540 = 0.9093

💡 反向传播就是对整个神经网络应用链式法则,从输出层逐层传递梯度


🔙 交互演示:反向传播 (Interactive)

Section titled “🔙 交互演示:反向传播 (Interactive)”

观察梯度如何从输出层流向输入层,以及参数如何更新。

🔙 反向传播 (Backpropagation)

前向传播 →
输入
x = 1.00
线性
z = wx + b
0.600
激活 σ
a = σ(z)
0.6457
损失
L = (a-y)²
0.0238
← 反向传播 (梯度流)
∂L/∂a
-0.3087
∂a/∂z = σ'(z)
0.2288
∂L/∂z
-0.0706
∂z/∂w = x
1.00
权重梯度
∂L/∂w = ∂L/∂z × x
-0.0706
偏置梯度
∂L/∂b = ∂L/∂z × 1
-0.0706

💡 点击"梯度下降"观察 w, b 如何更新以减小损失 | 公式: w ← w - α × ∂L/∂w


核心是链式法则 (Chain Rule)

假设简单的网络:xw1hw2yx \xrightarrow{w_1} h \xrightarrow{w_2} y,即 y=w2(w1x)y = w_2(w_1 x)。 误差 L=(ytarget)2L = (y - target)^2

我们需要求 w1w_1LL 的影响(Lw1\frac{\partial L}{\partial w_1}):

链式法则
Lw1=Lyyhhw1\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial h} \cdot \frac{\partial h}{\partial w_1}

我们将导数分解为连乘:

  • Ly\frac{\partial L}{\partial y}: 误差对输出的敏感度
  • yh\frac{\partial y}{\partial h}: 输出对隐藏层的敏感度 (w2w_2)
  • hw1\frac{\partial h}{\partial w_1}: 隐藏层对权重的敏感度 (xx)

在深层网络中,这个链条会很长,但原理不变:前一层的梯度 = 后一层的梯度 ×\times 当前层的导数


import torch
x = torch.tensor(1.0)
w1 = torch.tensor(2.0, requires_grad=True)
w2 = torch.tensor(3.0, requires_grad=True)
# 前向传播
# h = w1 * x
# y = w2 * h
y = w2 * (w1 * x)
# 计算 Loss (假设目标是 10)
loss = (y - 10)**2
# 反向传播 (魔法发生的地方)
loss.backward()
print(f"y: {y.item()}") # 6.0
print(f"Loss: {loss.item()}") # 16.0
# 查看梯度 (链式法则推导)
# Step 1: dL/dy = d/dy[(y-10)²] = 2(y-10) = 2(6-10) = -8
# Step 2: dy/dw2 = h = w1*x = 2*1 = 2
# Step 3: dL/dw2 = (dL/dy) × (dy/dw2) = -8 × 2 = -16
print(f"w2 的梯度: {w2.grad.item()}") # 输出: -16.0
# Step 2': dy/dw1 = w2*x = 3*1 = 3
# Step 3': dL/dw1 = (dL/dy) × (dy/dw1) = -8 × 3 = -24
print(f"w1 的梯度: {w1.grad.item()}") # 输出: -24.0



3Blue1Brown - Backpropagation

可视化理解反向传播

观看

CS231n Backprop Notes

Stanford 课程反向传播讲义

阅读

Calculus on Computational Graphs

计算图上的微积分

阅读