第五章:卷积神经网络

第五章:机器之眼------卷积神经网络与图像的秘密

!info

在第四章中,我们见证了 2012 年深度学习的爆炸时刻:Hinton、Krizhevsky 和 Sutskever 的三人团队用 AlexNet 在 ImageNet 竞赛上以 11 个百分点的巨大优势击溃了所有对手。我们用"三块拼图"(数据 × 算力 × 算法)解释了为什么革命偏偏在那一刻发生。但有一个问题被快速带过了:他们所使用的卷积神经网络里的"卷积",到底是一种怎样的操作?为什么偏偏是它,而不是别的什么架构,在图像识别上如此有效?

这不是偶然,其背后有一个关于图像数据本质结构的深刻洞察------而这个洞察,早在 1989 年 LeCun 还在 Bell 实验室处理邮政编码的时候就已经清晰了。那时候,他还没有 ImageNet,没有 GPU,没有 AlexNet,甚至没有多少同行相信他的方向。但他知道,关于图像,有两件事是真的------而这两件事,改变了一切。

!question

如果一个算法天生就"理解"图像的结构------知道相邻像素之间高度相关、同样的形状无论出现在画面的哪个位置都应该被同样地识别------它会比什么都不知道的通用算法强多少?卷积神经网络用一个简洁的设计回答了这个问题,也揭示了整个深度学习视觉革命最核心的秘密:在正确的地方做出正确的假设,这能产生多大的价值?

5.1、邮局里的深度学习

5.1.1 Bell 实验室的银行家需求

1987 年,美国邮政服务(USPS)正面临着一个棘手的实际工程问题。

在那个时期,每天有数亿封信件在全美流转。每封信的邮编需要被正确读取,才能路由到正确的分拣站。当时,这些邮编是靠人工来读取的------一批分拣工坐在传送带旁边,看信封,读邮编,按键输入。可想而知,这套系统不仅速度慢、成本高,而且出错率相当高。

当时的手写数字识别,是一个让所有工程团队头疼的问题。问题的核心不是"机器看不见数字"------扫描技术已经够好了,而是人类的书写风格复杂多变。邮编上的 "1",可以是一根竖线,可以是带顶划的欧式写法,可以是潦草到几乎平躺的一笔。"7" 在美国人和欧洲移民手里的写法完全不同------欧式 "7" 通常在中间加一横。一个 "4" 写得太马虎了,机器会把它认成" 9";一个 "5" 笔画连起来,又像极了 "6"。手写,从本质上就是把同样的"意义"(例如数字 2)映射到千变万化的"形状"上。当时最好的规则系统------精心手写的模板匹配程序------在理想条件下错误率超过 5%,在真实邮件上超过 10%。

而美国银行也有类似的问题。支票上的金额都是手写的,必须由人工核对。他们每年处理数十亿张支票,因此哪怕 1% 的错误率也将面临巨额的纠纷成本。

后来,AT&T Bell 实验室接了这个项目:想办法用机器自动读取手写数字?

负责这个项目的人,就是 Yann LeCun ,他刚刚完成了他在多伦多大学 Hinton 实验室的博士后研究,正在探索一种专门为图像设计的神经网络架构,因为 LeCun 知道这里存在的一个关键问题:如果将普通的全连接网络用在图像上,这将是一场灾难。

5.1.2 朴素的全连接网络

让我们先暂时抛开历史,用一组简单的数字计算来感受全连接网络处理图像的代价。

1989 年,LeCun 处理的手写数字图像是 32×3232×3232×32 像素、单通道(灰度图)。输入大小是 32×32=102432 × 32 = 102432×32=1024 个数值。如果第一个隐藏层有 1000 个神经元,那么仅这一层的参数数量就是 1024×1000=1021024 × 1000 = 1021024×1000=102 万个。这已经很多了。但如果以 ImageNet 为例,AlexNet 处理的 224×224224×224224×224 的彩色图像,情况会更糟糕:224×224×3=150528224 × 224 × 3 = 150528224×224×3=150528 个输入,第一个全连接层(1000 个神经元)需要的参数数量:150528×1000=1.5150528 × 1000 = 1.5150528×1000=1.5 亿个参数。仅仅一个全连接层,就有 1.5 亿个参数。

而整个 AlexNet 的卷积部分却只有约 2000 万参数------全连接层把参数数量放大了 7 倍以上。

这不只是"参数太多"的问题。参数多意味着:

  • 内存需求爆炸:2012 年的 GPU,显存只有 3-6 GB。1.5 亿参数的仅一个全连接层,本身就要占用约 600MB(每个参数 4 字节)。而整个网络可能有多个全连接层,加上需要存储梯度和优化器状态(通常是参数量的 2-3 倍),根本塞不进 GPU 显存中。

  • 过拟合几乎无法避免:1.5 亿个参数,需要远超这个数量的训练样本才能学到泛化的表示。ImageNet 有 120 万训练图片------每个参数平均只有 0.8 个训练样本。这样的比例下,网络倾向于死记硬背训练集,而不是学到真正的规律。实际上,过拟合不仅仅是模型性能下降,而是根本上无法泛化到新数据------训练集准确率接近 100%,测试集准确率只有 20-30%。

  • 计算量是天文数字:1.5 亿次乘加运算,仅仅是第一层的前向传播。乘上反向传播(大约是前向传播的 3 倍),再乘上训练的 epoch 数(通常 50-100 个),再乘上 batch 中的样本数,整个训练过程的 FLOP 数会让 1990 年代的任何计算设备直接瘫痪。

所以这套方案,其背后实际上是一个根本性的设计错误:

全连接网络的假设是,图像中的每个像素,都和所有其他像素有直接的联系。

这个假设是荒谬的。而且随着所处理图片的分辨率变大,荒谬得越来越离谱------其计算代价是呈平方级增长的。

5.1.3 平移不变性的缺失

平移不变性是一个直觉上显而易见,但在技术上需要显式设计的特性。

例如,想象你正在训练一个全连接网络,教网络识别猫。在训练阶段,你给它看过一万张猫的图片,所有的猫都大致在画面中央。网络学会了认识猫这种生物------更确切地说,学会了"图像中央位置的猫样特征"。

现在,我们给它一张猫出现在画面左侧的图片。

网络会把这张图认成什么呢?大概率不是猫,或者即使识别为猫,其置信度可能也较低。

为什么?因为全连接网络的每个权重,都对应输入的某个特定位置 。图像中央的像素连接到某些权重,图像左侧的像素连接到完全不同的另一批权重。这两批权重学到的东西,完全不共享。从网络的视角看,猫在中央和猫在左侧,是两种完全不同的输入,需要分别学习。

因此要让全连接网络泛化到猫在不同位置的情况,最直接的办法就是在训练数据中包含猫在各种位置的图片------数千张、数万张。但这大幅增加了数据收集和标注的成本,而且永远无法覆盖所有可能的位置、尺度、旋转组合。

而人类的视觉系统会立刻说:那就是只猫,不管它出现在什么位置。

这种"不管物体在哪里,都能认出它"的能力,叫做平移不变性(Translation Invariance)。它是人类和大多数动物视觉的基本特性,但在全连接网络里,需要用大量数据来强行学习------效率极低。

因此 LeCun 意识到,要解决这个问题,需要一种从结构上就"知道图像是什么"的网络。


5.2、卷积计算与视觉的秘密

5.2.1 卷积计算

"卷积"(Convolution)这个词,在数学和信号处理领域有着悠久的历史,远比神经网络的历史还要古老。在信号处理里,卷积是用来描述一个信号如何通过一个系统发生变换的运算。比如:声音经过一个房间的混响、图像经过一个镜头的模糊、不同频段的无线电信号干涉。这些变换,都可以用卷积来描述。

数学中的卷积是一种对两个函数进行"叠加"运算的数学工具,例如,对于两个离散序列 f[n]f[n]f[n] 和 g[n]g[n]g[n](定义在整数域上),卷积公式为: (f∗g)[n]=∑k=−∞∞f[k]⋅g[n−k] (f * g)[n] = \sum_{k=-\infty}^{\infty} f[k] \cdot g[n - k] (f∗g)[n]=k=−∞∑∞f[k]⋅g[n−k]其含义是将序列 ggg 反转(变为 g[−k]g[-k]g[−k])、平移 nnn(变为 g[n−k]g[n-k]g[n−k]),再与 f[k]f[k]f[k] 逐点相乘后求和,得到第 nnn 个位置的卷积结果。

这个公式看起来令人生畏,但实际上我们从中学阶段就一直在应用这个公式,例如多项式相乘本质上就是离散卷积

接下来我们以 f(x)=3x3+x+5f(x) = 3x^3 + x + 5f(x)=3x3+x+5 和 g(x)=4x2+x+6g(x) = 4x^2 + x + 6g(x)=4x2+x+6 来演示卷积计算多项式乘法。按照规则,我们从最低项到最高项([x0,x1,x2,⋯ ][x^0, x^1, x^2,\cdots][x0,x1,x2,⋯])提取各自的系数分为为 [5,1,0,3][5,1,0,3][5,1,0,3] 和 [6,1,4][6,1,4][6,1,4],其中 f(x)f(x)f(x) 中的 x2x^2x2 项缺失,可认为系数为 0。具体卷积计算过程如下:

