BP神经网络正向图:从数学原理到Python实现

1次阅读
没有评论

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

image.webp

从单层感知机到多层网络

理解 BP 神经网络的正向传播,最好从单层感知机开始。单层感知机的计算非常简单:输入向量 x 乘以权重矩阵 W,加上偏置 b,再通过激活函数得到输出。用数学公式表示就是:

BP 神经网络正向图:从数学原理到 Python 实现

a = W * x + b
y = σ(a)

其中 σ 代表激活函数。这个简单的计算过程,其实就是神经网络正向传播的基础。

正向传播的数学推导

当网络结构扩展到多层时,每一层的计算都遵循相同的模式。以一个 3 层网络为例(输入层、隐藏层、输出层),正向传播的过程可以这样表示:

  1. 输入层到隐藏层:

    z1 = W1 * x + b1
    a1 = σ(z1)

  2. 隐藏层到输出层:

    z2 = W2 * a1 + b2
    y = σ(z2)

这里的关键是要理解权重矩阵的维度。比如 W1 的维度是 (隐藏层节点数, 输入特征数),这样才能保证矩阵乘法正确进行。

Python 实现

下面我们用 NumPy 来实现这个正向传播过程:

import numpy as np

# 定义激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def relu(x):
    return np.maximum(0, x)

# 网络参数
input_size = 3
hidden_size = 4
output_size = 1

# 初始化权重和偏置
W1 = np.random.randn(hidden_size, input_size) * 0.01
b1 = np.zeros((hidden_size, 1))
W2 = np.random.randn(output_size, hidden_size) * 0.01
b2 = np.zeros((output_size, 1))

# 正向传播
def forward(x):
    # 输入层到隐藏层
    z1 = np.dot(W1, x) + b1
    a1 = relu(z1)  # 使用 ReLU 激活

    # 隐藏层到输出层
    z2 = np.dot(W2, a1) + b2
    y = sigmoid(z2)  # 使用 Sigmoid 激活

    return y

# 测试
x = np.random.randn(input_size, 1)
y_pred = forward(x)
print(f"预测输出: {y_pred}")

避坑指南

在实现正向传播时,有几个常见问题需要注意:

  1. 权重初始化:
  2. 不要初始化为 0,这会导致所有神经元学习相同的东西
  3. 小随机数初始化是个不错的起点

  4. 维度匹配:

  5. 确保矩阵乘法的维度匹配
  6. 使用 print 语句检查中间结果的 shape
  7. 常见错误是忘记转置或者搞错维度顺序

  8. 数值稳定性:

  9. 对于 sigmoid 等函数,注意防止数值溢出
  10. 可以考虑添加数值稳定性的实现

思考题

  1. 如何验证正向传播计算的正确性?
  2. 可以通过手工计算几个简单的例子来验证
  3. 或者使用已知权重的网络测试

  4. 不同激活函数对输出范围的影响?

  5. sigmoid 输出在 0 - 1 之间
  6. tanh 输出在 - 1 到 1 之间
  7. ReLU 输出在 0 到无穷大

  8. 当输入特征维度变化时,需要调整哪些参数?

  9. 需要调整第一层权重矩阵的列数
  10. 其他层的参数保持不变

总结

通过本文的学习,你应该已经掌握了 BP 神经网络正向传播的基本原理和实现方法。记住,理解矩阵维度和激活函数的作用是关键。实践是最好的老师,建议你多尝试不同的网络结构和参数设置,观察它们对输出的影响。

正文完
 0
评论(没有评论)