第 10 章 卷积网络(Convolutional networks)

返回目录

本章一句话:图像又大、又有空间结构、还能平移旋转,用全连接网络处理会参数爆炸且效率低下;卷积层用“局部连接 + 权重共享”这一招,既大幅减少参数,又天然尊重图像的空间关系,由此搭出的就是卷积神经网络(CNN)。

读这章的收获:理解为什么图像需要专门的网络结构,分清不变性与等变性,掌握卷积的核心零件(卷积核 / 步长 / 填充 / 扩张 / 通道 / 感受野),看懂下采样(池化)与上采样(转置卷积),并认识 AlexNet、VGG、YOLO、语义分割等经典架构。


本章速览

  • 全连接不适合图像,原因有三:① 维度太高(224×224 RGB ≈ 15 万维输入,一层就要上百亿权重);② 它把每个像素一视同仁,没有“邻近”概念;③ 图像平移后语义不变,但全连接得在每个位置重新学一遍同一个模式。
  • 卷积层的两个法宝局部连接(每个输出只看附近一小片输入)+ 权重共享(同一套权重滑过整张图)。参数大减,且不随图像变大而增多。
  • 不变性 vs. 等变性:分类要的是平移不变(图平移,结论不变);逐像素的分割要的是平移等变(图平移,输出跟着同样平移)。卷积层本身是等变的,池化带来部分不变性
  • 卷积的四个旋钮:卷积核大小(看多大范围)、步长 stride(隔几格算一次)、填充 padding(怎么处理边界)、扩张率 dilation(在权重间插零,以少量权重覆盖大范围)。
  • 通道(channel)= 多个并行的卷积核,各自产出一张特征图;深层网络里输入和隐藏层都是多通道的。
  • 感受野随层数加深而扩大:一个深层单元最终能“看见”输入中越来越大的区域,信息逐层汇聚。
  • 下采样(步长卷积 / 最大池化 / 平均池化)缩小空间尺寸;上采样(复制 / 反池化 / 双线性插值 / 转置卷积)放大尺寸;1×1 卷积只改通道数不改空间。
  • 经典应用:图像分类(AlexNet、VGG,越深越强)、目标检测(YOLO)、语义分割(编码器-解码器 / 沙漏网络)。

10.0 为什么图像需要专门的网络

第 2–9 章讲的都是全连接网络:从输入到输出只有一条路径,每个输入都连到下一层每个单元。这对图像来说很糟糕,原因有三:

  • 维度太高。一张分类用的图像常是 224×224 的 RGB,即 150,528 维输入。全连接网络的隐藏层通常比输入还大,于是哪怕只有一层,权重数就会超过 150,528²,约 220 亿——训练数据、内存、算力都吃不消。
  • 不懂“邻近”。相邻像素在统计上强相关,但全连接把每对输入都同等对待。哪怕把训练图和测试图的像素用同一种方式随机打乱,网络照样能训练,效果几乎没差别——说明它根本没利用空间结构。
  • 平移要重学。一张树的图片向左平移几个像素,仍然是树,但每一个输入都变了。全连接网络只好在每个位置分别学习“什么样的像素代表树”,显然浪费。

卷积层对症下药:它独立处理每个局部区域,并在整张图上共享同一套参数。于是参数更少、利用了邻近像素的关系、也不必在每个位置重新学习像素的含义。主要由卷积层构成的网络就是卷积神经网络(CNN)


10.1 不变性与等变性(Invariance and equivariance)

上面提到,图像的某些性质(比如树的纹理)在变换下是稳定的。这里把这个直觉写得更精确。设 \(t[\cdot]\) 是一种对图像的变换(平移、旋转、翻转、扭曲……)。

不变性(invariance):函数 \(f[\mathbf{x}]\) 对变换 \(t\) 不变,当且仅当

\[f\big[t[\mathbf{x}]\big] = f[\mathbf{x}].\]

也就是说,不管输入怎么变换,输出都一样。图像分类网络就该是平移(以及旋转、翻转、扭曲)不变的:哪怕山被平移到画面另一侧,网络都该认出这还是“山”。

等变性 / 协变性(equivariance / covariance):函数 \(f[\mathbf{x}]\) 对变换 \(t\) 等变,当且仅当

\[f\big[t[\mathbf{x}]\big] = t\big[f[\mathbf{x}]\big].\]

也就是说,输入怎么变,输出就跟着同样地变逐像素的语义分割网络就该是等变的:输入图像平移了,输出的分割图(那层彩色覆盖)也该平移同样的量。

直觉记法:不变 = 我不动声色(输入变,结论不变);等变 = 我亦步亦趋(输入变,输出跟着变)。

