共计 2037 个字符,预计需要花费 6 分钟才能阅读完成。
1. BP 神经网络基础
BP(Back Propagation)神经网络是最经典的监督学习算法之一,其核心是通过前向传播计算输出,再通过反向传播调整权重。一个典型的三层网络包括:

- 输入层 :接收原始特征向量
- 隐含层 :进行非线性变换(常用 Sigmoid/Tanh/ReLU)
- 输出层 :产生最终预测结果
反向传播的核心思想是:
1. 计算预测输出与真实标签的误差
2. 将误差从输出层向输入层反向传递
3. 根据误差调整各层权重
2. 数学推导(链式法则)
2.1 前向传播公式
对于第 $l$ 层的第 $j$ 个神经元:
$$
z_j^{(l)} = \sum_{i} w_{ji}^{(l)}a_i^{(l-1)} + b_j^{(l)}
$$
$$
a_j^{(l)} = \sigma(z_j^{(l)})
$$
2.2 误差反向传播
定义损失函数 $L$(如 MSE),则输出层误差:
$$
\delta_j^{(L)} = \frac{\partial L}{\partial a_j^{(L)}} \sigma'(z_j^{(L)})
$$
隐含层误差(链式法则):
$$
\delta_j^{(l)} = \left(\sum_{k} w_{kj}^{(l+1)}\delta_k^{(l+1)} \right) \sigma'(z_j^{(l)})
$$
2.3 权重更新
学习率 $\eta$ 下的权重更新:
$$
w_{ji}^{(l)} \leftarrow w_{ji}^{(l)} – \eta \delta_j^{(l)}a_i^{(l-1)}
$$
3. Python 实现(NumPy 版)
import numpy as np
class BPNetwork:
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):
for w, b in zip(self.weights, self.biases):
x = self.sigmoid(np.dot(w, x) + b)
return x
def train(self, X, y, epochs=1000, lr=0.1):
for _ in range(epochs):
# 前向传播
activations = [X]
zs = []
for w, b in zip(self.weights, self.biases):
z = np.dot(w, activations[-1]) + b
zs.append(z)
activations.append(self.sigmoid(z))
# 反向传播
delta = (activations[-1] - y) * activations[-1] * (1 - activations[-1])
nabla_w = [np.zeros_like(w) for w in self.weights]
nabla_b = [np.zeros_like(b) for b in self.biases]
nabla_w[-1] = np.dot(delta, activations[-2].T)
nabla_b[-1] = delta
for l in range(2, len(self.weights)+1):
delta = np.dot(self.weights[-l+1].T, delta) * \
activations[-l] * (1 - activations[-l])
nabla_w[-l] = np.dot(delta, activations[-l-1].T)
nabla_b[-l] = delta
# 更新参数
self.weights = [w - lr*nw for w, nw in zip(self.weights, nabla_w)]
self.biases = [b - lr*nb for b, nb in zip(self.biases, nabla_b)]
4. 常见问题与解决方案
4.1 梯度消失
现象 :深层网络早期层梯度接近 0
解决方案 :
– 使用 ReLU 及其变体(LeakyReLU)
– 残差连接(ResNet)
– 梯度裁剪
4.2 训练不稳定
优化方法 :
– 批量归一化(BatchNorm)
– 自适应优化器(Adam/RMSProp)
– 学习率衰减
5. 性能优化技巧
- 学习率策略 :
- 初始值建议 0.001-0.1
-
使用学习率调度器(如 ReduceLROnPlateau)
-
权重初始化 :
- He 初始化(配合 ReLU)
-
Xavier 初始化(配合 Sigmoid)
-
正则化 :
- L2 正则化(权重衰减)
- Dropout
6. 最佳实践
- 数据预处理:标准化到均值为 0,方差为 1
- 监控训练过程:绘制 loss/accuracy 曲线
- 早停法(Early Stopping)防止过拟合
思考题
- 如何证明反向传播的梯度计算是正确的?
- 当遇到验证集性能波动时,可能有哪些原因?
- 对比 SGD、Momentum、Adam 在不同场景下的表现差异
