机器学习中的可分离卷积——笔记

601 阅读10分钟

任何看过MobileNet架构的人,都会偶然发现可分离卷积这个词**。**什么是可分离卷积,它与普通卷积有什么不同?

内容表

  1. 空间可分离卷积
    1.1 空间可分离卷积 - 一个例子
    1.2 空间可分离卷积 - 计算成本背后的数学
    1.3 结

  2. 深度可分离卷积
    2.1 深度可分离卷积 - 一个例子
    2.1.1 深度卷积
    2.1.2 点状卷积
    2.2 深度可分离卷积 - 计算成本背后的数学
    2.3

    结论

  3. 可分离卷积的替代品

可分离卷积有两种类型。

  • 空间可分离卷积
  • 深度可分离卷积。

我们将在这篇文章中讨论这两种类型。

1.空间可分离卷积

空间可分离卷积是这两种卷积中比较容易的,所以我们先讨论它。空间可分离卷积在图像的空间特征上工作:它的宽度和高度。这些特征是图像的空间维度,因此被称为空间可分离。它将卷积操作分解成两部分,并依次应用每个分离的卷积。例如,索贝尔滤波器(或称索贝尔核),它是一个3x3的滤波器,被拆成两个大小为3x1和1x3的滤波器。

sobel

正如你所看到的,3x3的滤波器被分割成3x1和1x3的滤波器。输出没有变化,因为图像仍然遵守矩阵乘法规则。应用3x1滤波器的图像的列维是1,也就是下一个滤波器,即1x3滤波器的行维。所改变的是所进行的乘法数量。空间可分离卷积减少了单个乘法的数量。

在一个常规的3x3卷积中,总共有9次操作。但是当我们把矩阵分成3x1和1x3的滤波器时,总共有6次操作。因此,在图像中进行卷积时,需要更少的矩阵乘法运算。

1.1 空间可分离卷积--一个例子

以一幅5x5的图像为例,3x3的内核以1的跨度和0的填充进行卷积。3x3核将在水平方向的3个位置和垂直方向的3个位置进行扫描,总共有9个位置。这9个位置显示在下面的图片中。在每一个点上,总共有9个矩阵乘法(从元素上看)将被应用,总共有9 x 9 = 81次乘法。

ssc

现在,考虑一下空间可分离卷积的作用。我们首先在5x5的图像上应用3x1滤波器。通过扫描5个水平位置和3个垂直位置,我们总共得到3 x 5 = 15个位置。这些位置显示在5x3的中间矩阵中。在每个位置,与其说有9个元素的矩阵乘法,不如说我们只有15 x 3 = 45次乘法。但这并不是最终的矩阵。然后,中间的5x3矩阵与1x3滤波器进行卷积,在水平方向和垂直方向的3个位置扫描矩阵。我们总共得到了3 x 3 = 9个位置,在应用了3个元素的矩阵乘法后,总共带来了9 x 3 = 27次矩阵乘法。因此,我们的总数加起来是45+27=72次乘法。这意味着减少了9个元素的矩阵乘法。下图中标出了各自的位置。

ssc2

1.2 空间可分离卷积--计算成本背后的数学

让我们来概括一下这个公式。对于任何N×N的图像,用一个m×m的核进行卷积,其跨度为1,填充为0。

  • 传统卷积需要((N - 2)x(N - 2)x m x m)矩阵乘法。
  • 空间可分离卷积需要(N x (N-2) x m) + ((N-2) x (N-2) x m) = (2N-2) x (N-2) x m的乘法。

我们可以找到这两种方法的计算成本的比率。空间可分离卷积的计算成本与常规卷积的计算成本之间的比率是。

ssc-ratio

我们可以看到,当图像大小远远大于滤波器的大小时,这个比率变成了2/m(当N>>m时)。把内核大小的值m=3、5、7,以此类推,我们可以看到空间可分离卷积的计算成本是标准卷积的2/3(大约66%),对于5×5的过滤器来说是2/5(40%),对于7×7的过滤器来说是2/7(大约29%),依此类推。

1.3 结论

我们看到,空间可分离卷积通过较少的矩阵乘法次数节省了总体成本。但是,为什么它在深度学习应用中没有被广泛使用呢?主要原因是并不是所有的卷积滤波器(核)都能被分解(或分离)成两个更小的核。此外,通过用空间上可分离的核代替所有传统的卷积核,我们可能会限制自己在训练期间搜索所有可能的核,导致次优的训练结果。

2.深度可分离卷积

接下来是下一种类型的可分离卷积,深度可分离卷积用于不能被分解成更小的滤波器。因此,它在大多数深度学习架构中更为普遍。MobileNetXception就是这样两个使用深度可分离卷积的例子。我们在Keras(作为keras.layer.SeperableConv2D)以及Tensorflow(作为tf.layer.separable_conv2d)中看到这种可分离卷积。

