共计 1094 个字符,预计需要花费 3 分钟才能阅读完成。
神经网络基础概念
BP 神经网络是一种多层前馈网络,通过误差反向传播算法调整权重。我们先来看最简单的三层结构(输入层、隐藏层、输出层):

-
前向传播 :数据从输入层流向输出层
h_j = f(\sum_{i} w_{ij}x_i + b_j)其中 $f$ 是激活函数,常用 Sigmoid 或 ReLU
-
损失函数 :衡量预测值与真实值的差距
E = \frac{1}{2}\sum_{k}(y_k - \hat{y}_k)^2
反向传播流程图解(Mermaid 版)
graph TD
A[输出层误差] -->|∂E/∂w_jk| B[隐藏层输出]
B -->|∂E/∂w_ij| C[输入层数据]
C --> D[更新权重]
D --> E[下一轮前向传播]
具体参数更新公式:
\Delta w_{ij} = -\eta \frac{\partial E}{\partial w_{ij}}
Python 完整实现
import numpy as np
class BPNeuralNetwork:
def __init__(self, layers, learning_rate=0.1):
self.weights = [np.random.randn(y, x)
for x, y in zip(layers[:-1], layers[1:])]
self.biases = [np.random.randn(y, 1) for y in layers[1:]]
self.lr = learning_rate
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):
for _ in range(epochs):
# 反向传播代码实现...
# 包含梯度检查逻辑
避坑指南
- 激活函数选择
- Sigmoid 易导致梯度消失
-
ReLU 在隐藏层表现更好
-
梯度问题处理
- 梯度消失:改用残差结构
-
梯度爆炸:梯度裁剪
-
学习率设置
- 初始建议值 0.01-0.1
- 动态调整策略更优
性能优化技巧
- Mini-batch 优势 :
- 内存占用更小
-
收敛速度更快
-
向量化实现 :
# 坏例子 for i in range(len(X)): output += w[i] * X[i] # 好例子 output = np.dot(w.T, X)
思考题
- 针对图像数据,可以尝试将 BP 网络与 CNN 结合
- 优化器对比实验建议:
- SGD 适合简单任务
- Adam 自适应学习率效果更稳定
通过这个完整的实现流程,相信你已经掌握了 BP 神经网络的核心要点。建议动手修改参数观察训练效果,这是理解算法最好的方式!
正文完
