A guide to convolution arithmetic for deeplearning
本文是中文翻译版本。
https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
https://arxiv.org/abs/1603.07285
目录
1.1 Discrete convolutions 离散卷积
2.1 No zero padding, unit strides 无零填充,单位步幅
2.2 Zero padding, unit strides 零填充,单位步幅
2.2.1 Half (same) padding SAME填充
2.3 No zero padding, non-unit strides 无填充,非单位步长
2.4 Zero padding, non-unit strides
4.Transposed convolution arithmetic 转置卷积(反卷积)
4.1 Convolution as a matrix operation 卷积的矩阵运算
4.3 No zero padding, unit strides, transposed无零填充,单位步幅,转置
4.4 Zero padding, unit strides, transposed零填充,单位步幅,转置
4.5 No zero padding, non-unit strides, transposed
4.6 Zero padding, non-unit strides, transposed
5.1 Dilated convolutions 空洞卷积、膨胀卷积、扩张卷积
深度卷积神经网络(CNNs)一直是深度学习惊人进步的核心。虽然CNN早在90年代就已经被用来解决字符识别任务(Le Cun et al., 1997),但它们目前的广泛应用是由于更近的工作,当时深度CNN被用来在ImageNet图像分类挑战中击败最先进的技术(Krizhevsky et al., 2012)。
因此,卷积神经网络构成了机器学习从业者非常有用的工具。但是,第一次学习使用CNNs,一般是一种令人生畏的体验。卷积层的输出形状受其输入的形状以及卷积核形状、零填充和步长的选择的影响,并且这些属性之间的关系不容易推断。与完全连接的层形成对比,后者的输出大小与输入大小无关。此外,CNN网络通常还有一个Pooling阶段,相对于完全连通的网络而言,又增加了一个复杂程度。最后,所谓的转置卷积层transposed convolutional layers (also known as frac-
tionally strided convolutional layers)已经被越来越多的工作所采用 (Zeiler et al., 2011; Zeiler and Fergus, 2014; Long et al., 2015; Radford et al., 2015; Visin et al., 2015; Im et al., 2016),并且它们与卷积层的关系已经以不同的清晰程度进行了解释。
本指南有两个目的:
1 .解释卷积层和转置卷积层的关系。
2.直观了解卷积、汇集和转置卷积层中输入形状、核形状、零填充、步长和输出形状之间的关系。
为了保持广泛的适用性,本指南中显示的结果独立于实现细节,并适用于所有常用的机器学习框架,如Theano (Bergstra et al., 2010; Bastien et al., 2012),Torch (Collobert et al., 2011), Tensorflow (Abadi et al., 2015) and Caffe (Jia et al., 2014).
本章简要回顾了CNN的主要组成部分,即离散卷积和池化。关于该主题的深入讨论,请参见Deep Learning教科书第9章(Goodfellow等人,2016)。
1.介绍
1.1 Discrete convolutions 离散卷积
神经网络的基础是仿射变换 affine transformations:接收一个向量作为输入,并与一个矩阵相乘以产生一个输出(在通过非线性传递结果之前,通常会添加一个偏置向量)。这适用于任何类型的输入,无论是图像、声音片段还是无序的特征集合:无论它们的维度如何,它们的表示总是可以在转换之前被展平为向量。
图像、声音片段和许多其他类似的数据都有一个内在的结构。更正式地说,它们都有这些重要属性:
1.它们被存储为多维数组。
2.它们具有一个或多个排序重要的轴(例如,图像的宽度和高度轴,声音剪辑的时间轴)。
3.一个轴称为通道轴,用于访问数据的不同视图(例如,彩色图像的红色、绿色和蓝色通道,或立体声音轨的左右通道)。
当应用仿射变换时,这些属性没有被利用;事实上,所有的轴都以相同的方式处理,拓扑信息没有被考虑在内。然而,利用数据的隐含结构在解决一些任务时可能会非常方便,比如计算机视觉和语音识别,在这种情况下,最好保留它。这就是离散卷积发挥作用的地方。
离散卷积是保持这种排序概念的线性变换。它是稀疏的(只有几个输入单元贡献给一个给定的输出单元),并重用参数(相同的权重应用于输入中的多个位置)。
图1.1提供了一个离散卷积的例子。浅蓝色网格称为输入特征图feature map。为了使绘图简单,只显示一个输入feature map,但将多个feature map堆叠并不罕见。卷积核(阴影区域):
卷积核(阴影区域)在feature map上滑动。在每个位置,计算核的每个元素与其重叠的输入元素之间的乘积,并将结果相加,以获得当前位置的输出。可以使用不同的核来重复该过程,以形成所需数量的输出特征图(图1.3)。此过程的最终输出称为输出feature map。如果有多个输入feature map,则卷积核必须是三维的,或者等效地,每个特征图将与一个不同的内核卷积,生成的特征图将进行元素求和,以生成输出feature map。(卷积核的通道数=输入特征图的通道数)
图1.1中描述的卷积是二维卷积的一个例子,但它可以推广到N维卷积。例如,在三维卷积中,核将是一个长方体,并在输入feature map的高度、宽度和深度上滑动。
虽然从信号处理的角度来看,卷积和互相关是有区别的,但是当学习卷积核时,这两者就可以互换了。为了简单起见,并与大多数机器学习文献保持一致,本指南将使用术语卷积。
n ≡ number of output feature maps, 输出特征图个数
m ≡ number of input feature maps, 输入特征图个数
kj≡ kernel size along axis j. j轴的核大小
卷积核shape:(n, m, k1, . . . , kN)
下列属性影响沿j轴的卷积层的输出大小oj:
• ij: input size along axis j,
• kj: kernel size along axis j,
• sj: stride (distance between two consecutive positions of the kernel(核两个连续位置之间的距离),) along axis j,
• pj: zero padding (number of zeros concatenated at the beginning and at
the end of an axis) along axis j
例如,图1.2显示了应用于5 × 5输入的3 × 3核,使用2 × 2步长用1 × 1零边框填充。
请注意,stride构成了一种下采样形式。作为被解释为衡量内核翻译量的一种替代方法,步幅也可以被视为保留了多少输出。例如,将核移动两跳相当于将核移动一跳但只保留奇数个输出元素(图1.4)。
3x2x3x3 卷积核 理解:3x3的卷积核(具有两个通道),这样的卷积核有3个。
每个两通道卷积核分别在输入图像上滑动,得到的仍然是两通道图,然后按位置相加变成1个通道。因为有3个卷积核,所以这样的过程重复3次,得到3张feature map。
1.2 Pooling 池化
通过使用一些函数来合并子区域,如取平均值或最大值,合并操作可减小特征图的大小。
通过在输入上滑动一个窗口,并将窗口的内容提供给一个pooling function,pooling就可以工作了。从某种意义上来说,pooling的工作方式非常类似于离散卷积,但是用一些其他函数代替了核描述的线性组合。图1.5提供了一个平均池化的例子,图1.6为最大池化的例子。
下列属性影响沿j轴池化层的输出大小oj:
ij:沿j轴的输入大小,
kj:沿j轴的池化窗口大小,
sj:沿j轴的步幅(池化窗口两个连续位置之间的距离)
2.卷积运算
卷积层属性之间的关系的分析由于它们不跨轴交互的而变得容易,即沿着轴j的内核大小、跨距和零填充的选择仅影响轴j的输出大小。因此,本章将关注以下简化的设置:
这有助于分析和可视化,但请记住,这里概述的结果也适用于二维和非正方形的情况。
2.1 No zero padding, unit strides 无零填充,单位步幅
2.2 Zero padding, unit strides 零填充,单位步幅
零填充的两个特定实例被广泛使用。
2.2.1 Half (same) padding SAME填充
使输出大小与输入大小相同(即,o = i)可能是一个理想的属性。
注意k是奇数,s=1 ,p=k/2=n
2.2.2 Full padding 完全填充
虽然卷积核通常会相对于输入大小减小输出大小,但有时需要相反的操作。这可以通过适当的零填充来实现:
s=1,p=k-1 得到的feature map比输入更大。在这种设置中,考虑了核在输入特征图上的所有可能的部分或全部叠加。
2.3 No zero padding, non-unit strides 无填充,非单位步长
floor函数解释了这样一个事实,有时最后一步骤与内核到达输入的末尾不一致,即一些输入单元被省略了(参见图2.7中的例子)。
在这种情况下,零填充输入的底部行和右侧列不被核覆盖。不覆盖的就直接去除,输出形状下取整。
2.4 Zero padding, non-unit strides
floor函数意味着在某些情况下,卷积将为多个输入大小产生相同的输出大小。更具体地说,如果i+2p-k是s的倍数,则任何输入大小j = i + a,a属于{ 0,...,s-1 },将产生相同的输出大小。请注意,这种二义性仅适用于s > 1。(当s=1,i+2p-k是个整数,不存在向下取整的说法)。
图2.6和图2.7输入不同,一个是5x5,另一个是6x6,但有趣的是,尽管有不同的输入大小,这些卷积有相同的输出大小。虽然这不影响卷积的分析,但这将使转置卷积的分析复杂化。
(a)s=1,k=3,p=0,带入得到输出为3x3
(b)s=2,k=3,p=0,带入得到输出为2x2
3.池化算法
在神经网络中,池化层为输入的小平移提供不变性。最常见的池是最大池,它包括将输入拆分成(通常是非重叠的)patches(块),并输出每个块的最大值。还存在其他类型的池化,例如平均池化,它们都有一个共同的想法,即通过对一些块的内容应用非线性来局部汇集输入(Boureau et al.,
2010a,b, 2011; Saxe et al., 2011)
一些读者可能已经注意到,卷积算法的处理仅依赖于某些函数被重复应用于输入子集的假设。这意味着在前一章中导出的关系可以在池化的情况下重用。由于池化不涉及零填充,描述一般情况的关系如下:
4.Transposed convolution arithmetic 转置卷积(反卷积)
对转置卷积的需求通常来自于希望使用与正常卷积方向相反的变换,即从具有某个卷积的输出形状的事物到具有其输入形状的事物,同时保持与所述卷积兼容的连接模式。例如,可以使用这种变换作为卷积自动编码器的解码层,或者将特征映射投影到更高维空间。
同样,卷积的情况比完全连通的情况要复杂得多,完全连通的情况只需要使用一个形状已被转置的权重矩阵。然而,由于每一个卷积都归结为矩阵运算的有效实现,从全连通情形中获得的见解在解决卷积情形中是有用的。
与卷积算法一样,转置卷积算法的论述也因转置卷积性质不发生轴间相互作用而得到简化。(通道之间独立)
结果可以推广到N维和非正方形的情况。
4.1 Convolution as a matrix operation 卷积的矩阵运算
以图2.1所示的卷积为例。如果输入和输出从左到右、从上到下展开成向量,卷积可以表示为稀疏矩阵C(4 x 16),其中非零元素是核的元素wij,i和j分别是卷积核的行和列):
将输入的4x4=16个格子铺平为16x1,卷积核处理成上面矩阵C的样子4x16(相当于W),输出为4x1。输出的4个格子相当于4个神经元。突然发现,其实就是一个输入为16,输出为4的神经网络!那普通神经网络和CNN的差别在哪呢?CNN的权值矩阵是稀疏的且值有重复,这也体现了最开始提到的:利用数据的隐含结构、稀疏、重用参数。这种线性运算将输入矩阵展平为16维向量,并产生一个4维向量,该向量随后被整形(reshape)为2 × 2输出矩阵。
“当应用仿射变换时,这些属性没有被利用;事实上,所有的轴都以相同的方式处理,拓扑信息没有被考虑在内。然而,利用数据的隐含结构在解决一些任务时可能会非常方便,比如计算机视觉和语音识别,在这种情况下,最好保留它。这就是离散卷积发挥作用的地方。
离散卷积是保持这种排序概念的线性变换。它是稀疏的(只有几个输入单元贡献给一个给定的输出单元),并重用参数(相同的权重应用于输入中的多个位置)。”
使用这种表示法,通过转置C很容易获得反向传播;换句话说,误差通过将损失与相乘而反向传播。误差反传操作以一个4维向量作为输入,产生一个16维向量作为输出,its connectivity pattern is compatible with C by construction。值得注意的是,卷积核w定义了用于向前和向后传播的矩阵C和。
4.2 Transposed convolution
现在让我们来考虑一下需要什么来反过来,即从4维空间映射到16维空间,同时保持图2.1中描述的卷积的连通性模式。这个操作被称为转置卷积。
转置卷积Transposed convolutions——也称为fractionally strided convolutions 或者
deconvolutions——通过交换卷积的前向和后向过程来工作。一种说法是,卷积核定义了卷积,但是它是直接卷积还是转置卷积是由向前和向后传递的计算方式决定的。文献中有时使用“反卷积”这个术语,但我们反对它,理由是反卷积在数学上被定义为卷积的逆卷积,它不同于转置卷积。
例如,虽然核w定义了一个卷积,其前向和后向通过分别与C和相乘来计算,但它也定义了一个转置卷积,其前向和后向通过分别与和相乘来计算。最后请注意,总是可以用直接卷积来模拟转置卷积。缺点是它通常对输入添加许多列和许多行的零,导致效率低得多的实现。
转置卷积运算可以被认为是一些卷积相对于其输入的梯度,这通常是转置卷积在实践中的实现方式。
通过参考与其共享内核的直接卷积并定义等价的直接卷积来导出每个转置卷积的属性。
4.3 No zero padding, unit strides, transposed无零填充,单位步幅,转置
4.4 Zero padding, unit strides, transposed零填充,单位步幅,转置
4.5 No zero padding, non-unit strides, transposed
4.6 Zero padding, non-unit strides, transposed
5.Miscellaneous convolutions
5.1 Dilated convolutions 空洞卷积、膨胀卷积、扩张卷积
也叫atrous convolutions。在这里,我们试图提供一个空洞卷积的直观理解。关于更深入的描述和理解它们在什么情况下适用,见 Chen et al. (2014); Yu and Koltun (2015)。
膨胀的卷积通过在核元素之间插入空间来“膨胀”卷积核。膨胀“速率”由一个额外的超参数d控制。实现可能有所不同,但通常在内核元素之间插入d-1个空间,使得d = 1对应于一个常规的卷积。
扩张卷积用于廉价地增加输出单元的感受野,而不增加核大小,当多个扩张卷积一个接一个地堆叠时,这尤其有效。一个具体的例子,见 Oord et al. (2016),其中提出的WaveNet模型实现了根据原始音频的自回归生成模型,该模型使用空洞卷积来根据过去大量音频帧上下文训练出新的音频帧。
为了理解扩张率d和输出大小o之间的关系,考虑d对effective kernel size. 有效内核大小 的影响是很有用的。以因子d扩张的大小为k的核具有有效大小:
容易理解,每行有k个像素,自然就有k-1个间隙,每个间隙插入d-1个空,每行一共增加了(k-1)(d-1)个空。这可以与关系6相结合,以形成用于空洞卷积的以下关系:
卷积核膨胀--->卷积核滑动。d=2,那么卷积核元素之间插入d-1=1个空。