引言
卷积,是卷积神经网络中最重要的组件之一。不同的卷积结构有着不一样的功能,但本质上都是用于提取特征。比如,在传统图像处理中,人们通过设定不同的算子来提取诸如边缘、水平、垂直等固定的特征。而在卷积神经网络中,仅需要随机初始化一个固定卷积核大小的滤波器,并通过诸如反向传播的技术来实现卷积核参数的自动更新即可。其中,浅层的滤波器对诸如点、线、面等底层特征比较敏感,深层的滤波器则可以用于提取更加抽象的高级语义特征,以完成从低级特征到高级特征的映射。本文将从背景、原理、特性及改进四个维度分别梳理10篇影响力深远的经典卷积模块以及10篇具有代表性的卷积变体,使读者对卷积的发展脉络有一个更加清晰的认知。
【经典卷积系列】
- 原始卷积 (Vanilla Convolution)
- 组卷积 (Group convolution)
- 转置卷积 (Transposed Convolution)
- 1×1卷积 (1×1 Convolution)
- 空洞卷积 (Atrous convolution)
- 深度可分离卷积 (Depthwise Separable Convolution)
- 可变形卷积 (Deformable convolution)
- 空间可分离卷积 (Spatially Separable Convolution)
- 图卷积 (Graph Convolution)
- 植入块 (Inception Block)
【卷积变体系列】
- 非对称卷积(Asymmetric Convolution)
- 八度卷积(Octave Convolution)
- 异构卷积(Heterogeneous Convolution)
- 条件参数化卷积(Conditionally Parameterized Convolutions)
- 动态卷积(Dynamic Convolution)
- 幻影卷积(Ghost Convolution)
- 自校正卷积(Self-Calibrated Convolution)
- 逐深度过参数化卷积(Depthwise Over-parameterized Convolution)
- 分离注意力模块(ResNeSt Block)
- 内卷(Involution)
VanillaConv
背景
CNNs中的卷积,也称为滤波器,是由一组具有固定窗口大小且带可学习参数(learnable paramerters)的卷积核所组成,可用于提取特征。
原理
如下图所示,卷积的过程是通过滑动窗口从上到下,从左到右对输入特征图进行遍历,每次遍历的结果为相应位置元素的加权求和:
特性稀疏连接(sparse connectivity)
传统的神经网络层使用矩阵乘法,由一个参数矩阵和一个单独的参数描述每个输入和每个输出之间的交互,即每个输出单元与每个输入单元进行密集交互。
然而,卷积网络具有稀疏交互作用,有时也称为稀疏连接或稀疏权值。
总的来说,使用稀疏连接方式可以使网络储存更少的参数,降低模型的内存要求,同时提高计算效率。
权值共享(shared weights)
在传统的神经网络中,每个元素都使用一个对应的参数(权重)进行学习。但是,在CNNs中卷积核参数是共享的。权值共享,也称为参数共享,是指在计算图层的输出时多次使用相同的参数进行卷积运算。
平移不变性(translation invariant)
CNNs中的平移不变性指的是当图像中的目标发生偏移时网络仍然能够输出同源图像一致的结果。对于图像分类任务来说,我们希望CNNs具备平移不变性,因为当图像中目标发生位置偏移时其输出结果应该保持一致。然而,CNNs结构本身所带来的平移不变性是非常脆弱的,大多数时候还是需要从大量数据中学习出来。
平移等变性(translation equivalence)
CNNs中的平移等变性指的是当输入发生偏移时网络的输出结果也应该发生相应的偏移。这种特性比较适用于目标检测和语义分割等任务。CNNs中卷积操作的参数共享使得它对平移操作具有等变性,而一些池化操作对平移有近似不变性。
GroupConv
论文:AlexNet[1] (Accepted by NIPS 2012)
背景
受单个GPU算力的瓶颈限制,组卷积在早期阶段是被应用于切分网络使其能够在多个GPU上进行并行计算,之后被广泛应用到ResNeXt[2]网络中。
原理
原始卷积操作中每一个输出通道都与输入的每一个通道相连接,通道之间是以稠密方式进行连接。而组卷积中输入和输出的通道会被划分为多个组,每个组的输出通道只和对应组内的输入通道相连接,而与其它组的通道无关。这种分组(split)的思想随后被绝大多数的新晋卷积所应用。
特性
降低参数量
参数量为原始卷积的1/g,其中g为分组数。
提高训练效率
通过将卷积运算按通道划分为多个路径,可以尽可能地利用分布式的计算资源进行并行运算,有利于大规模深度神经网络的训练。
提高泛化性能
组卷积可以看成是对原始卷积操作的一种解耦,改善原始卷积操作中滤波器之间的稀疏性,在一定程度上起到正则化的作用。
改进
原始的组卷积实现中,不同通道的特征会被划分到不同的组里面,直到网络的末端才将其融合起来,中间过程显然缺乏信息的交互(考虑到不同滤波器可提取到不同的特征)。
为了解决此问题,ShuffleNet[3]结合了逐点组卷积(Pointwise Group Convolution, PGC)和通道混洗(channel shuffle),来实现一个高效轻量化的移动端网络设计。
单纯地应用PGC虽然可以有效的降低计算复杂度,但同时也会引入副作用(组与组之间的信息无交互)。因此,作者进一步地应用通道混洗操作来促使信息更好的流通。最后,论文中也提出了一种Shuffle单元。
TransposedConv
论文:《A guide to convolution arithmetic for deeplearning》[4]
背景
转置卷积,也称为反卷积(Deconvolution)或微步卷积(Fractionally-strided Convolution),一般应用在编解码结构中的解码器部分或者DCGAN中的生成器中等。但由于数字信号处理中也有反卷积的概念,所以一般为了不造成歧义,大多数框架的API都会定义为转置卷积。
原理
与常规的卷积操作不同,转置卷积是一种一对多的映射关系,即输入矩阵中的一个值映射到输出矩阵的K×K(i.e., kernel size)个值。在具体的实现当中,需要维护一个转置矩阵,这个矩阵参数是可学习的。
特性
特征上采样
利用转置卷积,可以引入参数让网络自动学习卷积核的权重以更好地恢复空间分辨率。一般来说,利用转置卷积来替代常规的上采样操作(最近邻插值、双线性插值即双立方插值)会取得更好的效果(在没有过拟合的情况下),弊端是增大了参数量,且容易出现网格效应[5]。
特征可视化
利用转置卷积还可以对特征图进行可视化。有时间的强烈推荐大家去阅读原论文《Visualizing and Understanding Convolutional Networks》[6],有助于帮助大家理解不同深度的各个特征图究竟学到了什么特征。比如,增加网络的深度有利于提取更加抽象的高级语义特征,而增加网络的宽度有利于增强特征多样性的表达。或者是小的卷积核有利于特征的学习,而小的步长则有利于保留更多的空间细节信息。
1×1Conv
论文:《Network In Network》[7] (Accepted by ICLR 2014)
背景
1×1卷积最初提出的目的是用于增强模型对特定感受野下的局部区域的判定能力。后续也被GoogleNet[8]和ResNet[9]进一步的应用。
特性
增强特征表达能力
1×1卷积本质上也是一个带参数的滤波器,在不改变特征图本身尺寸的情况下,能够增加网络深度。通过在卷积后通过非线性激活函数可以有效的增强网络的表达能力。
升维和降维
1×1卷积可以通过增加或减少滤波器的数量来实现升维或降维的目的。与全连接层不同,由于卷积是基于权值共享,因此能够有效的降低网络的参数量和计算量。另一方面,降低维度可以认为是通过减少冗余的特征图来降低模型中间层权重的稀疏性,从而得到一个更加紧凑的网络结构。
跨通道的信息交互
类似于多层感知机,1×1卷积本质上就是多个特征图之间的线性组合。因此,通过1×1卷积操作可以轻松实现跨通道的信息交互和整合。
AtrousConv
论文:《Multi-Scale Context Aggregation by Dilated Convolutions》[10] (Accepted by ICLR 2016)
讲解:https://mp.weixin.qq.com/s/DWGqjMruicwIDKhsmossmg
背景
空洞卷积,也称为扩张卷积(Dilated Convolution),最早是针对语义分割任务所提出来的。由于语义分割是一种像素级的分类,经过编码器所提取出的高级特征图最终需要上采样到原始输入特征图的空间分辨率。因此,为了限制网络整体的计算效率,通常会采用池化和插值等上/下采样操作,但这对语义分割这种稠密预测任务来说是非常致命的,主要体现在以下三方面:
- 不可学习:由于上采样操作(如双线性插值法)是固定的即不可学习的,所以并不能重建回原始的空间信息。
- 损失空间信息:引入池化操作不可避免的会导致内部数据结构丢失,导致空间细节信息严重丢失。
- 丢失小目标:经过N次池化(每次下采样2倍),原则上小于个像素点的目标信息将不可重建,这对于语义分割这种密集型预测任务来说是致命的。
原理
空洞卷积可看成是原始卷积更进一步的扩展,通过在原始卷积的基础上引入空洞率这个超参数,用于调节卷积核的间隔数量。比如,原始卷积核其空洞率为1,而对于空洞率为k的卷积则用0去填充空白的区域。
特性
增大感受野
空洞卷积可以在同等卷积核参数下获得更大的感受野。所以,对于需要较为全局的语义信息或类似于语音文本需要较长的序列信息依赖的任务中,都可以尝试应用空洞卷积。
表征多尺度信息
利用带有不同空洞率的卷积,还可以捕捉到多尺度的上下文语义信息。不同的空洞率代表着不同的感受野,意味着网络能够感知到不同尺寸的目标。
局限性
不好优化
虽然引入空洞卷积可以在参数不变的情况增大感受野,但是由于空间分辨率的增大,所以在实际中常常会不好优化,速度方面是一个诟病,因此在工业上对实时性有要求的应用更多的还是类FCN结构。
引入网格/棋盘效应
应用空洞卷积也引入网格效应。由图森和谷歌大脑合作研究的《Understanding Convolution for Semantic Segmentation》[11]文章指出了如果多次使用空洞率相同的卷积去提取特征时会损失掉信息的连续性。这是因为卷积核并不连续,导致许多的像素从头到尾都没有参与到运算当中,相当于失效了,这对于语义分割这类的密集型预测任务来说是十分不友好的,特别是针对小目标来说。一个解决方案便是令所叠加的卷积其空洞率不能出现大于1的公约数,如令其等于[1, 2, 5],使其呈现锯齿结构。
DWConv
论文:《Xception: Deep Learning with Depthwise Separable Convolutions》[12] (Accepted by CVPR 2017)
代码:https://github.com/CVHuber/Convolution/blob/main/Depthwise%20Separable%20Convolution.py
讲解:https://mp.weixin.qq.com/s/qkldaRnuN-R0B64ssUs47w
背景
深度可分离卷积,由深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)两部分组成,后也被MobileNet[13]等著名网络大规模应用。标准的卷积过程中对应图像区域中的所有通道均被同时考虑,而深度可分离卷积打破了这层瓶颈,将通道和空间区域分开考虑,对不同的输入通道采取不同的卷积核进行卷积,它将普通的卷积操作分解为两个过程,目的是希望能用较少的参数学习更丰富的特征表示。
原理
逐深度卷积
不同于原始卷积,深度卷积是一个卷积核负责一个通道,独立地在每个通道上进行空间卷积。因此,深度卷积的输出特征图数量等于输入特征图数量,无法进行有效的维度扩展。
逐点卷积
由于一个特征图仅被一个滤波器卷积,无法有效的利用不同通道在相同空间位置上的特征信息,由此加入了逐点卷积。点卷积主要是要1×1卷积构成,负责将深度卷积的输出按通道投影到一个新的特征图上。
特性
降低参数量和计算量
深度可分离卷积将原始的卷积运算分为两层,一层用于滤波(深度卷积),一层用于组合(逐点卷积)。这种分解过程能极大减少模型的参数量和计算量。
降低模型容量
深度可分离卷积在应用时并没有使用激活函数。此外,虽然深度可分离卷积可以显著的降低模型的计算量,但同时也会导致模型的容量显著降低,从而导致模型精度的下降。
DeformableConv
论文:《Deformable Convolutional Networks》[14] (Accepted by ICCV 2017)
代码:https://github.com/CVHuber/Convolution/blob/main/Deformable%20Convolution.py
讲解:https://mp.weixin.qq.com/s/O9ToEnVC-H7qPwxPQN-a7A
背景
在计算机视觉领域,同一物体在不同场景,角度中未知的几何变换是任务的一大挑战,通常来说要么通过充足的数据增强,扩充足够多的样本去增强模型适应尺度变换的能力,要么设置一些针对几何变换不变的特征或者算法,比如SIFT或者滑动窗口等。然而传统CNNs固定的几何结构无法对未知的物体形变进行有效建模,因此可变形卷积的提出便是用于解决此问题。
(a) 普通卷积;(b) 可变形卷积;(c)-(d) 可变形卷积的两种特殊形式。
原理
需要注意的是,可变形卷积并不是真正意义上的学习可变形的卷积核,而是利用额外的卷积层去学习相应的偏移量,将得到的偏移量叠加到输入特征图中相应位置的像素点中。但由于偏移量的生成会产生浮点数类型,而偏移量又必须转换为整形,如果直接取整的话是无法进行反向传播的,因此原文是利用双线性插值的方式来间接的计算对应的像素值。
特性
自适应感受野
传统的卷积核由于尺寸形状固定,其激活单元的感受野也相对固定。但实际上同一个物体由于在不同位置上可能对应着不同的尺度或者变形,因此自适应感受野是进行精确定位所需要的,特别是对于密集型预测任务来说。可变形卷积基于一个平行的网络来学习偏移,让卷积核在输入特征图能够发散采样,使网络能够聚焦目标中心,从而提高对物体形变的建模能力。
难以部署
DCN虽然可以带来高精度,但是仍然存在一个缺陷,即当卷积核过大时,会占用非常大的内存空间,因此在落地部署方面的应用很受限制。不过对于参加竞赛而言倒不失为一种提分的trick。
改进
可变形卷积可以在一定程度上提升模型特征提取的泛化能力,但同时也会引入一些不相关的背景噪声干扰。为此,作者提出了改进的版本《Deformable ConvNets v2: More Deformable, Better Results》[15],并给出了三种相应的解决方案:使用更多数量的可变形卷积、为每个偏置都添加相应的权重、模仿R-CNN中的特征。然而,可变形卷积的计算效率也是一个值得商榷的问题。从另一个侧面来看,可变形卷积可以看做是对局部区域进行自注意力操作。
SSConv
背景
与深度可分离卷积一样,空间可分离卷积也属于因式分离卷积的一种,其核心思想是从图像空间维度(宽度和高度)进行卷积运算。
原理
空间可分离卷积的工作原理是将卷积核拆分为两部分,即将一个k×k的卷积核拆成k×1和1×k两个方向的卷积核分别对输入特征图进行卷积,以降低计算的复杂度。
Spatially Separable Convolution
特性
降低计算量
如上图所示,以5×5的输入特征图为例,如果我们直接用一个3×3的卷积核去卷积,共需要9×9=81次乘法运算。而如果换成空间可分离卷积,那么计算量为15×3+9×3=72次乘法运算。共节省了约11%的计算量。
应用
可以在空间上分离的最著名的卷积之一是Sobel算子,用于检测边缘。
局限性
空间可分离卷积在实际当中很少被广泛应用,最主要的一个原因是并不是所有的卷积核都能够有效的拆分成小的卷积核。
GraphConv
论文:《Semi-Supervised Classification with Graph Convolutional Networks》[16] (Accepted by ICLR 2017)
讲解:https://github.com/CVHuber/Convolution/blob/main/Graph%20Convolution.py
背景
图卷积网络又是图网络中最简单的一个分支,而图卷积的提出便是为了有效的解决传统CNNs、RNNs等网络无法处理的非欧式空间的数据问题。
Graph Convolution
原理
图中的核心思想是利用边的信息对节点信息进行聚合,从而生成新的节点表示。简而言之,CNNs中的卷积运算是卷积核对应位置的加权求和,扩展到GCNs就是利用边的信息不断的汇聚邻间节点的信息,以更新原节点的参数。
特性
节点特征
每个节点均可用于特征表示。
结构特征
节点与节点之间通过携带信息的边进行关联。
Inception Block
论文:Going deeper with convolutions[17] (Accepted by CVPR 2015)
背景
Inception Block最初提出的目的是希望能够在同一层特征图上获得不同尺度下的特征表征,增加网络宽度有利于获得更丰富的特征表示。
Inception v1
特性
多尺度特征提取
由上图可知,Inception Block主要通过多个带有不同卷积核大小的卷积运算来捕获多尺度的上下文信息,最后再通过拼接操作聚合输出,以获得多尺度特征表示。
改进
Inception v1
为了进一步地压缩网络的参数量和计算量,作者在原先的Inception块中大量的引入了1×1卷积,从而减小网络的整体规模。
Inception v2
Inception v2[18]的主要思想便是提出了Batch Normalization,通过减少内部协变量偏移有效的加速了深度网络的训练。此外,借鉴VGG-Net[19]的思想,v2将v1中的5×5卷积用两个3×3卷积进行替换,在保证获得同等感受野的情况下,进一步的降低网络的参数量和计算量。
Inception v3
Inception v3[20]主要借鉴了空间可分离卷积的思想,将原本k×k的卷积核拆分成1×k和k×1的一维卷积,一方面可以有效的加速网络的运算,另一方面多余的计算资源可用于增加网络的深度,提高非线性映射的能力。
Inception v4
Inception v4[21]则借鉴了ResNet[22]的思想,引入了Skip Connection,不仅可以极大地加速网络的训练,同时也能够显著的提高网络性能。
本文暂时没有评论,来添加一个吧(●'◡'●)