摘要 :在轻量化网络的设计中,我们常说"计算量降低了9倍"或"参数量减少了数倍"。这些数字究竟是怎么算出来的?本文将通过严谨的数学推导,对比 标准卷积 、深度可分离卷积(MobileNet) 、分组卷积(ShuffleNet) 以及 Ghost Module 的计算差异,并提供一个具体的推理计算案例。
0. 符号定义 (Notation)
为了保证推导的严谨性,我们统一以下符号:
- H×WH \times WH×W: 输入/输出特征图的空间尺寸(假设输入输出尺寸不变,即 Stride=1, Padding=Same)。
- CinC_{in}Cin: 输入通道数 (Input Channels)。
- CoutC_{out}Cout: 输出通道数 (Output Channels)。
- K×KK \times KK×K: 卷积核尺寸 (Kernel Size,通常为 3x3)。
- FLOPs : 浮点运算次数 (Floating Point Operations),我们主要计算乘加运算(MACC,Multiply-Accumulate Operations),通常 1 MACC≈2 FLOPs1 \text{ MACC} \approx 2 \text{ FLOPs}1 MACC≈2 FLOPs。本文以 MACC 为基准单位。
1. 基准:标准卷积 (Standard Convolution)
1.1 计算过程推导
标准卷积中,输出特征图的每一个像素点 ,都是由一个 K×K×CinK \times K \times C_{in}K×K×Cin 的立体卷积核与输入进行点积得到的。
-
单个输出像素的计算量 :
需要遍历 CinC_{in}Cin 个通道,每个通道做 K×KK \times KK×K 次乘加。
Costpixel=K⋅K⋅Cin Cost_{pixel} = K \cdot K \cdot C_{in} Costpixel=K⋅K⋅Cin -
总计算量 (FLOPs) :
输出特征图共有 H⋅WH \cdot WH⋅W 个像素,且有 CoutC_{out}Cout 个输出通道(即有 CoutC_{out}Cout 个卷积核)。
FLOPsstd=H⋅W⋅Cout⋅(K⋅K⋅Cin) FLOPs_{std} = H \cdot W \cdot C_{out} \cdot (K \cdot K \cdot C_{in}) FLOPsstd=H⋅W⋅Cout⋅(K⋅K⋅Cin)整理后:
FLOPsstd=H⋅W⋅Cin⋅Cout⋅K2 \mathbf{FLOPs_{std} = H \cdot W \cdot C_{in} \cdot C_{out} \cdot K^2} FLOPsstd=H⋅W⋅Cin⋅Cout⋅K2 -
参数量 (Params) :
卷积核数量 ×\times× 单个卷积核体积。
Paramsstd=K⋅K⋅Cin⋅Cout \mathbf{Params_{std} = K \cdot K \cdot C_{in} \cdot C_{out}} Paramsstd=K⋅K⋅Cin⋅Cout
2. 核心:深度可分离卷积 (Depthwise Separable Conv)
这是 MobileNet 系列的核心。它将标准卷积分解为 Depthwise (DW) 和 Pointwise (PW) 两步。
2.1 步骤一:Depthwise Convolution (DW)
每个卷积核只负责1个输入通道(Channel-wise),不改变通道数。
- 输入:CinC_{in}Cin,输出:CinC_{in}Cin。
- 卷积核:K×K×1K \times K \times 1K×K×1,共有 CinC_{in}Cin 个。
- 计算量 :
FLOPsdw=H⋅W⋅Cin⋅(K⋅K) FLOPs_{dw} = H \cdot W \cdot C_{in} \cdot (K \cdot K) FLOPsdw=H⋅W⋅Cin⋅(K⋅K)
2.2 步骤二:Pointwise Convolution (PW)
使用 1×11 \times 11×1 卷积将 DW 的结果在通道维度进行融合,改变通道数。
- 输入:CinC_{in}Cin,输出:CoutC_{out}Cout。
- 卷积核:1×1×Cin1 \times 1 \times C_{in}1×1×Cin,共有 CoutC_{out}Cout 个。
- 计算量 :
FLOPspw=H⋅W⋅Cout⋅(1⋅1⋅Cin) FLOPs_{pw} = H \cdot W \cdot C_{out} \cdot (1 \cdot 1 \cdot C_{in}) FLOPspw=H⋅W⋅Cout⋅(1⋅1⋅Cin)
2.3 总计算量与压缩比推导
总计算量为两步之和:
FLOPsdsc=FLOPsdw+FLOPspw FLOPs_{dsc} = FLOPs_{dw} + FLOPs_{pw} FLOPsdsc=FLOPsdw+FLOPspw
FLOPsdsc=H⋅W⋅Cin⋅K2+H⋅W⋅Cin⋅Cout FLOPs_{dsc} = H \cdot W \cdot C_{in} \cdot K^2 + H \cdot W \cdot C_{in} \cdot C_{out} FLOPsdsc=H⋅W⋅Cin⋅K2+H⋅W⋅Cin⋅Cout
计算压缩比 (Reduction Ratio) :
FLOPsdscFLOPsstd=HWCinK2+HWCinCoutHWCinCoutK2 \frac{FLOPs_{dsc}}{FLOPs_{std}} = \frac{H W C_{in} K^2 + H W C_{in} C_{out}}{H W C_{in} C_{out} K^2} FLOPsstdFLOPsdsc=HWCinCoutK2HWCinK2+HWCinCout
分子分母同时约去 H⋅W⋅CinH \cdot W \cdot C_{in}H⋅W⋅Cin:
Ratio=K2+CoutCout⋅K2=K2CoutK2+CoutCoutK2 \text{Ratio} = \frac{K^2 + C_{out}}{C_{out} \cdot K^2} = \frac{K^2}{C_{out} K^2} + \frac{C_{out}}{C_{out} K^2} Ratio=Cout⋅K2K2+Cout=CoutK2K2+CoutK2Cout
Ratio=1Cout+1K2 \mathbf{\text{Ratio} = \frac{1}{C_{out}} + \frac{1}{K^2}} Ratio=Cout1+K21
2.4 推理分析
当 K=3K=3K=3 时,K2=9K^2=9K2=9。
如果 CoutC_{out}Cout 较大(例如 64, 128, 512),则 1Cout→0\frac{1}{C_{out}} \to 0Cout1→0。
此时:
Ratio≈19 \text{Ratio} \approx \frac{1}{9} Ratio≈91
结论:3x3 深度可分离卷积的计算量约为标准卷积的 1/8 到 1/9。
3. 进阶:分组卷积 (Group Convolution)
ShuffleNet 利用分组卷积来降低 1×11 \times 11×1 卷积(PW)的计算量。
3.1 推导过程
假设我们将输入通道 CinC_{in}Cin 和输出通道 CoutC_{out}Cout 都平均分成 ggg 组。
每一组内部进行独立的标准卷积。
-
单组计算量 :
输入通道 Cing\frac{C_{in}}{g}gCin,输出通道 Coutg\frac{C_{out}}{g}gCout。
FLOPsgroup_i=H⋅W⋅Cing⋅Coutg⋅K2 FLOPs_{group\i} = H \cdot W \cdot \frac{C{in}}{g} \cdot \frac{C_{out}}{g} \cdot K^2 FLOPsgroup_i=H⋅W⋅gCin⋅gCout⋅K2 -
总计算量 (ggg 组之和) :
FLOPsgroup=g⋅(H⋅W⋅Cing⋅Coutg⋅K2) FLOPs_{group} = g \cdot \left( H \cdot W \cdot \frac{C_{in}}{g} \cdot \frac{C_{out}}{g} \cdot K^2 \right) FLOPsgroup=g⋅(H⋅W⋅gCin⋅gCout⋅K2)
FLOPsgroup=H⋅W⋅Cin⋅Cout⋅K2⋅1g FLOPs_{group} = H \cdot W \cdot C_{in} \cdot C_{out} \cdot K^2 \cdot \frac{1}{g} FLOPsgroup=H⋅W⋅Cin⋅Cout⋅K2⋅g1 -
压缩比 :
FLOPsgroupFLOPsstd=1g \frac{FLOPs_{group}}{FLOPs_{std}} = \frac{1}{g} FLOPsstdFLOPsgroup=g1
3.2 实际应用中的推理
在 ShuffleNet 中,通常针对 1×11 \times 11×1 卷积使用分组(g=2,3,4,8g=2, 3, 4, 8g=2,3,4,8 等)。
若 g=3g=3g=3,则计算量直接除以 3。但分组卷积会导致通道间信息不流通,因此必须配合 Channel Shuffle 操作。
4. 极致:Ghost Module 推导
GhostNet 认为 CoutC_{out}Cout 个特征图中,有很多是相似的(冗余的)。假设我们只需要生成 mmm 个"本征特征图",剩下的 n=Cout−mn = C_{out} - mn=Cout−m 个是"幻影特征图"。
4.1 步骤分解
假设总输出通道数为 nnn,其中分为两部分:mmm 个原始特征,s⋅ms \cdot ms⋅m 个幻影特征(n=m+s⋅mn = m + s \cdot mn=m+s⋅m)。
-
生成本征图 (Primary Conv) :
使用标准卷积生成 mmm 个通道。
FLOPs1=H⋅W⋅Cin⋅m⋅K2 FLOPs_1 = H \cdot W \cdot C_{in} \cdot m \cdot K^2 FLOPs1=H⋅W⋅Cin⋅m⋅K2 -
生成幻影图 (Cheap Operation) :
对这 mmm 个通道,每个通道进行 s−1s-1s−1 次简单的线性变换(通常是 d×dd \times dd×d 的 Depthwise 卷积,且 ddd 通常等于 KKK)。
FLOPs2=H⋅W⋅m⋅(s−1)⋅d2 FLOPs_2 = H \cdot W \cdot m \cdot (s-1) \cdot d^2 FLOPs2=H⋅W⋅m⋅(s−1)⋅d2
(注:这里是逐通道变换,类似于 DW 卷积,输入通道为 1)
4.2 压缩比推导 (Speed-up Ratio)
标准卷积生成 nnn 个通道的计算量:
FLOPsstd=H⋅W⋅Cin⋅n⋅K2 FLOPs_{std} = H \cdot W \cdot C_{in} \cdot n \cdot K^2 FLOPsstd=H⋅W⋅Cin⋅n⋅K2
Ghost Module 总计算量:
FLOPsghost=FLOPs1+FLOPs2 FLOPs_{ghost} = FLOPs_1 + FLOPs_2 FLOPsghost=FLOPs1+FLOPs2
=m⋅H⋅W⋅(Cin⋅K2+(s−1)⋅d2) = m \cdot H \cdot W \cdot (C_{in} \cdot K^2 + (s-1) \cdot d^2) =m⋅H⋅W⋅(Cin⋅K2+(s−1)⋅d2)
压缩比 rsr_srs :
rs=FLOPsstdFLOPsghost=n⋅Cin⋅K2m⋅(Cin⋅K2+(s−1)⋅d2) r_s = \frac{FLOPs_{std}}{FLOPs_{ghost}} = \frac{n \cdot C_{in} \cdot K^2}{m \cdot (C_{in} \cdot K^2 + (s-1) \cdot d^2)} rs=FLOPsghostFLOPsstd=m⋅(Cin⋅K2+(s−1)⋅d2)n⋅Cin⋅K2
利用关系 n=m⋅sn = m \cdot sn=m⋅s,代入分子:
rs=m⋅s⋅Cin⋅K2m⋅(Cin⋅K2+(s−1)⋅d2) r_s = \frac{m \cdot s \cdot C_{in} \cdot K^2}{m \cdot (C_{in} \cdot K^2 + (s-1) \cdot d^2)} rs=m⋅(Cin⋅K2+(s−1)⋅d2)m⋅s⋅Cin⋅K2
rs=s⋅Cin⋅K2Cin⋅K2+(s−1)⋅d2 r_s = \frac{s \cdot C_{in} \cdot K^2}{C_{in} \cdot K^2 + (s-1) \cdot d^2} rs=Cin⋅K2+(s−1)⋅d2s⋅Cin⋅K2
极限推理 :
假设 d≈Kd \approx Kd≈K (卷积核大小一致),且 Cin≫sC_{in} \gg sCin≫s (输入通道数远大于扩充倍数)。
分子分母同除以 Cin⋅K2C_{in} \cdot K^2Cin⋅K2:
rs≈s1+s−1Cin r_s \approx \frac{s}{1 + \frac{s-1}{C_{in}}} rs≈1+Cins−1s
由于 s−1Cin≈0\frac{s-1}{C_{in}} \approx 0Cins−1≈0,则:
rs≈s \mathbf{r_s \approx s} rs≈s
结论:如果你想把通道数扩充 2 倍 (s=2s=2s=2),Ghost Module 的理论加速比就接近 2 倍。
5. 实例计算演练 (Numerical Example)
为了彻底搞懂,我们设定一个具体的场景进行计算。
场景设定:
- 输入特征图:112×112×64112 \times 112 \times 64112×112×64
- 输出通道:128128128
- 卷积核:3×33 \times 33×3
- Stride=1
5.1 标准卷积计算
FLOPs=112×112×64×128×3×3≈12,544×73,728≈924.8 M (MACCs) \begin{aligned} FLOPs &= 112 \times 112 \times 64 \times 128 \times 3 \times 3 \\ &\approx 12,544 \times 73,728 \\ &\approx \mathbf{924.8 \text{ M (MACCs)}} \end{aligned} FLOPs=112×112×64×128×3×3≈12,544×73,728≈924.8 M (MACCs)
5.2 深度可分离卷积 (DSC) 计算
- DW 部分 :
112×112×64×9≈7.2 M 112 \times 112 \times 64 \times 9 \approx 7.2 \text{ M} 112×112×64×9≈7.2 M - PW 部分 :
112×112×64×128≈102.7 M 112 \times 112 \times 64 \times 128 \approx 102.7 \text{ M} 112×112×64×128≈102.7 M - 总计 :
7.2+102.7=109.9 M 7.2 + 102.7 = \mathbf{109.9 \text{ M}} 7.2+102.7=109.9 M
验证压缩比 :
109.9924.8≈0.1188 \frac{109.9}{924.8} \approx \mathbf{0.1188} 924.8109.9≈0.1188
理论公式验证:
1128+19=0.0078+0.1111=0.1189 \frac{1}{128} + \frac{1}{9} = 0.0078 + 0.1111 = \mathbf{0.1189} 1281+91=0.0078+0.1111=0.1189
结果高度一致!
5.3 分组卷积 (g=4g=4g=4) 计算
假设对 PW 过程进行分组:
112×112×64×128×1×1×14≈25.6 M 112 \times 112 \times 64 \times 128 \times 1 \times 1 \times \frac{1}{4} \approx \mathbf{25.6 \text{ M}} 112×112×64×128×1×1×41≈25.6 M
6. 总结
通过上述推导,我们可以得出以下硬核结论:
- MobileNet (DSC) :通过解耦空间相关性和通道相关性,将计算量主要集中在 1×11 \times 11×1 的 PW 卷积上,压缩极限约为 1/K21/K^21/K2。
- ShuffleNet (Group Conv) :进一步攻击 PW 卷积,通过稀疏连接(分组),将计算量线性降低 1/g1/g1/g。
- GhostNet :通过线性变换替代卷积生成冗余特征,加速比近似等于通道扩充倍数 sss。
实际应用建议 :
虽然理论 FLOPs 降低了,但 Memory Access Cost (MAC) 也是推理速度的关键。
- DW 卷积虽然 FLOPs 低,但运算密度低,对内存带宽要求高。
- Group 卷积 如果 ggg 过大,会增加内存碎片化访问成本。
- 因此,理论推导是基础,RepVGG 这类重参数化方法(推理时回归标准 3×33 \times 33×3 卷积)在现代 GPU/NPU 上往往能获得更好的 FLOPs/Latency 平衡。