共计 1838 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要手算神经网络?
刚开始学习神经网络时,很多人会直接调库实现,但这样容易忽略底层计算细节。手算能帮我们:

- 真正理解矩阵运算的维度关系
- 掌握激活函数的实际作用
- 为反向传播推导打下基础
常见手算错误盘点
初学者常遇到这些问题:
- 矩阵乘法时维度不匹配
- 忘记添加偏置项
- Sigmoid 函数计算错误
- 各层输出形状混淆
数学原理分步拆解
网络结构说明
我们以 2 -3- 1 结构为例:
- 输入层:2 个神经元
- 隐藏层:3 个神经元
- 输出层:1 个神经元
计算公式一览
-
输入层→隐藏层 计算:
$$ z^{[1]} = W^{[1]}X + b^{[1]} $$
$$ a^{[1]} = \sigma(z^{[1]}) $$ -
隐藏层→输出层 计算:
$$ z^{[2]} = W^{[2]}a^{[1]} + b^{[2]} $$
$$ a^{[2]} = \sigma(z^{[2]}) $$
其中 $\sigma$ 是 Sigmoid 函数:
$$ \sigma(z) = \frac{1}{1+e^{-z}} $$
实战例题:手算全过程
给定参数
权重矩阵:
– $W^{[1]} = \begin{bmatrix} 0.1 & 0.2 \ -0.3 & 0.4 \ 0.5 & -0.6 \end{bmatrix}$
– $W^{[2]} = \begin{bmatrix} 0.7 & -0.8 & 0.9 \end{bmatrix}$
偏置项:
– $b^{[1]} = \begin{bmatrix} 0.1 \ -0.2 \ 0.3 \end{bmatrix}$
– $b^{[2]} = \begin{bmatrix} -0.4 \end{bmatrix}$
输入:
$X = \begin{bmatrix} 0.5 \ -0.6 \end{bmatrix}$
计算步骤
- 第一层计算:
$$ z^{[1]} = \begin{bmatrix} 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 \end{bmatrix} = \begin{bmatrix} 0.03 \ -0.59 \ 0.91 \end{bmatrix} $$
$$ a^{[1]} = \sigma(z^{[1]}) = \begin{bmatrix} 1/(1+e^{-0.03}) \ 1/(1+e^{0.59}) \ 1/(1+e^{-0.91}) \end{bmatrix} ≈ \begin{bmatrix} 0.5075 \ 0.3568 \ 0.7130 \end{bmatrix} $$
- 第二层计算:
$$ z^{[2]} = 0.7×0.5075 + (-0.8)×0.3568 + 0.9×0.7130 + (-0.4) ≈ 0.2311 $$
$$ a^{[2]} = \sigma(0.2311) ≈ 0.5575 $$
Python 代码验证
import numpy as np
# 定义 Sigmoid 函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 初始化参数
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]])
X = np.array([[0.5], [-0.6]])
# 前向传播
Z1 = np.dot(W1, X) + b1
A1 = sigmoid(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2)
# 打印结果
print(f"隐藏层输出:\n{A1}\n")
print(f"最终输出: {A2.item():.4f}")
运行结果应与手算结果一致:
隐藏层输出:
[[0.50749944]
[0.35682728]
[0.71298611]]
最终输出: 0.5575
避坑指南
- 维度检查:
- $W^{[1]}$ 形状应为(隐藏层神经元数, 输入层神经元数)
-
矩阵乘法前使用 assert 检查形状
-
偏置项:
-
注意广播机制,建议始终保持列向量形式
-
激活函数:
- Sigmoid 容易梯度消失,实际常用 ReLU
- 注意指数计算可能溢出
延伸练习
- 尝试将隐藏层改为 4 个神经元
- 使用 ReLU 代替 Sigmoid
- 修改输入值为 [1.0, -1.0] 观察输出变化
- 添加第二个隐藏层
总结
通过这次手算练习,我们:
- 理清了神经网络前向传播的计算流程
- 掌握了矩阵维度对齐的方法
- 验证了 Sigmoid 函数的实际效果
- 建立了代码实现与数学公式的对应关系
建议读者亲自完成所有计算步骤,这是理解神经网络工作机制的最佳途径。当你能准确预测每一层的输出值时,反向传播的学习就会水到渠成。
