共计 2190 个字符,预计需要花费 6 分钟才能阅读完成。
神经网络基础与 BP 算法原理
反向传播(Backpropagation, BP)是神经网络训练的基石算法。要理解 BP,我们需要先明确几个基本概念:

- 前向传播:输入数据通过网络层层计算,最终得到预测输出
- 损失函数:衡量预测值与真实值的差距(如交叉熵、均方误差)
- 梯度下降:通过计算损失函数对参数的梯度,沿负梯度方向更新参数
BP 算法的核心数学工具是 链式求导法则。以三层网络为例:
-
前向传播计算:
$$z^{(2)} = W^{(1)}x + b^{(1)}$$
$$a^{(2)} = \sigma(z^{(2)})$$
$$z^{(3)} = W^{(2)}a^{(2)} + b^{(2)}$$
$$\hat{y} = \text{softmax}(z^{(3)})$$ -
反向传播时,先计算输出层误差:
$$\delta^{(3)} = \hat{y} – y$$
然后逐层回传:
$$\delta^{(2)} = (W^{(2)})^T\delta^{(3)} \odot \sigma'(z^{(2)})$$
最后更新参数:
$$\frac{\partial L}{\partial W^{(1)}} = \delta^{(2)}x^T$$
$$\frac{\partial L}{\partial b^{(1)}} = \delta^{(2)}$$
图像处理中的特殊挑战
当 BP 算法应用于图像识别时,会遇到几个典型问题:
-
高维输入:一张 224×224 的 RGB 图像就有 150,528 个输入维度,直接全连接会导致参数量爆炸
-
局部特征提取:传统全连接网络难以捕捉图像的局部特征(如边缘、纹理)
-
梯度消失:深层网络中梯度连乘可能变得极小,导致底层参数更新缓慢
解决方案包括:
- 使用卷积神经网络(CNN)替代全连接网络
- 引入 ReLU 激活函数缓解梯度消失
- 采用批归一化(BatchNorm)加速训练
PyTorch 实现与可视化
以下是使用 PyTorch 实现 BP 算法的完整示例:
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
class SimpleNN(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
# 超参数设置
input_size = 784 # 28x28
hidden_size = 500
num_classes = 10
learning_rate = 0.001
# 初始化模型
model = SimpleNN(input_size, hidden_size, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# 训练循环
loss_history = []
for epoch in range(5):
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images.view(-1, 28*28))
loss = criterion(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_history.append(loss.item())
# 绘制损失曲线
plt.plot(loss_history)
plt.title('Training Loss')
plt.xlabel('Iterations')
plt.ylabel('Loss')
plt.show()
MNIST 实战案例
我们使用经典 MNIST 数据集验证 BP 算法效果:
- 数据预处理:
- 归一化像素值到[0,1]
-
将图像展平为 784 维向量
-
网络结构:
- 输入层:784 个神经元
- 隐藏层:500 个 ReLU 神经元
-
输出层:10 个神经元(Softmax)
-
训练结果:
- 5 个 epoch 后测试准确率达到 97.3%
- 损失曲线平滑下降,显示 BP 有效
优化技巧与问题解决
常见优化方法
- 学习率调整:
- 初始使用较大学习率(如 0.01),后期逐步降低
-
采用学习率调度器(如 StepLR)
-
权重初始化:
-
使用 Xavier 或 He 初始化避免梯度消失 / 爆炸
-
批量归一化:
- 在隐藏层后添加 BN 层加速收敛
典型问题排查
- 梯度消失:
- 检查激活函数选择(推荐 ReLU)
-
验证初始化方法
-
过拟合:
- 添加 Dropout 层(如 p =0.5)
-
使用 L2 正则化
-
训练震荡:
- 减小学习率
- 增大 batch size
延伸思考
- 如何将当前全连接网络改进为 CNN 结构?
- 尝试在 CIFAR-10 数据集上应用 BP 算法
- 实现动态学习率调整策略(如 CosineAnnealing)
- 比较 SGD、Adam 等优化器的效果差异
BP 算法虽然基础,但深入理解其原理对掌握深度学习至关重要。建议读者动手实现不同变种,在实践中深化理解。
