共计 1636 个字符,预计需要花费 5 分钟才能阅读完成。
数学基础铺垫
反向传播(Backpropagation)是训练神经网络的核心算法,理解它需要掌握两个关键数学概念:

- 偏导数 :衡量函数在某一变量方向上的变化率。例如对于函数 $f(x,y)=x^2+y^3$,$\frac{\partial f}{\partial x}=2x$ 表示当 y 固定时,x 变化对 f 的影响程度。
- 链式法则 :复合函数求导的规则。若 $z=f(g(x))$,则 $\frac{dz}{dx}=\frac{dz}{dg}\cdot\frac{dg}{dx}$。这个法则正是反向传播能够逐层计算误差的数学基础。
反向传播算法分步拆解
以一个简单的 3 层网络(输入层→隐藏层→输出层)为例:
- 前向传播 :
- 输入数据 $X$ 经过权重 $W_1$ 计算隐藏层输出:$H=\sigma(XW_1+b_1)$
-
隐藏层结果经过 $W_2$ 计算最终输出:$\hat{Y}=\sigma(HW_2+b_2)$
-
损失计算 :
使用交叉熵损失函数:$L=-\frac{1}{N}\sum_{i=1}^N y_i\log(\hat{y}_i)$ -
反向传播关键步骤 (代码实现见下文):
- 计算输出层梯度:$\frac{\partial L}{\partial W_2}=H^T(\hat{Y}-Y)$
- 计算隐藏层梯度:$\frac{\partial L}{\partial W_1}=X^T[(\hat{Y}-Y)W_2^T \odot \sigma'(H)]$
- 更新参数:$W \leftarrow W – \eta \frac{\partial L}{\partial W}$
激活函数对比实验
# PyTorch 实现示例
import torch
import torch.nn as nn
# Sigmoid 激活的反向传播
def backward_sigmoid():
x = torch.randn(3, requires_grad=True)
y = torch.sigmoid(x).sum()
y.backward() # 自动计算梯度
# ReLU 激活的反向传播
def backward_relu():
x = torch.randn(3, requires_grad=True)
y = torch.relu(x).sum()
y.backward()
实际训练中发现:
– Sigmoid 在深层网络中容易出现梯度消失(导数最大仅 0.25)
– ReLU 虽然缓解了梯度消失,但存在 ”Dead ReLU” 问题(负值区域梯度为 0)
MNIST 实战案例
完整代码包含以下关键部分:
- 数据加载与预处理
- 网络结构定义(含反向传播自动求导)
- 训练循环实现
- 梯度监控模块
# 关键训练代码片段
model = nn.Sequential(nn.Linear(784, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(10):
for X, y in train_loader:
optimizer.zero_grad()
output = model(X.view(-1, 784))
loss = F.cross_entropy(output, y)
loss.backward() # 反向传播自动执行
optimizer.step()
梯度问题解决方案
针对梯度消失 / 爆炸的实用技巧:
- 权重初始化 :
- Xavier 初始化(适合 Sigmoid/Tanh)
-
He 初始化(适合 ReLU 系函数)
-
归一化技术 :
- Batch Normalization
-
Layer Normalization
-
架构改进 :
- 使用 ResNet 的跳跃连接
- LSTM/GRU 的门控机制
思考与改进方向
试着思考以下问题:
1. 如何通过动量(Momentum)加速梯度下降?
2. 自适应学习率算法(如 Adam)如何改进基础反向传播?
3. 二阶优化方法(如 Hessian 矩阵)为什么在实际中较少使用?
理解反向传播只是起点,现代深度学习框架已经帮我们自动完成了这些计算。但掌握其原理,才能更好地调试模型和解决实际问题。
正文完
