共计 1302 个字符,预计需要花费 4 分钟才能阅读完成。
背景知识:前馈神经网络结构
前馈神经网络(Feedforward Neural Network)是最基础的神经网络结构,由输入层、隐含层和输出层组成。在我们的案例中:
![前馈神经网络实战:解析输入 x =[2,3]与权重 w1=[0 1],w2=[1]的隐含层计算过程 前馈神经网络实战:解析输入 x =[2,3]与权重 w1=[0 1],w2=[1]的隐含层计算过程](https://www.qqiyuan.cn/wp-content/uploads/2026/06/7_protocol_stack-2.webp)
- 输入层:2 个节点(对应向量 x =[2,3])
- 隐含层:2 个节点(由权重 w1 和 w2 决定)
- 权重矩阵:连接输入层和隐含层的参数,w1=[0,1]和 w2=[1]构成 2×2 矩阵
维度关系遵循:
$$
W_{hidden} = \begin{bmatrix}
w1 \
w2
\end{bmatrix} = \begin{bmatrix}
0 & 1 \
1 & ?
\end{bmatrix}
$$
注意到 w2 的维度不完整,假设 w2=[1,0]补全为 2×2 矩阵。这是初学者常遇到的第一个问题——权重矩阵必须严格匹配输入 / 输出维度。
核心计算步骤
1. 维度验证
输入 x 是 1×2 向量,权重 W 是 2×2 矩阵,根据矩阵乘法规则:
$$
(1×2) \times (2×2) \rightarrow (1×2)
$$
输出应是 1×2 的隐含层向量。若维度不匹配会出现 ValueError,这是后续代码需要验证的重点。
2. 净输入计算
执行矩阵乘法得到隐含层净输入 z:
$$
z = x \cdot W = [2,3] \cdot \begin{bmatrix}
0 & 1 \
1 & 0
\end{bmatrix} = [3,2]
$$
具体计算过程:
- 第一个节点:2×0 + 3×1 = 3
- 第二个节点:2×1 + 3×0 = 2
3. ReLU 激活
应用 ReLU 函数 $f(z)=max(0,z)$:
$$
output = [max(0,3), max(0,2)] = [3,2]
$$
Python 代码实现
import numpy as np
# 输入和权重定义
x = np.array([2, 3])
W = np.array([[0, 1], # w1
[1, 0]]) # w2
# 维度验证
assert x.shape[0] == W.shape[0], \
f"维度不匹配!输入特征数{x.shape[0]}≠权重行数{W.shape[0]}"
# 净输入计算
z = np.dot(x, W) # 等价于 x @ W
print("净输入:", z) # 输出: [3 2]
# ReLU 激活
hidden_output = np.maximum(0, z)
print("隐含层输出:", hidden_output) # 输出: [3 2]
避坑指南
- 维度不匹配:
- 错误现象:
ValueError: shapes (1,2) and (1,2) not aligned -
解决:始终检查权重矩阵列数 = 输入特征数,行数 = 隐含层节点数
-
忘记转置:
- 错误示例:
W = np.array([0,1,1,0])未 reshape 为 2×2 -
正确做法:显式定义矩阵形状,或用
.reshape(2,2)调整 -
激活函数误用:
- Sigmoid 会导致梯度消失,ReLU 更适合作隐藏层激活函数
- 输出层需根据任务选择(如二分类用 Sigmoid)
扩展思考
尝试以下实验:
- 将 w1 改为[1,0],观察输出如何变化
- 初始化所有权重为 0,发现网络无法学习(梯度相同)
- 使用
np.random.randn()生成随机权重,理解初始化的重要性
通过这个案例,我们完整走通了单隐含层神经网络的前向传播过程。下一步可以尝试:
- 增加更多隐含层
- 实现反向传播算法
- 用 PyTorch/TensorFlow 框架重构代码
正文完
发表至: 未分类
近两天内
