Post

卷积神经网络CNN

卷积神经网络CNN

Image Classification

目标: 给定一张输入图片,输出对各类别的概率分布(猫、狗、树……)

关键设置:

  • 所有输入图片必须是相同尺寸(例如 100×100)
  • 输出是一个 one-hot 向量 ŷ:维度 = 模型能识别的类别数量
  • 模型预测输出 y' 是一个概率向量(经过 softmax)
  • 损失函数:y'ŷ 之间的交叉熵(Cross Entropy)

计算机如何“看”一张图片

截屏2026-04-11 19.39.38

图片对计算机来说不是一个平面网格,而是一个 3D 张量(Tensor)

1
2
形状:[高度 × 宽度 × 通道数]
例如:100 × 100 × 3
  • 高度 & 宽度 = 分辨率(像素数量)
  • 通道数(Channel) = 颜色平面:RGB 彩色图 = 3 个通道;灰度图 = 1 个通道
  • 张量中每个数值 = 像素强度(取值范围 [0, 255] 或 [0, 1])

什么是 Tensor(张量)? 是标量(0维)、向量(1维)、矩阵(2维)向更高维度的推广。3D 张量就是一个三维数值数组。

输入全连接网络前需要“拉直”

要把图片输入标准神经网络,需要将 3D 张量展平(Flatten)成 1D 向量:

1
100 × 100 × 3 = 30,000 个输入值

为什么不直接用全连接(fully connected)网络?

截屏2026-04-11 19.41.04

参数量爆炸。 以 100×100×3 的输入、1000 个隐藏层神经元为例:

1
参数量 = 30,000 × 1,000 = 3 × 10^7(三千万个参数)

这不仅计算量巨大,更重要的是:它完全忽略了图像本身的结构特性

我们不妨想想,处理图像时,我们真的需要“全连接”吗?

答案是不需要。原因来自对图像的三个观察。

三个观察 → 三个设计决策

观察一:模式是局部的

  • 关键特征(鸟嘴、眼睛、翅膀)远比整张图片小得多
  • 一个神经元不需要看整张图,只需要看一个小的局部区域
  • 浅层学习基础检测器(边缘、角点);深层学习高级检测器(鸟嘴、眼睛)

设计决策:感受野(Receptive Field)— 局部连接

观察二:相同的模式会出现在不同位置

  • 在左上角学到的“鸟嘴检测器”,在右下角同样适用
  • 为每一个位置都单独训练一个检测器 → 极度冗余且浪费

设计决策:参数共享(Parameter Sharing)

观察三:下采样不会改变物体的类别

  • 把一张鸟的图片隔一个像素抽一个 → 还是能看出是鸟
  • 可以对图像降采样以节省计算,同时不损失分类能力

设计决策:池化(Pooling)

截屏2026-04-11 19.49.25

感受野(Receptive Field)

每个神经元不再连接全部 30,000 个输入,而只连接一个局部小区域

对于fully connected network,它可以选择看全局,也可以选择只看一个小范围(把许多weight设为0即可),但是对于receptive field来说,只能看到小范围!

截屏2026-04-11 19.55.19

典型设置:

  • 卷积核大小(Kernel size):3×3(在空间上覆盖 3×3 区域,跨越所有通道)
  • 每个神经元的参数数量:3×3×C 个权重 + 1 个偏置(C = 通道数)
  • 不同感受野之间相互重叠(由 stride 控制)
  • 添加 Padding (补值,通常有补0、补平均,等等)使感受野能覆盖图像边缘
  • Stride(步长):每次移动感受野的像素数(stride=2 → 空间尺寸减半)

注意: 同一个感受野位置上可以有多个神经元,它们使用不同的权重,检测该区域内的不同模式。

Receptive Field的设计可以完全由设计者决定,完全可以大胆发挥!

截屏2026-04-11 19.59.27

参数共享(Parameter Sharing)

核心思想: 相同的模式可以出现在图像的任意位置,因此可以在所有位置使用同一套权重(即同一个滤波器 Filter)。

  • 位于不同位置、但“做同一件事”的神经元 → 共享参数
  • 这就是参数共享

从操作角度来说:一个 Filter 会在整张图像上滑动(卷积)

重要区分: 同一位置上检测不同模式的两个神经元,参数不共享 — 它们对应不同的 Filter。

典型设置:

  • 每个感受野位置对应一组神经元(例如 64 个)
  • 这 64 个神经元分别对应 64 个不同的 Filter
  • 所有位置共用这 64 个 Filter → 参数量大幅减少

从receptive field到parameter sharing,我们不断在限制模型的弹性。CNN的弹性小,model bias就大。

卷积层(Convolutional Layer)

将Receptive Field和Parameter Sharing结合,就得到了卷积层

理解卷积层有两种等价视角:

神经元视角滤波器视角
每个神经元只看一个局部感受野每个 Filter 是一个小权重张量(3×3×C)
不同位置的神经元共享参数每个 Filter 在整张图像上滑动
→ 同一个检测任务在每个位置都执行→ 每个 Filter 输出一张“特征图”

这两种视角描述的是完全相同的操作 — 只是两种理解方式。

具体计算过程(以灰度图 C=1 为例)

给定一张 6×6 的图像和若干滤波器(如课件中的 Filter 1、Filter 2),每个 Filter 以 stride=1 在图像上滑动,在每个位置计算点积,输出一张特征图(Feature Map)(6×6 输入 + 3×3 卷积核 + stride=1 + 无 padding → 4×4 输出)。

截屏2026-04-11 20.30.41

