动机#
卷积神经网络源于对生物视觉系统的模拟,即不同的视细胞能够看到的视野不一样,通过叠加视野来形成最终的视觉图像。相较于 MLP 处理图像的高参数量、空间信息损失来说,卷积神经网络在保留空间架构的同时,实现了效率和准确度的协同提升。
CNN 的归纳偏置主要体现在以下方面:
- 平移不变形 - 物体特征(局部区域)的识别不会因为空间位置的改变而发生变化;
- 空间上的权重共享 - 不同位置使用的是同一个卷积核,平等对待每一块局部区域;
- 局部连接 - 局部区域已经足够进行物体识别,因此后一层仅于前一层的特定区域的神经元相连。
卷积层#
卷积的数学本质是空间位置滑动的内积。
2D 卷积#

其中 表示原始图像的局部区域、 表示卷积核,其维度与输入图像一致、 表示 输出特征维度/卷积核个数。假设输入特征维度为 、卷积核维度为 ,则输出特征维度为 ,参数量为 ,加 1 表示偏置。
通过公式可以看出 卷积神经网络在空间维度上是局部连接的,但是在通道维度上是全连接的,即主要提取的是空间信息。
感受野#
感受野(Receptive Field) 指的是 输出特征图上的一个元素在输入特征图上映射的区域大小。随着层数的叠加,感受野也会逐渐变大,直到看完整个输入图像(深层特征中的单个元素会对应原始图像中更大的区域)。
填充和步长#
- 填充(Padding) - 对输入特征图周围采用 0 填充,目的是控制输出特征图空间尺寸以及增加边缘像素的计算次数(避免边界信息丢失);
- 步长(Stride) - 定义了卷积核在输入特征图上每次移动的像素步数,目的是调节特征图的下采样速度(减少参数量且增加后续神经元的感受野)以及控制特征提取精度。
如果加上步长和填充,那么输出特征图空间大小为 。并且不同的卷积参数会导致不同的输出特征图,比如说边缘检测、锐化、高斯模糊等。
FLOPs 计算过程#
标准卷积层计算公式:
全连接层计算公式:
其中 和 表示全连接层中输入/输出特征维度, 和 表示输出特征图的空间维度,最后将每层的结果相加就得到最终的 FLOPs。
CAM 可视化技术#
Class Activation Mapping 通过生成热力图,来表明输入图像中与预测类别最相关的区域。其最后一层卷积层 + 全局平均池化层 + MLP 层保证了 每个通道的特征映射对最终分类的结果都有直接贡献。

具体步骤:1)输入图像经过若干 CNN 和最终 GAP 之后,得到每个通道的特征向量,然后进行加权求和,得到与输入图像尺寸相同的 2D 激活图,其中 每个 MLP 权重值代表其对应的特征向量对每个类别的贡献程度;2)将激活图进行上采样和归一化并叠加到原始图像上形成热力图,从而突出模型关注的区域。
池化层#
最大 / 平均池化#
池化(Pooling) 操作也是基于窗口扫描,与卷积操作不同的是池化取窗口内的最大值或平均值。

该操作会减少特征图的空间维度,但不会减少通道维度。并且能够有效减少参数量,但会过度压缩空间信息,因此后续基于 CNN 的模型都很少使用该技术。
空间金字塔池化#
空间金字塔池化(Spatial Pyramid Pooling) 指的是 对输入特征图在不同尺度进行池化操作,然后将这些不同尺度的特征拼接在一起,以捕获多尺度的信息,从而避免 单一尺度导致的空间信息损失。

这里需要注意经过池化操作得到的特征向量是在 通道维度 进行拼接。
全局平均池化#
全局平均池化(Global Average Pooling) 将每个特征图的 空间维度 通过平均化压缩为单一的数值,这样就将 高维的特征转换成了低维的特征向量,维度变化为 。
- 大幅减少参数数量、在不依赖位置空间的前提下捕捉全局特征;
- 通过平均压缩了空间信息,不适用于利用空间位置的分割、检测等任务。
分层表示学习#
通过堆叠多个卷积层和池化层来逐渐提取图像的层次化特征,实现 由低级到高级的特征学习。浅层提取到的是图像的低级特征,如边缘、纹理等,而深层提取到的是图像的高级特征,如物体的形状、结构等。

卷积种类#
组卷积#
组卷积(Group Convolution) 由 AlexNet 提出的,其 将输入特征沿通道维度分成多个组,然后对每个组执行标准卷积操作,最后将结果合并。其有效减少了模型的参数量和计算量,是构建轻量级网络的基础。
转置卷积#
转置卷积(Transpose Convolution) 主要用于 上采样(Upsampling) 操作,即将输入特征图的空间尺寸扩大,这对于需要恢复图像细节或扩大特征的尺寸的任务来说非常重要。

