共计 1578 个字符,预计需要花费 4 分钟才能阅读完成。
数学原理篇
BP 神经网络的核心在于前向传播计算预测值,再通过反向传播调整权重。我们先看两个关键过程:

- 前向传播公式
- 隐层输出:$h_j = \sigma(\sum_{i} w_{ij}x_i + b_j)$
- 输出层结果:$y_k = \sigma(\sum_{j} w_{jk}h_j + b_k)$
-
其中 $\sigma$ 为 Sigmoid 函数:$\sigma(z) = \frac{1}{1+e^{-z}}$
-
反向传播推导
- 输出层误差:$\delta_k = (y_k – t_k) \cdot \sigma'(z_k)$
- 隐层误差:$\delta_j = (\sum_{k} w_{jk}\delta_k) \cdot \sigma'(z_j)$
- 权重更新:$\Delta w_{ij} = -\eta \delta_j x_i$($\eta$ 为学习率)
Python 实现篇
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
# 权重初始化(Xavier 方法)self.W1 = np.random.randn(input_size, hidden_size) * np.sqrt(1/input_size)
self.W2 = np.random.randn(hidden_size, output_size) * np.sqrt(1/hidden_size)
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def forward(self, X):
self.hidden = self.sigmoid(np.dot(X, self.W1))
return self.sigmoid(np.dot(self.hidden, self.W2))
def train(self, X, y, epochs=1000, lr=0.1):
for _ in range(epochs):
# 前向传播
output = self.forward(X)
# 反向传播
output_error = y - output
output_delta = output_error * (output * (1 - output))
hidden_error = output_delta.dot(self.W2.T)
hidden_delta = hidden_error * (self.hidden * (1 - self.hidden))
# 权重更新
self.W2 += lr * self.hidden.T.dot(output_delta)
self.W1 += lr * X.T.dot(hidden_delta)
MNIST 实战篇
-
数据预处理
from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784', version=1) X = mnist.data / 255.0 # 归一化 y = np.eye(10)[mnist.target.astype(int)] # one-hot 编码 -
超参数调优
- 隐层神经元数量:通常取输入层和输出层的几何平均数
-
学习率:建议从 0.01 开始尝试,配合学习率衰减
-
损失曲线分析
losses = [] for epoch in range(epochs): loss = np.mean(np.square(y - model.forward(X))) losses.append(loss) plt.plot(losses)
避坑指南
- 梯度消失对策
- 使用 ReLU 等替代激活函数
-
采用残差连接结构
-
过拟合预防
- 添加 L2 正则化项
-
实施 Dropout 技术
-
学习率衰减
lr = initial_lr * (1. / (1. + decay_rate * epoch))
进阶思考
- 如何通过增加卷积层改进网络结构?
- 对比 Sigmoid、Tanh、ReLU 在不同深度的表现差异
- 随机梯度下降 (SGD) 与批量训练的效果对比实验
正文完
