共计 1406 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
BP(Backpropagation)算法是训练神经网络的核心方法,它通过不断调整网络参数来最小化预测误差。就像教小孩认图卡,我们告诉网络每次猜测的错误程度(损失函数),它就能自己调整 ” 脑回路 ”(权重参数)。理解这个过程是掌握深度学习的钥匙。

核心概念
正向传播:信息的流动
想象信号像水流过管道:
-
加权求和 :每个神经元接收上游信号 $x_i$,用权重 $w_i$ 调节后汇总
$$z = \sum_{i} w_i x_i + b$$ -
激活函数 :通过非线性函数(如 ReLU)产生输出
$$a = \sigma(z)$$
就像给水流加上阀门,控制流量大小
反向传播:错误的修正
发现预测错误后,网络需要知道:
-
损失函数导数 :预测值 $\hat{y}$ 与真实值 $y$ 的差距
$$\frac{\partial L}{\partial \hat{y}}$$ -
链式法则 :从输出层倒推各层责任
$$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w}$$
像查监控录像,找出哪个阀门(权重)没调好
代码实现
import numpy as np
# 定义 ReLU 激活函数
def relu(x):
return np.maximum(0, x)
# 单个样本的前向计算
def forward(x, w1, w2):
z1 = np.dot(w1, x) # 第一层加权和
a1 = relu(z1) # 第一层激活
z2 = np.dot(w2, a1) # 输出层加权和
return z2, a1
# 反向传播计算梯度
def backward(x, y, z2, a1, w2):
error = z2 - y # 输出误差
# 输出层梯度
grad_w2 = error * a1
# 隐藏层梯度(链式法则)grad_w1 = error * w2 * (a1 > 0) * x
return grad_w1, grad_w2
常见问题
梯度消失 / 爆炸
- 原因 :深层网络连续相乘导致梯度指数级变化
- 消失:权重更新几乎停止(如 sigmoid 函数饱和区)
-
爆炸:权重剧烈波动(如初始值过大)
-
解决方案 :
- 使用 ReLU 等非饱和激活函数
- 梯度裁剪(设定阈值)
- 合理的权重初始化(如 Xavier 方法)
学习率设置
- 太大:参数在最优解附近震荡
- 太小:训练速度缓慢
- 经验法则 :
- 初始尝试 0.001-0.1 范围
- 使用学习率衰减策略
可视化原理
输入层 隐藏层 输出层
○ ---w1---> ○ ---w2---> ○
(前向) (前向)
<---δw1---- <---δw2----
(反向) (反向)
最佳实践
参数初始化
- 全零初始化 :导致所有神经元相同(禁用)
- 随机初始化 :推荐 Xavier 方法
w = np.random.randn(n,m) * np.sqrt(2/(n+m))
批量训练技巧
- Mini-batch:平衡效率与稳定性
for batch in dataset: grad = average([backward(x,y) for x,y in batch]) w -= lr * grad
延伸思考
尝试不同激活函数的影响:
1. Sigmoid:观察梯度消失现象
2. LeakyReLU:解决 ” 神经元死亡 ” 问题
3. Swish:Google 提出的新激活函数
总结
理解 BP 算法就像学习骑自行车——开始可能摇摇晃晃(调试参数),一旦掌握平衡(理解梯度流动),就能自由探索深度学习的广阔天地。建议从简单的全连接网络开始实践,逐步挑战更复杂的网络结构。
