反向传播(Backpropagation)

从损失出发沿计算图逆行,用链式法则把路径上的偏导数逐段相乘,算出每个权重的梯度。路径上有 ReLU 关闭的节点时,梯度信号被截断为零。对应代码中的 loss.backward()。

核心公式

📖 符号说明

符号含义说明
损失值交叉熵或其他损失函数的输出
目标权重要计算梯度的参数
第k层加权求和激活函数的输入
起点信号交叉熵配Sigmoid时的输出层梯度

🔢 分步计算

  1. 1

    从损失到输出层的梯度(交叉熵+Sigmoid的简洁结果)

  2. 2

    沿路径把每条箭头的偏导数乘起来,ReLU关闭的节点导数为0,截断整条路径

一句话版本

从损失出发,沿计算图的箭头反方向走,用链式法则把偏导数逐段相乘,算出每个权重的梯度。

核心操作

反向传播做的事只有一件:把"损失信号"从输出层逐层传回输入层。

在计算图中,从损失 LLL 到某个权重 www 有一条路径。沿这条路径,每条箭头对应一个偏导数。链式法则说:把路径上所有偏导数逐段相乘,就得到 LLLwww 的梯度。

Lw=Lzn×znzn1××z1w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial z_n} \times \frac{\partial z_n}{\partial z_{n-1}} \times \cdots \times \frac{\partial z_1}{\partial w}wL=znL×zn1zn××wz1

具体例子

在一个 2-2-1 网络中,权重 w11w_{11}w11 的梯度链路为 Lz3h1z1w11L \leftarrow z_3 \leftarrow h_1 \leftarrow z_1 \leftarrow w_{11}Lz3h1z1w11,四个因子逐段相乘:

  1. 起点信号 Lz3=py\frac{\partial L}{\partial z_3} = p - yz3L=py(交叉熵配 Sigmoid 的简洁结果)
  2. z3h1=w3\frac{\partial z_3}{\partial h_1} = w_3h1z3=w3(权重值)
  3. h1z1\frac{\partial h_1}{\partial z_1}z1h1(ReLU 导数:正数通过=1,负数截断=0)
  4. z1w11=x1\frac{\partial z_1}{\partial w_{11}} = x_1w11z1=x1(对应的输入值)

如果路径上某个 ReLU 导数为 0(隐藏节点被关闭),后面所有因子都被清零——那条路封了,梯度信号传不回去

中间结果复用

不同权重的梯度链路往往共享前缀。比如 w11w_{11}w11w12w_{12}w12 共享从 LLLz1z_1z1 的全部因子,只有最后一步不同(乘 x1x_1x1 还是 x2x_2x2)。共享的中间结果只算一次,这就是反向传播高效的原因——本质上是动态规划。

代码中的反向传播

在 PyTorch 中,loss.backward() 自动完成上述全部计算,每个参数的梯度存入 .grad 属性,随后优化器用梯度更新参数。