共计 1834 个字符,预计需要花费 5 分钟才能阅读完成。
认识 BP 神经网络
BP 神经网络(Backpropagation Neural Network)是机器学习中最基础的前馈神经网络之一,广泛应用于分类、回归等任务。它由三部分组成:

- 输入层 :接收原始数据(如图像像素、文本特征)
- 隐藏层 :通过加权求和与非线性变换提取特征(至少 1 层)
- 输出层 :给出最终预测结果
比如识别手写数字时,输入层是 784 个像素点(28×28 图片),输出层则是 0 - 9 共 10 个神经元。
为什么初学者觉得难?
- 反向传播像黑箱 :误差如何从输出层传递到隐藏层?链式法则的推导过程容易让人迷失在偏导数中
- 权重更新不直观 :梯度下降时,权重矩阵如何调整缺乏可视化呈现
- 参数设置玄学 :学习率、隐藏层大小等超参数对结果影响显著但缺乏明确规则
用 Python 实现 + 可视化
1. 神经网络类实现
import numpy as np
class BPNeuralNetwork:
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.z1 = np.dot(X, self.W1) # 隐藏层输入
self.a1 = self.sigmoid(self.z1) # 隐藏层激活输出
self.z2 = np.dot(self.a1, self.W2) # 输出层输入
return self.sigmoid(self.z2) # 最终输出
def backward(self, X, y, output, learning_rate=0.1):
# 输出层误差
error = output - y
delta_output = error * (output * (1 - output)) # sigmoid 导数
# 隐藏层误差
error_hidden = delta_output.dot(self.W2.T)
delta_hidden = error_hidden * (self.a1 * (1 - self.a1))
# 更新权重
self.W2 -= learning_rate * self.a1.T.dot(delta_output)
self.W1 -= learning_rate * X.T.dot(delta_hidden)
2. 可视化网络结构
用 Matplotlib 绘制带权重的神经元连接图:
import matplotlib.pyplot as plt
def draw_neural_net(ax, W1, W2):
# 绘制神经元(圆形节点)for i in range(input_size):
ax.add_patch(plt.Circle((0, -i*0.5), 0.1, color='skyblue'))
for j in range(hidden_size):
ax.add_patch(plt.Circle((1, -j*0.5), 0.1, color='orange'))
# 绘制连接线(线宽反映权重)for i in range(W1.shape[0]):
for j in range(W1.shape[1]):
linewidth = np.abs(W1[i,j]) * 3
ax.plot([0,1], [-i*0.5, -j*0.5], 'gray', linewidth=linewidth)
关键参数设置经验
- 学习率 :从 0.01 开始尝试,观察 loss 曲线:
- 震荡剧烈→调小
- 下降过慢→适当增大
- 隐藏层大小 :
- 一般取输入层和输出层大小的中间值
- 复杂任务可适当增加,但需警惕过拟合
- 梯度消失对策 :
- 使用 ReLU 代替 sigmoid
- 批归一化(BatchNorm)
- 残差连接(ResNet 思路)
从单层到深度网络的思考
- 深度扩展 :每增加一个隐藏层,都需要考虑:
- 梯度传播效率(可能需配合跳跃连接)
- 计算资源消耗
- 激活函数选择 :
- ReLU:缓解梯度消失,计算快
- LeakyReLU:解决神经元 ” 死亡 ” 问题
- Swish:Google 提出的平滑版本 ReLU
通过这个简单的实现,我们不仅理解了 BP 神经网络的核心机制,还学会了如何用可视化让抽象概念变得直观。建议读者尝试修改隐藏层数量,观察网络性能的变化,这是迈向深度学习的重要一步。
正文完