复制代码
    5 1 0 3   第一步:f(x) 系数按顺序放置
4 1 6                g(x) 系数顺序先翻转,并挪位,尾项与 f(x) 首项对其,重叠部分相乘求和,5x6=30
----------------------
    5 1 0 3   第二步:f(x) 不动  
  4 1 6              g(x) 滑动一位,重新计算重叠部分 5x1+1x6=11
----------------------
    5 1 0 3   第三步:f(x) 不动  
    4 1 6            g(x) 滑动一位,重新计算重叠部分 5x4+1x1+0x6=21
----------------------
    5 1 0 3   第四步:f(x) 不动  
      4 1 6          g(x) 滑动一位,重新计算重叠部分 1x4+0x1+3x6=22 
----------------------
    5 1 0 3   第五步:f(x) 不动  
        4 1 6        g(x) 滑动一位,重新计算重叠部分 0x4+3x1=3
----------------------
    5 1 0 3   第六步:f(x) 不动  
          4 1 6      g(x) 滑动一位,重新计算重叠部分 3x4=12,此时如果再滑,将无重叠,计算结束
----------------------

至此我们已经计算出两个多项式相乘后,各项(按 [x0,x1,x2,⋯ ][x^0, x^1, x^2,\cdots][x0,x1,x2,⋯] 顺序)的系数大小为 [30,11,21,22,3,12][30,11,21,22,3,12][30,11,21,22,3,12],读者不妨自己校验一下结果。

因此在离散的图像处理中,卷积计算演变成了一个非常直观的操作:用一个小矩阵(卷积核/滤波器)在图像上滑动,并在每个位置计算一个加权和。

例如,假设我们有一个 5×55×55×5 的图像,想利用一个 3×33×33×3 的卷积核处理它。我们会把 3×33×33×3 的核放在左上角,把对应的 9 个像素值和核的 9 个权重一一相乘,然后加起来,得到一个单一的输出值。然后向右滑动一步(这叫步长stride),重复计算。再向右滑,直到到达右边界。然后回到左边,向下滑一行,从左到右再扫一遍。这个过程就像拿着一个小窗户在图像上滑动,每个位置都计算一次加权和。

这个操作在图像处理领域很早就有人在使用了------Sobel 边缘检测滤波器(1968 年)、Gaussian 模糊滤波器(如图片处理软件中模糊操作背后的原理)都是卷积操作的具体实例。图像处理工程师早已知道,不同的卷积核可以用来检测边缘、提取纹理、去除噪声等。每一个特定的核都是人工精心设计的,基于对图像处理的数学理解。

LeCun 的创新,是把这个古老的操作和神经网络的学习能力结合起来------让网络自己学习卷积核的权重,而不是要人工设计这些卷积核。这看起来很简单,但它的威力在于:网络可以自动发现哪些卷积核对于特定任务(比如识别猫)是有用的。用人工设计来讲,一个图像处理工程师可能花十年才能积累的卷积核知识库,一个神经网络用几周的训练就能自动学出来。

这个想法,在脑科学里也有回响。

5.2.2 视神经科学的意外发现

1958 年秋天,约翰斯·霍普金斯大学的实验室里,大卫·休伯尔 (David Hubel,1926-2013,加拿大裔美国神经生理学家)和托斯坦·维厄瑟尔(Torsten Wiesel,1924-,瑞典神经生理学家)正在做一件让他们深感沮丧的事情:他们把极细的电极插入了一只麻醉猫的大脑初级视觉皮层(V1 区),然后对着猫的眼睛打光点,试图找到能让神经元发射的刺激。

结果什么都没有。

光点打在视野的这里,神经元沉默。打在那里,还是沉默。他们用遮光板在幻灯片上打了个洞,投影出一个亮点------沉默。换了位置,还是沉默。一整个下午,那根电极的扬声器里几乎只有背景噪声的嗡嗡声。

然而,一个意外在此刻发生了。

当他们在往投影仪里插入一张新的玻璃幻灯片时,幻灯片的边缘在投影屏上划过了一条移动的阴影线------那是幻灯片边框的影子,在屏幕上从上方缓慢扫过。

这时的扬声器里突然爆发出密集的发射音:哒哒哒哒哒哒......

电极旁边的那个神经元被激活了。

Hubel 和 Wiesel 对视了一眼。他们用了几秒钟意识到发生了什么:那里的神经元对圆点并不敏感,但它对移动的边缘线是敏感的。更有意思的是,这个神经元对特定方向的边缘特别敏感。

接下来的几年,他们用一块可以旋转的遮光片系统性地进行测试:这个神经元只对某个特定角度的边缘有强响应------比如 45° 的对角线。换成 90° 的竖线,响应减弱。换成水平线,几乎没有响应。再换一个神经元,它的偏好可能是竖线;再换一个,它对 30° 的斜线特别敏感。

视觉皮层的神经元,是方向选择性的------每个神经元都有它偏好的"方向",像一个挑剔的评委。

他们随后进一步研究发现,这些神经元大致可以分为两类:

  • 简单细胞(Simple Cells):只对特定位置、特定方向的边缘有响应。边缘在哪里,细胞就必须在对应的位置被激活。
  • 复杂细胞(Complex Cells):对特定方向的边缘有响应,但不关心边缘在视野的哪个位置------边缘在任何地方出现,都会触发响应。

复杂细胞的这个特性,被 Hubel 和 Wiesel 解释为:它是由多个简单细胞"汇聚"而成的,汇聚了不同位置上相同方向的边缘信号。这是一种内置的位置不变性

更重要的发现是层次性:V1 区负责检测边缘和方向;信号传入 V2 区,处理更复杂的轮廓和纹理;进入 V4 区,处理颜色和形状;最终到达下颞叶皮层,这里的神经元已经在处理具体的物体------面孔、手、工具。

整个视觉系统就是这样一条从低级特征到高级语义的处理流水线。低级就是边缘和方向,中级是形状和纹理,高级是物体类别。每一层都聚合下一层的信息,形成更抽象的表示。

Hubel 和 Wiesel 凭这项工作获得了 1981 年诺贝尔生理学或医学奖。但在当时,这项工作的计算意义被远远低估了。这种"从基础特征到高级特征的层次化处理",给了 LeCun 和他同时代的研究者重要的启发:人工神经网络也应该被这样组织------用局部的、层次化的特征提取来处理图像。

但这不是刻意的模仿,而是两套系统在解决同一个问题时自然收敛到了相似的结构。值得注意的是,LeCun 在 1989 年设计 LeNet 时,更多参考的是信号处理里的卷积操作,而不是 Hubel-Wiesel 的神经科学------神经科学给的是直觉和信心,不是推导路径。这种相似性是事后发现的,而不是从生物学反向工程出来的。这恰恰说明,自然视觉系统和人工神经网络,在面对相同的问题约束时,独立地发展出了相似的结构解决方案。

图 5.1:人类视觉皮层的层次化处理


5.3、卷积的两个核心假设

LeCun 的卷积神经网络,把关于图像的两个核心假设编码进了网络结构本身。而这两个假设,是卷积网络之所以强大的根本原因。

5.3.1 假设一:局部性

在图像中,只有相邻的像素才会高度相关,而距离较远的像素之间几乎无关。

这个直觉很简单:例如,当我们看到一张猫的照片时,猫耳朵位置的一个像素,和它旁边的像素很可能是相似的颜色(猫毛)。但这个像素和图片右下角某个随机位置的像素,则几乎没有任何关系。

想象一个实际的图像:如果你在看猫脸的细节时,你只需要关注猫脸周围 10×1010×1010×10 像素的区域。你不需要同时看脚爪或者尾巴。这个像素级别的事实对应了一个视觉学事实:图像中的信息是空间局部的。边缘、纹理、颜色渐变,这些视觉元素都是局部现象,不会跨越整张图传递。

因此,当我们要判断一个像素区域"是什么",只需要看它附近的区域即可,而不需要看整张图。这正是卷积核的工作方式------一个 3×33×33×3 的卷积核,在某个位置,只看该位置周围 3×33×33×3 像素的 9 个值。

基于这个假设,卷积网络的每个神经元只连接一个局部区域 (感受野,Receptive Field),而不是整个图像输入。例如,一个 3×33×33×3 的卷积核的感受野是 9 个像素。相比全连接层的 150000+ 个连接,每个神经元的参数数量从十几万降到了个位数。这带来的不仅是参数数量的减少,更是计算复杂度的指数级下降

5.3.2 假设二:平移等变性

图像中的同一种特征,无论出现在图像的哪个位置,识别它的方式是一样的。