空洞卷积#

空洞卷积(Dilated Convolution) 通过引入 Dilation Rate 来控制卷积核处理数据时的采样步长,使得 同样大小的卷积核能够获得更大的感受野,避免过度下采样带来的空间信息损失。当 Dilation Rate 为 1 时,退化为标准卷积。当 Dilation Rate 为 4 时,表示 在卷积核中间 插入三个 0。
深度可分离卷积#

深度可分离卷积(Depthwise Separable Convolution) 是一种高效的卷积操作,其通过 分解标准卷积 操作来大幅减少参数量。可以看作是分组卷积的一种特殊形式(分组数等于通道数 / 每个组只有一个特征)。
- 深度卷积(Depthwise convolution) - 使用多组不同的卷积核对输入特征图进行标准卷积操作;
- 逐点卷积(Pointwise convolution) - 使用 卷积对深度卷积的输出特征图上的每个位置进行卷积。
标准卷积计算量:
深度可分离卷积计算量:
如何理解这个公式呢?深度卷积的通道数为 1,所以上方公式左侧 ;逐点卷积的卷积核大小为 1,所以上方公式右侧 。
可变形卷积#
可变形卷积(Deformable Convolution) 给卷积核在输入特征图上的每个采样点添加一个可学习的 2D 偏移量,从而使得固定的采样网格可以根据输入特征动态地变形,更好地贴合目标的形状和结构。

- 学习偏移量 - 原始输入特征图经过一个独立并行的标准卷积层之后生成 “偏移量场”,其空间大小与原始输入一致、通道大小为 ,乘以 2 表示每个采样点需要一个 的偏移量;
- 执行可变形采样与卷积 - 在对每个采样点进行卷积计算的时候,我们先从偏移量场中取出偏移坐标 ,这样最终输入特征图上的采样坐标就变为 ,其表示一个具体的 坐标。但由于是浮点数,无法准确定位,因此采用双线性插值对其进行变形得到最终坐标。
实用训练技巧#
批归一化#
批归一化(Batch Normalization) 假设 各个通道表示的特征一样重要,并通过 减均值除方差 逐通道引入数据先验。并且为了避免过度归一化破坏网络自身的表达能力而引入两个可学习参数。

训练阶段 - 使用 当前小批次 的均值和方差对输入特征图进行归一化,并且特征图的每一维都有独立的可学习参数。通过 指数移动平均(EMA) 来计算移动均值和移动方差,以便在推理的时候使用。
推理阶段 - 将单个样本作为一个批次,基于此计算均值和方差会导致模型输出不稳定,因此需要一个 “能代表整个数据集分布的均值和方差”,即移动均值和移动方差。查看 动手学深度学习 / 批量规范化 ↗ 的代码:
def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum): if not torch.is_grad_enabled(): # 预测模式下,直接使用移动平均/方差 X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps) else: mean = X.mean(dim=(0, 2, 3), keepdim=True) var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True) # 训练模式下,用当前批次的均值和方差做标准化 X_hat = (X - mean) / torch.sqrt(var + eps) # 更新移动平均的均值和方差 moving_mean = momentum * moving_mean + (1.0 - momentum) * mean moving_var = momentum * moving_var + (1.0 - momentum) * var Y = gamma * X_hat + beta # 缩放和移位 return Y, moving_mean.data, moving_var.data有效性探讨 - 批归一化通过对网络进行重参数化,极大平滑了优化景观(Optimization Landscape),意味着梯度更具可预测性,这允许我们使用更大的学习率,从而实现更快、更稳定的模型训练。

虽然主流 CNN 依赖这一项技术,但是将使用了批归一化的预训练模型适配到新的数据集上的时候,会因为使用了模型中存储的旧的移动均值和移动方差从而导致模型性能下降和训练不稳定,解决办法有两种:
- 当使用大批量的时候,可以解冻批归一化层来动态更新移动均值和移动方差,从而适配新数据的分布;
- 当使用小批量的时候,可以使用其他不依赖批量统计的归一化技术,比如实例归一化、组归一化等。

