BP神经网络前馈计算手算实战:从数学原理到分步推导

1次阅读
没有评论

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

image.webp

1. 案例准备

我们构造一个 2 -3- 1 结构的 BP 神经网络,各层参数如下:

BP 神经网络前馈计算手算实战:从数学原理到分步推导

输入层:
– 输入向量 $x = [1.0, 0.5]$

隐藏层:
– 权重矩阵 $W^{[1]} = \begin{bmatrix} 0.1 & 0.3 \ -0.2 & 0.4 \ 0.5 & -0.1 \end{bmatrix}$
– 偏置向量 $b^{[1]} = [0.1, -0.1, 0.2]$

输出层:
– 权重向量 $W^{[2]} = [0.2, -0.3, 0.4]$
– 偏置值 $b^{[2]} = 0.05$

激活函数统一采用 Sigmoid:
$\sigma(z) = \frac{1}{1+e^{-z}}$

2. 前馈计算全流程

2.1 输入层→隐藏层

  1. 线性变换计算:
    $$
    z^{[1]} = W^{[1]}x + b^{[1]} = \begin{bmatrix} 0.11.0 + 0.30.5 \ -0.21.0 + 0.40.5 \ 0.51.0 + (-0.1)0.5 \end{bmatrix} + \begin{bmatrix} 0.1 \ -0.1 \ 0.2 \end{bmatrix} = \begin{bmatrix} 0.25 \ 0.0 \ 0.65 \end{bmatrix}
    $$

  2. 激活函数应用:
    $$
    a^{[1]} = \sigma(z^{[1]}) = \begin{bmatrix} \frac{1}{1+e^{-0.25}} \ \frac{1}{1+e^{0}} \ \frac{1}{1+e^{-0.65}} \end{bmatrix} \approx \begin{bmatrix} 0.562 \ 0.500 \ 0.657 \end{bmatrix}
    $$

易错点:
– 注意权重矩阵的维度是(3,2),输入向量是(2,1),结果应为(3,1)
– 偏置项需与线性变换结果逐元素相加

2.2 隐藏层→输出层

  1. 线性变换计算:
    $$
    z^{[2]} = W^{[2]}a^{[1]} + b^{[2]} = [0.20.562 + (-0.3)0.5 + 0.4*0.657] + 0.05 \approx 0.241
    $$

  2. 最终输出:
    $$
    a^{[2]} = \sigma(z^{[2]}) \approx \frac{1}{1+e^{-0.241}} \approx 0.560
    $$

验证技巧:
– 检查每步结果的数值范围:Sigmoid 输出应在 (0,1) 之间
– 最终输出 0.560 合理,符合预期

3. 计算过程图解

输入层      隐藏层         输出层
 x₁━┓     z₁=0.25      z≈0.241
    ┣━W₁₁→ a₁≈0.562  → a≈0.560
 x₂━┛     z₂=0.0
        W₂₁→ a₂=0.500
            z₃=0.65
        W₃₁→ a₃≈0.657

4. 常见错误排查

  • 维度不匹配:
  • 确认 $W^{[1]}x$ 是(3,2)×(2,1)=(3,1)
  • $W^{[2]}a^{[1]}$ 是(1,3)×(3,1)=(1,1)

  • 激活函数计算:

  • 检查 Sigmoid 分母是否写对符号
  • 避免直接使用线性变换结果作为输出

  • 小数点精度:

  • 建议保留 3 位小数
  • 中间结果不要过早四舍五入

5. 思考题解析

要使输出接近 0.8,可通过以下方法调整:

  1. 权重调整方向:
  2. 增大 $W^{[2]}$ 中对应较大 $a^{[1]}$ 元素的权重(如增加 $w_3$)
  3. 适当减小偏置 $b^{[2]}$

  4. 数学验证:
    设调整后 $W^{[2]} = [0.2, -0.3, 0.8]$,则:
    $$
    z^{[2]} \approx 0.20.562 – 0.30.5 + 0.8*0.657 + 0.05 \approx 0.496 \
    a^{[2]} \approx \sigma(0.496) \approx 0.622
    $$
    仍需进一步微调参数

6. 总结建议

  1. 手算训练价值:
  2. 通过 3 次完整手算可建立维度转换直觉
  3. 建议用不同激活函数(如 ReLU)对比计算

  4. 扩展练习:

  5. 尝试构造输入使某个隐藏神经元输出接近 0
  6. 探索偏置项对输出的影响规律

  7. 工具验证:
    最终可用 NumPy 验证计算结果:

    import numpy as np
    W1 = np.array([[0.1,0.3],[-0.2,0.4],[0.5,-0.1]])
    b1 = np.array([0.1,-0.1,0.2])
    a1 = 1/(1+np.exp(-(W1@np.array([1.0,0.5])+b1)))
    print(a1)  # 应输出 ≈[0.562, 0.500, 0.657]

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