第 5 步 · 隐藏层的力量
多层感知机 + 反向传播Multilayer Perceptron + Backprop
XOR — 为什么一层不够,两层就能解决?
10 分钟
阅读 + 实操
1 个
交互演示
中级
难度
多层感知机 · 交互演示
损失 BCE--
准确率--
步数0
单神经元(失败)
两层 MLP(成功)
为什么学这步?
单层网络只能解决线性可分问题。但现实中很多问题(如 XOR 异或)用一条直线根本切不开——这就是为什么需要隐藏层。隐藏层的作用是"空间变换":把原本无法用直线分开的数据,扭转到新的空间里,让它们变得可分。反向传播则是训练多层网络的算法——本质是链式法则:从输出层的误差开始,逐层往回算每个参数该往哪个方向调整。
📌 发生了什么
- 单层网络对 XOR 无解——一条直线切不开对角的两个"是"。
- 隐藏层把数据投影到新空间,让原本不可分的问题变可分。
- 反向传播用链式法则从输出往回传梯度,逐层更新权重。
⚠️ 常见陷阱
- 隐藏层越多越好?不一定,层数过多会导致梯度消失/爆炸。
- "学习"= 记住数据?不是,网络学习的是规律而非逐条记忆。
- 隐藏层在"看"什么?每层学习不同特征表示,浅层简单、深层复杂。
✅ 本章小结
- XOR 问题:单层无解,两层搞定——证明隐藏层的必要性。
- 空间变换:隐藏层把数据投影到新空间,让不可分变可分。
- 反向传播:链式法则从输出往回传梯度,逐层更新权重。
📐 反向传播链式法则推导
反向传播本质是链式法则在多层网络上的应用——从输出层往回逐层传播误差梯度。
定义误差信号 δ⁽ˡ⁾ = ∂L/∂z⁽ˡ⁾,对输出层(假设交叉熵 + softmax):
隐藏层的误差信号由下一层回传(链式法则),⊙ 表示逐元素乘积:
权重梯度 = 误差信号 × 上一层激活值,偏置梯度 = 误差信号:
🎛 隐藏层宽度与深度
宽度(每层神经元数)和深度(层数)共同决定网络容量。宽而浅 vs 窄而深各有取舍。
| 结构 | 表现 | 结果 |
|---|---|---|
| 1 层 × 4 神经元 | 容量不足,无法拟合 XOR 等非线性问题 | 欠拟合 |
| 2 层 × 16 神经元 | 容量适中,训练快,泛化好 | 推荐 |
| 3 层 × 64 神经元 | 容量大但训练慢,易过拟合 | 需正则化 |
| 10 层 × 128 神经元 | 梯度消失/爆炸,训练极不稳定 | 需特殊初始化 |
💡 深度比宽度更高效:每多一层相当于组合上一层特征,指数级提升表达力。
💻 前向传播 + 反向传播
两层 MLP 的前向 + 反向传播核心代码(Python):
import numpy as np
# 前向传播
def forward(x, W1, b1, W2, b2):
z1 = W1 @ x + b1 # z1 = W1·x + b1
a1 = np.maximum(0, z1) # a1 = relu(z1)
z2 = W2 @ a1 + b2 # z2 = W2·a1 + b2
a2 = softmax(z2) # a2 = softmax(z2)
return z1, a1, z2, a2
# 反向传播
def backward(x, y, cache, W2):
z1, a1, z2, a2 = cache
dz2 = a2 - y # δ² = ŷ - y
dW2 = np.outer(dz2, a1) # ∂L/∂W2 = δ²·a1ᵀ
db2 = dz2
da1 = W2.T @ dz2 # 回传到 a1
dz1 = da1 * relu_prime(z1) # δ¹ = (W2ᵀ·δ²) ⊙ f'(z1)
dW1 = np.outer(dz1, x) # ∂L/∂W1 = δ¹·xᵀ
db1 = dz1
return dW1, db1, dW2, db2
📚 参考文献与延伸阅读
- Rumelhart, Hinton & Williams (1986). Learning representations by back-propagating errors. Nature — 反向传播算法的奠基论文
- Goodfellow, Bengio & Courville, Deep Learning (2016), §6.5 Back-Propagation — 完整的反向传播推导与计算图
- Nielsen, M. Neural Networks and Deep Learning — 在线教材,用直观图解讲解反向传播
- Calcol: Calculus on Computational Graphs — 计算图视角下的反向传播
📝 课后练习
检验你的理解——答对为止