数据增强#
复杂数据增强库:https://github.com/albumentations-team/albumentations ↗
经典的数据增强技术包括:
- Color Jittering - 对图像的亮度、对比度、饱和度、色相(Hue)进行随机扰动;
- PAC Jittering - 特殊的色彩扰动,能模拟出更自然的光照颜色变化;
- Random Scale / Crop - 将图像随机缩放到不同尺寸,然后随机裁剪出一个固定大小的区域作为输入;
- Horizontal / Vertical Flip - 将图像沿垂直中轴线左右翻转、沿水平中轴线上下翻转;
- Shift / Rotation / Reflection - 将图像进行特定角度的旋转、特定范围的平移等;
- Noise - 在图像的像素值上添加高斯噪声或椒盐噪声,提高模型对输入数据中微小扰动的鲁棒性。
高级的数据增强技术包括:
- Mixup - 将两个随机选取的训练样本(包括图像和标签)进行线性插值,从而创造出一个全新的合成样本。目的是鼓励模型在不同类别之间学习到更平滑线性的决策边界,并对对抗样本有更好的防御效果;
- CutMix - 从一张图像中随机裁剪出一个小块并粘贴到另一张图像的随机位置上,且新样本的标签也根据两个图像所占的面积比例进行混合。目的是让模型不仅依赖物体的局部特征,还依赖全局特征;
- AutoAugment - 将数据增强本身视为一个搜索问题,使用强化学习算法为特定的数据集自动地搜索出一套最优的数据增强策略组合。
经典卷积架构#
Recipe is all you need:

AlexNet#
AlexNet 使用了两个 GPU 同时训练,首次证明了学习到的特征可以超越手工设计的特征,赢得了 2012 年 ImageNet 图像识别挑战赛。

ZFNet 在 AlexNet 的基础上进行超参数调优,将 top-5 错误率从 16.4% 降低至 11.7%。
VGG#
VGG 采用了 连续的 小尺寸卷积核(步长为 1) 来减少参数量并达到与大尺寸卷积核相同的有效感受野,其中两个 的有效感受野相当于 。且通过层叠多个类似的卷积层来增加网络的深度,提升网络的非线性表达能力。

VGG-16 的总参数量为 138M,并且大部分参数量都在末尾的全连接层中,我们可以使用 卷积来替代 FC 层从而减少参数量。
Inception Series#
Inception 系列通过不同大小的卷积核提取不同的空间信息,并在必要的时候进行填充,最后将输出在通道维度上拼接起来。该网络主要由 Inception 模块 组成,后续的版本迭代也是基于基础模块进行设计改良。

通过引入 卷积操作,该网络相较与 AlexNet 减少了 12 倍的参数量,且 top-5 错误率下降至 6.7%。
卷积操作通道维度,不改变输入特征图的空间尺寸,且通过跨通道信息融合引入更多的非线形性。
ResNet / ResNeXt#
ResNet 通过引入 残差连接 解决了深度网络训练优化难的问题,该连接通过 将输入与通过若干层的输出相加,从而缓解了梯度消失的问题,使得梯度能够根据该连接传递到浅层网络。并且残差连接使得网络学习输入的恒等映射,从而保留原始特征。该网络主要由 残差模块 组成,即遵循 的设计,即降维 -> 提取特征 -> 恢复维度来有效提取特征和降低参数量。

ResNext 在残差模块的基础上添加了多条并行路线 / 扩大宽度,类似 Inception 模块,相较于 ResNet 有更好的 FLOPs / Accuracy 权衡。
DenseNet#
DenseNet 在 ResNet 的基础上进一步提高了特征的重用性,相较于 “残差连接” 的相加,该网络使用 密集连结 来对输出特征图进行扩展,使得每一层都与前面所有层相连接,使得浅层的低级特征能够被每一层利用,并且进一步促进了梯度流动。

该网络主要由 Dense 模块 和 Transition 层 组成,前者通过增长率定义输出特征图与输入特征图之间通道数的关系,后者通过卷积和池化控制输出特征的通道数量和空间尺寸。
ConvNeXt#
ConvNeXt ↗ 是 Facebook AI Research 在 2022 年提出的,其证明了如果使用与 ViT 相似的现代化训练方法和架构设计原则来 “逐步改造” 一个标准的卷积网络(ResNet),其性能完全可以与顶尖的 Transformer 模型相媲美,甚至超越它们。

模型压缩#
参数剪枝#
剪枝(Pruning) 指的是 移除对模型性能贡献较少的冗余参数,从而在不影响精度的前提下大幅减少参数和计算量。具体来说网络中的 Hessian 矩阵中的很多特征值接近零,表明模型在某些参数方向上存在冗余。
- 结构化剪枝 - 移除高层次结构,比如卷积核、通道、层。且剪枝后的网络结构依然是规整的;
- 非结构化剪枝 - 将单个权重置零,会导致权重矩阵变得稀疏,需要专门的稀疏计算库和硬件才能加速;
- 彩票假设 - 一个随机初始化的密集网络中存在一个稀疏子网络(“中奖彩票”),该网络经过独立训练后,可以达到与原始网络相当甚至更好的性能。

