深度学习中不同类型卷积的综合介绍:通过可视化直观地理解卷积
点击上方关注,All in AI中国
作者——Kunlun Bai
如果你听说过深度学习中不同类型的卷积(例如2D / 3D / 1x1 /转置/膨胀(Atrous)/空间可分离/深度可分离/扁平/分组卷积),并且混淆了它们实际意味着什么,那么这篇文章会让你了解不同类型卷积的分工。本文是综合介绍的下篇。
7. 膨胀卷积(Atrous 卷积)
膨胀卷积在论文(https://arxiv.org/abs/1412.7062)和论文"通过膨胀卷积进行多尺度上下文聚合"(https://arxiv.org/abs/1511.07122)中引入。
这是标准的离散卷积:
膨胀的卷积如下:
当l = 1时,膨胀卷积变为标准卷积。
直观地说,膨胀的卷积通过在内核元素之间插入空格来"膨胀"内核。这个附加参数l(膨胀率)表示我们想要扩展内核的程度。实现可能会有所不同,但内核元素之间通常会插入l-1个空格。下图显示了l = 1、2和4时的内核大小。
在图像中,3×3个红点表示在卷积之后,输出图像具有3×3像素。虽然所有三个膨胀的卷积都提供了相同维度的输出,但模型观察到的感受野是截然不同的。对于l = 1,接受域为3 x 3。l = 2时为7 x 7。对于l = 3,接受域增加到15 x 15。有趣的是,与这些操作相关的参数数量基本相同。
文章"通过膨胀卷积进行多尺度上下文聚合"的作者在多层膨胀卷积中构建了一个网络,其中膨胀率l在每一层呈指数增长。结果,有效的感受野呈指数增长,而参数的数量只与层线性增长!
本文中的膨胀卷积用于系统地聚合多尺度上下文信息而不会丢失分辨率。
8.可分离卷积
可分离卷积用于一些神经网络体系结构,例如MobileNet(https://arxiv.org/abs/1704.04861)。可以在空间上(空间可分离卷积)或深度(深度可分离卷积)执行可分离卷积。
8.1空间可分离卷积
空间可分离卷积在图像的2D空间维度上操作,即高度和宽度。从概念上讲,空间可分离卷积将卷积分解为两个独立的运算。对于下面所示的例子,一个Sobel内核(3x3内核)被划分为3x1和1x3内核。
Sobel内核可以分为3 x 1和1 x 3内核
在卷积中,3x3内核直接与图像卷积。在空间可分离的卷积中,3x1内核首先与图像卷积,然后应用1x3内核。在执行相同操作时,这将需要6个而不是9个参数。
此外,在空间上可分离卷积中需要比卷积更少的矩阵乘法。举个具体的例子,在具有3×3内核(stride = 1,padding = 0)的5×5图像上的卷积需要在水平方向上扫描3个位置(和垂直方向上扫描3个位置)。总共9个位置,如下图所示。在每个位置,应用9个元素乘法。总的来说,这是9 x 9 = 81次乘法。
另一方面,对于空间可分离卷积,我们首先在5 x 5图像上应用3 x 1过滤器。我们在水平方向上扫描5个位置,垂直方向上扫描3个位置。总共5 x 3 = 15个位置,如下图所示。在每个位置,应用3个元素乘法。这是15 x 3 = 45次乘法。我们现在获得了3 x 5矩阵。此矩阵现在与1 x 3内核进行卷积,内核在水平方向上扫描3个位置,垂直方向上扫描3个位置。对于这9个位置中的每一个,应用3个元素乘法。此步骤需要9 x 3 = 27次乘法。因此,总体而言,空间可分离卷积需要45 + 27 = 72次乘法,这小于卷积。
让我们概括一下上面的例子。 假设我们现在在具有m×m内核的N×N图像上应用卷积,其中stride = 1且padding = 0。传统的卷积需要(N-2)×(N-2)×m×m次乘法。空间可分离卷积需要N×(N-2)×m +(N-2)×(N-2)×m =(2N-2)×(N-2)×m次乘法。空间可分离卷积与标准卷积之间的计算成本比率为
对于图像尺寸N大于过滤器尺寸(N >> m)的层,该比率变为2 / m。这意味着在这种渐近情况下(N >> m),空间可分离卷积的计算成本是3×3过滤器的标准卷积的2/3。 5 x 5过滤器为2/5,7 x 7过滤器为2/7,依此类推。
虽然空间可分离的卷积可以节省成本,但很少用于深度学习。其中一个主要原因是并非所有内核都可以分为两个较小的内核。如果我们通过空间可分离的卷积替换所有传统的卷积,我们就限制了在训练期间搜索所有可能的核。训练结果可能不是最佳的。
8.2深度可分离卷积
现在,让我们看看深度可分离卷积,这在深度学习中更常用(例如在MobileNet和Xception中)。深度可分离卷积包括两个步骤:深度卷积和1x1卷积。
在描述这些步骤之前,你可以回顾一下上篇中讨论的2D卷积和1 x 1卷积。让我们快速回顾一下标准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的单层。通过这样做,我们将输入层(7 x 7 x 3)转换为输出层(5 x 5 x 128)。即高度和宽度被缩小,同时深度延伸。
现在有了深度可分离的卷积,让我们看看我们如何实现相同的转换。
首先,我们将深度卷积应用于输入层。我们不再使用尺寸为3 x 3 x 3的单个过滤器,而是分别使用3个内核。每个过滤器的大小为3 x 3 x 1。每个内核与输入层的1个通道进行卷积(仅1个通道,而不是所有通道!)。每个这样的卷积提供尺寸为5×5×1的图。然后我们将这些图堆叠在一起以创建5×5×3图像。在此之后,我们的输出尺寸为5 x 5 x 3。现在我们缩小了空间尺寸,但深度仍然与以前相同。
作为深度可分离卷积的第二步,为了扩展深度,我们应用1x1卷积,内核大小为1x1x3。将5 x 5 x 3输入图像与每个1 x 1 x 3内核进行对比,可提供大小为5 x 5 x 1的映射。
因此,在应用128个1x1卷积后,我们可以得到一个尺寸为5 x 5 x 128的层。
通过这两个步骤,深度可分离卷积还将输入层(7 x 7 x 3)转换为输出层(5 x 5 x 128)。
深度可分离卷积的整个过程如下图所示。
那么,深度可分离卷积的优势是什么?效率!与2D卷积相比,对于深度可分离卷积,需要更少的操作。
让我们回顾一下2D卷积示例的计算成本。有128个3x3x3内核移动5x5次。这是128 x 3 x 3 x 3 x 5 x 5 = 86,400次乘法。
可分离卷积怎么样?在第一个深度卷积步骤中,有3个3x3x1内核移动5x5次。那是3x3x3x1x5x5 = 675次乘法。在1 x 1卷积的第二步中,有128个1x1x3内核移动5x5次。这是128 x 1 x 1 x 3 x 5 x 5 = 9,600次乘法。因此,总体而言,深度可分离卷积需要675 + 9600 = 10,275次乘法。这只是2D卷积成本的12%左右!
因此,对于具有任意大小的图像,如果我们应用深度可分离卷积,我们可以节省多少时间。让我们概括一下上面的例子。现在,对于大小为H x W x D的输入图像,我们想要使用大小为h x h x D的Nc内核进行2D卷积(stride = 1,padding = 0),其中h是偶数。这将输入层(H x W x D)变换为输出层(H-h + 1×W-h + 1×Nc)。所需的总体乘法是Nc x h x h x D x(H-h + 1)x(W-h + 1)
另一方面,对于相同的变换,深度可分离卷积所需的乘法是
D xhxhx 1 x(H-h + 1)x(W-h + 1)+ Nc x 1 x 1 x D x(H-h + 1)x(W-h + 1)=(hxh + Nc)x D x(H-h + 1)x(W-h + 1)
深度可分卷积与2D卷积之间的乘法比率现在为:
对于大多数现代架构来说,输出层通常具有许多通道。对于这样的层(Nc >> h),则上述表达式缩减至1 / h / h。这意味着对于这种渐近表达式,如果使用3 x 3过滤器,则2D卷积的乘法比深度可分离卷积多9倍。对于5 x 5过滤器,2D卷积的乘法次数增加了25倍。
使用深度可分离卷积有任何缺点吗?当然有。深度可分离卷积减少了卷积中的参数数量。因此,对于小型模型,如果2D卷积被深度可分离卷积替换,则模型容量会显著降低。因此,该模型可能会变得次优。但是,如果使用得当,深度可分离卷积可以在不显著损害模型性能的情况下提供效率。
9.扁平卷积
扁平卷积直观地说是应用过滤器分离。我们将这个标准过滤器分成3个1D过滤器,而不是应用一个标准卷积过滤器将输入层映射到输出层。这种想法与上述空间可分离卷积中的类似,其中空间过滤器由两个rank-1过滤器近似。
应该注意的是,如果标准卷积过滤器是rank-1过滤器,则这种过滤器总是可以分成三个1D过滤器的交叉积。但这是一个强条件,标准过滤器的固有rank大于1。正如文章中指出的那样"随着分类问题的难度增加,解决问题需要更多的主要组件...深度网络中的学习过滤器具有分布的特征值,并且直接将分离应用于过滤器会导致显著的信息丢失。"
为了缓解这种情况,本文限制了接受域的连接,以便模型可以在训练时学习一维分离的过滤器。在这篇论文中(https://arxiv.org/abs/1412.5474)作者认为,通过在3D空间中跨越所有方向的连续1D过滤器序列组成的扁平网络训练提供与标准卷积网络相当的性能,由于学习参数的显著减少,计算成本大大降低。
10.分组卷积
2012年,AlexNet的论文(https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)中引入了分组卷积。实现它的主要原因是允许通过两个具有有限内存(每个GPU 1.5 GB内存)的GPU进行网络训练。下面的AlexNet在大多数层上显示了两个独立的卷积路径。它正在跨两个GPU进行模型并行化(当然,如果有更多的GPU,可以进行多GPU并行化)。
在这里,我们描述了分组卷积是如何工作的。首先,传统的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卷积
在分组卷积中,过滤器被分成不同的组。每组负责具有一定深度的传统2D卷积。以下示例可以更清楚地说明这一点。
具有2个过滤器组的分组卷积
以上是具有2个过滤器组的分组卷积的说明。在每个过滤器组中,每个过滤器的深度仅为2D卷积的深度的一半。每个过滤器组都会创建Dout / 2通道。总的来说,两组创建2 x Dout / 2 = Dout频道。然后,我们使用Dout通道将这些通道堆叠在输出层中。
10.1分组卷积vs.s.深度卷积
你可能已经观察到分组卷积与深度可分离卷积中使用的深度卷积之间的一些联系和差异。如果过滤器组的数量与输入层通道相同,则每个过滤器的深度为Din / Din = 1。这与深度卷积中的过滤器深度相同。
另一方面,每个过滤器组现在包含Dout / Din过滤器。总的来说,输出层的深度为Dout。这与深度卷积不同,深度卷积不会改变层的深度。在深度可分离卷积中,层深度随后通过1x1卷积进行扩展。
分组卷积有一些优点。
第一个优势是有效的训练。由于卷积被分成多个路径,因此每个路径可以由不同的GPU分开处理。此过程允许以并行方式对多个GPU进行模型训练。与使用一个GPU训练所有内容相比,多GPU上的这种模型并行化允许每步将更多图像馈送到网络中。模型并行化被认为比数据并行化更好。后者将数据集分成批次,然后我们在每批次上进行训练。
分组卷积对于训练深度神经网络非常重要,如下图所示。
第二个优点是模型效率更高,即模型参数随着过滤器组数量的增加而减少。在前面的示例中,过滤器在标称2D卷积中具有h x w x Din x Dout参数。具有2个过滤器组的分组卷积中的过滤器具有(h×w×Din / 2×Dout / 2)×2个参数。参数数量减少了一半。
第三个优点有点出人意料。分组卷积可以提供比标称2D卷积更好的模型。另一个很棒的博客(https://blog.yani.io/filter-group-tutorial/)解释了它。这里有一个简短的总结。
原因与稀疏过滤器有关。下图是相邻层的过滤器之间的相关性。 这种关系是稀疏的。
在CIFAR10上训练的网络中网络模型中相邻层的过滤器之间的相关矩阵。成对的高度相关过滤器更亮,而低相关过滤器更暗。
分组卷积的相关图怎么样?
当使用1,2,4,8和16个过滤器组训练时,在CIFAR10上训练的网络中网络模型中相邻层的过滤器之间的相关性。
上图是当使用1,2,4,8和16个过滤器组训练模型时相邻层的过滤器之间的相关性。文章提出了一个推理(https://blog.yani.io/filter-group-tutorial/):"过滤器组的作用是通过块对角结构稀疏性对信道维度进行学习...具有高相关性的过滤器在具有过滤器组的网络中以更结构化的方式进行学习。实际上,不需要学习的过滤器关系在较长时间参数化。在以这种显著方式减少网络中的参数数量时,不容易过度拟合,因此类似正则化的效应允许优化器学习更准确,更有效的深度网络。"
AlexNet conv1过滤器分离
此外,每个过滤器组都学习数据的唯一表示。正如AlexNet的作者所注意到的,过滤器组似乎将学习过滤器组织成两个不同的组,黑白过滤器和彩色过滤器。
11. Shuffled分组卷积
在来自Magvii Inc(Face ++)的ShuffleNet(https://arxiv.org/abs/1707.01083)中引入了这一概念。 ShuffleNet是一种计算有效的卷积架构,专为具有非常有限的计算能力(例如10-150 MFLOP)的移动设备而设计。
Shuffled分组卷积背后的思想与分组卷积背后的思想(在MobileNet:https://arxiv.org/abs/1704.04861和ResNeXt:https://arxiv.org/abs/1611.05431中用于示例)和深度可分离卷积(在Xception中使用:https://arxiv.org/abs/1610.02357)相关联。
总的来说,Shuffled分组卷积涉及分组卷积和信道混洗。
在关于分组卷积的部分中,我们知道过滤器被分成不同的组。每组负责具有一定深度的传统2D卷积。总操作大幅减少。对于下图中的示例,我们有3个过滤器组。第一个过滤器组与输入层中的红色部分进行卷积。类似地,第二和第三过滤器组与输入中的绿色和蓝色部分卷积。每个过滤器组中的内核深度仅为输入层中总通道数的1/3。在该示例中,在第一组分组卷积GConv1之后,输入层被映射到中间特征映射。然后通过第二组分卷积GConv2将该特征映射映射到输出层。
分组卷积的计算效率很高。但问题是每个过滤器组仅处理从先前层中的固定部分向下传递的信息。对于上图中的示例,第一个过滤器组(红色)仅处理从前1/3输入通道传递的信息。蓝色过滤器组(蓝色)仅处理从最后1/3的输入通道传递下来的信息。因此,每个过滤器组仅限于学习一些特定功能。这一属性会阻止通道组之间的信息流,并在训练期间削弱表示。为了解决这个问题,我们应用了信道混洗。
信道混洗的想法是我们想要混合来自不同过滤器组的信息。在下图中,我们在应用具有3个过滤器组的第一组分组卷积GConv1后得到特征图。在将此特征映射馈送到第二个分组卷积之前,我们首先将每个组中的通道划分为多个子组。我们把这些小组混在一起。
在这样的变换之后,我们像往常一样继续执行第二组分组卷积GConv2。但是现在,由于混洗层中的信息已经混合,我们实质上为GConv2中的每个组提供了特征映射层(或输入层)中的不同子组。因此,我们允许渠道组之间的信息流动并加强表示。
12. Pointwise分组卷积
ShuffleNet论文(https://arxiv.org/abs/1707.01083)还介绍了逐点分组卷积。通常,对于分组卷积,例如在MobileNet或ResNeXt中,组运算在3x3空间卷积上执行,而不在1 x 1卷积上执行。
shuffleNet论文认为,1 x 1卷积的计算成本也很高。它建议将分组卷积应用于1 x 1卷积。正如名称所示,逐点分组卷积执行1 x 1卷积的组操作。该操作与分组卷积相同,只有一个修改——在1x1过滤器而不是NxN过滤器(N> 1)上执行。
在ShuffleNet论文中,作者使用了我们学到的三种类型的卷积:(1)Shuffled分组卷积; (2)逐点分组卷积; (3)深度可分离卷积。这种架构设计显著降低了计算成本,同时保持了准确性。例如,ShuffleNet和AlexNet的分类错误在实际移动设备上具有可比性。然而,计算成本已经从AlexNet的720 MFLOP大幅降低到ShuffleNet的40-140 MFLOP。由于计算成本相对较小且模型性能良好,ShuffleNet在移动设备的卷积神经网络领域获得了普及。
参考
博客和文章
"深度学习中不同类型的卷积介绍"(https://towardsdatascience.com/types-of-convolutions-in-deep-learning-717013397f4d)
"评论:DilatedNet ——膨胀卷积(语义分割)"(https://towardsdatascience.com/review-dilated-convolution-semantic-segmentation-9d5a5bd768f5)
"ShuffleNet:用于移动设备的极其高效的卷积神经网络"(https://medium.com/syncedreview/shufflenet-an-extremely-efficient-convolutional-neural-network-for-mobile-devices-72c6f5b01651)
"可分离卷积的基本介绍"(https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-b99ec3102728)
"Inceptionnetwork"初始网络版本的简单指南"(https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202)
"过滤器组教程(分组卷积)"(https://blog.yani.io/filter-group-tutorial/)
"卷积算术动画"(https://github.com/vdumoulin/conv_arithmetic)
"使用转置卷积进行上采样"(https://towardsdatascience.com/up-sampling-with-transposed-convolution-9ae4f2df52d0)
"直观地理解深度学习的卷积"(https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1)
论文
网络中的"网络"(https://arxiv.org/abs/1312.4400)
膨胀卷积的多尺度上下文聚合(https://arxiv.org/abs/1511.07122)
使用深度卷积网和完全连接的CRF进行语义图像分割(https://arxiv.org/abs/1412.7062)
ShuffleNet:一种用于移动设备的极其高效的卷积神经网络(https://arxiv.org/abs/1707.01083)
深度学习卷积算法指南(https://arxiv.org/abs/1603.07285)
更深入地了解卷积(https://arxiv.org/abs/1409.4842)
重新思考计算机视觉的初始架构(https://arxiv.org/pdf/1512.00567v3.pdf)
用于前馈加速的卷积卷积神经网络(https://arxiv.org/abs/1412.5474)
Xception:深度学习与深度可分离的卷积(https://arxiv.org/abs/1610.02357)
MobileNets:用于移动视觉应用的高效卷积神经网络(https://arxiv.org/abs/1704.04861Link)
ResNeXt:深度神经网络的聚合残差变换(https://arxiv.org/abs/1611.05431)
编译出品