对于左上角的竖直边缘和右下角的竖直边缘,它们是同一种东西,就应该用同一种滤波器来检测。同样,对于猫耳朵的尖角形状,无论猫在画面的哪个位置,检测它的权重也应该是一样的。

基于这个假设,卷积网络会使用同一个滤波器扫过整个图像 ------这叫做权重共享 (Weight Sharing)。一个 3×33×33×3 的滤波器,在整张图片上滑动,在每个位置都做同样的操作,用完全相同的权重。

权重共享的效果是:原本需要为每个位置单独学习的权重,现在被共享了------一个 3×33×33×3 的滤波器只有 9 个参数,而这 9 个参数会通过滑窗的方式被用来处理图像中的所有位置。如果图像是 224×224224×224224×224,这个 3×33×33×3 滤波器会被应用 (224−3+1)2≈50000(224-3+1)^2 ≈ 50000(224−3+1)2≈50000 次,但始终使用的是同样的 9 个权重。

基于这两个假设,CNN 网络可以带来两个直接的好处:

参数效率极大提升 。例如,一个 3×3×33×3×33×3×3 的卷积滤波器(3 行 × 3 列 × 3 通道)只有 27 个参数,而不是数十万。如果一个卷积层有 64 个这样的滤波器,总参数数也只有 1728 个------相比全连接层的动辄数百万参数,这是一个巨大的差异。

天然的位置泛化。因为同一个滤波器处理所有位置,它学到的特征识别能力,天然就可以应用到图像的任何位置------不需要为每个位置单独学习。如果你的训练数据中,有猫在画面左侧的样本,那么网络学到的"猫脸检测器"就会自动泛化到猫在其他位置的情况。

这就是归纳偏置(Inductive Bias)的威力。


5.4、归纳偏置:正确的假设如何指数级提升学习效率

5.4.1 什么是归纳偏置

"归纳偏置"的意思是:模型对数据的结构有一定的先验假设,而这些假设决定了模型会从数据里归纳出什么样的规律。所有的模型都有归纳偏置------区别只在于这个偏置是否和数据的真实结构一致。

一个没有任何归纳偏置的模型(比如完全连接的神经网络),它的假设是:"所有东西都可能和所有其他东西有关"。这个假设过于宽泛,意味着模型必须靠数据来排除几乎所有不成立的关系。在图像上,这需要极其大量的样本------"告诉"网络猫在左边和猫在右边是同一种东西,这件对人类直觉显而易见的事情,全连接网络必须花大量数据重新发现。

因此,卷积网络的归纳偏置是:在图像里,像素只与局部像素相关,而特征与其所处的位置无关

这个假设和图像数据的真实统计特性高度一致。自然图像的绝大多数信息都体现在局部的纹理和边缘上;同样的视觉模式(边缘、纹理、形状)无论出现在哪里都应该被同样地识别。这两个假设都是对的------所以卷积网络一旦有了足够的数据,就能快速收敛到有效的特征表示。

5.4.2 用类比理解归纳偏置的威力

我们可以把"从数据里学习"想成探案的过程。

一个没有任何先验信息的侦探,就必须排查整个城市的所有人,逐一进行背景调查、查问不在场证明、验证购买记录。这个侦探可能要花一年的时间才能锁定嫌疑人。

而一个知道案发地点在某栋写字楼的侦探,只需要排查这栋楼的访问记录、监控录像和相关人员。搜索空间缩小了 1000 倍,侦探可能花一周时间就能破案。

再进一步,一个知道案发时间、知道从监控看出嫌疑人穿着的侦探,搜索空间再缩小 100 倍。现在只需要检查那段时间出入该楼且穿着匹配的人名单。

正确的假设,就是把搜索空间从"整个城市"缩减到"某个楼"、再缩减到"那个楼的电梯记录"。

机器学习中的情况完全类似。全连接网络相当于第一个侦探,它对数据结构的假设太弱,必须用大量训练样本来补偿。CNN 相当于第二、第三个侦探,它内建了关于图像结构的假设,从而显著缩小了搜索空间。

把关于问题结构的正确假设编码进模型,可以让学习过程指数级更高效------这是归纳偏置的威力,也是 CNN 在图像任务上碾压全连接网络的根本原因。

这个洞察,后来成为整个深度学习架构设计的核心哲学:

  • Transformer 的归纳偏置是"任意两个位置都可以直接交互",适合序列性模态
  • 图神经网络的归纳偏置是"局部拓扑结构决定节点表示",适合图数据
  • RNN 的归纳偏置是"时间维度有顺序依赖",适合时间序列

每种架构,都是一种关于数据结构的假设------选对了,事半功倍;选错了,事倍功半。


5.5、卷积操作的工程细节

5.5.1 滤波器的三个重要参数:kernel size、stride、padding

现在让我们进入卷积操作的具体工程细节。当一个工程师实现卷积层时,有三个超参数需要进行调整,这直接决定了输出的大小和计算复杂度。

Kernel Size(卷积核大小)

卷积核的大小决定了每次"看"多大的范围。最常见的是 3×33×33×3 的核,这在 VGGNet 中被证明是一个很好的选择。较大的核(如 5×55×55×5、7×77×77×7)能一次看到更大的范围,更宽的视野,但代价是参数更多、计算更重。较小的核(1×11×11×1)则几乎无法捕捉空间信息,通常用于通道维度的处理,而不是空间特征提取。

Stride(步长)

步长决定了卷积核在图像上移动时的跳跃距离。如果 stride = 1,核每次向右移动 1 个像素。如果 stride = 2,核每次向右移动 2 个像素,这样输出会变小。

具体来说,如果输入大小是 WWW,卷积核大小是 KKK,步长是 SSS,那么输出大小约为 (W−K)/S+1(W - K) / S + 1(W−K)/S+1。例如,224×224224×224224×224 的输入,3×33×33×3 的核,stride 为 1,输出就是 (224−3)/1+1=222×222(224 - 3) / 1 + 1 = 222×222(224−3)/1+1=222×222。如果 stride 为 2,输出就是 (224−3)/2+1=111×111(224 - 3) / 2 + 1 = 111×111(224−3)/2+1=111×111------通过增大步长,可以快速压缩空间分辨率,减少后续计算量。

在实际网络中,stride 通常在卷积层中设置为 1 或 2,或者使用单独的池化层来进行下采样。这是一种权衡:用 stride=2 的卷积比用单独的池化层计算量少,但用池化层可以让卷积和下采样的职责更清晰。

Padding(填充)

这里有一个问题是,卷积操作会缩小图像。一个 224×224224×224224×224 的图像,经过一个 3×33×33×3 的卷积,输出变成 222×222222×222222×222。多层卷积后,空间尺寸会快速萎缩。

为了解决这个问题,人们在输入图像周围补充 0(或其他值),这叫做 padding 。如果你在 224×224224×224224×224 的图像周围填充 1 圈 0,输入变成 226×226226×226226×226。再用 3×33×33×3 的卷积,输出变成 224×224224×224224×224------大小保持不变了。

这在网络设计中很重要。例如,在 ResNet 中,残差连接要求两个卷积块的输入和输出大小相同,这通常通过 padding 来实现。不同的 padding 策略(zero-padding、reflection-padding、replication-padding)在不同应用上有细微差异,但最常见的还是 zero-padding。

5.5.2 卷积作为特征检测器:从边缘到纹理

一个卷积滤波器,本质上就是一个模式检测器

以边缘检测为例。图像处理领域早已知道,一个可以用来检测竖直边缘的滤波器卷积核形式为:

复制代码
[-1   0  +1]
[-1   0  +1]
[-1   0  +1]

把这个滤波器应用到图像的某个 3×33×33×3 区域的原理是这样的:将对应位置的像素值和滤波器权重相乘,然后加起来求和。

如果这个区域的左边是暗的(像素值小,比如 50),右边是亮的(像素值大,比如 200),那么:

  • 左列的计算:-1 × 50 = -50
  • 右列的计算:+1 × 200 = +200
  • 两者加起来:-50 + 200 = +150

得到一个较大的正数------强响应,检测到竖直边缘。而如果这个区域整体是均匀的(没有边缘),左右像素值相差不大,比如都是 100,加权和接近于零------弱响应,没有竖直边缘。

这个原理非常直观:滤波器的权重设计得能够"响应"某种特定的视觉模式。检测水平边缘的滤波器会是:

复制代码
[-1  -1  -1]
[ 0   0   0]
[+1  +1  +1]

检测左上-右下对角线边缘的滤波器会是:

复制代码
[-1   0  +1]
[ 0   0   0]
[+1   0  -1]

在 CNN 里,这些滤波器的权重不是人工设计的 ,而是通过训练自动学出来的。在 AlexNet 的可视化(Zeiler & Fergus 2014 做了系统的可视化工作)里,第一层学到的滤波器自发地呈现出各种方向的边缘检测器、颜色渐变检测器------非常类似 Sobel、Gabor 等人工设计的滤波器,但并不完全相同。

