ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
论文链接: https://arxiv.org/abs/1807.11164
一、 Problem Statement
作者认为在设计网络结构的时候光考虑FLOPs这个指标不够,还需要考虑MAC(memory access cost)和目标设备。
相近的FLOPs可能会又不同的速度,在不同目标设备上不同的操作也有不同的速度。
二、 Direction
提出了下面四个准则
- 相同的通道数来减少MAC(memory access cost)
- 过多的group convolution会增加MAC
- 网络碎片化减少了并行的程度
- element-wise的操作也是不可以忽略的
三、 Method
1. Equal channel width minimizes memory access cost (MAC)
作者举了个例子,假设网络结构中使用了depthwise separable convolutions, 输入通道数为
c
1
c_1
c1, 输出通道数为
c
2
c_2
c2。特征图的大小为
h
×
w
h \times w
h×w。因此可得, FLOPs为:
B
=
h
w
c
1
c
2
B = hwc_1c_2
B=hwc1c2
MAC为:
M
A
C
=
h
w
(
c
1
+
c
2
)
+
c
1
c
2
MAC = hw(c_1 + c_2) + c_1c_2
MAC=hw(c1+c2)+c1c2
分别代表输入,输出和卷积核权重的memory access。根据均值定理,可以得到:
M
A
C
≥
2
h
w
B
+
B
h
w
MAC \geq 2 \sqrt{hwB} + \frac{B}{hw}
MAC≥2hwB+hwB
所以,在给定的FLOPs下,MAC有一个下限。当输入和输出通道数一样的时候,MAC最小。
2. Excessive group convolution increases MAC
Group convolution通过将所有通道之间的密集卷积变为稀疏(仅在通道组)内来降低计算复杂度(FLOPs)。一方面,它在固定的FLOPs下,能够使用更多的通道数来增加网络的capacity,提升精度。但是,增加通道数会导致更多的MAC。根据上面的式子,我们做一个变形:
M
A
C
=
h
w
(
c
1
+
c
2
)
+
c
1
c
2
g
=
h
w
c
1
+
B
g
c
1
+
B
h
w
MAC = hw(c_1 + c_2) + \frac{c_1c_2}{g} \\ =hwc_1 + \frac{Bg}{c_1} + \frac{B}{hw}
MAC=hw(c1+c2)+gc1c2=hwc1+c1Bg+hwB
这里的
g
g
g是group的数量。
B
=
h
w
c
1
c
2
/
g
B = hwc_1c_2 /g
B=hwc1c2/g是FLOPs。可以看到,给定一个固定的输入大小,
c
1
×
h
×
w
c_1 \times h \times w
c1×h×w 和计算量B,MAC随着
g
g
g的增大而增大。 意味着如果使用一个大的group number,会导致速度降低。
因此,group number的数量需要根据目标设备和任务小心的选择。简单地使用大的group number是不明智的,因为会导致使用更多的通道数,增加计算量。
3. Network fragmentation reduces degree of parallelism
网络碎片化会减少并行的程度。尽管碎片化会提升精度,但这对一些并行计算的设备是不友好的,会引进额外的开销,比如内核启动和同步。 减少碎片化的程度。
4. Element-wise operations are non-negligible
Element-wise操作,如ReLU, AddTensor, AddBias等等也是不可以忽略的,它们有着小的FLOPs,但是有相对大的MAC。特别是depthwise convolution,它有着较大的 M A C / F L O P s MAC/FLOPs MAC/FLOPs比例。因此,尽可能减少这些element-wise操作。
5. ShuffleNet V2
作者根据上面的规则,改进ShuffleNet V1, 设计出ShuffleNet V2。它们之间的差别通过下图对比:
- 增加了channel split:
输入通道 c c c会分为 c − c ′ c-c' c−c′和 c ′ c' c′。然后一个branch经过三个相同输入输出通道数的卷积来满足第一条规则。然后两个1x1卷积不再是group-wise的,满足第二条规则,因为split操作已经产生了两个groups。 - 用Concatenation替换Add
因为通道数相同,channel shuffle操作会在concatenation之后,使得信息可以在两个branch之间交流。 - element-wise 操作只存在一个branch中:
像ReLU和depth-wise convolution只存在一个branch之中。concat, channel shuffle, channel split融合在一个element-wise操作中。
可以看到,额外的1x1卷积层在global average pooling之前会使用,用来融合特征。
ShuffleNet v2拥有更多的特征通道和更大的网络capacity。其次,在每个block中,一半的特征通道(当 c ′ = c / 2 c'=c/2 c′=c/2时)直接穿过该block并连接下一个block。这可以看作是一种特征重用,使得ShuffleNet v2更加效率和精度更高。
四、 Conclusion
提出了4个准则来设计网络结构,以后在优化速度和精度的时候,可以借鉴。