BP神经网络实战:从数学原理到Python实现(附经典例题解析)

1次阅读
没有评论

共计 1578 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

数学原理篇

BP 神经网络的核心在于前向传播计算预测值,再通过反向传播调整权重。我们先看两个关键过程:

BP 神经网络实战:从数学原理到 Python 实现(附经典例题解析)

  1. 前向传播公式
  2. 隐层输出:$h_j = \sigma(\sum_{i} w_{ij}x_i + b_j)$
  3. 输出层结果:$y_k = \sigma(\sum_{j} w_{jk}h_j + b_k)$
  4. 其中 $\sigma$ 为 Sigmoid 函数:$\sigma(z) = \frac{1}{1+e^{-z}}$

  5. 反向传播推导

  6. 输出层误差:$\delta_k = (y_k – t_k) \cdot \sigma'(z_k)$
  7. 隐层误差:$\delta_j = (\sum_{k} w_{jk}\delta_k) \cdot \sigma'(z_j)$
  8. 权重更新:$\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 实战篇

  1. 数据预处理

    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 编码

  2. 超参数调优

  3. 隐层神经元数量:通常取输入层和输出层的几何平均数
  4. 学习率:建议从 0.01 开始尝试,配合学习率衰减

  5. 损失曲线分析

    losses = []
    for epoch in range(epochs):
        loss = np.mean(np.square(y - model.forward(X)))
        losses.append(loss)
    plt.plot(losses)

避坑指南

  1. 梯度消失对策
  2. 使用 ReLU 等替代激活函数
  3. 采用残差连接结构

  4. 过拟合预防

  5. 添加 L2 正则化项
  6. 实施 Dropout 技术

  7. 学习率衰减

    lr = initial_lr * (1. / (1. + decay_rate * epoch))

进阶思考

  1. 如何通过增加卷积层改进网络结构?
  2. 对比 Sigmoid、Tanh、ReLU 在不同深度的表现差异
  3. 随机梯度下降 (SGD) 与批量训练的效果对比实验
正文完
 0
评论(没有评论)