开云网址万字长文带你看尽深度学习中的各种卷积网络(下篇)雷锋网 AI 科技评论按:深度学习中的各种卷积网络大家知多少?对于那些听说过却又对它们没有特别清晰的认识的小伙伴们,Kunlun Bai 这篇文章非常值得一读。Kunlun Bai 是一位人工智能、机器学习、物体学以及工程学领域的研究型科学家,在本文中,他详细地介绍了 2D、3D、1x1 、转置 、空洞(扩张)、空间可分离、深度可分离、扁平化、 分组等十多种卷积网络类型。雷锋网 AI 科技评论编译如下。
直观上,空洞卷积通过在卷积核部分之间插入空间让卷积核「膨胀」。这个增加的参数 l(空洞率)表明了我们想要将卷积核放宽到多大。虽然各实现是不同的,但是在卷积核部分通常插入 l-1 空间。下图显示了当 l-1,2,4 时的卷积核大小。
在图像中,3 x 3 的红点表明经过卷积后的输出图像的像素是 3 x 3。虽然三次空洞卷积都得出了相同维度的输出图像,但是模型观察到的感受野(receptive field)是大不相同的。l=1 时,感受野为 3 x 3;l=2 时,感受野是 7 x 7;l=3 时,感受野增至 15x15。有趣的是,伴随这些操作的参数数量本质上是相同的,不需要增加参数运算成本就能「观察」大的感受野。正因为此,空洞卷积常被用以低成本地增加输出单元上的感受野,同时还不需要增加卷积核大小,当多个空洞卷积一个接一个堆叠在一起时,这种方式是非常有效的。
《通过空洞卷积做多规模的上下文聚合》的论文作者在多层空洞卷积以外创建了一个网络,其中的空洞率 l 每层都以指数级的方式增长。结果,当参数数量每层仅有直线式的增长时,有效的感受野实现了指数型的增长。
该论文中,空洞卷积被用于系统地聚合多规模的上下文信息,而不需要损失分辨率。该论文表明,其提出的模块提高了当时(2016 年)最先进的语义分割系统的准确率。大家可以阅读这篇论文获得更多信息。
空间可分离卷积在图像的 2D 空间维度上执行,例如高和宽两个维度。从概念上来看,顾名思义,空间可分离卷积将卷积分解为两项单独的操作。下面所展示的案例中,一个卷积核为 3x3 的 Sobel 卷积核拆分成了一个 3x1 卷积核和一个 1x3 卷积核。
一个卷积核为 3x3 的 Sobel 卷积核拆分成了一个 3x1 卷积核和一个 1x3 卷积核
在卷积中,3x3 卷积核可以直接对图像进行卷积操作。在空间可分离卷积中,首先由 3x1 卷积核对图像进行卷积,之后再应用 1x3 卷积核。在执行相同的操作中,这就要求 6 个而不是 9 个参数了。
此外,比起卷积,空间可分离卷积要执行的矩阵乘法运算也更少。举一个具体的案例,在卷积核为 3x3 的 5x5 图像上做卷积,要求横向扫描 3 个位置(以及纵向扫描 3 个位置)上的卷积核,共有 9 个位置,如下图标出的 9 个点所示。在每个位置都进行 9 次元素级别的乘法运算,共执行 9 x 9 = 81 次运算。
针对空间可分离卷积,另一方面,我们先在 5x5 图像上应用一个 3x1 的过滤器,这样的线 个位置的卷积核以及纵向扫描 3 个位置的卷积核,总共 5 x 3=15 个位置,如下图所标的点所示。这样的线 次乘法运算。现在得到的是一个 3 x 5 的矩阵,这个矩阵经过 1 x 3 卷积核的卷积操作——从横向上的 3 个位置以及纵向上的 5 个位置来扫描该矩阵。对于这 9 个位置中的每一个,都进行了 3 次元素级别的乘法运算,这个步骤总共要求 9 x 3=27 次乘法运算。因此,总体上,该空间可分离卷积共进行了 45 + 27 = 72 次乘法运算,也比标准的卷积所要进行的乘法运算次数要少。
对于图像大小 N 大于过滤器大小(N m),这个比率就变成了 2 / m,这就意味着在这种渐进情况(N m)下,对于一个 3x3 的过滤器,空间可分离卷积与标准的卷积之间的计算成本比率为 2/3;对于一个 5x5 的过滤器,比率为 2/5;对于一个 7x7 的过滤器,比如为 2/7,以此类推。
虽然空间可分离卷积节省了计算成本,但是它很少应用于深度学习中。一个主要的原因是,并不是所有的卷积核都能被拆分为 2 个更小的卷积核。如果我们用这种空间可分离卷积来取代所有传统的卷积,就会束缚我们去搜寻训练期间所有可能存在的卷积核,因为这个训练结果可能是还只是次优的。
现在,让我们移步到深度可分离卷积,它在深度学习中的应用要更普遍得多(例如在 MobileNet 和 Xception 中)。深度可分离卷积由两步组成:深度卷积以及 1x1 卷积。
在介绍这些步骤前,值得回顾一下前面部分所提到的 2D 卷积核 1x1 卷积。让我们先快速过一下标准的 2D 卷积。举一个具体的案例,假设输入层的大小为 7 x 7 x 3(高 x 宽 x 通道),过滤器大小为 3 x 3 x 3,经过一个过滤器的 2D 卷积后,输出层的大小为 5 x 5 x 1(仅有 1 个通道)。
一般来说,两个神经网络层间应用了多个过滤器,现在假设过滤器个数为 128。128 次 2D 卷积得到了 128 个 5 x 5 x 1 的输出映射。然后将这些映射堆叠为一个大小为 5 x 5 x 128 的单个层。空间维度如高和宽缩小了,而深度则扩大了。
首先,我们在输入层上应用深度卷积。我们在 2D 卷积中分别使用 3 个卷积核(每个过滤器的大小为 3 x 3 x 1),而不使用大小为 3 x 3 x 3 的单个过滤器。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。这样的话,图像的空间维度缩小了吗,但是深度保持与原来的一样。
深度可分离卷积—第一步:在 2D 卷积中分别使用 3 个卷积核(每个过滤器的大小为 3 x 3 x 1),而不使用大小为 3 x 3 x 3 的单个过滤器。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。
深度可分离卷积的第二步是扩大深度,我们用大小为 1x1x3 的卷积核做 1x1 卷积。每个 1x1x3 卷积核对 5 x 5 x 3 输入图像做卷积后都得出一个大小为 5 x 5 x1 的映射。
深度可分离卷积完成这两步后,同样可以将一个 7 x 7 x 3 的输入层转换为 5 x 5 x 128 的输出层。
因此,做深度可分离卷积的优势是什么?高效!相比于 2D 卷积,深度可分离卷积的执行次数要少得多。
因此对于任意大小的图像来说,应用深度可分离卷积能节省多少次计算呢?我们稍微概括一下上面的案例。假设输入图像大小为 H x W x D,2D 卷积的卷积步长为 1,填充为 0,卷积核大小为 h x h x D(两个 h 相等)、个数为 Nc。2D 卷积后,大小为 H x W x D 的输入层最终转换为大小为(H-h+1)x(W-h+1)x Nc 的输出层,总共需要进行的乘法运算次数为:Nc x h x h x D x (H-h+1) x (W-h+1)。
对于大部分现代框架而言,输出层往往都有许多个通道,例如几百甚至几千个通道。对于 Nc h 的层,上面的表达式会缩短为 1/h/h,这就意味着对于这个渐进的表达式而言,如果使用的过滤器大小为 3 x 3,2D 卷积需要进行的乘法运算次数比深度可分离卷积多出 9 次;使用大小为 5 x5 的过滤器,则要多出 25 次。
使用深度可分离卷积有什么缺点吗?当然有。深度可分离卷积会减少卷积中的参数个数,这样的话,对于一个小的模型,如果采用深度可分离模型来踢打 2D 模型,该模型的能力就会被大为削弱。结果,该模型也会变成次优的模型。然而,如果恰当使用,深度可分离卷积可以提高效率而不会明显损害模型的性能。
《将扁平化卷积神经网络应用于前馈加速》(Flattened convolutional neural networks for feedforward acceleration,)这篇论文对扁平化卷积(Flattened convolutions)进行了介绍。直观上,这种卷积的思路就是应用过滤器分离,即将标准的分离器拆分为 3 个 1D 分离器,而不是直接应用一个标准的卷积过滤器来将输入层映射为输出层。这个思路类似于前部分所提到的空间可分离卷积,其中的一个空间过滤器近似于两个 rank-1 过滤器。
需要注意的一点事,如果标准卷积的过滤器是 rank-1 过滤器,这样的过滤器可以被拆分为 3 个 1D 过滤器的交叉乘积,但是这是一个前提条件并且标准过滤器的固有 rank 往往比现实应用中的更高。正如论文中所指出的:「随着分类问题的难度增加,解决该问题还需要更多的关键部分... 深度网络中学习过滤器具有分布的特征值,并且将分离直接用于过滤器会导致明显的信息丢失。」
为了减轻这类问题,论文限制了感受野的关系从而让模型可以根据训练学习 1D 分离的过滤器。这篇论文声称,通过使用由连续的 1D 过滤器组成的扁平化网络在 3D 空间的所有方向上训练模型,能够提供的性能与标准卷积网络相当,不过由于学习参数的显著减少,其计算成本要更低得多。
这里我描述的是分组卷积是如何实现的。首先,传统的 2D 卷积步骤如下图所示。在这个案例中,通过应用 128 个过滤器(每个过滤器的大小为 3 x 3 x 3),大小为 7 x 7 x 3 的输入层被转换为大小为 5 x 5 x 128 的输出层。针对通用情况,可概括为:通过应用 Dout 个卷积核(每个卷积核的大小为 h x w x Din),可将大小为 Hin x Win x Din 的输入层转换为大小为 Hout x Wout x Dout 的输出层。
在分组卷积中开云网址,过滤器被拆分为不同的组,每一个组都负责具有一定深度的传统 2D 卷积的工作。下图的案例表示得更清晰一些。
上图表示的是被拆分为 2 个过滤器组的分组卷积。在每个过滤器组中,其深度仅为名义上的 2D 卷积的一半(Din / 2),而每个过滤器组都包含 Dout /2 个过滤器。第一个过滤器组(红色)对输入层的前半部分做卷积([:, :, 0:Din/2]),第二个过滤器组(蓝色)对输入层的后半部分做卷积([:, :, Din/2:Din])。最终,每个过滤器组都输出了 Dout/2 个通道。整体上,两个组输出的通道数为 2 x Dout/2 = Dout。之后,我们再将这些通道堆叠到输出层中,输出层就有了 Dout 个通道。
你可能已经观察到了分组卷积和深度可分离卷积中用到的深度卷积之间的某些联系和区别。如果过滤器组的数量与输入层的通道数相同,每个过滤器的深度就是 Din / Din = 1,其与深度卷积中的过滤器深度相同。
从另一个角度来说,每个过滤器组现在包含 Dout / Din 个过滤器。总体而言开云网址,其输出层的深度就是 Dout,这就与深度卷积的输出层深度不同,深度卷积不改变层的深度,但随后深度可分离卷积中的 1 x 1 卷积会加大层的深度。
第一个优势是训练的高效性。由于卷积被拆分到几条路线中,每条路线都由不同的 GPU 分别进行处理。这一过程就允许模型以平行的方式在多个 GPU 上进行训练。比起在一个 GPU 上一个一个地训练模型,这种在多个 GPU 上的模型并行化训练方式每一步都可以给网络喂养更多的图像。模型并行化被认为比数据并行化更佳,后者将数据集进行拆分,然后对每一批数据进行训练。不过,当每批数据的大小过小时,我们执行的工作基本上是随机的,而不是批量梯度下降。这就会造成训练速度变慢或聚合效果变差的结果。
第二个优势是模型更加高效,例如,当过滤器组数增加时,模型参数就会减少。在前一个案例中,在标准的 2D 卷积中,过滤器有 h x w x Din x Dout 个参数,而在拆分为 2 个过滤器组的分组卷积中,过滤器仅有 (h x w x Din/2 x Dout/2) x 2 个参数:参数数量减少了一半。
第三个优势是给人带来了些惊喜的。分组卷积能提供比标准 2D 卷积更好的模型。另一篇很棒的博客
在 CIFAR10 训练的 Network-in-Network 模型中相邻层的过滤器之间的相关性矩阵。高相关的过滤器对更亮,而低相关过滤器对更暗。图片源自:
当采用 1、2、4、8 和 16 个过滤器组训练时,在 CIFAR10 训练的 Network-in-Network 模型中相邻层的过滤器之间的相关性。图片源自:
上图表示的就是模型采用 1、2、4、8 和 16 个过滤器组训练时,相邻层的过滤器的相互关系。这篇文章提出了一个推论:「过滤器组的作用就是学习通道维度上的块对角结构的稀疏性... 在对过滤器进行了分组的网络中,高相关性的过滤器以更结构化的方式学习。结果,不要求学习的过滤器关系也不再需要用参数进行表示,这就显著减少了网络中的参数数量,并且在减少参数的过程中不容易过度拟合,因此这种类似正则化的效果可以让优化器学习更准确、更有效的深度网络。」
过滤器分离:正如论文作者所指出的,过滤器组似乎将学习的过滤器分为两个不同的组:黑白过滤器和彩色过滤器。图片源自:
此外,每个过滤器组都学习数据独一无二的表示。正如 AlexaNet 这篇论文的作者所提到的,过滤器组似乎将学习的过滤器组织成了两个不同的组:黑白滤镜和彩色滤镜。
混洗分组卷积背后的思路与分组卷积(应用于 MobileNet 、ResNeXt 等网络)以及深度可分离卷积(应用于 Xception)背后的思路相关。
在分组卷积部分,我们了解到了过滤器被拆分为不同的组,每个组都负责拥有一定深度的传统 2D 卷积的工作,显著减少了整个操作步骤。在下图这个案例中,假设过滤器分成了 3 组。第一个过滤器组对输入层的红色部分做卷积;第二个和第三个过滤器组分别对输入层的绿色和蓝色部分做卷积。每个过滤器组中的卷积核深度仅为输入层整个通道的 1/3。在这个案例中,进行第一个分组卷积 GConv1 后,输入层被映射到中间的特征映射上,之后特征映射又通过第一个分组卷积 GConv2 被映射到输出层上。
分组卷积虽然计算高效,但它也存在问题,即每个过滤器分组仅对从前面层的固定部分向后传递的信息进行处理。在上面这个图像的案例中,第一个过滤器组(红色)仅处理从输入通道的前 1/3 部分向后传递的信息;蓝色过滤器组仅处理从输入通道的后 1/3 部分向后传递的信息。这样的话,每个过滤器组就仅限于学习一些特定的特征,这种属性就阻碍了训练期间信息在通道组之间流动,并且还削弱了特征表示。为了克服这一问题,我们可以应用通道混洗。
通道混洗的思路就是混合来自不同过滤器组的信息。下图中,显示了应用有 3 个过滤器组的第一个分组卷积 GConv1 后所得到的特征映射。在将这些特征映射喂养到第二个分组卷积之前,先将每个组中的通道拆分为几个小组,然后再混合这些小组。
经过这种混洗,我们再接着如常执行第二个分组卷积 GConv2。但是现在,由于经过混洗的层中的信息已经被混合了,我们本质上是将特征映射层的不同小组喂养给了 GConv2 中的每个组。结果,不仅信息可以在通道组间进行流动,特征表示也得到增强开云网址。
ShuffleNet 这篇论文认为 1x1 卷积的计算成本也很高,提议也对 1x1 卷积进行分组。逐点分组卷积,顾名思义,就是针对 1x1 卷积进行分组操作,这项操作与分组卷积的相同,仅有一项更改——就是在 1x1 过滤器而非 NxN 过滤器 (N1) 执行。
在该论文中,作者使用了我们都有所了解的 3 种卷积: (1) 混洗分组卷积; (2) 逐点分组卷积; 以及 (3) 深度可分离卷积。这种架构设计能明显地减少计算量同时还能保持准确性。在实际的移动设备上,ShuffleNet 的分类错误与 AlexNet 的相当。然而,从使用 AlexNe 的 720 MFLOPs 到使用 ShuffleNet 的 40–140 MFLOPs,计算成本明显下降。在面向移动设备的卷积神经网络领域,ShuffleNe 以相对较小的计算成本以及良好的模型性能广受欢迎。