BP神经网络前馈计算手算详解:从数学推导到实战例题

1次阅读
没有评论

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

image.webp

为什么需要掌握 BP 前馈手算能力?

在神经网络的学习和实践中,手算前馈过程是理解模型运作原理的关键。无论是为了:

BP 神经网络前馈计算手算详解:从数学推导到实战例题

  • 调试模型:当网络输出不符合预期时,手算能快速定位计算错误
  • 面试考核:许多机器学习岗位会考察基础算法的推导能力
  • 论文复现:阅读文献时需验证作者描述的模型结构是否合理

数学准备

前馈计算主要涉及以下公式:

  1. 线性变换:$Z^{[l]} = W^{[l]T}X + b^{[l]}$
  2. $W^{[l]}$ 表示第 l 层的权重矩阵
  3. 注意权重矩阵需要转置

  4. 激活函数(以 Sigmoid 为例)

  5. $A^{[l]} = \sigma(Z^{[l]}) = \frac{1}{1+e^{-Z^{[l]}}}$
  6. 其导数:$\sigma'(Z^{[l]}) = A^{[l]}(1-A^{[l]})$

  7. 维度关系

  8. 如果输入是 $n^{[l-1]}$ 维,输出是 $n^{[l]}$ 维
  9. 则 $W^{[l]}$ 的维度是 $(n^{[l]}, n^{[l-1]})$
  10. $b^{[l]}$ 的维度是 $(n^{[l]}, 1)$

例题演示:3 层网络(2-3-1)

假设网络结构如下:
– 输入层:2 个神经元
– 隐藏层:3 个神经元
– 输出层:1 个神经元

给定参数:

W1 = [[0.1, 0.2],
      [0.3, 0.4],
      [0.5, 0.6]]
b1 = [0.1, 0.2, 0.3]

W2 = [[0.7, 0.8, 0.9]]
b2 = [0.4]

输入数据:

X = [0.5, 0.6]

第一步:输入层→隐藏层

  1. 计算 Z1:
    $Z1 = W1^T \cdot X + b1$

    = [[0.1, 0.3, 0.5],   [[0.5],   + [0.1,
        [0.2, 0.4, 0.6]]   [0.6]]     0.2,
                              0.3]
    = [0.1*0.5 + 0.2*0.6 + 0.1,
       0.3*0.5 + 0.4*0.6 + 0.2,
       0.5*0.5 + 0.6*0.6 + 0.3]
    = [0.27, 0.49, 0.91]

  2. 应用 Sigmoid 激活:
    $A1 = \sigma(Z1) = [0.567, 0.620, 0.713]$

第二步:隐藏层→输出层

  1. 计算 Z2:
    $Z2 = W2^T \cdot A1 + b2$

    = [[0.7, 0.8, 0.9]] * [0.567, 0.620, 0.713] + 0.4
    = 0.7*0.567 + 0.8*0.620 + 0.9*0.713 + 0.4
    = 1.685

  2. 最终输出:
    $A2 = \sigma(Z2) = 0.843$

易错点警示

在计算过程中需要特别注意:

  • 矩阵维度:确保权重矩阵的转置正确
  • 偏置项:不要漏加 bias 项
  • 激活函数:只在隐藏层应用,输入层不需要
  • 数值范围 :Sigmoid 输出应在(0,1) 之间

计算验证

用 NumPy 验证我们的手算结果:

import numpy as np

def sigmoid(x):
    return 1/(1+np.exp(-x))

# 输入数据
X = np.array([[0.5], [0.6]])

# 第一层参数
W1 = np.array([[0.1, 0.2],
               [0.3, 0.4],
               [0.5, 0.6]])
b1 = np.array([[0.1], [0.2], [0.3]])

# 第二层参数
W2 = np.array([[0.7, 0.8, 0.9]])
b2 = np.array([[0.4]])

# 前向传播
Z1 = np.dot(W1.T, X) + b1
A1 = sigmoid(Z1)
Z2 = np.dot(W2.T, A1) + b2
A2 = sigmoid(Z2)

print("隐藏层输出:", A1.flatten())
print("最终输出:", A2.item())

输出结果与手算一致:

隐藏层输出: [0.566916 0.619999 0.713136]
最终输出: 0.843305

延伸思考

掌握了基础计算后,可以尝试:

  1. 更换激活函数(如 ReLU、tanh)
  2. 增加网络层数
  3. 改变每层的神经元数量
  4. 使用不同的输入数据

手算练习模板

计算步骤 公式 你的计算过程 结果验证
Z1 = W1^T*X + b1
A1 = σ(Z1)
Z2 = W2^T*A1 + b2
A2 = σ(Z2)

通过这个模板,你可以系统地练习更多前馈计算案例。记住,熟能生巧,反复练习是掌握神经网络计算的关键。

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