TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

卷积神经网络学到了什么:滤波器、感受野、反向传播与 LeNet 和 AlexNet

状态:草稿(2026-10-13),部分实测。 示例是在笔记本电脑 CPU(Python 3.9,numpy 2.0)上直接运行测得的值。代码位于此文件夹的 code/01_conv.py 中,几秒钟即可运行完毕。论文中的数值是查阅原文并连同条件一起摘录的。 写作规则:以实测数据为基础,无法测量的内容标记为「未实测」。

目录

1. 为什么图像需要特殊的结构

手机上的一张照片包含数百万个数字(像素)。如果将这些输入投入普通的神经网络,即 全连接层(每个输入都连接到每个输出的层),连接数量就会呈指数级暴增。仅看单个将 32×32 黑白图像转换为 28×28 大小的 6 个特征图的层,情况即是如此。

方式 需要学习的数字(权重)
全连接层 4,821,600 个
6 个 5×5 卷积滤波器 156 个

(直接计算, code/01_conv.py [5]. 卷积为 6 个滤波器 × (25 + 偏置 1)。)

之所以会产生 3 万倍的差异,是因为图像具有以下两种性质。

  1. 相邻像素之间的关联性很深(局部性)。 要识别球的轮廓,并不需要用到画面对角角落的像素。
  2. 相同的图案无论出现在哪里都是相同的图案(平移不变性)。 屏幕左侧的球和右侧的球可以用相同的方法来查找。

卷积是将这两种假设写入结构中的运算。它只观察小窗口(局部性),并将相同的滤波器应用于整个图像(权重共享)。这种「将假设融入结构」的做法被称为 归纳偏置,在第 7 篇中我们将看到 Vision Transformer 正是因为抛弃了这一点而付出了什么代价。

2. 卷积:滑动小窗口进行乘加运算

합성곱: 3×3 창을 밀며 곱하고 더하기 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 입력 6×6 필터(학습) -1 0 1 -2 0 2 -1 0 1 0 4 4 0 0 4 4 0 0 4 4 0 0 4 4 0 출력 4×4 경계에서만 크다 창 9칸 × 필터 9칸을 곱해 모두 더하면 출력 한 칸 층을 쌓으면 한 칸이 보는 범위(수용 영역)가 넓어진다 3×3 한 층 3px 두 층 5px + 풀링(보폭 2) 6px 3×3 세 층 더 18px
图:3×3 窗口在输入上方滑动,与滤波器相乘并相加,层数堆叠得越深,单个单元的视野范围就越广

计算过程很简单。将 3×3 滤波器(9 个数字)重叠到图像的 3×3 窗口上,将对应位置相乘并全部相加,就能得到一个输出单元。逐个单元滑动窗口并重复此过程,即可完成输出特征图。

# code/01_conv.py 에서
def conv2d(x, k):
    kh, kw = k.shape
    out = np.empty((x.shape[0] - kh + 1, x.shape[1] - kw + 1))
    for i in range(out.shape[0]):
        for j in range(out.shape[1]):
            out[i, j] = np.sum(x[i:i + kh, j:j + kw] * k)
    return out

当我们将垂直边界滤波器(索贝尔滤波器)应用到一个左半部分为 0(暗)、右半部分为 1(亮)的 6×6 图像时,结果如下(实测)。

필터            출력(4×4)
[-1  0  1]      [0 4 4 0]
[-2  0  2]      [0 4 4 0]
[-1  0  1]      [0 4 4 0]
                [0 4 4 0]

仅在亮度发生变化的边界处输出为 4,其余部分为 0。滤波器是一个提出「这种图案在这里吗?」的疑问,而输出特征图则是将该疑问的答案铺展到整张图像上。实际的网络会在单层中放置数十到数百个这样的滤波器,每个滤波器寻找不同的图案(水平边界、对角线、色块等)。

另外,深度学习框架所称的「卷积」与数学教科书中的卷积不同,它是不翻转滤波器的 互相关运算。由于滤波器无论如何都是通过学习确定的,因此翻转与否并没有区别。

3. 滤波器不是手动设定的:损失、反向传播与梯度下降

早期的计算机视觉像上面的索贝尔滤波器一样由人工设计滤波器。CNN 的核心在于 从数据中学习滤波器的数字。学习方法分为三个步骤。

  1. 损失函数:通过一个数字来衡量当前滤波器产生的输出与正确答案相差多少。这里使用的是均方误差(MSE)。
  2. 反向传播:计算如果稍微改变滤波器中的 9 个数字中的每一个,损失会发生多大变化(梯度)。对于卷积而言,将「输出误差」与「输入」再次进行卷积即可得到滤波器的梯度。
  3. 梯度下降:沿着梯度的反方向稍微移动滤波器。 k ← k − 학습률 × 기울기.
# code/01_conv.py 에서 — 필터 k 의 기울기
for x, y in zip(X, Y):
    err = conv2d(x, k) - y                       # 출력 오차
    for a in range(3):
        for b in range(3):
            g[a, b] += np.mean(2 * err * x[a:a + err.shape[0], b:b + err.shape[1]])
