共计 1484 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
反向传播(Backpropagation, BP)算法是深度学习模型训练的核心,它通过计算损失函数对网络参数的梯度,指导参数更新以最小化误差。然而在实际训练中,梯度消失(Gradient Vanishing)和梯度爆炸(Gradient Explosion)问题常导致模型难以收敛。例如在深层网络中,梯度通过链式法则逐层传递时,若权重初始化不当或激活函数选择不佳,梯度值可能指数级缩小或膨胀。

技术选型对比
- SGD(随机梯度下降):基础优化器,计算简单但容易陷入局部最优,需手动调整学习率。
- Momentum:引入动量项加速收敛,缓解震荡。
- Adam:结合动量与自适应学习率,适合稀疏梯度场景。
实验表明,Adam 在多数任务中表现稳定,但 SGD 配合学习率调度可能获得更优泛化性能。
核心实现细节
反向传播数学推导
以单隐藏层网络为例,设损失函数为 L,隐藏层激活函数为 σ,则:
- 输出层梯度:
$$\frac{\partial L}{\partial W_2} = (y – \hat{y}) \cdot \sigma'(z_2) \cdot h^T$$ - 隐藏层梯度:
$$\frac{\partial L}{\partial W_1} = (W_2^T \cdot \delta_2) \odot \sigma'(z_1) \cdot x^T$$
计算流程图解
graph LR
A[输入 x] --> B[隐藏层 h =σ(W1x+b1)]
B --> C[输出 ŷ=σ(W2h+b2)]
C --> D[计算损失 L(y, ŷ)]
D -->| 反向传播 | C
C -->|δ2=∂L/∂ŷ| B
B -->|δ1=W2ᵀδ2⊙σ'(z1)| A
代码示例(PyTorch)
import torch
import torch.nn as nn
class MLP(nn.Module):
def __init__(self, input_dim=784, hidden_dim=128):
super().__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.fc2 = nn.Linear(hidden_dim, 10)
self.relu = nn.ReLU()
def forward(self, x):
h = self.relu(self.fc1(x))
return self.fc2(h)
# 训练循环关键片段
model = MLP()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters())
for x, y in dataloader:
optimizer.zero_grad()
output = model(x)
loss = criterion(output, y)
loss.backward() # 自动反向传播
optimizer.step()
性能与安全优化
- 权重初始化 :
- 使用 Xavier 初始化保持各层方差一致
-
对 ReLU 网络采用 He 初始化
-
梯度裁剪 :
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) -
正则化 :
- L2 正则化防止过拟合
- Dropout 层增强鲁棒性
避坑指南
- 激活函数选择 :深层网络避免使用 Sigmoid,优先选用 ReLU 变体(如 LeakyReLU)
- 批量归一化 :在隐藏层后添加 BN 层可加速收敛
- 学习率监控 :使用 LR Finder 确定合理初始学习率
思考与实践
尝试实现一个 5 层全连接网络,比较以下两种情况的训练效果:
1. 使用标准 SGD 优化器
2. 结合 Adam 优化器与梯度裁剪
欢迎在评论区分享你的实验 loss 曲线和准确率对比!
正文完