网络并没有被告知"每个卷积核应该学什么样的边缘或者特征检测",它是从图片数据的统计规律里自己发现了这是个有用的特征。更深层的卷积层则学到了更复杂的特征------不只是边缘,而是纹理、形状、部件等。

机器之眼,看到了和人类工程师花十年才总结出来的同样的东西------但它只花了几天训练。这不只是技术进步,而是一种对人类专业知识积累方式的根本性颠覆。

5.5.3 卷积核的其他变体:为不同场景优化

除了基础的卷积之外,研究者们还开发了各种变体,以应对特定的实际需求。

分组卷积(Group Convolution)

在标准卷积中,一个卷积核会同时处理输入的所有通道。但这有时不是必要的。分组卷积把输入通道和输出通道分成若干组,每组独立进行卷积计算。比如,如果输入有 64 个通道,分成 8 组,那么每组只有 8 个通道,每组的卷积核也相应地变小。

这大幅减少了参数数量和计算量。例如,原本 3×3×64×643×3×64×643×3×64×64 的卷积有 36864 个参数;分组卷积(8 组)变成 8×(3×3×8×8)8 × (3×3×8×8)8×(3×3×8×8) = 4608 个参数------少了 87.5%。

分组卷积最著名的应用是 AlexNet 中的设计。由于 2012 年的 GPU 显存有限,AlexNet 的某些层采用分组卷积来节省显存占用。后来,MobileNet 和其他移动端网络也大量采用分组卷积来减少计算。

深度可分卷积(Depthwise Separable Convolution)

这是分组卷积的一个特殊形式,也是 MobileNet 的核心创新。它把一个普通卷积分解成两个更小的卷积:

  1. 逐深度卷积(Depthwise Convolution):对每个输入通道独立进行卷积,卷积核个数等于输入通道数
  2. 逐点卷积(Pointwise Convolution) :用 1×11×11×1 卷积进行通道之间的线性组合

例如,一个 3×33×33×3 的卷积,输入 32 通道、输出 64 通道,标准做法需要 3×3×32×64=184323×3×32×64 = 184323×3×32×64=18432 个参数。用深度可分卷积,需要 3×3×32+1×1×32×64=288+2048=23363×3×32 + 1×1×32×64 = 288 + 2048 = 23363×3×32+1×1×32×64=288+2048=2336 个参数------少了 87.3%。

计算量同样大幅减少,但精度损失很小。这是为什么 MobileNet 能在手机、平板等资源受限的设备上达到不错准确率的关键。

空洞卷积(Dilated Convolution)或膨胀卷积

在某些任务中(比如语义分割),需要在保持空间分辨率的同时扩大感受野。空洞卷积通过在卷积核的权重间插入"空洞"(即 dilation factor)来实现。

例如,一个 3×33×33×3 的标准卷积看的是相邻的 9 个像素。一个 dilation=2 的 3×33×33×3 卷积,看的是间隔为 2 的 9 个像素------有效感受野是 5×55×55×5,但参数数量仍然只有 9。这对于需要大感受野但计算资源有限的场景特别有用。

可形变卷积(Deformable Convolution)

标准卷积的感受野是固定的矩形网格。但对于复杂形状的物体(比如扭曲的文字、弯曲的道路),固定的矩形感受野可能不是最优的。可形变卷积允许卷积核的采样位置动态调整,即卷积核会"畸变"以适应图像中的非矩形结构。

这在 2017 年由何恺明等人提出,在物体检测和分割任务中显示了性能提升,但计算复杂度也相应增加,因此主要用于需要高精度的场景,而不是实时处理。


5.6、感受野的逐层扩张:从局部到全局

单个卷积层只看局部(3×33×33×3),那怎么处理整张图的信息?答案是通过堆叠。

第一层 :每个输出神经元看输入的 3×33×33×3 区域,感受野 = 3×33×33×3。

第二层 :以第一层的输出为输入。第二层的一个 3×33×33×3 卷积核,看第一层输出的 3×33×33×3 区域。而第一层输出的 3×33×33×3 区域,对应原始输入的 5×55×55×5 区域。所以第二层的感受野 = 5×55×55×5。

第三层 :同理,感受野 =7×7= 7×7=7×7。

依次类推,第四层 =9×9= 9×9=9×9,第五层 =11×11= 11×11=11×11......

如果卷积核使用步长 stride=2,感受野会扩大得更快。例如,如果每一层都用 stride=2,那么感受野会以 2 的幂速率增长:3 → 7 → 15 → 31 → 63......

在 AlexNet 的五层卷积后,实际感受野已经覆盖了整个 224×224 的输入(因为确实有步长大于 1 的卷积,感受野扩大得更快)。

这是卷积网络的深刻设计:通过局部操作的层层堆叠,把局部信息聚合成全局表示。不需要全连接的暴力连接,也能综合整张图的信息。

而且,这种层次化聚合有一个额外的好处:不同层提取了不同抽象程度的特征

  • 第一、二层:边缘、纹理、颜色渐变
  • 第三、四层:形状、结构、部件(比如"圆形"、"毛发纹理")
  • 第五层及全连接层:物体级别的语义特征("这是一只猫")

这种层次化表示,和 Hubel-Wiesel 发现的视觉皮层层次结构惊人地相似------不是因为 LeCun 刻意模仿,而是因为两者都在解决同一个问题:如何从低分辨率的局部信号,逐步构建高层的语义理解。


5.7、池化与下采样:在精度和效率间权衡

卷积层提取了特征,但还需要一个操作来压缩信息 ,同时提供额外的稳定性和平移容错。这就是池化(Pooling)。

5.7.1 最大池化:保留最强的声音

最常见的池化方式是最大池化(Max Pooling)。

把特征图分成不重叠的 2×2 区域,在每个区域里只保留最大值:

复制代码
    输入特征图:
              [1  3 | 2  0]     经过 2×2 最大池化:
              [2  4 | 1  5]  →  [4  5]
             -------|-------    [3  4]
              [0  1 | 3  2]     
              [3  2 | 1  4]

这个操作做了什么?

空间压缩 :224×224224×224224×224 的特征图经过 2×22×22×2 最大池化,变成 112×112112×112112×112------减少了 75% 的数据量,后续层的计算量随之下降。这意味着你的网络不需要处理那么多数据,训练速度会加快,显存占用会减少。

特征筛选 :最大值代表"该区域内,这个滤波器的最强响应"。换句话说,只要这个区域内的某个位置有这种特征,我们就认为这个区域有这种特征------不需要精确的位置信息。这是一个定位不敏感性的特征,对分类任务很有帮助。

轻微的平移容错 :假设一个特征在位置 (10, 10) 有强响应,图像轻微移动后,响应可能在 (11, 10)。但如果两个位置都在同一个 2×22×22×2 的池化窗口里,最大池化的输出不变------对小范围的平移不敏感。这给了网络一定的鲁棒性,使得网络对微小的图像变化(比如物体微微移动、微微旋转)不那么敏感。

这第三点,和我们在第四章讲残差连接时的思路类似:在设计中显式处理掉你知道会发生的变换,而不是依赖数据来学习。

5.7.2 其他池化方式

除了最大池化,还有平均池化(Average Pooling)------取区域内的平均值,而不是最大值。平均池化在某些任务上更合适,比如它对大范围特征的整体强度更敏感,对异常值更不敏感。如果一个区域里大多数值都是 3,但有一个 100 的异常值,最大池化会取 100,而平均池化会忽视这个异常值,取一个接近 3 的值。

全局平均池化 (Global Average Pooling,GAP)是另一种特殊形式:把整张特征图(比如 7×7×5127×7×5127×7×512)压缩成一个向量(512 维),每个通道取一个平均值。

这个操作有一个巨大的优势:它完全消除了空间维度,但保留了通道维度的信息。而且,它不引入任何额外参数------GAP 是一个完全无参数的操作。

GoogLeNet 大量使用全局平均池化来代替传统的全连接层。想象一下,如果有 7×7×10247×7×10247×7×1024 的特征图,接一个全连接层到 1000 类,需要 7×7×1024×1000=50007 × 7 × 1024 × 1000 = 50007×7×1024×1000=5000 多万个参数。但用 GAP,只需要平均每个通道,然后用一个 1024→1000 的全连接层(约 100 万参数)。这是一个数量级的差异。

5.7.3 1×11×11×1 卷积:通道维度的瑞士军刀

在这里值得提一个经常被忽视但极其实用的卷积操作:1×1 卷积

顾名思义,1×11×11×1 的卷积核,感受野只有 1 个像素。这看起来毫无意义------它什么局部信息都学不到。但 1×11×11×1 卷积做的不是空间处理,而是通道处理 :把一个位置上的 CCC 个通道的值线性组合成 C′C'C′ 个通道。

这个操作有两个实际用途:

