共计 1756 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要反向传播?
在神经网络训练过程中,我们需要调整网络参数(权重和偏置)使得预测结果尽可能接近真实值。反向传播(Backpropagation)正是计算这些参数梯度的高效算法,它通过链式法则将误差从输出层逐层传递回输入层,指导参数更新。

数学原理:链式法则的应用
-
前向传播计算
假设网络有 L 层,第 l 层的输出为:a^l = σ(z^l) = σ(W^l a^{l-1} + b^l)其中 σ 是激活函数,W 和 b 是权重矩阵和偏置向量。
-
损失函数定义
以均方误差为例:L = 1/2 ||y - a^L||^2 -
反向传播四步曲
- 计算输出层误差:δ^L = ∇_a L ⊙ σ'(z^L)
- 反向传播误差:δ^l = (W^{l+1}^T δ^{l+1}) ⊙ σ'(z^l)
- 计算梯度:∇_W L = δ^l (a^{l-1})^T, ∇_b L = δ^l
- 参数更新:W = W – η∇_W L
Python 实现完整示例
import numpy as np
class NeuralNetwork:
def __init__(self, layers):
# 初始化权重和偏置
self.weights = [np.random.randn(y, x) * 0.1
for x, y in zip(layers[:-1], layers[1:])]
self.biases = [np.zeros((y, 1)) for y in layers[1:]]
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def forward(self, x):
# 前向传播计算
a = x
for w, b in zip(self.weights, self.biases):
z = np.dot(w, a) + b
a = self.sigmoid(z)
return a
def train(self, X, y, epochs=1000, lr=0.1):
for _ in range(epochs):
# 随机选择一个样本
i = np.random.randint(len(X))
x, target = X[i], y[i]
# 前向传播(保存中间结果)activations = [x]
zs = []
for w, b in zip(self.weights, self.biases):
z = np.dot(w, activations[-1]) + b
a = self.sigmoid(z)
zs.append(z)
activations.append(a)
# 反向传播
delta = (activations[-1] - target) * activations[-1] * (1 - activations[-1])
# 更新最后一层参数
self.weights[-1] -= lr * np.dot(delta, activations[-2].T)
self.biases[-1] -= lr * delta
# 逐层反向传播
for l in range(2, len(self.weights)+1):
z = zs[-l]
sp = activations[-l] * (1 - activations[-l])
delta = np.dot(self.weights[-l+1].T, delta) * sp
self.weights[-l] -= lr * np.dot(delta, activations[-l-1].T)
self.biases[-l] -= lr * delta
梯度消失与爆炸问题
- 成因分析
- 梯度消失:深层网络中,小梯度的连乘导致前面层参数几乎不更新
-
梯度爆炸:大梯度的连乘导致数值溢出
-
解决方案
- 使用 ReLU 等改进的激活函数
- 权重初始化技巧(如 Xavier 初始化)
- 梯度裁剪(Gradient Clipping)
- 残差连接(ResNet)
超参数调优实践
- 学习率选择
- 太大:震荡无法收敛
- 太小:训练过慢
-
建议:从 0.01 开始尝试,使用学习率衰减策略
-
批量大小影响
- 大批量:训练稳定但需要更多内存
- 小批量:噪声有助于跳出局部最优
- 常见选择:32/64/128
训练调试技巧
- 监控指标
- 绘制损失函数曲线
-
定期验证集测试
-
早期停止
当验证集误差开始上升时停止训练 -
正则化方法
- L2 正则化
- Dropout
动手实验建议
- 在 MNIST 数据集上测试网络性能
- 尝试不同网络深度对梯度消失的影响
- 比较 Sigmoid 和 ReLU 的表现差异
- 实现学习率动态调整策略
通过理解反向传播的核心机制并实践这些技巧,你将能够更高效地训练神经网络模型。建议从简单网络开始,逐步增加复杂度,观察不同超参数对训练过程的影响。
正文完
