前馈神经网络实战:解析输入x=[2,3]与权重w1=[0 1],w2=[1]的隐含层计算过程

1次阅读
没有评论

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

image.webp

背景知识:前馈神经网络结构

前馈神经网络(Feedforward Neural Network)是最基础的神经网络结构,由输入层、隐含层和输出层组成。在我们的案例中:

前馈神经网络实战:解析输入 x =[2,3]与权重 w1=[0 1],w2=[1]的隐含层计算过程

  • 输入层: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]

避坑指南

  1. 维度不匹配
  2. 错误现象:ValueError: shapes (1,2) and (1,2) not aligned
  3. 解决:始终检查权重矩阵列数 = 输入特征数,行数 = 隐含层节点数

  4. 忘记转置

  5. 错误示例:W = np.array([0,1,1,0])未 reshape 为 2×2
  6. 正确做法:显式定义矩阵形状,或用 .reshape(2,2) 调整

  7. 激活函数误用

  8. Sigmoid 会导致梯度消失,ReLU 更适合作隐藏层激活函数
  9. 输出层需根据任务选择(如二分类用 Sigmoid)

扩展思考

尝试以下实验:

  1. 将 w1 改为[1,0],观察输出如何变化
  2. 初始化所有权重为 0,发现网络无法学习(梯度相同)
  3. 使用 np.random.randn() 生成随机权重,理解初始化的重要性

通过这个案例,我们完整走通了单隐含层神经网络的前向传播过程。下一步可以尝试:

  • 增加更多隐含层
  • 实现反向传播算法
  • 用 PyTorch/TensorFlow 框架重构代码
正文完
 0
评论(没有评论)