降维(减少计算量) :如果特征图是 7×7×5127×7×5127×7×512,你要接一个 3×3×5123×3×5123×3×512 的卷积(输出 256 通道),标准做法需要的参数是 3×3×512×256≈1183 × 3 × 512 × 256 ≈ 1183×3×512×256≈118 万。但如果先用 1×11×11×1 卷积把 512 通道压缩到 64 通道,再做 3×33×33×3 卷积,参数变成 1×1×512×64+3×3×64×256≈181×1×512×64 + 3×3×64×256 ≈ 181×1×512×64+3×3×64×256≈18 万------减少了约 85%。计算量相应降低,网络训练更快。

升维(增加表达能力) :在某些场景下,可以用 1×11×11×1 卷积把通道数从少扩展到多,相当于增加了特征的维度,而不需要改变空间分辨率。这在融合多尺度特征时特别有用。

通道融合 :在 Inception 模块中,不同大小的卷积并行处理,最后用 1×11×11×1 卷积融合它们的输出,选择性地组合来自不同尺度的特征。

GoogLeNet 的 Inception 模块大量使用了 1×11×11×1 卷积作为"bottleneck"(瓶颈)来控制计算量,ResNet 的深层版本(ResNet-50/101/152)也用了同样的设计------先降维、再处理、再升维,让极深的网络在可控计算代价下成为可能。


5.8、经典架构演进:从 LeNet 到 ResNet 与之后

5.8.1 LeNet-5:第一个真正落地的深度学习系统

1989 年,LeCun 在 Bell 实验室设计了第一版卷积网络,用于识别手写邮政编码。1998 年,他发表了 LeNet-5,一个更完整、更成熟的版本。

LeNet-5 的架构非常简洁:

复制代码
输入(32×32) → 卷积(6个5×5核) → 池化 → 卷积(16个5×5核) → 池化 → 全连接 → 输出(10类)

参数量:约 6 万个。在那个时代,这已经是一个"大"网络了。

LeNet-5 被用于美国邮政系统的支票邮编识别,最终处理了 AT&T 美国邮递服务中大约 10%-20% 的手写支票读取任务。换算一下这个规模:美国每年处理约 400 亿张支票,10% 就是 40 亿张------这不是一个实验室演示,而是每天数千万张真实支票在真实流水线上被 LeNet-5 处理。在错误率上,LeNet-5 也达到了 1% 以下的误读率,优于此前所有人工规则系统。

这是深度学习第一次真正的、有统计意义的商业化落地。 它不只是在测试集上表现好,而是在美国最大的金融基础设施之一里,日复一日地处理真实业务。

LeCun 多年后回忆,当时有人会来找他参加商务演示,他会拿出笔记本电脑,现场演示 LeNet-5 读取手写数字------总是能引起观众的震惊反应。一个机器在实时读取手写的、参差不齐的邮编,而且准确率比当时大多数人工方法更高------这在 1990 年代是令人瞠目结舌的场景。

但他也回忆了一种深刻的无奈。

尽管 LeNet-5 在商业上是真实有效的,1990 年代的主流 AI 学术社区对这个工作几乎不感兴趣。 原因不是效果不好------效果有目共睹。原因是那个时代有一个更时髦、更"有理论根基"的替代品:支持向量机(Support Vector Machine,SVM)。

SVM 在 1990 年代横扫了机器学习竞赛和学术排行榜。它有严格的数学理论------凸优化、核函数、最大化间隔------可以证明在某些条件下保证收敛到全局最优。更重要的是,它的性能好、训练数据需求量相对小,在各种基准测试上以微弱差距胜过或平手 LeNet-5。在那个时代,神经网络是"工程技巧"的代名词------你需要仔细选择架构,要调超参数,没有任何理论保证它会收敛,也无法解释为什么它有效。SVM 的理论洁净感,让神经网络显得土气。

LeCun 在这场争论中是孤独的。他坚持认为卷积网络的设计原则是正确的,是可扩展的,是未来。但当时没有足够的数据来证明"大"的神经网络比"小"的更好,也没有足够的算力来训练真正大的网络,所以他的坚持很难被检验。

在 Bell 实验室的一次内部报告里,LeCun 用 LeNet-5 在一个测试集上的结果和 SVM 做了对比,两者几乎持平。听报告的研究员转身问他的同事:"所以他们为什么不用 SVM 呢?"

LeNet-5 在那十年里,很像一颗被人忽视的珍珠。 它有实际的价值,但学术界看不到。直到 2012 年 AlexNet 的爆发,才终于证明了 LeCun 的执着。这段挫折期,从 LeNet-5 在 1998 年到 AlexNet 在 2012 年,足足等了 14 年。LeCun 在这 14 年间坚持深度学习研究,即便大多数同行都转向了 SVM。这是对信念的考验。

5.8.2 AlexNet 之后:深度的觉醒

第四章已经详细讲过了 AlexNet(2012)、VGGNet(2014)、ResNet(2015)的技术细节和历史背景。这里我们从架构设计哲学的角度再来补充一些细节。

AlexNet 的设计 是大胆的、有些杂乱的:混用 11×1111×1111×11、5×55×55×5、3×33×33×3 的卷积核,靠实验找到好的超参数。这是 2012 年的风格------没有太多理论指导,就是跑实验,看什么有效。AlexNet 成功后,后来的研究者逐渐意识到:不是所有的卷积核大小都有用,设计可以更有原则。

VGGNet 的设计哲学 是"简洁产生效率":只用 3×33×33×3 的卷积核,所有结构判断都靠这个最小单元。

为什么 3×33×33×3 是最优选择?VGG 的论文给出了一个漂亮的数学论证:

  • 两个连续的 3×33×33×3 卷积,感受野等同于一个 5×55×55×5 卷积,但参数量是 2×32=182 × 3^2 = 182×32=18,远小于 52=255^2 = 2552=25
  • 三个 3×33×33×3 = 一个 7×77×77×7 的感受野,参数量 3×9=273 × 9 = 273×9=27,远小于 72=497^2 = 4972=49

用更多小卷积核堆叠代替大卷积核:相同的感受野,更少的参数,同时因为有了更多非线性激活层,表达能力反而更强。而且,更多小卷积核意味着更多的非线性函数,网络的"弯曲"程度更高,可以拟合更复杂的函数。

这个设计原则,后来成了 CNN 架构设计的主流思路之一。

ResNet 的残差连接,我们在上一章详细讲过了。这里强调一个有趣的视角:

残差连接的核心是让网络学习增量 (Residual),而不是目标函数本身。这在某种程度上类似人类学习的方式------你已经会做某件事了,当你学习"做得更好"时,你学的是"在已有基础上改进什么",而不是"从零开始学怎么做"。

这个"学增量比学目标函数更容易"的直觉,在后来的 Transformer 架构中也被保留了下来------每个 Transformer 层同样有残差连接。

5.8.3 轻量化网络的时代:为移动设备而生

2012 年到 2015 年间,CNN 的发展方向主要是追求更深、更准确------ResNet 推到 152 层,网络变得越来越深。但随着深度学习应用的落地,一个新的需求出现了:

能不能在手机、平板、嵌入式设备上跑深度学习?

手机 GPU 的算力只有服务器 GPU 的千分之一,内存只有几个 GB。一个 ResNet-50 有 2500 万参数,就算用 FP16 半精度,也要占用 50MB 的内存------对手机来说是一个沉重的负担。更别提运行时的计算,ResNet-50 的一次前向传播需要 40 多亿次浮点计算,在手机 GPU 上需要好几秒。用户不可能等待。

这催生了一系列轻量化网络(Lightweight Network),目标是用尽可能少的参数和计算量,实现尽可能好的准确率。

MobileNet(2017,Howard 等,Google)

MobileNet 的核心创新是深度可分卷积,我们在前面已经详细介绍过了。通过这个技巧,MobileNet 把标准 CNN 的参数从几千万降到几百万,计算量也相应大幅下降。

例如,MobileNet v1 在 ImageNet 上的准确率达到 70.6%,参数只有 430 万------相比 ResNet-50 的 2500 万参数,只有 1/6。而且执行速度快了 10 倍以上。

MobileNet 的设计还包含了一个重要概念:宽度乘数(Width Multiplier)------通过一个超参数来统一缩放所有通道数,实现"在准确率和速度之间灵活权衡"。如果你的设备资源非常受限,就降低宽度乘数,换取更快的速度;如果资源充足,就提高宽度乘数,换取更高的准确率。

ShuffleNet(2017,Zhang 等,Face++ / Megvii)

ShuffleNet 在深度可分卷积的基础上,引入了通道混洗(Channel Shuffle)操作。在深度可分卷积中,不同通道的信息被分离处理,可能导致某些通道之间缺乏交互。通道混洗通过在某些操作后随机重排通道顺序,让不同通道之间有机会交互,从而在保持高效率的同时提升准确率。

ShuffleNet 的参数数甚至比 MobileNet 更少,但在相同的计算预算下,准确率反而更高。

EfficientNet(2019,Tan & Le,Google Brain)

EfficientNet 提出了一个更系统的思路:复合缩放(Compound Scaling)。

当要缩小一个网络以适应更小的设备时,该怎么缩呢?我们可以减少网络的深度(层数),或者减少宽度(通道数),或者降低输入分辨率。但这三个维度应该怎样平衡?

