共计 1306 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍:前向传播的局限性
在 1986 年反向传播算法提出之前,神经网络主要依赖前向传播进行预测,但缺乏有效的参数更新机制。传统方法如随机搜索或有限差分法存在明显缺陷:

- 计算成本高:每调整一个参数需重新计算整个网络输出
- 维度灾难:参数增多时搜索空间呈指数级增长
- 局部最优陷阱:无法保证找到全局最优解
论文精要:反向传播的数学原理
反向传播的核心是通过链式法则逐层计算损失函数对参数的梯度。以单隐层网络为例:
- 定义损失函数 $L = \frac{1}{2}(y – \hat{y})^2$
- 输出层梯度计算:$\frac{\partial L}{\partial w_2} = (\hat{y} – y)\sigma'(z_2)h_1$
- 隐藏层梯度计算:$\frac{\partial L}{\partial w_1} = (\hat{y} – y)\sigma'(z_2)w_2 \cdot \sigma'(z_1)x$
其中 $\sigma$ 为激活函数,$z$ 为加权输入,$h$ 为隐藏层输出。
PyTorch 实现示例
import torch
import torch.nn as nn
# 定义网络结构
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(784, 128) # 输入层到隐藏层
self.fc2 = nn.Linear(128, 10) # 隐藏层到输出层
def forward(self, x):
x = torch.sigmoid(self.fc1(x)) # 激活函数
return self.fc2(x)
# 初始化网络和优化器
model = Net()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
# 训练循环
for epoch in range(10):
for data, target in dataloader:
optimizer.zero_grad()
output = model(data.view(-1, 784))
loss = criterion(output, target)
loss.backward() # 自动反向传播
optimizer.step() # 参数更新
常见问题:梯度消失 / 爆炸
-
梯度消失 :深层网络中连续小梯度相乘导致底层参数几乎不更新
解决方案 :使用 ReLU 等非饱和激活函数 -
梯度爆炸 :梯度值指数级增长导致数值不稳定
解决方案 :梯度裁剪 (Gradient Clipping)
现代优化技术
- Batch Normalization:标准化层输入缓解内部协变量偏移
- Residual Connection:通过跳转连接解决梯度消失问题
- 自适应优化器 :Adam、RMSProp 等自动调整学习率
实践建议
- 调试技巧:
- 先在小数据集上过拟合验证模型容量
-
可视化梯度直方图检查分布
-
参数初始化:
-
使用 Xavier/Glorot 初始化保持方差一致
-
学习率策略:
- 配合学习率衰减或 warmup
建议读者在 MNIST 数据集上实践完整流程,观察不同超参数对训练过程的影响。通过修改网络深度、激活函数等配置,直观感受反向传播的行为特性。
正文完
发表至: 未分类
近两天内