卷积网络的设计正好踩中这两点:卷积层是平移等变的,而后面引入的池化能带来对小幅平移的部分不变性


10.2 一维卷积网络(Convolutional networks for 1D inputs)

为了便于可视化,先从一维数据讲起;二维(图像)只是把同样的思想推广到平面。卷积网络由一连串卷积层串成,每个卷积层都对平移等变;通常还配有池化机制来诱导对平移的部分不变性。

10.2.1 一维卷积是什么

卷积层基于卷积运算。在一维里,卷积把输入向量 \(\mathbf{x}\) 变成输出向量 \(\mathbf{z}\),使每个输出 \(z_i\) 都是附近若干输入的加权和,而且每个位置用的是同一套权重。这套权重叫卷积核(kernel)或滤波器(filter),它覆盖的输入范围叫卷积核大小(kernel size)

以卷积核大小为 3 为例:

\[z_i = \omega_1 x_{i-1} + \omega_2 x_i + \omega_3 x_{i+1},\]

其中 \(\boldsymbol{\omega} = [\omega_1, \omega_2, \omega_3]^\top\) 就是卷积核。把核从左滑到右,每滑一格算一个输出。

它为什么是等变的? 因为同一套权重在每个位置重复使用:如果把输入 \(\mathbf{x}\) 整体平移,输出 \(\mathbf{z}\) 就会被同样地平移。

小注:严格来说这里算的是互相关(cross-correlation),真正的“卷积”要把权重相对输入翻转一下。但机器学习里习惯(不太严谨地)把它就叫卷积。

10.2.2 填充(Padding)

每个输出要看“前一个、当前、后一个”三处输入,那么第一个输出(没有前一个)和最后一个输出(没有后一个)怎么办?两种常见做法:

  • 填充(padding):在输入两端补上新值再照常计算。最常用的是零填充(zero-padding)——假设有效范围之外的输入都是 0。也可以把输入当作首尾相接的环,或在边界处做镜像反射。这样输出和输入等长
  • 有效卷积(valid convolution):干脆丢掉那些“核会越界”的输出位置。好处是不在边缘引入任何额外信息;坏处是表示会变短(输出比输入小)。

10.2.3 步长、卷积核大小与扩张(Stride, kernel size, dilation)

上面只是卷积大家族的一个成员。这一族由三个旋钮区分:

  • 步长(stride):核每次滑动几格。每个位置都算就是步长 1;步长 2 则隔一个位置算一次,输出数量大约减半(同时也实现了下采样)。
  • 卷积核大小(kernel size):核覆盖的范围。增大它能整合更大区域的信息(如大小为 5 就看最近的 5 个输入),但权重也随之增多;通常取奇数,好让核以当前位置为中心。
  • 扩张率 / 空洞卷积(dilation / atrous convolution,源自法语 “à trous” = 带洞):在核的权重之间插入零。例如把大小为 5 的核的第 2、4 个元素设为 0,就变成一个“扩张的大小 3”的核——只用 3 个权重,却能整合更大范围的信息。扩张率 = 权重间插入的零的个数 + 1。

10.2.4 卷积层(Convolutional layers)

一个卷积层的计算是:先做卷积,加上偏置 \(\beta\),再过激活函数 \(a[\cdot]\)。以核大小 3、步长 1、扩张 1 为例,第 \(i\) 个隐藏单元为:

\[h_i = a\!\left[\beta + \sum_{j=1}^{3} \omega_j\, x_{i+j-2}\right] = a\big[\beta + \omega_1 x_{i-1} + \omega_2 x_i + \omega_3 x_{i+1}\big],\]

其中偏置 \(\beta\) 和核权重 \(\omega_1,\omega_2,\omega_3\) 都是可训练参数(零填充时越界的 \(x\) 当作 0)。

把它和全连接层对比一下。全连接层是

\[h_i = a\!\left[\beta_i + \sum_{j=1}^{D} \omega_{ij}\, x_j\right].\]

若有 \(D\) 个输入和 \(D\) 个隐藏单元,全连接层要 \(D^2\) 个权重、\(D\) 个偏置;而卷积层只用 3 个权重、1 个偏置。其实卷积层就是全连接层的特例:把大多数权重设为 0、其余权重约束为彼此相等(共享),全连接层就能精确复现卷积层。

10.2.5 通道(Channels)

只做一次卷积往往会丢信息——它在做邻域平均,而 ReLU 又会把负的部分截掉。所以通常并行做好几个卷积,每个卷积产出一组新的隐藏变量,叫一张特征图(feature map)或通道(channel)