EfficientNet 通过大量实验发现,最优的平衡是这三个维度按特定的比例共同缩放。例如,如果计算预算增加 2 倍,最优的方案是深度增加 1.3 倍、宽度增加 1.2 倍、输入分辨率增加 1.2 倍。

基于这个发现,EfficientNet 推出了一个系列:从 EfficientNet-B0(最小)到 EfficientNet-B7(最大),覆盖从手机到云服务器的各种场景。EfficientNet-B0 只有 390 万参数,但准确率达到 77.1%------比 MobileNet 更轻量但识别率更准确。

5.8.4 特殊应用:超越分类

CNN 的应用远不止图像分类。在 LLM 时代到来之前,CNN 在多个领域产生了重大影响。

目标检测

仅仅知道"图里有什么"还不够,很多应用需要知道"它在哪里"。这推动了目标检测(Object Detection)的发展。

2015 年,Faster R-CNN (何恺明等)提出了一个优雅的框架:先用 CNN 提取特征,然后用一个区域建议网络(Region Proposal Network,RPN)自动生成候选的物体位置,再在这些区域上进行分类。这个框架成为了后来目标检测的标准范式。

同时,YOLO(You Only Look Once,Redmon 等)提出了完全不同的思路:不生成候选区域,而是直接用一个 CNN 预测整张图里所有物体的位置和类别。YOLO 的速度比 Faster R-CNN 快得多,更适合实时应用(比如自动驾驶、视频监控)。

这两条路线------准确率优先(Faster R-CNN)和速度优先(YOLO)------一直并行发展到今天,代表了准确性和效率的两种取舍。

语义分割

比目标检测更难的是语义分割(Semantic Segmentation):为图像中的每个像素分类。比如,在一张街道图里,把所有属于"汽车"的像素标为红色,属于"行人"的像素标为蓝色。

这个任务需要高分辨率的空间信息,但标准的 CNN 经过多层池化后,空间信息损失殆尽。FCN (Fully Convolutional Networks,Long 等,2015)的创新是:用卷积取代全连接层(所以叫"fully convolutional"),并引入上采样(Upsampling)把分辨率恢复回原图大小。

后来的 U-Net(Ronneberger 等,2015)更进一步:用跳跃连接(Skip Connection,类似 ResNet)在下采样时保留高分辨率特征,在上采样时把它们融合回来。U-Net 虽然名字里有个"U"形,但核心思想就是:往下采样提取信息,往上采样恢复分辨率,在这个过程中通过跳跃连接保留细节。

这个设计在医学图像分割(肿瘤检测)和其他需要像素级精度的任务上大放异彩。

人脸识别与验证

CNN 在人脸识别上的应用引发了一系列伦理和技术问题。从技术上,人脸识别分为两个子任务:

  1. 人脸检测:从图像中找出人脸的位置(和目标检测一样)
  2. 人脸识别/验证:判断两张人脸是同一个人

对于人脸识别,关键不在于分类准确率,而在于学到一个好的人脸特征表示 。一个常用的思路是:训练一个 CNN,让它学会把同一个人的不同照片映射到特征空间的同一个点附近,把不同人的照片映射到不同的点。这叫做人脸嵌入(Face Embedding)。

FaceNet (Schroff 等,Google,2015)用一个叫三元组损失(Triplet Loss)的技巧来实现这个目标。三元组损失的思想很简单:给定一张人脸 A(锚点)、另一张同一个人的人脸 A+(正样本)、以及不同人的人脸 B(负样本),损失函数要求 A 和 A+ 的距离尽可能小,A 和 B 的距离尽可能大。通过这个损失函数的训练,FaceNet 学到的特征在同人验证任务上达到了 99.6% 的准确率------实际上超过了人眼。

这项技术的出现也引发了关于监控、隐私、偏见的广泛讨论,这也是我们在后续章节会涉及的话题。

风格迁移

还有一个有趣的应用:用 CNN 进行风格迁移(Style Transfer)------把一张图的风格应用到另一张图上。比如,用梵高的《星月夜》的风格重绘一张现代照片。

这背后的思想是:CNN 的不同层学到不同的特征。浅层学到颜色和纹理(风格),深层学到物体形状和内容(语义)。通过分别优化"内容的相似度"和"风格的相似度",可以生成既保留原内容又应用新风格的图像。

这不仅是一个艺术应用,也验证了我们对 CNN 分层特征的理解------低层和高层确实在处理不同的东西。


5.9、迁移学习:CNN 学到的是通用的视觉语言

5.9.1 真正的验证:把 ImageNet 模型搬到任何地方

AlexNet 在 ImageNet 上的 1000 类分类竞赛只是一个起点。2013-2015 年,研究者开始做一个更重要的实验:把在 ImageNet 上训练好的 AlexNet 直接搬到完全不同的任务上,观察它的特征是否还有效。

答案让所有人惊呆了。

医学图像:把 AlexNet 预训练权重搬到皮肤癌分类任务上,只需要在最后几层做少量调整("微调",Fine-tuning),在几千张医学图像上训练------结果比从零开始训练的专用模型还要好,有时甚至接近皮肤科专科医生的水平。注意:皮肤癌图像和猫狗图像在视觉上几乎没有任何关系。

卫星遥感:把 ImageNet 预训练的 CNN 用于从卫星图片里识别建筑物、道路、农田------这类图像从拍摄角度、比例尺、色彩分布上都和 ImageNet 的自然图像完全不同。但预训练特征依然有效,显著优于从零开始训练。

艺术风格识别:CNN 能区分不同画家的风格、不同时代的艺术流派------这对人类来说需要多年艺术训练才能掌握的微妙差异,CNN 在看过 ImageNet 之后已经具备了识别这类视觉模式的基础能力。

工业检测:把 ImageNet 预训练模型微调,识别工厂流水线上的产品缺陷。缺陷检测和猫狗分类完全是两码事,但特征迁移工作得很好。

医学诊断:利用 CNN 识别 X 光片中的肺结节、乳腺钼靶中的肿瘤。这些医学应用最终拯救了生命,证明了深度学习不只是学术上的成就,而是有真实的医疗价值。

为什么会这样?

这其实就是"归纳偏置"。CNN 的局部性和权重共享假设,正好对应了自然图像中普遍存在的统计规律:局部纹理、边缘方向、颜色渐变------这些特征不只在 ImageNet 里有用,在几乎所有视觉数据里都有用。

CNN 学到的不是"如何识别 ImageNet 里的 1000 种物体",而是"如何读懂自然图像的视觉语言"。 这个视觉语言是通用的,无论具体任务是什么,这个底层语言都有帮助。

5.9.2 迁移学习:一场实践革命

这个发现在工程实践层面带来了一场革命。

2012 年以前,如果你想开发一个"识别 X"的视觉系统(X 是任意物体、场景或模式),你需要:

  1. 收集大量 X 的标注图片(数万甚至数十万张)
  2. 手工设计或选择合适的特征描述子(SIFT、HOG、Color Histograms......)
  3. 在这些特征上训练 SVM 或其他分类器
  4. 反复迭代,可能需要几个月

这个过程的瓶颈是什么?标注数据特征工程。收集数万张标注图像很昂贵,而且需要领域专家手工设计特征。

2012 年之后,工程路径变成了:

  1. 收集数百到数千张 X 的标注图片(数量要求降低 10-100 倍)
  2. 下载一个在 ImageNet 上预训练好的 CNN(AlexNet、VGGNet、ResNet......)
  3. 把最后几层替换掉,用收集到的数据微调(通常只需要微调后面几层,前面的卷积层可以冻结)
  4. 几个小时到几天之内得到超过之前最好方法的结果

这种"预训练 + 微调"的范式,被称为迁移学习(Transfer Learning)。它把深度学习的能力从"顶尖研究团队的专属"变成了"任何工程师都能用的通用工具"。

当时正在斯坦福大学的 Andrej Karpathy 在 2014 年的博客里写道:

不要再从头训练 CNN 了。把 ImageNet 预训练的网络当成一个特征提取器------它提取的特征,几乎对所有视觉任务都有价值。

这个建议,在接下来几年里成了整个计算机视觉工程实践的默认出发点。它改变了一个行业的工作方式。

今天,如果你要做一个计算机视觉项目,"从 ImageNet 预训练模型开始"已经是常识,而不是"新发现"。这说明深度学习不仅改变了技术,还改变了我们做工程的思维方式。

CNN 的价值,不只是在 ImageNet 上赢了一场竞赛------它给了整个视觉领域一种通用的特征语言,一个不需要从零开始的起点。这个起点,让几乎所有视觉应用的开发成本降低了一到两个数量级。


5.10、卷积的局限:当假设与现实不符

5.10.1 归纳偏置的代价:正确的假设,错误的场景

归纳偏置是一把双刃剑。