卷积层的输出:

  • 若有 64 个 Filter,输出就是一个带有 64 个通道的“图像”(每个 Filter 对应一个通道)
  • 空间尺寸略有缩小(或加 padding 保持不变)

截屏2026-04-11 20.30.00

多层卷积叠加

第一层输出(64 通道)作为第二层的输入:

  • 第二层的 Filter 形状变为 3×3×64(跨越全部 64 个通道)
  • 深层 Filter 可以检测低层特征的组合模式
  • 第 1 层:检测边缘 → 第 2 层:检测角点、曲线 → 第 3 层+:检测眼睛、嘴巴……

无需担心 3×3 的 Filter 只能检测小范围的模式。 虽然每个 Filter 的尺寸只有 3×3,但 CNN 通常由多个卷积层叠加而成。第二层的输入是第一层的输出特征图,而特征图中的每一个值,都已经融合了原图上一个 3×3 区域的信息。因此,第二层的 3×3 Filter 实际上”看到”的是原图上一个 5×5 的区域。层数越深,有效感受野(Effective Receptive Field) 就越大,深层神经元最终可以捕捉到图像中的大范围模式。

顺便补充一个有用的规律:每多叠一层 3×3 卷积(stride=1),有效感受野就在每个方向上扩大 2 个像素,即 每层 +2,k 层后有效感受野为 (2k+1) × (2k+1)。这也是为什么现代网络(如 VGG)倾向于用多个小 Filter 叠加,而非直接用一个大 Filter。

池化(Pooling)— 最大池化(Max Pooling)

Pooling是没有需要学习的东西的(更像sigmoid、ReLu那种activation function)

动机: 对图像进行下采样,不会改变它代表的物体类别。

最大池化操作:

  • 取一个 2×2 区域 → 输出其中的最大值
  • 空间尺寸减半
  • 通道数不变(池化对每个通道独立进行)

截屏2026-04-11 20.38.05

示例:

1
2
3
4
5
输入(4×4):             经过 2×2 最大池化后:
3  -1  -3  -1
-3   1   0  -3    →       3   0
-3  -3   0   1            3   1
3  -2  -2  -1

池化的作用:

  • 减小空间尺寸 → 后续层参数量减少
  • 引入一定的平移不变性(小范围的位置偏移不影响最大值)
  • 提升计算效率

注意: 池化是一种启发式的工程选择,并非数学上必须的。现代网络有时会跳过池化,因为计算能力越来越强了(例如 AlphaGo 就不使用池化)。

完整的 CNN 架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   输入图像(H × W × 3)
        ↓
   卷积层(学习各种 Filter)
        ↓
   池化层(降采样)
        ↓
   卷积层(提取更深层特征)
        ↓
   池化层 
        ↓
   ......
        ↓
   Flatten(3D → 1D 向量,即把向量拉直成一个向量)
        ↓
   全连接层(Fully Connected)
        ↓
   Softmax
        ↓
   输出:各类别概率

卷积层负责提取特征;末尾的全连接层负责最终的分类决策

核心视角:CNN = 加了约束的全连接网络

CNN 不是一种全新的网络结构 — 它本质上是一个施加了两个约束的全连接网络

  1. 局部连接(感受野)→ 每个神经元只连接局部小区域
  2. 参数共享 → 不同位置的神经元使用相同的权重

这两个约束大幅减少了参数量,并向模型注入了图像领域特有的归纳偏置(Inductive Bias)

权衡: 更强的模型偏置(对数据结构做了更强的假设)→ 灵活性降低,但在图像任务上泛化能力大幅提升。全连接网络对图像来说是”样样都会,样样稀松”。

应用案例:AlphaGo 与 CNN 在图像之外的应用

为何把棋盘当作图像处理?

  • 棋盘是一个 19×19 的矩阵(结构与灰度图完全相同)
  • AlphaGo 使用 48 个通道(编码气、提子、历史落子等信息)
  • 输入张量:19×19×48

CNN 为何适用于围棋?

  • 观察一成立: 局部棋形(如“接触”、“征子”)是关键且局部的
  • 观察二成立: 左上角的棋形和右下角的同一棋形,战略意义完全相同
  • AlphaGo 第一层使用 5×5 的 Filter(感受野比常规图像 CNN 略大)

AlphaGo 为何不使用池化?

  • 观察三对围棋不成立: 对棋盘进行下采样会破坏信息(每个交叉点都至关重要)
  • 棋盘没有空间冗余 — 你不能对棋盘降采样后还正常下棋
  • 重要启示:三个观察并不总是同时成立,需要根据具体任务判断哪些组件适用、哪些应当舍弃。

这是一个很好的例子:理解归纳偏置的适用条件,而不是盲目套用架构。

其他领域的应用

CNN 的两个核心特性(局部模式 + 平移不变性)可以推广到二维图像之外:

CNN 的局限性

局限说明
对缩放和旋转不具备不变性旋转 45° 的猫可能无法被识别;需要数据增强(Data Augmentation)
感受野大小固定难以同时捕捉非常局部和非常全局的模式
池化会丢失位置信息Max Pooling 只保留“有没有”,丢失了“在哪里”(Capsule Network 尝试解决此问题)
依赖空间局部性假设如果任务本身不具备局部结构,CNN 的归纳偏置反而有害

对缩放/旋转问题的解决方案:

  • 工程方案:数据增强(展示经过翻转、旋转、缩放的样本)
  • 更本质的方案:Spatial Transformer Network(可学习的几何变换层)
This post is licensed under CC BY 4.0 by the author.

Trending Tags