与空间可分离卷积不同,纵向可分离卷积也处理深度维。深度维度指的是图像的通道数量。我们知道,任何图像都有3个不同的通道,即RGB,它们告诉每个像素的 "红度"、"绿度 "和 "蓝度"。深度可分离卷积的工作方式与空间可分离卷积类似:内核被分割成两个不同的内核,即深度卷积和卷积。我们将通过一个例子来看看这是如何工作的。

2.1 深度可分离卷积--一个例子

我们认为我们的输入层的大小为7 x 7 x 3(高度x宽度x通道)。我们首先应用常规的二维卷积作为比较。在应用只有一个滤波器的二维卷积后,我们得到一个只有一个通道的5×5×1的输出层。下图很好地说明了这一点。

regconv

正如你们中的许多人可能知道的那样,在任何两个神经网络层之间都会应用许多过滤器。举例来说,我们有128个过滤器。在进行了128次二维卷积后,我们总共得到了128个5×5×1的输出层。让我们将所有这些层堆叠成一个大层;该层的大小为5×5×128。我们能够缩小空间尺寸,也就是高度和宽度(从7×7到5×5)。然而,深度从3层增加到128层。

regconv2

正如我们在空间可分离卷积中所做的那样(见上节),让我们找出传统方法所需的乘法数量。我们有128个3×3×3的滤波器,移动5×5次。将过滤器与所做的移动相乘,我们得到128 x 3 x 3 x 3 x 5 x 5 = 86,400次乘法。

让我们看看深度可分离卷积是如何实现类似的结果的。

2.1.1 深度卷积

在上述同样的例子中,我们首先应用深度卷积(回顾一下,这种方法使用深度卷积和点卷积;在本节的介绍部分已经讨论过)。我们使用三个大小为3 x 3 x 1的独立核,而不是使用传统的二维卷积核中的一个3 x 3 x 3。这三个内核只与输入层的一个通道相互作用(卷积)。这三个卷积中的每一个都产生了一个大小为5 x 5 x 1的地图。再次进行堆叠,产生一个大小为5 x 5 x 3的地图。

dsc

2.1.2 点式卷积

接下来是点状卷积。以5 x 5 x 3为输入,我们应用1 x 1卷积,过滤器大小为1 x 1 x 3。

dsc2

回顾一下,在任何两个神经网络层之间都有多个过滤器。我们采取了128个这样的过滤器。因此,在应用了128个1 x 1的卷积后,我们得到了5 x 5 x 128大小的输出层,与我们在传统方法中得到的相同。

dsc3

要了解深度可分离卷积的全貌,请参考下图。

dsc4

现在我们来谈谈数字,好吗?深度可分离卷积的速度有多快?事实证明,要快得多!下面是数学上的分解。进行深度卷积时,我们有3个3×3×1的过滤器移动5×5次,总共带来3×3×3×1×5×5=675次乘法。在点式乘法中,我们有128个1×1×3的滤波器移动5×5次,总共有128×1×1×3×5×5=9600次乘法。这使我们总共有675+9600=10275次乘法,仅仅是传统二维卷积的总成本的12%!

2.2 深度可分离卷积--计算成本背后的数学原理

让我们概括一下这个公式。对于一个大小为H x W x D的输入图像,我们要做二维卷积,stride=1,padding=0,有Nc个大小为h x h x D的核,其中h是偶数。上述卷积将输入层转换为尺寸为H-h+1 x W-h+1 x Nc的输出层。因此。

  • 传统的二维卷积需要Nc x h x h x D x (H-h+1) x (W-h+1) 乘法。
  • 深度可分离卷积需要D x h x h x 1 x (H-h+1) x (W-h+1) + Nc x 1 x 1 x D x (H-h+1) x (W-h+1) = (h x h + Nc) x D x (H-h+1) x (W-h+1) 乘法。

这两种方法的计算成本之比为。

r

对于现代架构,Nc>>h将该方程减少为1/h^2。用这个渐进式的符号,当有3 x 3个过滤器时,二维卷积花费9倍的乘法。对于5 x 5的过滤器,二维卷积花费的乘法次数是25次。

2.3 结论

这就是所有的好消息了。使用深度可分离卷积有什么限制吗?事实证明,纵深可分离卷积减少了卷积的参数数量。因此,如果用深度可分离卷积代替传统的二维卷积,小模型可能会得到次优的结果。如果明智地使用,纵深可分离卷积实际上可以在不影响模型性能的情况下提高效率。

3.可分离卷积的替代品

虽然可分离卷积是众多卷积技术中的一种,但人们可以从一系列专门用于特定领域的不同卷积技术中选择。可分离卷积的替代品包括。

  • 转置卷积(去卷积,棋盘式神器
  • 扩张卷积 (Atrous Convolution)
  • 扁平卷积
  • 分组卷积
  • 洗牌式分组卷积
  • 点式分组卷积

通过OpenGenus的这篇文章,你一定对MobileNetV1模型中使用的可分离卷积有了完整的了解。请欣赏。