在正确的场景里,正确的归纳偏置让学习指数级高效------这是 CNN 在图像上成功的原因。但在错误的场景里,错误的归纳偏置比没有任何偏置更糟糕:它会让模型系统性地忽略数据中真正有信息量的结构,即使提供再多的训练样本,也可能无法高效学到正确的东西。

卷积的两个假设------局部性和平移等变性------在图像上高度成立。但一旦数据的结构与这两个假设不符,卷积在大多情况下并不是一个首选的框架。

假设的边界,就是卷积的边界。

5.10.2 语言:长程依赖打破了局部性假设

自然语言是打破卷积局部性假设最典型的例子。

考虑这个句子:"这家餐厅的服务员态度很好,菜品的摆盘也很精致,只是味道......实在不敢恭维。"

这句话的情感倾向,由最后半句的"实在不敢恭维"决定,这是一个强烈的负面信号。但这个关键的否定,与整句话的开头之间隔了大约 40 个字------远远超出了任何合理的卷积窗口大小。即使你用一个 7×77×77×7 的卷积核(看周围 7 个词),也无法跨越整个句子。

对于 CNN 来说,它只能看到局部窗口的每个片段------"这家餐厅的服务员态度很好"的局部判断是正面的,"实在不敢恭维"的局部判断是负面的。但这两个局部判断如何融合成正确的整体判断?CNN 没有一个自然的机制来处理这种跨越整个序列长度的依赖关系

更深层的问题是:语言的意义不是"空间局部"的,而是"上下文全局"的。 同一个词在不同的句子、不同的上下文里可能有完全相反的意思。"好"这个字,在"味道好"里是正面的,在"好难吃啊"里是强调词,在"你这道菜......好"(配上停顿和语气)里可能是讽刺。要理解它的意义,必须看整个上下文,而不是它旁边的几个字。

卷积的滑动窗口,从根本上无法捕捉这种结构。

2014-2016 年,研究者们确实尝试过把卷积用于文本处理------TextCNN(Kim 2014)用不同大小的卷积核(如 3、4、5)提取 n-gram 特征,在文本分类任务上效果不错。但一旦遇到机器翻译、问答、阅读理解这类需要深度语义理解的任务,TextCNN 就力不从心了。它可以提取局部的词组特征,但无法理解"这个句子里的'他'指的是第三段里的那个人物"这类跨越整个文本的指代关系。

5.10.3 时序数据:位置信息至关重要

卷积的第二个假设------平移等变性------在图像里是一个优点。一只猫在画面左边和在右边,本质上是"同一个东西",应该用同样的特征检测器。但在时序数据里,平移等变性变成了一个缺陷

时间序列的位置信息是有意义的。 一个股价的波动模式,在三年前和现在出现,对预测的意义是完全不同的------背景、市场状态、经济环境都变了。一首音乐里,同样的旋律主题在第一小节和最终高潮前出现,承担的情感功能截然不同。"位置无关"不是时序数据的特性,而是它需要被显式建模的关键维度。

用卷积处理时序数据,等于在告诉模型"三年前的同样模式和今天的意义相同"------这个假设绝大多数情况下是不正确的。

更麻烦的是可变长度问题。卷积的核是固定大小的,处理固定输入。对于自然语言这样长度从几个字到几千字不等的序列,卷积要么用 padding 强行补齐(引入噪声),要么需要设计复杂的多尺度结构(增加工程复杂度),都是在绕开问题而不是真正解决问题。

5.10.4 图数据:局部性的定义不成立

还有一类数据,卷积不只是不擅长,而是从根本上无法适用:图数据(Graph Data)。

分子结构、社交网络、知识图谱、交通路网------这些数据里,"距离"和"局部"的定义本身就是由图的拓扑结构决定的,而不是由欧几里得空间的距离决定的。

一个分子里,两个原子之间的"距离"是化学键的数目,而不是它们在二维图示里的像素距离。一个社交网络里,两个用户之间的"关系强度"取决于他们有多少共同朋友、互动频率,而不是他们在某个矩阵里的相对位置。

CNN 处理图像时,"3×33×33×3 局部"这个概念有清晰的空间定义。但把一个分子图"铺"成一个矩阵,然后用 3×33×33×3 的卷积核处理,是没有意义的------这个操作没有物理/化学的对应解释,也无法捕捉分子的拓扑结构信息。

这催生了一个全新的研究方向:图神经网络(Graph Neural Networks,GNN)------它有自己的归纳偏置,是专门为图数据结构设计的。

5.10.5 卷积的局限:推动了什么

卷积的这些局限,并不是一种缺陷的暴露------它们是历史进程的催化剂。

正是因为 CNN 在序列数据上的局限,研究者开发了 RNN 和 LSTM ,为序列建模引入了"记忆"机制。但 RNN/LSTM 也有自己的问题(梯度消失、顺序处理慢、难以捕捉极长程依赖)。这些问题,又推动了注意力机制 (Attention)的诞生------"不假设局部性,让每个位置都可以直接关注任意其他位置"。注意力机制最终演化成了 Transformer(2017),彻底放弃了局部性假设,在语言、图像、语音等几乎所有模态上刷新了历史记录。

每一代技术的局限,都精确地描绘了下一代技术需要解决的问题。

卷积的局限,不是故事的终点,而是故事的转折点。

5.11、 LeCun 的三十年:信念与验证

2018 年,美国计算机学会(ACM)将图灵奖授予 LeCun、Hinton 和 Yoshua Bengio 三人,表彰他们在深度学习领域"从概念到关键技术"的贡献。

LeCun 在获奖感言里回顾了那漫长的三十年------从 1989 年在 Bell 实验室的第一个想法,到 1998 年 LeNet-5 的完成,再到被学术界冷落的 14 年,再到 2012 年 AlexNet 突然让所有人都看见了。他用一句极其平静的话总结了这段历程:

"我们知道它是对的,只是需要时间让世界看到。"

这不是自信,而是对科学直觉的坚守。在没有 GPU、没有大数据、没有论文接收的时代,LeCun 和少数几个信徒坚持认为卷积网络是未来。当 SVM 统治了 1990 年代的机器学习时,他们没有放弃。当审稿人拒掉他们的论文说"SVM 已经够好了"时,他们继续写代码、跑实验。

这三十年不仅仅是一个人的故事,而是深度学习作为一个学科从被否定到被认可的完整周期。它教会我们一个关于科学的真理:对的想法有时候需要等待正确的时刻------足够的数据、足够的算力、足够的生态。 但最重要的是,有人愿意坚持,直到那个时刻到来。

卷积神经网络的诞生、冷落、复兴、统治,是人工智能历史上最动人的一幕。


5.12、知识自检

读完本章,你应该能做到:

  • 用具体数字说明全连接网络处理图像时参数爆炸的严重程度
  • 解释"平移不变性"对图像识别的重要性,以及全连接网络为什么天然缺乏它
  • 描述卷积的两个核心假设(局部性、平移等变性),以及它们对应图像数据的哪些真实特性
  • 用滤波器权重矩阵的例子,解释一个卷积核如何"检测竖直边缘"
  • 理解 stride、padding、kernel size 这三个参数如何影响卷积的输出大小
  • 解释分组卷积、深度可分卷积、空洞卷积各自解决什么问题
  • 计算两层、三层 3×3 卷积堆叠后的感受野大小
  • 解释最大池化如何实现降维、特征筛选和轻微平移容错
  • 用 VGG-16 的架构说明"前半段特征提取、后半段分类"的设计逻辑
  • 用"侦探缩小搜索范围"的类比解释归纳偏置的威力
  • 说出 LeNet-5 在 1990 年代被主流学界忽视的真实原因,以及 LeCun 坚持了多久
  • 对比 LeNet、AlexNet、VGGNet、ResNet 的设计哲学
  • 解释 MobileNet 和 EfficientNet 如何在有限计算预算下实现准确率和效率的平衡
  • 解释迁移学习为什么能奏效------为什么在 ImageNet 上训练的特征,能迁移到医学图像或卫星遥感
  • 说出目标检测(Faster R-CNN、YOLO)和语义分割(FCN、U-Net)的核心思路
  • 解释卷积在什么类型的数据上会失效,以及这为什么引出了后来的 RNN 和 Transformer

5.13、常见误解

❌ "卷积好主要是因为它减少了参数数量"

✅ 实际上:减少参数只是表象。根本原因是卷积正确地编码了图像数据的结构 ------局部相关性和平移等变性。一个参数数量很少的模型,如果假设不对(比如一个随机稀疏连接的网络),也不会比全连接更好。参数少、效果好,是正确假设的结果,而不是直接原因。好的假设自动带来参数效率。
❌ "卷积提供了完全的平移不变性"

✅ 实际上:卷积层本身提供的是平移等变性(equivariance),不是平移不变性(invariance)------特征的激活位置会随物体位置移动(输入移动,输出也移动)。池化层提供了一定程度的不变性,但范围很小(仅在池化窗口内)。完全的平移不变性需要全局平均池化,而这会丢失位置信息,对检测任务有害。理解这个区别,能帮你判断什么时候需要加入池化,什么时候不应该加。
❌ "更深的卷积网络一定更好"

