ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

卷积变体全解析:分组卷积、深度可分离、空洞、转置卷积原理与实战

卷积变体全解析:分组卷积、深度可分离、空洞、转置卷积原理与实战 1. 为什么卷积的变体越来越多先厘清标准卷积的边界刚接触卷积神经网络的时候我们往往会把“卷积”当成一个黑盒——输入一张图经过几层卷积特征图越来越小、通道越来越多最后接全连接层出分类结果。但等你真正上手做项目尤其是做语义分割、目标检测、轻量化模型部署这些实际任务时标准卷积的短板就暴露出来了要么计算量扛不住要么感受野不够用要么上采样怎么做都不对劲。这时候你才会意识到所谓“最全卷积总结”不是要把网络结构背一遍而是得先把卷积这件事从原理上拆明白。标准卷积的本质是让每个卷积核在输入特征图的所有通道上做加权求和。拿一个 3×3 卷积举例假设输入是 H×W×C_in输出通道数为 C_out那么这一层需要的参数量是 3×3×C_in×C_out计算量是 3×3×C_in×C_out×H×W。这个公式看起来简单但藏着一个关键信息计算量和输入分辨率、通道数、卷积核尺寸是乘性增长的。在移动端设备上跑一个 224×224 的分类模型如果全用标准 3×3 卷积中间层的计算量动辄就是几千万甚至上亿次乘加运算算力稍弱的芯片根本吃不消。感受野的问题则更隐蔽。标准卷积堆叠确实能增大感受野但代价是层数变深。假设你只有 5 层 3×3 卷积感受野也就 11×11对于需要全局上下文信息的任务比如语义分割中判断一个像素属于哪个物体这种局部感知能力远远不够。空洞卷积的出现本质上就是要在不增加参数量的情况下把感受野撑大。空间信息的处理方式也是标准卷积的短板。标准卷积虽然能提取局部特征但如果你要做图像到图像的映射比如分割、超分、生成需要把特征图恢复到原始分辨率。反卷积转置卷积就是在这个需求下被广泛使用的。它不是一个“逆向卷积”而是一种带有可学习参数的上采样方式理解这一点很多误用就能避开。还有一类需求是结构上的。标准卷积的每个卷积核要同时处理所有输入通道这意味着通道间的冗余信息也会被建模浪费算力。分组卷积、深度可分离卷积本质上就是在“通道维度”上做文章要么把通道分成几组各自卷积降低计算量要么把空间卷积和通道混合拆成两步进一步压缩参数。MobileNet、ShuffleNet 这些轻量级网络核心就是围绕这两类卷积做设计。所以你会发现“卷积家族”不是一堆花哨名词的堆砌每一类变体都在解决某个具体痛点。本篇文章我就按照“从标准卷积出发逐个展开变体原理、计算量对比、适用场景、复现细节”的思路来写尽量把数学推导和工程经验糅合在一起适合三类读者刚入门想系统梳理卷积知识的学生做模型轻量化部署的工程师以及做分割、检测等密集预测任务、需要灵活组合卷积类型的算法研究员。2. 分组卷积通道拆开算计算量和准确率的博弈2.1 参数量节省的具体计算分组卷积的核心操作一句话就能说清把输入特征图的通道均匀分成 G 组每组独立做标准卷积最后把各组输出拼接起来。这里的组数 G 是一个超参数G1 时退化为标准卷积GC_in 时就是深度卷积depthwise convolution。为了让你直观感受到参数量差距我直接列一组数字。假设输入通道 C_in256输出通道 C_out256卷积核 3×3标准卷积参数3×3×256×256 589,824分组卷积G4参数3×3×(256/4)×(256/4)×4 147,456分组卷积G8参数3×3×(256/8)×(256/8)×8 73,728参数量的变化规律是标准卷积的 1/G。这个推导很简单每组输入通道是 C_in/G每组输出通道是 C_out/G组内的卷积核参数是 3×3×(C_in/G)×(C_out/G)再乘以 G 组抵消后就是原来的 1/G。计算量同理也是 1/G。2.2 为什么分组卷积曾经不被看好现在又火了分组卷积最早出名是在 AlexNet 里当时是因为两块 GPU 显存不够才把通道拆成两组分别计算。后来 ResNeXt 把它重新带火变成了“cardinality”基数的概念——不是单纯省算力而是把分组当成一种增强模型表达能力的手段。我个人的理解是分组卷积实际上对通道之间的相关性做了一个先验假设同一组内的通道相关性较强跨组的通道相关性较弱。这有点像人脑处理视觉信号时分区域并行各处理各的通路。ResNeXt 的实验表明在相同参数量下增加分组数即基数比增加网络深度或宽度更能提升准确率原因是它让网络学到的特征更加多样化。工程上的坑在于分组卷积在 GPU 上的实际加速效果并不总是和理论计算量成正比。主要原因有两点一是分组后每组独立计算GPU 的并行度利用率可能下降尤其是分组数很大、每组通道很少时二是内存访问模式变得更复杂如果实现不当访存开销会把算力优势吃掉。在 PyTorch 里Conv2d 的 groups 参数就是为此设计的但底层是否真正加速取决于硬件和库的实现。我自己在 2080Ti 上测过G2 到 G4 时加速明显G32 以上反而可能比标准卷积更慢。2.3 分组卷积在轻量化网络中的隐藏用法除了省参数分组卷积还有一个容易被忽视的用法通道重排channel shuffle。ShuffleNet 的核心逻辑是如果多个分组卷积堆叠每组只在组内交流信息跨组信息永远无法流动这会损害表达能力。于是它加了一个“打乱通道”的操作让下一层分组时每组都能包含上一层各组的信息。这个操作的代价几乎为零只是对张量做 reshape 和 transpose但收益却很可观。我复现 ShuffleNetV2 时测过加了 channel shuffle 之后同等算力下 ImageNet 准确率能涨 1.5 到 2 个点。值得注意的是ShuffleNetV2 论文里有个反直觉的结论FLOPs 一样不代表速度一样内存访问成本MAC和并行度对实际速度的影响非常大。当时我做端侧推理时也踩过这个坑光看理论计算量选网络上板之后发现延迟完全不是那么回事后来改成直接用实际推理耗时作为衡量指标。3. 深度可分离卷积MobileNet 的速度密码但别忽略它的副作用3.1 拆解两步走深度卷积加逐点卷积深度可分离卷积由两部分组成深度卷积每个输入通道单独用一个卷积核做空间卷积不跨通道。这一步负责提取空间特征。逐点卷积用 1×1 卷积在所有通道间做线性组合这一步负责通道间的信息融合。这两步加起来的效果理论上可以逼近标准卷积。为什么说“逼近”因为标准卷积是一个联合空间加通道的线性映射而深度可分离卷积把它强行拆成了两步相当于把原来一个高维矩阵分解成了两个低维矩阵的乘积——信息表达上会有轻微损失但参数量和计算量大幅下降。还是用具体数字说话。输入 C_in256输出 C_out256卷积核 3×3特征图 56×56标准卷积计算量3×3×256×256×56×56 ≈ 1.85×10^9深度卷积计算量3×3×256×56×56 ≈ 7.24×10^6逐点卷积计算量1×1×256×256×56×56 ≈ 2.05×10^8深度可分离卷积总计算量约 2.12×10^8对比下来计算量大约是标准卷积的 1/8 到 1/9。这个比例怎么来的标准卷积的计算量是 3×3×C_in×C_out×H×W深度可分离卷积是 (3×3×C_in C_in×C_out)×H×W当 C_out 远大于 9 时后者约等于前者的 1/(C_out×某些系数)具体取决于 C_in 和 C_out 的关系。3.2 实际训练中那些容易踩的坑按理说计算量降了一个数量级模型应该又好又快。但我在实际项目中发现直接用深度可分离卷积替换标准卷积往往会出现准确率下降的问题尤其是任务复杂度较高时。原因有三个第一深度卷积的每个卷积核只处理一个通道感受野和跨通道信息同时受限。比如在检测小物体时单独一个通道的空间信息可能不够导致特征质量下降。MobileNetV2 之所以加入“倒残差”inverted residual结构用 1×1 先把通道扩宽再做深度卷积最后用 1×1 压缩回去本质上就是为了缓解这个问题——在更高维的空间里做深度卷积信息不容易丢。第二深度卷积的参数量极少容易过拟合或欠拟合。如果数据集很小深度卷积层实际上学不到足够丰富的空间模式。我当时在一个工业质检项目里只有几千张样本用 MobileNetV2 做特征提取效果反而不如 ResNet18调了很久才发现是这个原因。第三量化部署时精度掉得比标准卷积更明显。因为深度卷积每个通道独立计算对量化误差更敏感尤其是通道间数值范围差异大时统一用同一个 scale 去量化误差会被放大。我后来在 TensorRT 里做 INT8 量化深度可分离卷积的部分必须做 per-channel 量化否则精度掉得没法用。3.3 什么时候该用什么时候别用适用场景移动端或边缘设备上的分类、检测模型算力受限。需要极低延迟的实时推理比如视频流处理。作为骨干网络与注意力机制结合MobileNetV3 和 EfficientNet 都验证了这条路可行。不适合的场景需要极高精度的离线任务算力不是瓶颈标准卷积或大模型更合适。小数据集训练深度可分离卷积更容易过拟合或欠拟合。对逐像素输出质量要求很高的任务如精细分割、超分单纯替换会损失边缘细节。4. 空洞卷积撑大感受野的代价是“网格伪影”4.1 dilation rate 到底改了什么空洞卷积Dilated Convolution的关键参数是 dilation rate记为 d。普通卷积核的相邻元素间距是 1空洞卷积会让间距变成 d相当于在卷积核元素之间插入 d-1 个空洞。一个 3×3 卷积核当 d2 时实际覆盖的范围是 5×5但参数量不变仍然是 9 个权重。感受野的计算公式是新的感受野 (卷积核尺寸 - 1) × dilation 1。所以 3×3 卷积d2 时的感受野是 (3-1)×21 5d3 时是 7。如果连续堆叠多层空洞卷积感受野的增长是指数级的每层的等效卷积核尺寸可以叠加。空洞卷积最经典的应用是 DeepLab 系列的语义分割。分割任务要求输出分辨率尽量接近输入所以不能像分类那样反复池化把分辨率降下来。空洞卷积可以在保持分辨率的同时扩大感受野从而让每个像素都获得足够大的上下文信息。4.2 网格伪影空洞卷积最阴险的坑空洞卷积有个著名的副作用叫“网格伪影”gridding artifact。当多个空洞卷积堆叠时如果 dilation rate 相同或成倍数关系卷积核的有效采样点会集中在某些规律的位置上导致局部信息丢失输出特征图出现棋盘格状的伪影。具体表现是分割结果的边缘区域出现周期性的误分类或者生成的图像有规则纹理。我在一个遥感图像的建筑物分割项目里就遇到过这个问题模型在验证集上整体精度还行但输出图里建筑物边缘总有一圈细密的网格状噪点。后来排查发现连续三层 dilation rate2 的空洞卷积叠加采样点分布完全错开了中间区域。解决办法参考了 HDCHybrid Dilated Convolution的思路在一组空洞卷积中让 dilation rate 呈现锯齿状变化比如 [1,2,5,9] 而不是 [2,2,2,2]确保采样点覆盖完整。另一个更工程化的补救是“多分支空洞卷积”也就是 ASPP 结构——并行使用多个不同 dilation rate 的空洞卷积再把结果拼接起来。DeepLabV3 里的 ASPP 用的是 [1, 6, 12, 18] 四个分支效果比单纯堆叠同 dilation 的层好很多因为不同率的特征互补网格伪影被平均掉了。4.3 空洞卷积与感受野的“假大空”很多人以为空洞卷积的感受野大了就能获取更多全局信息。实测中不完全是这样。空洞卷积的感受野确实覆盖了更大的区域但采样点是稀疏的中间大量的像素根本没被看到。相比同样感受野的密集卷积比如 5×5空洞卷积学到的是“抽样”特征信息量其实更少。这意味着什么空洞卷积适合做上下文信息的补充但不适合做像素级细粒度特征的提取。如果你把所有下采样都换成空洞卷积来保持分辨率模型会学到一种“高感受野低细节”的表示边缘和小目标往往处理不好。我的建议是空洞卷积要和标准卷积混合使用。浅层用标准卷积提取细节深层用空洞卷积扩大上下文这样能兼顾局部和全局。5. 转置卷积不是逆卷积是可学习上采样5.1 从数学上弄懂转置卷积的维度变化转置卷积Transposed Convolution也叫反卷积Deconvolution但这个中文名其实有误导性。它并不是标准卷积的逆运算——你不可能从一个输出恢复出唯一确定的输入因为标准卷积本身不是可逆的。转置卷积做的事情是在已知卷积核的前提下把一个低分辨率的特征图映射到高分辨率映射规则保持“与卷积的转置关系”因此叫转置卷积。理解它的最好方式是从矩阵角度看。标准卷积可以表示为一个稀疏矩阵乘法 y Cx其中 C 是由卷积核构造的矩阵。转置卷积则是 y C^T x把输入特征图映射到更大的空间。注意这里的 C^T 并不是 C 的逆它只是把信息“扩散”到了更多位置。具体来说假设输入尺寸是 2×2用 3×3 转置卷积stride2输出尺寸是 4×4。输出的每个位置是输入各像素与卷积核权重组合的结果。PyTorch 里你可以用nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride2)实现输出尺寸公式是输出尺寸 (输入尺寸 - 1) × stride - 2×padding kernel_size output_padding这个公式经常让人头大尤其是 output_padding 这个参数。它的作用只是调整输出尺寸并不参与卷积运算。比如输入 4×4stride2卷积核 3×3按公式计算输出是 (4-1)×2 3 9如果你想得到 8×8 的输出就得设置 output_padding1。5.2 棋盘格伪影转置卷积的经典问题转置卷积有个绕不开的问题棋盘格伪影checkerboard artifacts在 GAN 生成的图像里非常常见。原因是 stride 大于 1 时卷积核的采样在输出空间上不均匀——某些位置被多个输入像素影响某些位置只被一个输入像素影响导致输出的权重分布不均匀形成明暗相间的棋盘纹理。当时我做图像超分实验时用了一堆转置卷积做上采样结果生成的图像总有一层隐约的网格感。后来把上采样方式换成了“先插值再卷积”的组合棋盘格伪影立刻消失了。这个操作很值得推荐先用双线性插值或最近邻插值把分辨率放大到目标尺寸再接一个标准 3×3 卷积。虽然从理论上说参数量差不多但生成图像的质量高很多训练也更稳定。5.3 转置卷积在分割任务中的正确使用姿势语义分割的上采样从编码器输出的低分辨率特征图恢复到原图尺寸有两种主流方案直接转置卷积简单粗暴但容易出棋盘格伪影。双线性插值加卷积先插值到目标尺寸再做卷积融合。我个人的经验是如果分割目标是平滑的大物体如道路、天空转置卷积没问题如果目标是精细结构如血管、电线建议用插值加卷积的组合或者用 Pixelshuffle像素重排做上采样。Pixelshuffle 的原理是把通道维度的信息“重排”到空间维度比如把 [C×r², H, W] 变成 [C, H×r, W×r]它不是转置卷积但能达到类似的上采样效果而且没有棋盘格伪影。6. 几类卷积的对比表格参数、计算量、感受野速查这里给一张我平时做方案选型会参考的速查表。行是卷积类型列是参数量倍数相对于标准卷积、计算量倍数相对于标准卷积假设输出通道与输入相同、感受野特点、主要适用场景。卷积类型参数量倍数计算量倍数感受野特点主要适用场景标准卷积11局部密集采样感受野与卷积核大小一致通用特征提取几乎适用所有任务分组卷积G组1/G1/G通道分组内局部采样感受野同标准卷积降低计算量ResNeXt骨干通道稀疏交互深度可分离卷积约1/9约1/8深度卷积空间采样逐点卷积通道融合轻量化部署、移动端分类检测空洞卷积dilationd11等效感受野线性放大采样稀疏语义分割、需要大上下文的任务转置卷积11但输出更大上采样映射感受野与卷积核相关图像生成、超分辨、分割解码器自适应图卷积变体较多变体较多结构自适应非规则感受野图数据、点云、关系建模任务注意这张表的参数量和计算量倍数是在“输入输出通道相等、同卷积核尺寸”的理想条件下推导的实际项目中还要考虑具体硬件、内存布局、是否融合激活函数等因素不能只看理论值。7. 自适应图卷积和三维卷积卷积变体在非图像数据上的扩展7.1 为什么要在图上定义卷积传统的卷积操作依赖规则网格——图像的像素均匀排列空间位置关系固定。但现实中有大量数据不是这种结构比如社交网络、分子结构、点云、知识图谱。它们的节点没有固定顺序邻居关系也各不相同标准卷积的滑动窗口根本无法直接应用。为了实现“类似卷积”的邻域聚合操作研究人员设计了图卷积。自适应图卷积Adaptive Graph Convolution进一步允许网络自己学习节点之间的连接权重而不依赖手工定义的邻接矩阵因此对不同的图结构有更强的泛化能力。7.2 从图像卷积到图卷积的映射逻辑图像卷积做的事可以概括为两步确定邻居然后对邻居特征做加权求和。图卷积也是这两步只是“邻居”的确定方式变了——每个节点的邻居就是与之相连的节点而这个连接关系可以来自邻接矩阵也可以来自注意力机制这正是自适应图卷积的精髓。常见的实现有 GCN谱域图卷积和 GAT图注意力网络。GCN 使用固定的邻接矩阵做归一化传播GAT 则使用学习到的注意力权重动态聚合邻居。自适应主要体现在注意力权重或者图上比如可以引入可学习的边权重矩阵让网络根据节点特征自动调整连接强度。这种机制在处理点云如 PointNet 的改进版或人体骨架动作识别时特别有效因为每个节点的邻居数量是不固定的。7.3 三维卷积从图像到视频和体数据三维卷积则是把二维卷积核扩展为三维立方体输入从 [C, H, W] 变成 [C, D, H, W]其中 D 可以是视频帧的时间维度也可以是 CT 影像的切片深度维度。3D 卷积神经网络经常用在这个场景视频动作识别、医学影像分割、气象数据预测等。这里的核心代价是计算量暴涨。一个 3×3×3 的 3D 卷积核参数量是普通 3×3 的 3 倍计算量更是随分辨率维度的增加而指数级上升。在 64×64×64 的体数据上跑一个简单的 3D 分割模型显存占用经常把 24G 的卡跑满。常用的应对策略包括用 2D1D 分离卷积比如先做空间 2D 卷积再做时间 1D 卷积、减少通道数、使用混合精度训练。8. 门控卷积给特征加上“开关”的进阶玩法8.1 门控卷积的原理门控卷积Gated Convolution最早在图像修复任务里被提出核心思路是让网络自己决定每个位置、每个通道的信息该保留多少。它的公式是output sigmoid(W_g · x) ⊙ (W_f · x)其中 W_g 和 W_f 是两个不同的卷积层sigmoid 的输出作为“门控信号”逐元素乘到 W_f 提取的特征上。简单来说就是一份特征经过两条分支一条分支提取内容特征另一条分支生成 0 到 1 之间的掩码决定内容特征中哪些部分需要保留哪些部分需要抑制。这跟你熟悉的注意力机制有很多相似之处。SE 模块是对通道做全局注意力CBAM 是对通道加空间做注意力门控卷积则是在特征图的每个空间位置上做动态选择。它的优势在于网络可以根据输入内容自适应地调整信息流——比如图像修复时破损区域的信息应该被抑制周围有效区域的信息应该被放大门控卷积天然适合做这件事。8.2 门控卷积的典型使用场景图像修复与 Inpainting门控可以自动区分破损区域和有效区域让网络把特征提取集中在有效区域上。语言模型与语音合成WaveNet 就用了类似门控的 Gated Activation Unit在时序数据上控制信息的遗忘与保留。视频预测与生成门控控制时间维度的信息流动避免误差累积。在复现门控卷积时要注意一点sigmoid 分支和内容分支的卷积核感受野应该一致通常都用 3×3 或 5×5否则门控信号和内容特征在空间上对不齐训练效果会很差。我踩过这个坑当时门控分支用了 1×1 卷积内容分支用了 3×3结果模型输出总是有奇怪的边缘——就是因为门控信号的空间分辨率虽然一样但感受到的局部范围不同语义对不上。9. 实战复盘在语义分割任务里如何组合这些卷积理论讲再多不如直接走一遍选型过程。这里我分享一个我在工业质检项目中的实际操作流程需求是分割传送带上的零件表面缺陷裂纹、划痕、污渍硬件是一块老旧的嵌入式 GPU内存有限要求单帧推理时间不超过 20ms。第一步选骨干网络。因为推理时间限制很紧直接排除 ResNet、VGG 这类重网络选择 MobileNetV2 作为编码器它的深度可分离卷积能保证低延迟。第二步处理分辨率问题。检测微小划痕需要较高分辨率不能像分类那样用大 stride 把特征图降到 7×7所以我用了空洞卷积替代部分下采样。具体做法是把 MobileNetV2 的最后多个 block 的 stride 从 2 改为 1同时把 block 里的深度卷积改为空洞卷积dilation2这样输出特征图保持在原图的 1/8 而不是 1/32感受野又没有被缩小。第三步解码器设计。我先尝试了双线性插值加卷积的组合效果不错但边缘细节还不够锐利。后来融合了转置卷积做一层精细上采样虽然棋盘格伪影的风险存在但在这种缺陷尺寸较小的场景下转置卷积带来的细节增强收益更大。这里的关键是只在上采样的最后一层用转置卷积前面的上采样都用插值把伪影风险压到最低。第四步引入门控卷积做掩码增强。缺陷区域的边界往往模糊我加了一个门控分支让网络自动学习哪些区域是“真正的缺陷边缘”哪些是背景纹理噪声。调整之后边缘 F1 分数提升了 1.8 个百分点这个收益在当时是很有说服力的。整条链路下来单帧推理时间稳定在 17ms 左右满足需求。10. 几条从实践中获得的选型经验最后再分享几条我自己的选型经验不一定适用于所有场景但至少能帮你少走弯路。第一不要为了用某些变体而强行用。如果你的任务在普通卷积下已经跑得很好算力也不紧张就没必要换成深度可分离卷积省下的那点参数量可能带来精度损失和部署复杂度。第二感受野不是越大越好。空洞卷积虽然能扩大感受野但采样稀疏过度使用会导致特征质量下降。合理的做法是“阶梯式”设置 dilation rate比如 [1, 2, 5]确保感受野覆盖平滑。第三上采样的优先级顺序我个人是插值加卷积优于转置卷积Pixelshuffle 优于插值加卷积在生成任务中。转置卷积不是不能用而是要控制使用位置尽量不放在最后的输出层。第四任何卷积变体的效果都要在目标硬件上实测验证。理论 FLOPs 和实际延迟的差距在我做嵌入式部署时几乎每天都能感受到同样的网络在 GPU、NPU、CPU 上的表现差异巨大最终选型必须以实测为准。第五新模型里的卷积组合比如 MobileNetV3 的 NAS 搜索结构、EfficientNet 的复合缩放本质上都是在卷积变体的搜索空间里寻优理解每一种变体的优缺点比背某个模型结构更重要。你只有知道每组件的实际作用才能在遇到问题时真正调试得动而不是只会换网络。
返回列表