举例:第一个核算出隐藏单元 \(h_1\!\sim\!h_6\),构成第 1 个通道;第二个核(不同权重、不同偏置)算出 \(h_7\!\sim\!h_{12}\),构成第 2 个通道。一般来说,输入和各隐藏层都是多通道的

参数怎么数?若上一层有 \(C_i\) 个输入通道、核大小为 \(K\),那么每个输出通道的每个单元都是对“全部 \(C_i\) 个通道 × \(K\) 个核位置”的加权和,用一个权重矩阵 \(\Omega \in \mathbb{R}^{C_i \times K}\) 加一个偏置。于是要产出 \(C_o\) 个输出通道,总共需要 \(C_i \times C_o \times K\) 个权重和 \(C_o\) 个偏置。

10.2.6 卷积网络与感受野(Receptive fields)

卷积网络就是一串卷积层。某个隐藏单元的感受野(receptive field),指的是原始输入中“喂给它”的那块区域。

设每层核大小都是 3:

  • 第 1 层的单元是最近 3 个输入的加权和,感受野 = 3;
  • 第 2 层的单元看第 1 层最近 3 个位置,而每个又来自 3 个输入,于是感受野 = 5;
  • 再加一层(核 3、步长 2),感受野扩到 7;
  • 再加一层后,深层单元的感受野就能覆盖整个输入

直觉:层越深,单元看得越宽,输入各处的信息被逐层汇聚起来。

10.2.7 例子:MNIST-1D

把卷积网络用到 MNIST-1D 数据上。输入 \(\mathbf{x}\) 是 40 维向量,输出 \(\mathbf{f}\) 是 10 维向量,经 softmax 得到类别概率。网络用 3 个隐藏层:第一层 15 通道、核大小 3、步长 2、valid 填充,得到 19 个空间位置;后两层设置相同,逐层缩小表示,最终是 4 个空间位置 × 15 通道,reshape 成 60 维向量,再用一个全连接层映到 10 个输出。

拿它和层数、单元数都相同的全连接网络对比:卷积网络只有 2,050 个参数,全连接网络有 59,065 个。两者都能把训练集拟合到完美,但卷积网络的测试误差(约 17%)远低于全连接(约 40%)。

这差距不是因为参数多少(过参数化通常反而有帮助)。真正原因是卷积结构有更好的归纳偏置(inductive bias):我们把“每个位置应当被同等处理”的先验知识写进了架构里。已知数据正是由一个模板经随机平移等操作生成的,这个先验非常合理。全连接网络得在每个位置分别学每个数字的模板;卷积网络则在各位置间共享信息,因此学得更准。换个角度看,卷积结构相当于一个正则化器:它给全连接网络能表示的大多数解都判了“无穷大的罚分”,只在一小族都合理的映射里搜索。


10.3 二维卷积网络(Convolutional networks for 2D inputs)

一维卷积可用于金融时间序列、音频、文本;但卷积网络更常用于二维图像。这时卷积核变成二维。一个 \(3\times3\) 的核 \(\Omega \in \mathbb{R}^{3\times3}\) 作用在二维输入 \(x_{ij}\) 上,产出一层隐藏单元:

\[h_{ij} = a\!\left[\beta + \sum_{m=1}^{3}\sum_{n=1}^{3} \omega_{mn}\, x_{i+m-2,\,j+n-2}\right].\]

这就是对一个 \(3\times3\) 的方形输入区域做加权和。核在二维平面上横向、纵向都滑动,每个位置产出一个输出。

RGB 图像 = 带 3 个通道的二维信号。 此时一个 \(3\times3\) 核实际有 \(3\times3\times3\) 个权重,作用在 3 个输入通道的 \(3\times3\) 区域上,产出一张与输入等高等宽的二维输出(假设零填充)。要产生多个输出通道,就用不同的核重复这一过程,把结果叠成一个三维张量(tensor)

参数计数(二维版):核大小 \(K\times K\)、输入通道 \(C_i\),则每个输出通道是 \(C_i \times K \times K\) 个量的加权和加一个偏置;要产出 \(C_o\) 个输出通道,共需 \(C_i \times C_o \times K \times K\) 个权重和 \(C_o\) 个偏置。

配图直觉:想象把一个 \(3\times3\times3\) 的小立方体(核)压在图像上,与对齐的 RGB 图像块逐元素相乘再求和、加偏置,得到一个数;把这个立方体在图上左右上下“滑过”,就得到一整张二维特征图。换一套核权重再滑一遍,就多一张特征图(多一个通道)。


10.4 下采样与上采样(Downsampling and upsampling)