✅ 实际上:深度带来更大感受野和更强表达能力,但也带来训练困难(梯度消失)和计算代价。在 ResNet 之前,超过 50 层的网络训练误差反而更高("退化问题")。深度需要配合残差连接、批归一化等技术才能真正发挥作用。无脑加深度是行不通的。
❌ "1×1 卷积没用,感受野只有 1 个像素"

✅ 实际上:1×1 卷积的妙处不在空间处理,而在通道处理和降维。它可以用大幅更少的参数实现与大卷积核类似的感受野(通过跨越多层)。在 ResNet 和 MobileNet 这样的高效网络中,1×1 卷积是设计的关键。
❌ "CNN 学到的特征是针对 ImageNet 的,迁移到其他任务会失效"

✅ 实际上:CNN 学到的不是"如何识别猫狗",而是"如何读懂图像的底层结构"------纹理、边缘、色彩、轮廓。这些东西在医学图像、卫星图、手写数字、任何视觉数据里都存在。预训练特征的泛化能力,正是 CNN 最强大的地方。
❌ "卷积在 NLP 中完全无用"

✅ 实际上:卷积可以用于文本(TextCNN),在文本分类任务上有不错表现。关键是:卷积擅长提取局部 n-gram 特征,适合不太需要全局上下文的任务。但对于需要长程依赖的任务(翻译、问答),卷积确实不够,需要 RNN 或 Transformer。这是架构与任务的匹配问题,不是卷积本身的缺陷。
❌ "深度学习的精髓是让模型完全自主地从数据里学规律,不需要人工注入任何先验假设"

✅ 实际上:所有实用的深度学习模型都有显式的归纳偏置 ------CNN 的局部性和权重共享,RNN 的时序假设,Transformer 的全局注意力------这些都是人工设计的先验假设。深度学习减少的是人工特征工程(手工提取边缘、纹理等特征),而不是结构上的先验知识。区别在于:这些先验被编码进了架构设计,而不是特征定义。"端到端学习"不等于"没有先验"。
❌ "MobileNet 和 EfficientNet 的准确率比 ResNet 低很多"

✅ 实际上:在相同的计算预算(浮点计算次数)下,MobileNet 和 EfficientNet 的准确率可以和 ResNet 相当甚至更高。关键是比较的是"等计算量"而不是"等参数量"。一个有 50M 参数的网络可能比一个有 10M 参数的网络慢得多(因为参数多不等于计算多)。轻量化网络的意义是在实际运行环境(手机、边缘设备)的约束下达到最佳精度。

本章关键词

词汇 简明定义
卷积(Convolution) 用小滤波器在输入上滑动、计算加权和的操作,实现局部特征提取
卷积核(Kernel) 卷积操作中的权重矩阵,通过与输入的逐元素相乘和求和来检测特定特征
感受野(Receptive Field) 特征图上的某个神经元,对应到原始输入的哪个区域
权重共享(Weight Sharing) 同一组滤波器权重,被用于输入图像的所有位置
步长(Stride) 卷积核在图像上移动时的跳跃距离,影响输出大小
填充(Padding) 在输入周围添加额外的像素(通常是0),防止空间大小快速缩小
平移等变性(Translation Equivariance) 输入平移,输出特征图也平移相同距离(不改变特征本身)
平移不变性(Translation Invariance) 输入平移,输出的整体结论不变(需要额外的全局池化等机制)
归纳偏置(Inductive Bias) 模型对数据结构的先验假设,影响学习效率和泛化能力
特征图(Feature Map) 卷积层的输出,表示某种特征在输入空间各位置的响应强度
最大池化(Max Pooling) 取局部区域内最大值的下采样操作,实现降维和平移容错
全局平均池化(Global Average Pooling) 把整张特征图的每个通道平均到一个值,是无参数的降维操作
批归一化(Batch Normalization) 对 mini-batch 数据做标准化,稳定训练并支持更大学习率
内部协变量转移(ICS) 深度网络训练中,每层输入分布随前层参数更新而持续变化
1×1 卷积 在通道维度做线性变换的卷积,用于升维/降维和通道融合
Bottleneck 设计 先降维、再处理、再升维的卷积块设计,减少计算量
分组卷积(Group Convolution) 把输入通道和输出通道分成若干组,独立进行卷积计算
深度可分卷积(Depthwise Separable) 分解为逐深度卷积和逐点卷积两个步骤,大幅降低参数量
空洞卷积(Dilated Convolution) 在卷积核权重间插入"空洞"来扩大感受野,同时保持参数数量
可形变卷积(Deformable Convolution) 允许卷积核的采样位置动态调整,适应非矩形结构
迁移学习(Transfer Learning) 预训练 + 微调范式,利用 ImageNet 等预训练模型快速适应新任务
目标检测(Object Detection) 识别图像中物体的位置和类别(如 YOLO、Faster R-CNN)
语义分割(Semantic Segmentation) 为图像中每个像素分类(如 FCN、U-Net)
人脸嵌入(Face Embedding) 把人脸映射到特征空间,相同人的不同照片距离近,不同人距离远
梯度消失(Vanishing Gradient) 反向传播时梯度被逐层衰减,导致深层参数无法更新

延伸阅读

  • 必读 :LeCun, Y., Bengio, Y., & Hinton, G.(2015). "Deep Learning." Nature, 521, 436-444. 三位奠基人的综述,第一、二节讲卷积网络
  • 必读 :LeCun, Y. 等(1998). "Gradient-Based Learning Applied to Document Recognition." Proceedings of the IEEE. LeNet-5 的完整论文,是深度学习实际落地的最早里程碑
  • 推荐 :Krizhevsky, A., Sutskever, I., & Hinton, G. E.(2012). "ImageNet Classification with Deep Convolutional Neural Networks." NeurIPS. AlexNet 论文,开启了现代深度学习时代
  • 推荐 :Simonyan, K., & Zisserman, A.(2015). "Very Deep Convolutional Networks for Large-Scale Image Recognition." ICLR 2015. VGGNet 论文,对小卷积核堆叠的深度网络有很好的分析
  • 推荐 :He, K., Zhang, X., Ren, S., & Sun, J.(2016). "Deep Residual Learning for Image Recognition." CVPR. ResNet 论文,引入残差连接,彻底解决深度网络的训练问题
  • 推荐 :Ioffe, S., & Szegedy, C.(2015). "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift." ICML 2015. 批归一化原论文,写得清晰且有大量实验数据
  • 推荐 :Zeiler, M.D., & Fergus, R.(2014). "Visualizing and Understanding Convolutional Networks." ECCV 2014. 系统性地展示了 CNN 各层学到了什么,是理解 CNN 工作原理的最好参考
  • 推荐:Howard, A. G., et al.(2017). "MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications." MobileNet 论文,深度可分卷积的经典应用
  • 推荐 :Tan, M., & Le, Q. V.(2019). "EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks." ICML 2019. 复合缩放的系统研究,轻量化网络的新思路
  • 深入 :He, K., et al.(2016). "Identity Mappings in Deep Residual Networks." ECCV 2016. ResNet 的改进版本,对残差连接有更深的分析
  • 深入 :Long, J., Shelhamer, E., & Darrell, T.(2015). "Fully Convolutional Networks for Semantic Segmentation." CVPR. FCN 论文,把卷积网络扩展到像素级任务

!tip

下一章预告:CNN 的卷积窗口是固定的,擅长的是局部特征和空间不变性。但文本数据完全是另一种结构------词序决定语义,前后文跨越任意距离,上下文的依赖随时可能贯穿整个句子。解决序列问题,我们需要一种能"记住历史"的网络结构。而在此之前,先让我们讨论一些工程上的问题:怎样才能高效地训练这些深度网络?优化算法、学习率调度、权重初始化、分布式训练------这套工程工具箱,是深度学习成为现实的幕后英雄。

相关推荐
且去填词1 小时前
Claude Code Skills 实践:从提示词到专业化 AI 开发工作流
人工智能·ai编程·开发·claude code·skills
Csvn1 小时前
Prompt工程技巧
人工智能
Agent手记1 小时前
RPA元素定位报错“已死”?实在Agent v7.3.4 TARS AI定位从根上解决,附实操
人工智能·rpa
王者鳜錸1 小时前
企业解决方案十一-各类小程序定制开发
图像处理·人工智能·小程序·大模型·语音处理·定制开发
Bode_20021 小时前
AI时代下加速制造企业创新
大数据·人工智能·机器学习
阿水实证通1 小时前
STATA CLI:我把 Stata 接进了命令行,也接进了 AI 工作流
人工智能·ai·经济学·实证分析
qq_411262421 小时前
CozyLife 墨水屏 + Find My / Google 双防丢四博 AI 智能音箱方案
人工智能·智能音箱
easyllm1 小时前
【无标题】
人工智能
人工智能培训1 小时前
如何定义和测量“通用具身智能”
大数据·人工智能·机器学习·prompt·agent