跳转到主要内容
杨月昌的软件博客
返回

深度直击:后向传播算法(Backpropagation)全解析

引言

后向传播算法(Backpropagation,简称 BP)是深度神经网络能够高效训练的关键。自1986年 Rumelhart 等人的经典论文以来,它已成为深度学习事实上的标准训练方法。

BP 的本质是通过链式法则(chain rule)高效计算损失函数对网络中每一个可训练参数的偏导数(梯度),从而支持任意深度的梯度下降优化。

即使到了2026年,尽管出现了 Forward-Forward、NoProp、Predictive Coding、Equilibrium Propagation 等不依赖传统 BP 的探索性方法,绝大多数实际工业级模型(包括大语言模型、视觉基础模型、生成模型等)仍然依赖自动微分 + BP 的组合。理解 BP 仍是深入掌握深度学习不可或缺的一环。


1. 前向传播与损失计算(回顾)

给定输入 $\mathbf{x}$,网络通过多层变换得到预测 $\hat{\mathbf{y}}$:

$$ \mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}, \quad \mathbf{a}^{(l)} = \sigma(\mathbf{z}^{(l)}) $$

最终损失(以均方误差为例):

$$ \mathcal{L} = \frac{1}{2} |\hat{\mathbf{y}} - \mathbf{y}|^2 $$

(分类任务通常使用交叉熵损失)


2. 后向传播数学核心:链式法则的高效应用

BP 的天才之处在于从输出层向输入层递归地计算误差项(error term 或 sensitivity),避免了显式计算所有中间复合导数。

2.1 输出层误差项 δ

对于第 $L$ 层(输出层),误差项定义为:

$$ \delta^{(L)} = \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{(L)}} = (\hat{\mathbf{y}} - \mathbf{y}) \odot \sigma’(\mathbf{z}^{(L)}) $$

(⊙ 表示逐元素相乘;对于 MSE + identity 激活则简化为 $\hat{\mathbf{y}} - \mathbf{y}$)

2.2 隐藏层误差项的递归传递

对于任意隐藏层 $l$(从后向前):

$$ \delta^{(l)} = \left( (\mathbf{W}^{(l+1)})^\top \delta^{(l+1)} \right) \odot \sigma’(\mathbf{z}^{(l)}) $$

这正是链式法则的体现:当前层的误差 = 下一层误差通过权重“反向投影”后,再乘以本层激活函数的导数。

2.3 参数梯度计算

一旦有了 δ,就可以非常高效地计算权重和偏置的梯度:

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} = \delta^{(l)} (\mathbf{a}^{(l-1)})^\top $$

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(l)}} = \delta^{(l)} $$

然后使用任意优化器(SGD、Adam、AdamW、Lion 等)更新:

$$ \mathbf{W}^{(l)} \leftarrow \mathbf{W}^{(l)} - \eta \frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} $$


3. 现代框架中的自动实现(PyTorch 示例)

现代框架(如 PyTorch、JAX、TensorFlow)通过计算图 + 自动微分(autograd)自动完成上述过程。

import torch
import torch.nn as nn

# 简单两层 MLP 示例
model = nn.Sequential(
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Linear(256, 10)
)

optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)
criterion = nn.CrossEntropyLoss()

# 训练一步
def train_step(images, labels):
    optimizer.zero_grad()
    logits = model(images)                # 前向
    loss = criterion(logits, labels)      # 损失
    loss.backward()                       # 自动后向传播(BP)
    optimizer.step()                      # 更新
    return loss.item()

关键点loss.backward() 这一行就完成了完整的链式求导 + 梯度累加。


4. BP 在深度网络中的经典痛点与2026年解决方案

问题核心原因现代主流解决方案(2025–2026)
梯度消失深层网络 + sigmoid/tanh → 导数 <1 连乘 → →0ReLU / GELU / SwiGLU / Mish 等非饱和激活函数
残差连接(ResNet)、LayerNorm、Skip connections
梯度爆炸权重初始化不当或深层累积梯度裁剪(gradient clipping by norm/value)
Xavier/He/Kaiming 初始化
梯度中心化技术(某些优化器内置)
计算内存开销大保存所有中间激活用于 backwardActivation checkpointing / Gradient checkpointing
混合精度训练(bf16 / fp16)
FlashAttention-2 等内核优化
生物学不合理需要全局误差反传,不符合局部学习仍在活跃研究:Forward-Forward、Predictive Coding、Equilibrium Propagation、NoProp 等
但尚未大规模取代 BP

2026 年工业共识


5. 总结与进阶方向

后向传播算法是深度学习能够规模化训练多层网络的基石。它将复杂的链式求导问题转化为高效的递归计算,为后续所有优化算法提供了梯度基础。

2026 年建议的学习路径

  1. 彻底理解链式法则在多层网络中的递归展开(动手推导 3–4 层网络的 δ 计算)
  2. 掌握 PyTorch / JAX 中的 backward()grad 机制
  3. 能够自己实现一次简易的从零 BP(不依赖框架)
  4. 了解梯度问题的主要解决方案与现代架构设计思想
  5. 关注不依赖 BP 的前沿探索(如 Forward-Forward、NoProp、生物启发学习),但不必急于在生产中使用

掌握 BP,你就真正打开了深度学习“从黑箱到可微分编程”的大门。



上一篇
WPF 进阶:使用 XmlDocument 实现 XML 文件的深度读写
下一篇
WPF 实战:构建企业级全局异常捕获与 log4net 日志监控系统