对计算机来说,照片是一个密密麻麻排满数字的网格。无论是人工设定的特征,还是把像素排成一行的神经网络(MLP),在这个网格面前都很容易动摇。让一个小滤波器在网格上滑动的卷积神经网络(CNN)解决了什么、还有什么没能解决,我们将亲手逐个计算数字来跟进。
把屏幕上的图片放得很大,就能看到一个个小方块(像素)。一个像素是表示亮度的一个数字,如果是彩色,则是红·绿·蓝三个数字。
数字网格通常以 0(黑)到 255(白)的整数存储。输入神经网络时,多数情况下会除以 255,变为 0~1。本页的计算也使用 0~1。一张手机照片(例:4000×3000 彩色)有 3,600 万个数字。数字网格如此之大,这一事实正是后面各节的出发点。
需要区分三种图形(+、×、○)。人设定了两条线索:“中间是否被涂满”、“横·竖条是否比对角线条更深”。机器只学习赋予这两个数字的权重。
这个例子的特征是故意做得很简单。实际上,研究者长期以来设计了精巧得多的特征,例如按区域统计边缘方向。即便如此,照片中物体的位置·大小·光照·角度变化无穷,人很难预先想到所有变化并把它们装进特征里。2012 年,在对 1,000 类照片进行分类的 ImageNet 竞赛中,连特征也自行学习的 CNN 以 15.3% 的 top-5 错误率大幅领先第 2 名(26.2%),潮流随之改变 [R4]。
要把照片输入 3-2 的 MLP(多层感知机),必须把网格展开成一行。我们逐个来看展开那一刻产生的问题。
局部连接 · 权重共享 · 池化 · 层层堆叠Fukushima 1980 → LeCun 1998
| MLP 的问题 | CNN 的解法 | 解决到什么程度 |
|---|---|---|
| ① 邻接关系丢失 | 局部连接:一个神经元只看 3×3 这样的相邻小块 | 把“一起看相邻像素”嵌入了结构之中 |
| ② 权重爆炸 | 权重共享:在所有位置使用同一个滤波器 | 只需 滤波器数 × 9 个。与照片尺寸无关 |
| ③ 位置变化 | 权重共享 + 池化:无论在哪里都由同一个滤波器寻找,池化吸收小的移动 | 相对不太容易动摇。并不完美。移动得多,准确率就会下降(第 8 节) [R6] |
| ④ 忽略像素顺序 | 层层堆叠:把相近的像素组合起来,逐步形成更大范围的形状 | 代价是依赖“相近的像素彼此相关”这一假设。打乱像素,性能就会下降(第 8 节) |
输出 = Σ (输入小块 × 滤波器)6×6 输入 · 3×3 滤波器 → 4×4 输出
把滤波器窗口叠在输入的某个位置上。重叠的 9 格逐格相乘后全部相加,得到的值就是输出的一格。窗口逐格移动并重复。6×6 输入上的 3×3 窗口横向可放 4 个位置、纵向可放 4 个位置,所以输出是 4×4(不做用 0 填充边缘的填充时)。
竖直边缘滤波器左列为 +1,右列为 −1。因此在“左亮右暗”的位置为正数,相反则为负数,均匀时接近 0。神经网络并不由人来设定这些滤波器数字,而是通过反向传播学习。补充一点,深度学习中所说的“卷积”与数学中的卷积不同,不翻转滤波器(互相关)。由于数字是靠训练确定的,结果是一样的 [R8]。
把第 5 节的 4×4 输出经过 ReLU(负数 → 0)后,每个 2×2 窗口只留下一个数字(最大值或平均值)。还要看看把图片移动一格时会有什么变化。
池化把数字减少到四分之一,减轻下一层的计算,并吸收 2×2 窗口内发生的小移动。跨越窗口边界的移动或 2 格以上的移动则会直接改变结果。所以与其说“CNN 对位置变化很强”,不如说“相对不太容易动摇”更准确。实际上有研究表明,即使是知名的大型 CNN,只要把图片移动几个像素,答案也可能改变 [R6]。
把最后的特征图变成一行数字,经过全连接层和 softmax,输出“是 + 的概率、是 × 的概率、是 ○ 的概率”。直接使用预先训练好的第 8 节 CNN。
用 12×12 的 3 种图形共 120 张(各 40 张)进行训练。训练图片全部位于中间(±0.5 格),混有噪声·干扰笔画·旋转·粗细变化。测试使用各 150 张从未见过的图片。
两段代码都只使用 Colab 默认安装的库。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
用与第 5·6 节相同的 6×6 数字“7”和相同的 4 个滤波器,计算卷积 → ReLU → 最大·平均池化。输出的数字与页面上的数字连格子都一致。若要换成自己的数据,只需修改代码中 [换成自己的数据] 标记处的 IMG。
用与第 8 节相同的模型结构和相同的图形规则,在实用库中重做实验。优化器换成了 Adam(40 个轮次),并用 3 个种子重复后取平均。打乱像素时,用按同一规则打乱的数据从头重新训练。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”时,所选代码会一并附在提示词后面。把〔 〕里的内容换成自己的情况即可。
AI 的回答只是起点。它提出的论文·数值·库函数务必对照原文和官方文档核实。如果在竞赛·论文中借助了 AI,请按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线相同的词典。整个系列使用统一的写法。点击章节名可跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。果蝇·大脑类比标注了强度。直接 有证据表明实际在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 果蝇·大脑类比 | 类比失灵之处 |
|---|---|---|---|
| 像素 | 一块马赛克瓷砖 | 部分 果蝇复眼中的一个小眼 | 小眼呈六边形排列,对亮度变化敏感。照片的像素是方形网格中的静止数值 |
| 滤波器 | 只照出特定花纹的放大镜 | 部分 初级视觉皮层的方向选择细胞 [R1] | 神经元的感受野因位置而略有不同。CNN 的滤波器在所有位置完全相同 |
| 权重共享 | 在纸上各处盖同一个印章 | 部分 果蝇视觉系统中同一类神经元在整个视野中重复排列 | 大脑的神经元各自拥有独立的连接强度,并不“共享”数字 |
| 池化 | 把地图缩小复印 | 部分 位置稍有不同也会反应的复杂细胞 [R1] | 复杂细胞是否恰好在做选取最大值的计算,尚未得到证实 |
| 层层堆叠 | 按点 → 线 → 图形的顺序画画 | 部分 视觉通路 V1 → V2 → V4 → 下颞叶皮层(3-1 第 5 节) | 大脑中有许多反馈连接,而 CNN 只朝一个方向流动 |
| 展平 | 把棋盘上的棋子排成一行 | 无 | 排成一行后,“谁是谁的邻居”就消失了(第 3 节 ①) |
| softmax | 把投票结果换算成得票率 | 无 | 得票率高并不代表答案正确。对于从未见过的图片,可能信心满满地答错 |
| 打乱像素 | 按既定规则打乱拼图块 | 无 | 人几乎认不出打乱后的图片,但 MLP 照样能学习。“像人一样看”的标准因模型而异 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片参考资料
以下资料作为结构和内容的参考。
这是面向讲师、实务 OJT 负责人和辅导老师的教学指南。时间为预估值,请根据实际课堂调整。
| 对象 | 学完 3-2 的大学生·职场人士。处理图像数据的从业者(检测影像、医学影像、文档扫描) |
|---|---|
| 先修知识 | 3-2 的隐藏层·反向传播概念。只用乘法和加法就能跟上第 5·6 节的计算 |
| 学习目标 | ① 说明照片是数字网格,并举出 MLP 碰壁的四个原因 ② 手算卷积·ReLU·池化 ③ 用实验结果说明 CNN 对位置变化“相对不太容易动摇,但并不完美” |
| 预计时间 | 阅读 40~50 分钟 · 动画演示 25 分钟 · Colab 实践 30 分钟(代码 1 10 分钟,代码 2 20 分钟) |
导入 5 分钟(第 1 节彩色果蝇的数字)→ 第 3 节四个原因 10 分钟 → 第 5·6 节手算 15 分钟 → 第 8 节仪表板 15 分钟 → 检测题 5 分钟。
用本公司的图像尺寸计算第 3 节 ② 权重爆炸 10 分钟 → 第 8 节 20 分钟(现场摄像头位置变了会怎样?)→ 代码 2 实操 30 分钟 →“我们的数据需要什么样的增强?”讨论 20 分钟 → 提示词卡片 10 分钟。
入门者只看第 1·3·5·8 节。中级者先手算第 5 节输出的一格,再与代码 1 的 conv2d 函数对照,并在第 7 节亲自数一数展平与全局池化的参数数量。
| 章节 | 停下来提问的问题 | 操作提示 |
|---|---|---|
| 1 数字网格 | “果蝇眼睛的红色,在三个通道中分别是什么数字?” | 在彩色果蝇中依次点击红·绿·蓝查看 |
| 2 传统机器学习 | “人工设定的特征为什么在移动后的图片上会崩溃?” | 按 干净图片 → 移动 2 格 的顺序点击,比较准确率条形图 |
| 3 MLP 的局限 | “正下方的像素在一行中相隔几格?” | 在 ② 权重爆炸中点击 1000×1000,让学生被数字之大吓一跳 |
| 4 CNN 的解法 | “为什么共享滤波器后,权重数就与照片尺寸无关了?” | 在层层堆叠中指出一个神经元看到的范围从 3 → 4 → 8 逐步扩大 |
| 5 卷积 | “这个位置的输出为什么是负数?” | 暂停后用“移动一格”一起解读算式 |
| 6 ReLU·池化 | “移动一格时,池化前和池化后哪一边变化更小?” | 交替点击原图和移动 1 格的图片 |
| 7 直到概率 | “展平和全局池化,哪一种对位置更不敏感?” | 选择“移动 2 格的 +”后,交替查看两种方法 |
| 8 对比仪表板 | “在居中的图片上谁赢?在移动后的图片上谁赢?” | 先看移动位置,再切换到打乱像素,观察结果反转 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| 即使位置改变,CNN 也能同样识别 | 只是相对不太容易动摇而已。移动得多准确率就会下降,大型 CNN 也可能因移动几个像素而改变答案 | 第 8 节 移动位置,第 6 节 |
| CNN 总是比 MLP 更准确 | 像本页这样图片总在同一位置时,MLP 有时反而更高。CNN 的优势在于参数效率和对移动的鲁棒性 | 第 8 节 移动 0 格时的准确率 |
| 滤波器由人来设定 | 第 5 节的滤波器是为了说明。实际的 CNN 通过反向传播学习滤波器数字 | 第 7 节中学到的特征图 |
| 池化会增加信息 | 池化在减少数字的同时丢弃信息。作为交换,它吸收小的移动并减少计算 | 第 6 节的 4×4 → 2×2 |
| CNN 和大脑的视觉皮层一样 | 虽然受简单·复杂细胞启发,但学习方法和连接结构不同 | 公共 D 节的“部分”标记 |
224 × 224 × 3 = 150,528 个输入 × 1,000 = 150,528,000 个(约 1.5 亿个)。有 64 个 3×3 彩色滤波器的卷积层是 3 × 3 × 3 × 64 = 1,728 个(含偏置 1,792 个)。
(6 − 3 + 1) × (6 − 3 + 1) = 4×4.
重叠小块的第二行是 [0, 3, 3],滤波器的每一行是 [1, 0, −1]。0×1 + 3×0 + 3×(−1) = −3。第一·第三行全是 0,相加后仍是 −3。
最大 6,平均 (6 + 3 + 0 + 3) / 4 = 3。
是 CNN。CNN 把“相近的像素彼此相关”这一假设装进了结构(3×3 滤波器、池化),而打乱后,相近的格子变成了毫无关系的像素。MLP 本来就不利用像素之间的位置关系,所以打乱后几乎不变。重要的条件是:不是把打乱的图片输入已经训练好的模型,而是用打乱的数据从头训练。
在代码 1 的 FILTERS 中添加一个对角线边缘滤波器,找出 6×6“7”中哪一格反应最大,并用两句话写出原因。
在代码 2 的训练数据中混入移动了 1~2 格的图片(数据增强)。把两个模型在 0~3 格下的准确率如何变化整理成表格,并比较“靠结构获得的鲁棒性”和“靠数据获得的鲁棒性”。
| 入门者 | 跳过第 2 节和第 7 节也不会打断思路。第 8 节只一起看结果条形图 |
|---|---|
| 进阶 | 让学生把第 4 节层层堆叠中的感受野计算(3 → 4 → 8)整理成一般公式。把第 6 节的局限与 [R6] 论文中的表格联系起来讨论 |
| 延伸学习 | Sangsun Ahn,《面向商业的数据科学》讲义(数据科学总览) · STEP [K-数字] 人工智能自然语言处理(与 3-5·3-8 相关) · STEP [K-数字] 金融科技数据分析基础(与 3-6 相关) |
| 讲师用资料 | 检测题的评分标准和作业参考答案可在教师用答案页面(3-3)查看 |
「3-3 图像与 CNN」篇读完啦。实验室的成员们各说一句,帮你总结一下。