进阶← 返回知识库
反向传播(Backpropagation)
从损失出发沿计算图逆行,用链式法则把路径上的偏导数逐段相乘,算出每个权重的梯度。路径上有 ReLU 关闭的节点时,梯度信号被截断为零。对应代码中的 loss.backward()。
核心公式
📖 符号说明
| 符号 | 含义 | 说明 |
|---|---|---|
| 损失值 | 交叉熵或其他损失函数的输出 | |
| 目标权重 | 要计算梯度的参数 | |
| 第k层加权求和 | 激活函数的输入 | |
| 起点信号 | 交叉熵配Sigmoid时的输出层梯度 |
🔢 分步计算
- 1
从损失到输出层的梯度(交叉熵+Sigmoid的简洁结果)
- 2
沿路径把每条箭头的偏导数乘起来,ReLU关闭的节点导数为0,截断整条路径
一句话版本
从损失出发,沿计算图的箭头反方向走,用链式法则把偏导数逐段相乘,算出每个权重的梯度。
核心操作
反向传播做的事只有一件:把"损失信号"从输出层逐层传回输入层。
在计算图中,从损失 L 到某个权重 w 有一条路径。沿这条路径,每条箭头对应一个偏导数。链式法则说:把路径上所有偏导数逐段相乘,就得到 L 对 w 的梯度。
∂w∂L=∂zn∂L×∂zn−1∂zn×⋯×∂w∂z1具体例子
在一个 2-2-1 网络中,权重 w11 的梯度链路为 L←z3←h1←z1←w11,四个因子逐段相乘:
- 起点信号 ∂z3∂L=p−y(交叉熵配 Sigmoid 的简洁结果)
- ∂h1∂z3=w3(权重值)
- ∂z1∂h1(ReLU 导数:正数通过=1,负数截断=0)
- ∂w11∂z1=x1(对应的输入值)
如果路径上某个 ReLU 导数为 0(隐藏节点被关闭),后面所有因子都被清零——那条路封了,梯度信号传不回去。
中间结果复用
不同权重的梯度链路往往共享前缀。比如 w11 和 w12 共享从 L 到 z1 的全部因子,只有最后一步不同(乘 x1 还是 x2)。共享的中间结果只算一次,这就是反向传播高效的原因——本质上是动态规划。
代码中的反向传播
在 PyTorch 中,loss.backward() 自动完成上述全部计算,每个参数的梯度存入 .grad 属性,随后优化器用梯度更新参数。