共计 1381 个字符,预计需要花费 4 分钟才能阅读完成。
神经网络基础概念回顾
前馈神经网络(Feedforward Neural Network)是最简单的神经网络类型之一,数据单向流动,没有反馈连接。单隐含层前馈神经网络包含三个部分:

- 输入层:接收原始数据
- 隐含层:进行特征变换
- 输出层:产生最终预测
我们今天要分析的例子是一个最简单的架构:输入层 2 个神经元,隐含层 2 个神经元,输出层 1 个神经元。
前向传播的数学推导
给定输入 x =[2,3],权重 w1=[0,1](输入到第一个隐含神经元),w2=[1,0](输入到第二个隐含神经元)。
- 计算隐含层输入:
- 第一个隐含神经元:z1 = x1w1[0] + x2w1[1] = 20 + 31 = 3
-
第二个隐含神经元:z2 = x1w2[0] + x2w2[1] = 21 + 30 = 2
-
应用 Sigmoid 激活函数:
- Sigmoid 公式:σ(z) = 1/(1+e^(-z))
- a1 = σ(3) ≈ 0.9526
-
a2 = σ(2) ≈ 0.8808
-
假设输出层权重 w_out=[0.5, 0.5],则最终输出:
- output = a1w_out[0] + a2w_out[1] ≈ 0.95260.5 + 0.88080.5 ≈ 0.9167
代码实现
import numpy as np
# 定义 Sigmoid 函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 输入数据
x = np.array([2, 3])
# 第一层权重
w1 = np.array([0, 1]) # 第一个隐含神经元权重
w2 = np.array([1, 0]) # 第二个隐含神经元权重
# 前向传播
z1 = np.dot(x, w1) # 第一个隐含神经元输入
z2 = np.dot(x, w2) # 第二个隐含神经元输入
a1 = sigmoid(z1) # 第一个隐含神经元激活输出
a2 = sigmoid(z2) # 第二个隐含神经元激活输出
# 输出层计算
w_out = np.array([0.5, 0.5])
output = np.dot(np.array([a1, a2]), w_out)
print(f"Final output: {output:.4f}")
权重初始化的重要性
权重初始化对神经网络训练至关重要:
- 全零初始化:会导致所有神经元学习相同的东西
- 随机初始化:常用方法,但需要控制范围
- Xavier/Glorot 初始化:考虑输入输出维度,适合 Sigmoid/tanh
- He 初始化:适合 ReLU 激活函数
在我们的例子中,如果使用全零初始化,网络将无法学习任何有用的特征。
常见错误及调试技巧
- 维度不匹配错误
- 症状:ValueError: shapes not aligned
- 原因:矩阵乘法维度不一致
-
解决:打印检查每一层的权重矩阵形状
-
梯度消失问题
- 症状:网络无法学习,输出不变化
- 原因:Sigmoid 导数在两端接近 0
-
解决:使用 ReLU 激活函数,或调整学习率
-
输出值饱和
- 症状:输出总是接近 0 或 1
- 原因:权重初始化不当或学习率太大
- 解决:使用更好的初始化方法,减小学习率
延伸思考题
- 如果我们将 Sigmoid 激活函数换成 ReLU,前向传播的计算结果会有什么变化?
- 假设我们想把这个网络扩展到隐含层有 3 个神经元,权重矩阵应该如何组织?
- 在反向传播过程中,学习率的大小会对权重更新产生什么影响?
结语
通过这个简单的例子,我们完整走了一遍单隐含层前馈神经网络的前向传播过程。虽然例子简单,但包含了神经网络最核心的计算逻辑。建议读者尝试修改代码中的权重值,观察输出变化,这样可以更直观地理解权重对网络输出的影响。
正文完
发表至: 未分类
近三天内
