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

1次阅读
没有评论

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

image.webp

从单层感知机开始

理解神经网络的正向传播,最好从最简单的单层感知机入手。单层感知机只包含输入层和输出层,没有隐藏层。它的计算过程可以表示为:

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

output = activation_function(W * X + b)

其中:
– W 是权重矩阵
– X 是输入向量
– b 是偏置项
– activation_function 是激活函数

扩展到多层神经网络

当我们在单层感知机的基础上加入隐藏层,就形成了多层神经网络。正向传播的过程就是数据从输入层,经过各隐藏层,最终到达输出层的过程。

对于第 l 层,其正向传播的计算公式为:

Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]}
A^{[l]} = g^{[l]}(Z^{[l]})

其中:
– Z^[l] 是第 l 层的线性计算结果
– A^[l] 是第 l 层的激活输出
– g^[l] 是第 l 层的激活函数

Python 实现

下面我们用 NumPy 来实现一个三层神经网络的正向传播过程:

import numpy as np

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

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

# 初始化参数
def initialize_parameters(layer_dims):
    parameters = {}
    L = len(layer_dims)

    for l in range(1, L):
        parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01
        parameters['b' + str(l)] = np.zeros((layer_dims[l], 1))

    return parameters

# 正向传播
def forward_propagation(X, parameters):
    caches = []
    A = X
    L = len(parameters) // 2

    for l in range(1, L):
        A_prev = A
        W = parameters['W' + str(l)]
        b = parameters['b' + str(l)]
        Z = np.dot(W, A_prev) + b
        A = relu(Z)
        caches.append((A_prev, W, b, Z))

    # 输出层使用 sigmoid 激活
    WL = parameters['W' + str(L)]
    bL = parameters['b' + str(L)]
    ZL = np.dot(WL, A) + bL
    AL = sigmoid(ZL)
    caches.append((A, WL, bL, ZL))

    return AL, caches

避坑指南

  1. 权重矩阵初始化
  2. 不要将所有权重初始化为 0,这会导致所有神经元学习相同的特征
  3. 小随机数初始化是更好的选择,比如乘以 0.01

  4. 维度不匹配错误

  5. 常见错误:权重矩阵的列数不等于前一层的神经元数
  6. 调试方法:在每步计算后打印矩阵维度
  7. 记住公式:W^[l].shape = (n^[l], n^[l-1])

  8. 数值稳定性

  9. 对于 sigmoid 函数,当 z 很大或很小时会出现数值溢出
  10. 解决方法:对输入数据进行标准化处理
  11. 可以考虑使用更稳定的激活函数如 ReLU

思考题

  1. 如何验证正向传播计算的正确性?
  2. 可以通过手动计算几个样本的结果来验证
  3. 也可以使用已知的神经网络库进行对比

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

  5. sigmoid 将输出限制在 (0,1)
  6. tanh 将输出限制在 (-1,1)
  7. ReLU 没有上限

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

  9. 需要调整第一层权重矩阵的维度
  10. 其他层的维度可以保持不变
  11. 注意检查所有矩阵乘法的维度兼容性

总结

通过本文的讲解和代码实现,我们了解了 BP 神经网络正向传播的完整过程。从单层感知机的基础计算,扩展到多层神经网络的结构,再到具体的 Python 实现和注意事项。希望这些内容能帮助初学者更好地理解和实现神经网络的正向传播。

在实际应用中,要特别注意矩阵维度的匹配和数值稳定性问题。通过反复练习和调试,你会逐渐掌握这些概念的。

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