04-卷积神经网络 核心 预计 30 分钟 ★ 最小路径

卷积运算:局部连接与参数共享

卷积(Convolution)是用一个小尺寸核(kernel)在输入上滑动做局部加权的运算:局部连接只看邻域、参数共享全图复用同一核,两大先验让网络用远少于全连接的参数理解图像的空间结构。

一句话定义

卷积(Convolution)是用一个小尺寸核(kernel)在输入上滑动做局部加权的运算:局部连接只看邻域、参数共享全图复用同一核,两大先验让网络用远少于全连接的参数理解图像的空间结构。

直觉

卷积核像「一张放大镜片拿着扫全图」:镜片(核)只有 3×3 那么小,却用同一副镜片看遍每个位置——看到「竖边」就给高分。全连接像「雇佣 784 个专门管家记每格像素的关系」,卷积像「培训几个通用侦探走遍全图」。

为什么重要

图像不是无结构的向量:相邻像素强相关、特征与位置无关。CNN 用这两条先验把 kp-005 的 MLP 从「参数爆炸 + 忽视空间」中解放出来,成为 2012 年视觉复兴的引擎(kp-019/kp-031)。输出尺寸与参数量的推导是 kp-018 块结构、kp-021 项目设计网络时的每日用公式。

前置知识

  • kp-002(张量形状与 [N,C,H,W] 约定)、kp-005(层的概念)。
  • 库外前置:二维数组的下标运算。

核心概念

  • 卷积核(kernel/filter):如 3×3 的小权重矩阵,滑动加权求和。
  • 特征图(feature map):一个核扫完全图得到的输出平面;c_out 个核得到 c_out 张。
  • 步幅(stride):每次滑动几格,>1 时输出缩小。
  • 填充(padding):输入边缘补零,控制输出尺寸并保住边缘信息。
  • 通道(channel):输入 c_in 张平面,核实际是 c_in×k×k 的三维体,逐平面卷再求和。
  • 感受野(receptive field):某层输出神经元能「看见」的原始输入区域大小。
  • 平移等变性:输入平移,特征图同样平移——参数共享的直接数学后果。

原理与机制

二维离散卷积的逐点定义:输出 O(i,j) = Σ_{u,v} K(u,v)·I(i+u, j+v)(交叉相关的实现形式,深度学习惯称卷积)。三个机制逐条拆解。其一,局部连接:每个输出只依赖 3×3 邻域,权重数从全连接的 H·W×H·W 级降到 c_out×c_in×k×k——224×224 图像上全连接一层需上亿参数,卷积层仅需数千。其二,参数共享:同一个核在所有位置复用,「检测竖边」的能力天然平移不变,这既是参数节约的来源,也是「视觉特征应位置无关」先验的编码。其三,层级感受野:3×3 卷积叠两层,感受野 5×5;叠三层 7×7——小核堆深度的参数效率高于单层大核(kp-019 的 VGG 正是此结论的产物)。输出尺寸公式由滑动的几何关系直接得出:可起始位置数 = (n + 2p − k)/s + 1(向下取整)。转置卷积(上采样)与空洞卷积(不增参数扩大感受野)是两个常用变体,前者见于分割与生成(指路生成方向站点),后者在 kp-021 的 ResNet 变体中可顺带认识。

公式或模型

输出尺寸与参数量(CNN 工程的「九九表」):

输出边长: n_out = floor( (n_in + 2p − k) / s ) + 1
参数量:   P = c_out × ( c_in × k × k + 1 )        (+1 为每核一个 bias)
感受野(层叠 3×3、s=1): RF_l = 1 + Σ_{i≤l} (k_i − 1)

变量说明:n_in 为输入边长,k 为核边长,p 为填充,s 为步幅。例:224→224 保持尺寸需 p=(k−1)/2=1(3×3 核);无填充时 224 经 3×3 核输出 222。

图示

输入 5×5,核 3×3,s=1,p=0 → 输出 3×3

. . . . .        ┌────────┐
. ■ ■ ■ .        │ 3×3 核 │  从左上角开始,每次滑动 1 格
. ■ ■ ■ .   ⊙    └────────┘  每个位置做 9 次乘加
. ■ ■ ■ .        9 个位置 → 输出 3×3 特征图
. . . . .        (同一核在 9 个位置反复使用 = 参数共享)

直观类比

感受野的层叠放大像「多人传话链」:第 1 层每人只听 3 个邻居,第 2 层通过邻居间接听到 5 格外——两层 3×3 的「耳朵」等效一层 5×5,但参数只有后者的 18/25。

实例或案例

把 kp-016 的 MLP 输入层换成卷积视角的账本:MNIST 784→512 全连接,参数 401,408;换成 Conv2d(1, 32, 3, padding=1),参数仅 32×(1×9+1)=320 个,且天然保留二维邻域信息。再算一道尺寸题(kp-021 会直接用到):输入 32×32,Conv2d(3, 64, kernel_size=3, stride=1, padding=1) 输出 64×32×32;再接 stride=2 的卷积则输出 64×16×16。手算与代码 print(x.shape) 对上,即掌握本知识点。

常见误区

  • 「深度学习的卷积就是数学卷积要翻转核」:实现是互相关(不翻转),因为核本身是学出来的,翻不翻转无差别。
  • 忘记核是「通道体」不是平面:3 通道输入的 3×3 核实际有 27 个权重。
  • 「参数共享导致各位置输出一样」:共享的是核,输入各处不同,输出特征图各位置当然不同。
  • 边缘信息丢失不设 padding:层层无填充会让特征图迅速缩没,或边缘信息系统性被忽略。

与其他知识点的关系

kp-018 把卷积组装成块并加入池化;kp-019 的 VGG/ResNet 是本公式的规模化应用;kp-016 的线性层是 k=全图、无共享的退化特例;kp-026 的注意力可视为「数据自适应的动态核」,先验更弱、数据需求更高。

自测题

  1. 推导输出尺寸公式,并算出输入 28×28、核 5×5、s=1、p=0 的输出尺寸。

答案要点:(28+0−5)/1+1=24,输出 24×24。

  1. Conv2d(16, 32, 3) 的参数量?

答案要点:32×(16×9+1)=32×145=4640。

  1. 两层 3×3(s=1)堆叠的感受野是多少?与单层 5×5 比参数量谁省?

答案要点:5×5;前者 2×9=18 个权重/通道对,后者 25 个,且多一次非线性。

延伸阅读

  • LeCun、Bottou、Bengio、Haffner《Gradient-Based Learning Applied to Document Recognition》Proceedings of the IEEE 1998(LeNet 原文)。
  • Goodfellow 等《Deep Learning》第 9 章「卷积网络」。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。