在有关于前面的全卷积全连接网络的查询中,需要对计算量参数量进行了解,由此引申到深度可分离卷积对参数量的巨幅消减。在本文中对此进行总结。
综述:
Depthwise Separable Convolution主要思想是对传统卷积做了一个分解:将传统卷积分成depthwise和pointwise两步来完成。其中depthwise就是对输入特征的每一层的feature map仅仅单独使用一个filter,然后对得到的若干个输出通道再使用1x1conv进行组合,得到新特征,即pointwise Conv。
值得注意的一点是,这种卷积背后的假设是跨channel相关性和跨spatial相关性的解耦。而这种假设目前还无法证明,但是实际实验结果表明深度可分离卷积确实可以减小参数数量。参考上面知乎帖子大佬的回答:
近两年是深度可分离卷积(Depth-wise Separable Convolution)大红大紫的两年,甚至有跟ResNet的Skip-connection一样成为网络基本组件的趋势。Xception论文指出,这种卷积背后的假设是跨channel相关性和跨spatial相关性的解耦。应用深度可分离卷积的另一个优势即是参数量的节省(这一点其实也是解耦的结果,参数描述上享受了正交性的乘法增益)。然而,这一假设的成立与否还是存疑的,目前我们也没有足够的工具去描述和证明这一假设。
参数量的大幅减少
例如:一个大小为64×64像素、3通道彩色图片在常规3*3卷积核下生成4层feature map所需要的参数量为3*3*3*4=108
而在depthwise seperable的卷积运算中,参数量将会大幅度的减少。
Depthwise:
对不同之处在于此次的卷积完全是在二维平面内进行,且卷积核的数量与上一层的Depth相同。所以一个三通道的图像经过运算后生成了3个Feature map,参数量为:3*3*3=27
Depthwise Convolution完成后的Feature map数量与输入层的depth相同,但是这种运算仅仅对输入层的每个channel独立进行卷积运算,只能考虑到层之间不同感受野内的关系,没有利用不同feature map在相同空间位置上的信息。因此需要增加另外一步操作来将这些map进行组合生成新的Feature map,即接下来的Pointwise Convolution。
Pointwise
Pointwise Convolution的运算与常规卷积运算非常相似,不同之处在于卷积核的尺寸为 1×1×M,M为上一层的depth,卷积核的数目由本层输出的feature map层数决定。本运算需要的参数量为1*1*3*4=12
通过以上参数量的计算,以及对应的本文未进行的计算量计算,我们都可以得出深度可分离卷积要比常规卷积减少巨大。
代码实践中的加速减速
在文章知乎专栏中,作者对于mobilenet V1的运行速度进行测试,发现该网络在有运行瓶颈的处理器上运行速度显著加快。
那么,为什么GPU上表现乏力的GPU,到CPU上反而一骑绝尘了呢?
我们回想一下,什么叫深度可分离卷积。
深度可分离卷积将一个标准卷积分割成了两个卷积(逐深度,逐点),因此减小了参数量,对应也减小了总计算量。
好的,在上面的话中,我们可以发现一个有趣的事实:深度可分离卷积的总计算量变小了,但深度可分离卷积的层数变多了。
而结合我们对GPU和CPU的认识:GPU是并行处理大规模数据(矩阵内积)的运算平台,而CPU则倾向于对数据串行计算(一个一个算)。
因此,若GPU的显存足够大(干脆假设无限大好了),因为每层的计算都可以并行一次处理,则此时总运算时间的主导因素是网络的层数。
而对于缺乏并行能力的CPU,总的运算时间的主导因素则是总计算量有关。
正因如此,才会出现这个乍一看神奇的现象。实际上,乍一看神奇的东西,背后的道理往往并不会太难。
拓展开来的卷积
常规卷积:
假设输入图像通道数为3,卷积输出通道数为32,那么就会有32*3个上述动态图的计算;
每三个分别对应输入RGB通道的卷积核(三个卷积核一起为一组)分别作用在其对应的通道上,会得到3张特征图,再进行特征图的加和,加和后再加上bias,就得到一张输出的特征图;
独立得重复这个过程32次,也就是323个卷积运算,得到输出的32张特征图。
这一次卷积过程的参数量为 32(3卷积核宽度卷积核长度 + 1)
group convolution
最早见于AlexNet——2012年Imagenet的冠军方法,Group Convolution被用来切分网络,使其在2个GPU上并行运行。
Group Convolution顾名思义,则是对输入feature map进行分组,然后每组分别卷积。假设输入feature map的尺寸仍为𝐶∗𝐻∗𝑊,输出feature map的数量为𝑁个,如果设定要分成𝐺个groups,则每组的输入feature map数量为𝐶/𝐺,每组的输出feature map数量为𝑁/𝐺,每个卷积核的尺寸为𝐶/𝐺∗𝐾∗𝐾,共有G组。
卷积参数量为:(𝐶/𝐺 ∗𝐻∗𝑊 + 1)∗N/G;可见,总参数量减少为原来的 1/𝐺。但是需要注意的是单个卷积核只与同组的输入map卷积,而不与其他组的输入map卷积;相较于传统的卷积会有信息提取容量方面的差异。
用途:
- 减少参数量,分成𝐺组,则该层的参数量减少为原来的1/𝐺
- Group Convolution可以看成是structured sparse,每个卷积核的尺寸由𝐶∗𝐾∗𝐾变为𝐶/𝐺∗𝐾∗𝐾,可以将其余(𝐶−𝐶/𝐺)∗𝐾∗𝐾的参数视为0,有时甚至可以在减少参数量的同时获得更好的效果(相当于正则)。
- 当𝐺=𝑁=𝐶、𝑁个卷积核每个尺寸为1∗𝐾∗𝐾时,Group Convolution就成了特殊情况下的Depthwise Convolution,参见MobileNet和Xception等,参数量进一步缩减。
深度卷积
深度卷积是组卷积的极端情况,将输入特征的每一通道分为一组,即分组数为G=C=N。后续步骤和group convolution一致。
深度可分离卷积
深度可分离卷积是将深度卷积和点卷积(1×1卷积核) 相结合。可以从深度卷积中可以得知,卷积核只是对通道的每一层进行了提取了特征,和标准卷积缺少了通道之间的信息交互。加入点卷积后可以增强特征通道之间的信息交互,进一步提升性能。
总体上来说,分组卷积和深度可分离卷积的参数量都得到缩减,但是特征抽取能力和原来相比也发生较大变化。主要应对的就是资源受限的场景,一般来说参数量多模型性能越好。
空间可分离卷积
空间可分离卷积在图像的 2D 空间维度上执行,例如高和宽两个维度。从概念上来看,顾名思义,空间可分离卷积将卷积分解为两项单独的操作。下面所展示的案例中,一个卷积核为 3x3 的 Sobel 卷积核拆分成了一个 3x1 卷积核和一个 1x3 卷积核。
在卷积中,3x3 卷积核可以直接对图像进行卷积操作。在空间可分离卷积中,首先由 3x1 卷积核对图像进行卷积,之后再应用 1x3 卷积核。在执行相同的操作中,这就要求 6 个而不是 9 个参数了。此外,比起卷积,空间可分离卷积要执行的矩阵乘法运算也更少。
虽然空间可分离卷积节省了计算成本,但是它很少应用于深度学习中。一个主要的原因是,并不是所有的卷积核都能被拆分为 2 个更小的卷积核。如果我们用这种空间可分离卷积来取代所有传统的卷积,就会束缚我们去搜寻训练期间所有可能存在的卷积核,因为这个训练结果可能是还只是次优的。