共计 2093 个字符,预计需要花费 6 分钟才能阅读完成。
核心概念
BP 神经网络(Backpropagation Neural Network)是一种多层前馈神经网络,其核心思想是通过反向传播算法来优化网络权重。一个典型的 BP 网络包含输入层、隐藏层和输出层,数据从输入层流向输出层(前向传播),误差从输出层反向传播到输入层(反向传播)。反向传播算法通过计算损失函数对权重的梯度,并使用梯度下降法更新权重,从而最小化预测误差。

数学推导
前向传播
给定输入 $x$,隐藏层输出 $h$ 和输出层输出 $y$ 可以表示为:
$$h = \sigma(W_1 x + b_1)$$
$$y = \sigma(W_2 h + b_2)$$
其中 $\sigma$ 是激活函数(如 Sigmoid 或 ReLU),$W_1, W_2$ 是权重矩阵,$b_1, b_2$ 是偏置项。
反向传播
反向传播的核心是链式法则。定义损失函数 $L$(如均方误差):
$$L = \frac{1}{2}(y – t)^2$$
其中 $t$ 是真实标签。我们需要计算 $L$ 对 $W_2$ 和 $W_1$ 的梯度:
- 输出层权重梯度:
$$\frac{\partial L}{\partial W_2} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z_2} \cdot \frac{\partial z_2}{\partial W_2} = (y – t) \cdot \sigma'(z_2) \cdot h$$
其中 $z_2 = W_2 h + b_2$。
- 隐藏层权重梯度:
$$\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial h} \cdot \frac{\partial h}{\partial z_1} \cdot \frac{\partial z_1}{\partial W_1}$$
其中 $\frac{\partial L}{\partial h} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial h}$,$z_1 = W_1 x + b_1$。
代码实现
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.W1 = np.random.randn(input_size, hidden_size)
self.b1 = np.zeros(hidden_size)
self.W2 = np.random.randn(hidden_size, output_size)
self.b2 = np.zeros(output_size)
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def forward(self, x):
self.z1 = np.dot(x, self.W1) + self.b1
self.h = self.sigmoid(self.z1)
self.z2 = np.dot(self.h, self.W2) + self.b2
self.y = self.sigmoid(self.z2)
return self.y
def backward(self, x, t, learning_rate):
# 输出层误差
error = self.y - t
delta_output = error * self.sigmoid_derivative(self.y)
# 隐藏层误差
error_hidden = np.dot(delta_output, self.W2.T)
delta_hidden = error_hidden * self.sigmoid_derivative(self.h)
# 更新权重
self.W2 -= learning_rate * np.dot(self.h.T, delta_output)
self.b2 -= learning_rate * np.sum(delta_output, axis=0)
self.W1 -= learning_rate * np.dot(x.T, delta_hidden)
self.b1 -= learning_rate * np.sum(delta_hidden, axis=0)
常见问题与优化
梯度消失
当网络层数较深时,梯度可能在反向传播过程中逐渐变小,导致浅层权重更新缓慢。解决方案:
- 使用 ReLU 等非饱和激活函数
- 使用批量归一化(Batch Normalization)
- 残差连接(ResNet)
训练不稳定
学习率过大可能导致振荡,过小则收敛缓慢。优化策略:
- 动量法(Momentum):累积历史梯度
- 自适应学习率(Adam, RMSprop)
- 学习率衰减
避坑指南
- 数据标准化:输入数据应归一化到相同尺度
- 权重初始化:使用 Xavier 或 He 初始化
- 正则化:L2 正则化或 Dropout 防止过拟合
- 监控训练过程:记录训练和验证损失
思考题
- 如何设计实验验证梯度消失现象的存在?
- 除了本文提到的优化方法,还有哪些技术可以加速神经网络训练?
- 当训练集准确率高但验证集准确率低时,可能是什么原因?如何解决?
