共计 1606 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要掌握 BP 前馈手算能力?
在神经网络的学习和实践中,手算前馈过程是理解模型运作原理的关键。无论是为了:

- 调试模型:当网络输出不符合预期时,手算能快速定位计算错误
- 面试考核:许多机器学习岗位会考察基础算法的推导能力
- 论文复现:阅读文献时需验证作者描述的模型结构是否合理
数学准备
前馈计算主要涉及以下公式:
- 线性变换:$Z^{[l]} = W^{[l]T}X + b^{[l]}$
- $W^{[l]}$ 表示第 l 层的权重矩阵
-
注意权重矩阵需要转置
-
激活函数(以 Sigmoid 为例):
- $A^{[l]} = \sigma(Z^{[l]}) = \frac{1}{1+e^{-Z^{[l]}}}$
-
其导数:$\sigma'(Z^{[l]}) = A^{[l]}(1-A^{[l]})$
-
维度关系:
- 如果输入是 $n^{[l-1]}$ 维,输出是 $n^{[l]}$ 维
- 则 $W^{[l]}$ 的维度是 $(n^{[l]}, n^{[l-1]})$
- $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]
第一步:输入层→隐藏层
-
计算 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] -
应用 Sigmoid 激活:
$A1 = \sigma(Z1) = [0.567, 0.620, 0.713]$
第二步:隐藏层→输出层
-
计算 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 -
最终输出:
$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
延伸思考
掌握了基础计算后,可以尝试:
- 更换激活函数(如 ReLU、tanh)
- 增加网络层数
- 改变每层的神经元数量
- 使用不同的输入数据
手算练习模板
| 计算步骤 | 公式 | 你的计算过程 | 结果验证 |
|---|---|---|---|
| Z1 = | W1^T*X + b1 | ||
| A1 = | σ(Z1) | ||
| Z2 = | W2^T*A1 + b2 | ||
| A2 = | σ(Z2) |
通过这个模板,你可以系统地练习更多前馈计算案例。记住,熟能生巧,反复练习是掌握神经网络计算的关键。
正文完
