3Blue1Brown - Backpropagation
可视化理解反向传播
一句话定义:反向传播是一种高效计算梯度的算法。它利用链式法则 (Chain Rule),从输出层开始,一层层往回推导,算出每个参数对总误差的”贡献”(即梯度)。
如果说梯度下降是下山的动作,那么反向传播就是告诉你在当前位置,往哪个方向走才是下坡的地图。
想象一条很长的生产线(神经网络),有 10 道工序(层),每道工序都有一个工人(参数)。 最终产品出来后,发现质量不合格(Loss 很大)。
这样,每个人(参数)都知道了自己该负多少责任(梯度),下次生产时就根据这个责任进行调整(更新参数)。
理解链式法则是反向传播的数学基础。
💡 反向传播就是对整个神经网络应用链式法则,从输出层逐层传递梯度
观察梯度如何从输出层流向输入层,以及参数如何更新。
💡 点击"梯度下降"观察 w, b 如何更新以减小损失 | 公式: w ← w - α × ∂L/∂w
核心是链式法则 (Chain Rule)。
假设简单的网络:,即 。 误差 。
我们需要求 对 的影响():
我们将导数分解为连乘:
在深层网络中,这个链条会很长,但原理不变:前一层的梯度 = 后一层的梯度 当前层的导数。
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 * hy = w2 * (w1 * x)
# 计算 Loss (假设目标是 10)loss = (y - 10)**2
# 反向传播 (魔法发生的地方)loss.backward()
print(f"y: {y.item()}") # 6.0print(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 = -16print(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 = -24print(f"w1 的梯度: {w1.grad.item()}") # 输出: -24.0