10.2.7 的网络靠步长 2 的卷积逐层缩小表示来扩大感受野。这一节系统地看怎么缩小(下采样)放大(上采样)二维表示,以及怎么只改通道数(在合并网络两条分支的表示时很有用,详见第 11 章)。

10.4.1 下采样(Downsampling)

以“高宽各缩一半”为例,三种主流做法:

  • 子采样 / 步长卷积:隔一个位置取一个值。用步长 2 做卷积时,等于在卷积的同时顺手完成了这种下采样(中间值根本不算)。
  • 最大池化(max pooling):取每个 \(2\times2\) 块里的最大值。它能带来对平移的部分不变性——输入平移一个像素,很多块的最大值仍然不变。
  • 平均池化(mean / average pooling):取每个 \(2\times2\) 块的平均值。

三种做法都对每个通道分别施加,所以输出高宽减半、通道数不变。

10.4.2 上采样(Upsampling)

把分辨率翻倍的几种办法:

  • 复制:把每个空间位置的所有通道值复制 4 份填进 \(2\times2\),最简单。
  • 最大反池化(max unpooling):若之前做过最大池化,就把值放回当初取最大值的那个位置(其余位置通常置 0)。
  • 双线性插值(bilinear interpolation):在已有采样点之间插值填补空缺。
  • 转置卷积(transposed convolution):大致是步长 2 下采样的“反过程”。下采样时输出比输入少一半、每个输出是 3 个输入的加权和;转置卷积里反过来——输出比输入多一倍,每个输入贡献到 3 个输出。若写成权重矩阵,它正好是下采样那个矩阵的转置,故得名。

提示:转置卷积可能造成棋盘格伪影(checkerboard artifacts),使用时需小心。

10.4.3 改变通道数:1×1 卷积

有时想在不做空间池化的前提下改变通道数(通常是为了与另一条并行分支的表示合并)。办法是用核大小为 1 的卷积(1×1 convolution):输出层的每个元素,是同一位置上所有输入通道的加权和;换不同权重重复多次,就能产出任意多的输出通道。其权重尺寸为 \(1\times1\times C_i\times C_o\)。配上偏置和激活,它等价于在每个空间位置上、对各通道跑同一个全连接小网络


10.5 应用(Applications)

下面看三类计算机视觉任务:图像分类(把整张图归到预定类别之一)、目标检测(找出图中多个物体并框出每个的边界框)、语义分割(给每个像素标上所属物体的类别)。

10.5.1 图像分类(AlexNet / VGG)

深度学习在视觉上的开创性工作多集中在 ImageNet 上:约 128 万训练图、5 万验证图、10 万测试图,每张标注为 1000 类之一。典型系统输入 224×224 RGB 图,输出 1000 类的概率分布。2011 年(深度网络登场前),最好的方法 top-5 错误率约 25%;五年后,最好的深度模型已超过人类水平。

AlexNet(2012) 是第一个在此任务上表现出色的卷积网络,8 个隐藏层(前 5 个卷积、后 3 个全连接),全用 ReLU:

  • 先用 11×11 核、步长 4 下采样得 96 通道;最大池化后用 5×5 核 得 256 通道;
  • 再叠 三个 3×3 卷积层,最终是 13×13×256;最后一个最大池化得 6×6×256,拉直成长度 9,216 的向量;
  • 过三个全连接层(4096、4096、1000),最后 softmax 输出 1000 类概率。

全网约 6000 万参数,大部分在全连接层。训练用了大幅数据增强(空间变换 + 强度扰动,扩增约 2048 倍)、测试时对 5 个裁剪/镜像版本平均、带动量的 SGD、Dropout(用于全连接层)和 L2 权重衰减。最终 top-5 错误率 16.4%、top-1 错误率 38.1%——这是当时的巨大飞跃,揭示了深度学习的潜力,开启了现代 AI 研究的时代。

VGG 在同一任务上更进一步:top-5 错误率 6.8%、top-1 错误率 23.7%。它同样是卷积层与最大池化层交替——空间尺寸逐渐变小、通道数逐渐变多——再接三个全连接层。它和 AlexNet 训练手法相近(数据增强、权重衰减、Dropout),最关键的区别是更深:VGG 用了 19 个隐藏层、1.44 亿参数

有好几年,这个任务上的性能随网络加深而稳步提升,这是“深度很重要”的有力证据。

10.5.2 目标检测(YOLO)

目标检测要在图中识别并定位多个物体。早期的卷积方案是 YOLO(You Only Look Once)。输入 448×448 RGB 图,经 24 个卷积层(像 VGG 那样用最大池化逐步缩小尺寸、同时增加通道),最后一层为 7×7、1024 通道;拉直后经一个全连接层映到 4096 维,再经一个全连接层得到输出。

