分组卷积有什么作用?和深度可分离卷积有什么关系?
简化版
分组卷积把输入和输出通道划成 G 组,每组独立卷积,计算量约降为普通卷积的 1/G。当 G=C_in 时得到 depthwise 卷积,但深度可分离卷积还必须再接 1×1 pointwise 卷积完成通道混合。
详细版
-
普通卷积每个输出通道连接全部输入通道;分组卷积只连接所属组。
-
参数量和 MACs 都从
Cout×Cin×K²降为Cout×Cin×K²/G。 -
分组阻断跨组信息,ResNeXt 用后续层融合,ShuffleNet 用 channel shuffle 交换通道。
-
depthwise 是组数等于输入通道数、每组一个输入通道的极端情况。
-
理论 FLOPs 下降不保证同倍延迟下降,内存访问和硬件并行度会影响实测。
完整版教学
一、用稀疏通道连接换取计算效率
标准卷积在通道维是全连接的,表达充分但成本高。
分组卷积将权重矩阵变成块对角结构,保留组内空间建模,减少不必要的跨通道乘加。
这种稀疏性是一种架构先验:若分组过多且没有混合操作,各组会形成互不通信的信息孤岛,精度可能下降。
二、底层机制与关键公式
要求 Cin 与 Cout 通常都能被 G 整除。
第 g 组只读取 Cin/G 个输入通道,并产生 Cout/G 个输出通道,最后沿通道拼接。
depthwise 层只负责每个通道内部的空间滤波,pointwise 1×1 才负责通道线性组合。
把二者合称深度可分离卷积,不能漏掉第二步。
standard params = Cout * Cin * K * K
grouped params = Cout * (Cin/G) * K * K
depthwise-separable = Cin*K*K + Cin*Cout
三、带数字的推演
Cin=Cout=64、K=3、G=4 时,普通卷积参数为 64×64×9=36,864;分组卷积为 9,216,正好降到 1/4。
若做 depthwise + pointwise,则为 64×9+64×64=4,672。
四、方案对比与选择
| 方案/场景 | 机制或优势 | 主要代价 |
|---|---|---|
| 普通卷积 | G=1 | 空间与通道一次完成,成本最高 |
| 分组卷积 | 1<G<Cin | 组内混合,成本约 1/G |
| Depthwise | G=Cin | 仅空间滤波,需 pointwise 混通道 |
五、实际执行流程
输入 64 通道 -> 切成 4×16 通道 -> 4 组独立 3×3 卷积
-> 拼接 4×16 输出 -> shuffle/1×1 促进跨组通信
六、边界条件与工程代价
GPU 对极端小组卷积可能启动许多低利用率 kernel,理论 MACs 很小但耗时未同步下降。
部署选型必须在目标硬件上测 latency,而不只报告 FLOPs。
组数改变会改变权重形状,不能把普通卷积预训练权重直接无损塞入任意分组结构;网络宽度和组数也要共同调节。
记忆钩子:沿着
G=1 → 普通卷积,1<G<C → 分组卷积,G=C → depthwise记忆。
七、常见误区与追问
-
误区:分组卷积就是深度可分离卷积。 depthwise 只是特殊分组,深度可分离还包含 pointwise。
-
追问:计算量为什么约除以 G? 每个输出通道只连接原来
1/G的输入通道。 -
误区:FLOPs 降 4 倍,延迟一定降 4 倍。 访存、并行度和算子实现会限制实际加速。
-
追问:组间如何交换信息? 可使用 1×1 卷积、channel shuffle 或后续非分组层。
-
追问:ResNeXt 的 cardinality 指什么? 它对应并行变换分支或分组数,是宽度、深度之外的容量维度。
八、加强记忆
沿着 G=1 → 普通卷积,1<G<C → 分组卷积,G=C → depthwise 记忆。
成本随 G 下降,但跨组通信也随之减少,所以答案必须同时提到 1×1 或 shuffle 与硬件实测。