1. 一张猫图暴露全连接网络的三个致命问题
任务:判断一张图里是否有猫。
1.1 问题一:输入特征太多
一张 1000 × 1000 的彩色图片(RGB 三个通道):
如果用一个隐藏层 1000 个神经元的全连接网络:
以 float32 存储:模型大小 ≈ 12 GB。只是加载模型就耗光了显存,更别说训练。
1.2 问题二:局部性 — 全连接太浪费
识别猫时,只需要看猫所在的区域就够了,不需要看整张图的每一个像素。
但全连接网络中,隐藏层的每个神经元都和所有输入像素相连。判断”有没有猫耳朵”只需要局部像素,却被迫接收全图的输入 → 大量无意义的连接浪费了参数。
1.3 问题三:平移不变性
猫在图片左上角还是右下角,都不改变它是一只猫。
全连接网络中,猫在左上角和右下角是两组完全不同的输入(不同的像素位置),网络需要分别学习”左上角的猫”和”右下角的猫” → 同一个模式需要学多遍。
2. 三者的共同根源:参数没共享 — 步兵扫雷的类比
| 视觉问题 | 步兵扫雷 |
|---|---|
| 输入特征多(大图) | 雷区大,不能造一个和雷区一样大的探测器 |
| 局部性(猫只占局部区域) | 地雷只在局部位置,探测只需看一小块 |
| 平移不变性(猫在哪都一样) | 地雷不管在哪都是地雷,属性不变 |
探雷兵的做法
雷区 6×6,探雷器 3×3 — 用一个小的探测器在整个雷区上滑动,从上到下、从左到右扫描每个 3×3 区域。
探雷器 (3×3)
↓
┌─────────────┐
│ · · · · · · │
│ · · · · · · │ 雷区 (6×6)
│ · · · · · · │
│ · · · · · · │
│ · · · · · · │
│ · · · · · · │
└─────────────┘
一个小探测器 + 滑动扫描 = 解决全部三个问题:
| 问题 | 如何解决 |
|---|---|
| 输入多 | 探测器很小,参数量不随雷区大小增长 |
| 局部性 | 每次只看一小块区域 |
| 平移不变性 | 同一个探测器扫过所有位置 → 参数共享,不管地雷在哪都能检测 |
3. 从探雷到卷积
探雷器 (3×3) → 一个局部的"感受野" → 在整张图上滑动 → 卷积核
同一个探测器到处用 → 参数共享 → 卷积核的权重在所有位置复用
这正是卷积神经网络(CNN)的核心思想:
- 小的卷积核(如 3×3)→ 解决输入特征多和局部性问题
- 全图滑动 + 参数共享 → 解决平移不变性问题
4. 总结
全连接网络用在图像上:
├── 1000×1000 图 = 300 万个输入 → 30 亿参数(爆炸)
├── 看猫只需看局部 → 其他像素的连接是浪费
└── 猫在左上和右下 → 同一模式需要学两遍
视觉问题共有的三大特点:
① 输入特征多 → 参数爆炸
② 局部性 → 不需要看到全图
③ 平移不变性 → 同一模式可能出现在任何位置
解法:小探测器 + 滑动扫描 = 卷积
→ 参数少(小核)、局部看(感受野)、参数共享(同核复用)