共计 1613 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
BP 算法(误差反向传播算法)是训练神经网络的核心技术。打个比方,神经网络就像一台复杂的机器,BP 算法就是教会这台机器如何自我调整的 ” 学习指南 ”。它通过不断修正网络中的连接权重,使网络的预测结果越来越接近真实值。

核心概念
正向传播:信息的前向流动
-
加权求和 :每个神经元接收前一层所有神经元的输出,进行加权求和
$$z_j = \sum_{i}w_{ji}x_i + b_j$$ -
激活函数 :通过非线性函数引入表达能力(常用 ReLU)
$$a_j = \sigma(z_j)$$
反向传播:误差的逆向传递
-
损失函数 :计算预测值与真实值的差距(如均方误差)
$$L = \frac{1}{2}(y_{pred}-y_{true})^2$$ -
链式法则 :从输出层逐层回传误差
$$\frac{\partial L}{\partial w_{ji}} = \frac{\partial L}{\partial a_j}\frac{\partial a_j}{\partial z_j}\frac{\partial z_j}{\partial w_{ji}}$$
代码实现
import numpy as np
# 定义 Sigmoid 激活函数及其导数
def sigmoid(x):
return 1/(1+np.exp(-x))
def sigmoid_derivative(x):
return x*(1-x)
# 网络参数
input_size = 2
hidden_size = 3
output_size = 1
learning_rate = 0.1
# 初始化权重
W1 = np.random.randn(input_size, hidden_size)
W2 = np.random.randn(hidden_size, output_size)
# 单个样本前向传播
X = np.array([0.5, 0.1]) # 输入
z1 = np.dot(X, W1)
a1 = sigmoid(z1)
z2 = np.dot(a1, W2)
pred = sigmoid(z2)
# 反向传播
target = 0.8 # 真实值
loss = 0.5*(pred - target)**2
d_pred = pred - target
d_z2 = d_pred * sigmoid_derivative(pred)
d_W2 = np.dot(a1.T, d_z2)
d_a1 = np.dot(d_z2, W2.T)
d_z1 = d_a1 * sigmoid_derivative(a1)
d_W1 = np.dot(X.reshape(-1,1), d_z1.reshape(1,-1))
# 权重更新
W1 -= learning_rate * d_W1
W2 -= learning_rate * d_W2
常见问题
梯度消失 / 爆炸
- 原因 :深层网络中连续的小数 / 大数连乘
- 解决方案 :
- 使用 ReLU 等改良激活函数
- 采用 Batch Normalization
- 使用残差连接
学习率设置
- 常用范围:0.1 到 0.0001
- 实践技巧:
- 初始可尝试 0.01
- 配合学习率衰减策略
- 使用自适应优化器(如 Adam)
可视化
输入层 隐藏层 输出层
○ ---w1---> ○ --w2---> ○
\ / \ /
w1'w2'
箭头方向表示正向传播路径,虚线表示反向传播时梯度回传路径。
最佳实践
参数初始化
- Xavier 初始化:适合 tanh 激活
- He 初始化:适合 ReLU 激活
- 小随机数:避免对称性问题
批量训练技巧
- 将数据集划分为 mini-batch
- 计算批次平均梯度
- 使用向量化操作加速
延伸思考
建议尝试:
– 将 sigmoid 换成 ReLU 观察训练速度变化
– 增加隐藏层数量体会梯度消失现象
– 调整学习率比较收敛效果
参考文献
- 《神经网络与深度学习》- Michael Nielsen
- 《Deep Learning》- Ian Goodfellow
- CS231n 课程笔记(斯坦福大学)
通过这次实践,我深刻体会到 BP 算法就像神经网络的 ” 自我反思 ” 过程——前向传播做出预测,反向传播根据错误调整认知。建议初学者可以先用纸笔推导简单网络(如 2 -1- 1 结构)的传播过程,再过渡到代码实现,这样理解会更加扎实。
正文完
