阅读论文《The Evolved Transformer》时遇到了separable convolution的概念,因此找了相关资料学习了一下。
参考:
https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-al
在讲Separable Convolution前先了解下常用的卷积网络的定义。
Convolutional Neural Networks
参考:
https://towardsdatascience.com/what-is-a-neural-network-6010edabde2b
卷积网络中最重要的是卷积核,通过卷积核在图像每个区域的运算,得到图像不同的特征,如下图(可以在http://setosa.io/ev/image-kernels/中更好得体验):
上面这张图使用outliine卷积核,实际中可以使用sharp等不同功能的卷积核以达到不同效果。
对于神经网络的每一层而言,可以使用多个卷积和得到不同的特征图,并将这些特征图一起输入到下一层网络。最终这些特征供给最后一层的分类器进行匹配,得到分类结果。下面的动画展示了这个过程:
Separable Convolution可以分成spatial separable convolution和depthwise separable convolution。
对于12x12x3的图像,5x5x3的卷积核,能产生8x8x1的输出:
假设我们想要8x8x256的输出,则需要使用256个卷积核来创造256个8x8x1的图像,把他们叠加在一起产生8x8x256的输出:
即12x12x3 — (5x5x3x256) — >12x12x256
Spatial Separable Convolutions
Spatial separable convolution将卷积分成两部分,最常见的是把3x3的kernel分解成3x1和1x3的kernel,如:
通过这种方式,原本一次卷积要算9次乘法,现在只需要6次。
还有一个Sobel kernel(用来检测边)也是用的这种方法:
但spatial separable convolution存在的问题是,不是所有kernel都能转换成2个小的kernel。
Depthwise Separable Convolutions
由于卷积并不使用矩阵相乘,为了减少计算量,可以将卷积的过程分成两部分:a depthwise convolution and a pointwise convolution.
depthwise convolution
首先,我们使用3个5x5x1的卷积核产生8x8x3的图像:
pointwise convolution
其次,使用1x1x3 的卷积核对每个像素计算,得到8x8x1 的图像:
使用256个1x1x3 的卷积核,则恶意产生8x8x256的图像:
可以看到,整个过程由原来的12x12x3 — (5x5x3x256) →12x12x256,变成12x12x3 — (5x5x1x1) — > (1x1x3x256) — >12x12x256
意义
主要就是减少了计算量,原先是256个5x5x3的卷积核移动8x8次,即需要256x3x5x5x8x8=1,228,800次乘法计算。使用depthwise convolution,有3个5x5x1的卷积核移动8x8次,需要3x5x5x8x8 = 4,800次乘法计算。使用pointwise convolution,有256个1x1x3的卷积核移动8x8次,需要256x1x1x3x8x8=49,152次乘法计算,加起来共有53,952次计算。