输出编码了一个 7×7 网格上每个格子的信息:每格预测最可能的类别,以及固定数量的边界框(图示为每格 2 个框)。每个框用 5 个参数描述:中心的 x、y 坐标,框的高、宽,以及该预测的置信度(估计预测框与真实框的重叠程度)。

训练用了动量、权重衰减、Dropout、数据增强,并采用迁移学习:先在 ImageNet 分类上预训练,再微调到检测任务。网络跑完后,再用启发式后处理:去掉低置信度的框,并对指向同一物体的多个框做抑制(只保留最自信的那个,即非极大值抑制 NMS)。

10.5.3 语义分割(编码器-解码器 / 沙漏网络)

语义分割要给每个像素标上它所属物体的类别(不属于任何训练类别的像素就不标)。一个早期网络的输入是 224×224 RGB 图,输出是 224×224×21 的数组:每个位置给出 21 个可能类别的概率。

  • 编码器(encoder,下采样侧):前半部是 VGG 的精简版(13 个卷积层,而非完整 VGG 的 16 个),把表示缩到 14×14;再一次最大池化后,接两个全连接层映到长度 4096 的一维表示——这两层不再代表空间位置,而是汇聚了整张图的信息。
  • 解码器(decoder,上采样侧):再用一个全连接层把表示重组成 7×7×512;随后是一系列最大反池化反卷积层(即二维转置卷积,但这里不带上采样),结构上是 VGG 的镜像。最后用 1×1 卷积产出 21 个通道(对应各类别),并在每个空间位置做 softmax 得到类别概率。

这种“先压缩、再展开”的架构,下采样侧叫编码器、上采样侧叫解码器,整体因形似沙漏而被称作编码器-解码器网络沙漏网络(hourglass network)。最终分割图再用一个启发式方法生成:贪心地先挑“最有代表性”的类别并圈出其区域(兼顾概率与空间连通性),再依次加入下一个最有代表性的类别,直到证据不足为止。


本章小结

  • 卷积层里,每个隐藏单元都是“附近输入的加权和 + 偏置 + 激活函数”;权重和偏置在每个空间位置都相同,所以参数远少于全连接,而且不随图像尺寸增大而增多。为了不丢信息,用不同的权重和偏置重复这套操作,在每个位置产出多个通道
  • 典型卷积网络是“卷积层 + 每隔一段做一次二倍下采样”:数据流过网络时,空间尺寸一般成倍缩小、通道数成倍增加;末端常接一或多个全连接层,汇聚全图信息、产出所需输出。若输出本身是图像,再用一个镜像的“解码器”上采样回原始尺寸。
  • 卷积层的平移等变性带来了对图像任务有益的归纳偏置,相比全连接网络显著提升性能。
  • 本章介绍了图像分类、目标检测、语义分割三类网络。分类性能随网络加深而提升;但后续实验表明,一味加深并非总有帮助——超过某个深度后网络变得难以训练。这正是下一章残差连接(residual connections)要解决的问题。

关键术语对照

中文 English 一句话含义
卷积神经网络 Convolutional neural network (CNN) 主要由卷积层构成的网络
不变性 Invariance 输入变换后,输出不变(分类要的)
等变性 / 协变性 Equivariance / Covariance 输入变换后,输出跟着同样变(分割要的)
卷积核 / 滤波器 Kernel / Filter 滑过输入做加权和的那套共享权重
卷积核大小 Kernel size 核覆盖的输入范围
步长 Stride 核每次滑动几格(步长 2 即下采样一半)
填充 Padding 处理边界的方式(如零填充)
有效卷积 Valid convolution 丢弃越界位置,输出比输入小
扩张 / 空洞卷积 Dilation / Atrous convolution 权重间插零,少权重覆盖大范围
通道 / 特征图 Channel / Feature map 一个卷积核产出的一张输出
感受野 Receptive field 喂给某单元的原始输入区域
权重共享 Weight sharing 各位置用同一套权重,减少参数
归纳偏置 Inductive bias 写进架构的先验知识,帮助泛化
池化 Pooling 缩小表示(最大池化 / 平均池化)
最大反池化 Max unpooling 把值放回当初取最大的位置
转置卷积 / 反卷积 Transposed / Deconvolution 上采样,权重矩阵是下采样的转置
1×1 卷积 1×1 convolution 只改通道数、不改空间尺寸
编码器-解码器 / 沙漏网络 Encoder-decoder / Hourglass 先下采样压缩、再上采样还原

返回目录 | 上一章:第 9 章 正则化 | 下一章:第 11 章 残差网络