参数量化#
量化(Quantization) 指的是 降低每个权重或激活值的比特数,标准的深度学习模型通常使用 FP32 来存储参数和中间结果,而量化试图使用 FP16/BF16 或 INT8 来存储。
- (非)线性量化 - 将浮点数张量通过缩放因子和零点映射到定点整数向量。判断零点是否为 0 分为(非)对称量化,以及对层/通道使用同一套方案分为逐层/通道量化;非线性量化使用非均匀间隔表示权重,例如使用 K-Means 对数值分布中心使用更高精度;
- 量化感知训练(QAT) - 在训练过程中就 “模拟” 量化操作。前向传播时对权重进行伪量化,但在反向传播时梯度直接传给原始精度的浮点权重,从而让模型在训练阶段适应量化带来的误差;
- 训练后量化(PTQ) - 在模型训练完成后直接对权重进行量化。该方法简单快捷,但通常精度损失较大。
知识蒸馏#
知识蒸馏(Distillation) 指的是用一个训练好的精确的 “教师网络(Teacher Network)” 来指导一个轻量的 “学生网络(Student Network)” 进行训练,目标是 让学生网络不仅学习任务的真实标签(Hard Label),还要学习教师网络输出的 “软标签(Soft Label)“,即教师网络在最终层的概率分布。
蒸馏的损失函数通常是学生(教师)网络输出的 logit 之间的 KL 散度,并引入温度系数使得输出概率分布变得平滑。总损失就是硬标签的交叉熵损失和软标签的蒸馏损失的加权和,推荐 知识蒸馏经典之作 / 潘小小 ↗。
还有一些不需要教师网络的蒸馏方式,比如说使用网络深层来指导浅层学习的自蒸馏,以及让一组学生网络互相学习的在线蒸馏。
轻量级卷积架构#
SqueezeNet#
SqueezeNet 通过 Fire 模块 来大幅减少参数量和模型尺寸,并达到了与 AlexNet 的相似精度。
- Squeeze - 使用 的卷积核对输入特征图进行通道压缩;
- Expand - 使用 和 的卷积核分别进行特征提取和通道扩展,并在通道维度上拼接结果。
SENet#
SENet 通过 通道注意力机制 来学习不同通道之间的依赖关系,并根据这些关系动态地增强有用的特征通道,抑制无用的特征通道。基于此设计了一个轻量级、即插即用的 SE 模块。
- Squeeze - 对输入特征图的每个通道进行全局平均池化(会丢失大量的空间信息),用于提取每个通道的全局空间信息,此时特征图大小变为 ;
- Excitation - 将一阶段得到的特征图送入两层 MLP 网络来显式地建模通道间的相关性,并为并为每个通道生成一个权重。其是一个瓶颈结构,特征图维度大小变换为 ,其中 是衰减超参数;
- Scale - 将二阶段得到的权重逐通道地乘以输入特征图的对应通道,以此来动态加强通道信息。

ShuffleNet#
ShuffleNet 通过 逐点分组卷积 和 通道混洗 来建立不同组之间的特征交流,解决分组卷积中每个组的输出只与组内的特征有关而导致的表征问题。

推荐查看 ChannelShuffle / Pytorch ↗。
MobileNet#
MobileNet v1 使用深度可分离卷积代替普通卷积,在准确率轻微下降的情况下极大地减少了模型的参数量和计算量,从而使得模型可以部署在移动端。
MobileNet v2 认为网络深层部分的卷积核训练后容易变得稀疏是由于映射到低维空间的特征经过 ReLU 后会造成信息损失。因此我们可以通过取消激活函数并且通过增加输入特征图的通道数来增加信息量。

主要是引入了 倒置残差(Inverted residual) 结构,其将传统瓶颈层的 “宽-窄-宽” 结构倒置为 “窄-宽-窄” 的结构,即先用一个 结构的逐点卷积增加输入特征图的通道数,然后使用 卷积提取特征信息,最后使用 卷积将特征图的通道数减少为原始个数。
轻量化卷积算子汇总#

上图描述了各类卷积算子对输入特征在空间维度和通道维度的影响,以及对应的复杂度分析。
高级卷积架构#
3D 卷积#

EfficientNet#
