深入解析单隐含层前馈神经网络:从权重计算到梯度下降

1次阅读
没有评论

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

image.webp

神经网络基础概念回顾

前馈神经网络(Feedforward Neural Network)是最简单的神经网络类型之一,数据单向流动,没有反馈连接。单隐含层前馈神经网络包含三个部分:

深入解析单隐含层前馈神经网络:从权重计算到梯度下降

  • 输入层:接收原始数据
  • 隐含层:进行特征变换
  • 输出层:产生最终预测

我们今天要分析的例子是一个最简单的架构:输入层 2 个神经元,隐含层 2 个神经元,输出层 1 个神经元。

前向传播的数学推导

给定输入 x =[2,3],权重 w1=[0,1](输入到第一个隐含神经元),w2=[1,0](输入到第二个隐含神经元)。

  1. 计算隐含层输入:
  2. 第一个隐含神经元:z1 = x1w1[0] + x2w1[1] = 20 + 31 = 3
  3. 第二个隐含神经元:z2 = x1w2[0] + x2w2[1] = 21 + 30 = 2

  4. 应用 Sigmoid 激活函数:

  5. Sigmoid 公式:σ(z) = 1/(1+e^(-z))
  6. a1 = σ(3) ≈ 0.9526
  7. a2 = σ(2) ≈ 0.8808

  8. 假设输出层权重 w_out=[0.5, 0.5],则最终输出:

  9. 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 激活函数

在我们的例子中,如果使用全零初始化,网络将无法学习任何有用的特征。

常见错误及调试技巧

  1. 维度不匹配错误
  2. 症状:ValueError: shapes not aligned
  3. 原因:矩阵乘法维度不一致
  4. 解决:打印检查每一层的权重矩阵形状

  5. 梯度消失问题

  6. 症状:网络无法学习,输出不变化
  7. 原因:Sigmoid 导数在两端接近 0
  8. 解决:使用 ReLU 激活函数,或调整学习率

  9. 输出值饱和

  10. 症状:输出总是接近 0 或 1
  11. 原因:权重初始化不当或学习率太大
  12. 解决:使用更好的初始化方法,减小学习率

延伸思考题

  1. 如果我们将 Sigmoid 激活函数换成 ReLU,前向传播的计算结果会有什么变化?
  2. 假设我们想把这个网络扩展到隐含层有 3 个神经元,权重矩阵应该如何组织?
  3. 在反向传播过程中,学习率的大小会对权重更新产生什么影响?

结语

通过这个简单的例子,我们完整走了一遍单隐含层前馈神经网络的前向传播过程。虽然例子简单,但包含了神经网络最核心的计算逻辑。建议读者尝试修改代码中的权重值,观察输出变化,这样可以更直观地理解权重对网络输出的影响。

正文完
 0
评论(没有评论)