k -= lr * g

动手实践:随机滤波器如何变成索贝尔滤波器

我们让 32 张随机图像通过索贝尔滤波器以生成「正确答案输出」,在不知道正确答案滤波器的情况下,从随机滤波器(均值 0,标准差 0.1)出发,以 0.1 的学习率进行梯度下降(实测,笔记本电脑 CPU 约 6 秒)。

步数 损失(MSE)
0 1.064
10 0.730
50 0.193
100 0.037
200 0.0013
500 0.000000

经过 500 步学习到的滤波器是 [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]] ,与正确答案的最大差异为 0.0005。尽管没有人对它说「去寻找垂直边界」,但由于数据需要这样的滤波器,滤波器最终便呈现出了这种形状。如果我们把实际 CNN 第一层的滤波器画成图,边界和色块图案会浮现出来,原因也是如此。

为了验证通过反向传播求得的梯度是否正确,我们将其与 数值微分(通过稍微改变一个数字来直接测量损失变化的方法)进行了比较。最大相对误差一致,达到 6.4×10⁻¹¹。这是在信任自己编写的学习代码之前总值得做的一项检查。

4. 池化与感受野:单个单元的视野范围

卷积单层的一个输出单元仅观察输入的 3×3 区域。要识别整个球或运动员的手臂,必须看得更广。方法有两种。

输出单元受输入影响的范围称为 感受野。每层按 r ← r + (커널 − 1) × j, j ← j × 보폭 进行计算(j 为累积步幅)。如果用 LeNet-5 和 AlexNet 的架构来计算,结果如下(直接计算, code/01_conv.py [4]).

网络 穿过各层的感受野(px) 最终
LeNet-5 5 → 6 → 14 → 16 → 32 输入 32×32 全部
AlexNet 11 → 19 → 51 → 67 → 99 → 131 → 163 → 195 输入 224×224 的绝大部分

池化也是有代价的。降低分辨率会让人类和模型失去 精确位置。虽然对于分类(「这幅图里有猫吗」)来说这不是问题,但对于需要以像素级精度知道球的坐标的任务来说却是致命的。第 3 篇(U-Net·HRNet)正是处理这个问题的。

5. LeNet-5(1998):卷积 + 池化 + 反向传播的原型

LeCun 等人在 1998 年的论文中介绍了用于识别手写数字(MNIST)的 LeNet-5。输入为 32×32 黑白图像。数据中的数字最大也不过 20×20 并且位于 28×28 方格的中央,但他们故意将输入设得更大(这与上述感受野计算中最后一层看到整个 32×32 输入相契合)。

这篇论文展示的是:「特征无需人工设计,可以通过卷积结构和反向传播从头到尾进行学习」。然而,受限于 1998 年的算力和数据,很难处理超出如手写数字般小巧清晰的图像。

6. AlexNet(2012):相同的思想,不同的规模

14 年后,Krizhevsky、Sutskever 和 Hinton 的 AlexNet 在 ImageNet 竞赛(ILSVRC,1000 个类别,约 120 万张训练图像)中以巨大优势获胜。其结构思想与 LeNet 相同,改变的是规模和一些学习技巧。

项目 AlexNet(论文)
规模 6000 万个参数,65 万个神经元,5 层卷积 + 3 层全连接
输入 224×224×3
训练 将网络拆分部署在当时的两张桌面 GPU(3GB 内存)上,历时 5–6 天,将 120 万张图像迭代约 90 次
ILSVRC-2012 测试 top-5 错误率 15.3%(7 个 CNN 的集成)对比第 2 名的 26.2%。单模型验证集为 18.2%
ILSVRC-2010 测试 top-1 37.5%,top-5 17.0%(测试时 10 个裁剪画面的平均值)

「top-5 错误率」是指模型选出的前 5 个答案中没有正确答案的比例。15.3% 是集成模型的数据,这是一个经常被漏掉的条件。

通过查看论文中实际测量的内容,可以看出是什么造成了差异以及「为什么要这样设计」。

总结来说,AlexNet 给我们的教训不是「某一个新点子」,而是 大数据 + 快速计算 + 使大型网络得以训练的各种技巧的组合。此后十年的视觉模型大都建立在这个公式之上。

7. 局限性

8. 与我们项目的关联

TT Score 的寻球模型(WASB·BlurBall)在 2026 年仍然是 卷积神经网络。原因与本文所述完全一致。

详细的结构与实测请参考《TT Score 模型解剖第 2 篇:寻球》。下一篇文章将介绍使深层网络得以训练的残差连接和批归一化。

蒂蒂小结。 我们从没对过滤器说过“去寻找垂直边界”,但在走了 500 步之后,它就变成了索贝尔过滤器。数据会促使过滤器自动变成想要的形状。

参考文献

登录后即可点赞

评论

还没有评论。

登录后即可发表评论