共计 1674 个字符,预计需要花费 5 分钟才能阅读完成。
1. 案例准备
我们构造一个 2 -3- 1 结构的 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 输入层→隐藏层
-
线性变换计算:
$$
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}
$$ -
激活函数应用:
$$
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 隐藏层→输出层
-
线性变换计算:
$$
z^{[2]} = W^{[2]}a^{[1]} + b^{[2]} = [0.20.562 + (-0.3)0.5 + 0.4*0.657] + 0.05 \approx 0.241
$$ -
最终输出:
$$
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,可通过以下方法调整:
- 权重调整方向:
- 增大 $W^{[2]}$ 中对应较大 $a^{[1]}$ 元素的权重(如增加 $w_3$)
-
适当减小偏置 $b^{[2]}$
-
数学验证:
设调整后 $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. 总结建议
- 手算训练价值:
- 通过 3 次完整手算可建立维度转换直觉
-
建议用不同激活函数(如 ReLU)对比计算
-
扩展练习:
- 尝试构造输入使某个隐藏神经元输出接近 0
-
探索偏置项对输出的影响规律
-
工具验证:
最终可用 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]
