卷积网络

以下内容由我的CSDN博客迁移。

学习了基本的神经网络结构,以及如何进行正则化和优化之后,我们接下来转向特化的神经网络家族,允许其扩展到能够处理很大规模的数据和具有特殊结构的数据。(主要参考《深度学习》和cousera上吴恩达的课程) 卷积网络(convolutional network),也叫卷积神经网络(CNN), 是一种专门用来处理具有类似网络结构的数据的神经网络。例如时间序列(一维网格)和图像数据(二维网格)。CNN 使用了卷积这种数学运算,卷积网络是指至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。卷积网络结构的研究进展十分迅速,针对特定基准(benchmark),几周就会有一个新的最优的网络结构。但所有的网络结构都是由基本部件逐步搭建起来的。

一、卷积运算

通常,卷积是对两个实变函数的一种运算。卷积运算通常用星号表示。 \[s(t) = \int x(a)w(t-a)da = (x*w)(t).\] 卷积的第一个参数(x)称为输入,第二个参数(w)称为核函数,输出有时称作特征映射

离散形式的卷积定义如下: \[s(t) = (x*w)(t) = \sum_{a = -\infty}^{\infty} x(a)w(t-a).\]

在机器学习中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。

最后,我们经常一次在多个维度上进行卷积运算。如果把一张二维图像 I 作为输入,我们使用一个二维的核 K: \[S(i, j) = (I*K)(i, j) = \sum_m \sum_n I(m, n) K(i-m, j-n).\] 卷积是可交换的,我们可以等价地写作: \[S(i, j) = (I*K)(i, j) = \sum_m \sum_n I(i-m, j-n) K(m, n).\] 卷积运算的可交换性的出现是因为我们将核相对输入进行了翻转

很多神经网络库会实现一个相关的函数,称为互相关函数(cross-correlation),和卷积几乎一样,但没有对核进行翻转: \[S(i, j) = (I*K)(i, j) = \sum_m \sum_n I(i+m, j+n) K(m, n)\] 在机器学习中,学习算法会在核合适的位置学得恰当的值,所以一个基于核翻转的卷积运算的学习算法所学得的核,是对未进行翻转的算法学得的核的翻转。

在二维张量上,卷积运算(未对核进行翻转)具体如图:

离散卷积可以看作矩阵乘法,但这个矩阵的一些元素被限制为必须和另外一些元素相等。对于二位情况,卷积对应着一个双重分块循环矩阵,此外,卷积通常对应一个非常稀疏的矩阵,这是因为核的大小通常远小于输入的大小。

二、使用卷积的动机

卷积运算通过三个重要的思想来帮助改进机器学习系统:稀疏交互(sparse interactions)、参数共享(parameter sharing)、等变表示(equivariant representations). 此外,卷积提供了一种可以处理大小可变的输入的方法。下面依次介绍。

1. 稀疏交互

也叫做稀释连接,稀疏权重。这是由于核的大小远小于输入的大小而得的。当处理图像时,输入的图像可能有成千上万的像素点,但我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征。这不仅减少了存储需求,而且提高了统计效率。

在深度卷积网络中,处在网络深层的单元可能与绝大部分输入是间接交互的,这允许网络可以通过只描述稀疏交互来高效的描述多个变量的复杂交互。

2. 参数共享

是指在一个模型的多个函数中使用相同的参数。在 CNN 中,核的每一个元素都作用在输入的每一位置上。卷积运算中的参数共享保证了我们只需学习一个参数集合,而非对每个位置都学习一个单独的参数集合。虽然前向传播的时间数量级没有改变,但是显著降低了模型的存储需求。

3. 等变表示

参数共享的特殊形式使得神经网络具有平移等变的性质。即如果函数\(f(x)\)\(g(x)\)满足\(f(g(x))=g(f(x))\),我们说\(f(x)\)对于变换\(g\)具有等变性。对于卷积来说,如果 g 是输入的任意平移函数,那么卷积函数对于 g 具有等变性。例如卷积产生了一个二维映射来表明某些特征在输入中出现的位置。如果我们移动输入中的对象,它的表示也会在输出中移动同样的量。

但卷积对于其他的一些变换并不是天然等变的,例如对于图像的放缩和旋转变换。

三 、池化

卷积网络的一个典型层包含三级,如图:

在第一级中,这一层并行地计算多个卷积产生一组线性激活响应。在第二级中,每一个线性激活响应会通过一个非线性的激活函数。这一级有时也被称为探测级。在第三级中,我们使用池化函数来进一步调整这一层的输出。

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如最大池化函数,给出相邻矩形区域内的最大值。其他常用的池化函数包含平均值,L2范数和基于到中心像素距离的加权平均函数。

当输入做出少量平移时,池化池能够帮助输入的表示近似不变。平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生变化。局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。。例如判定图像是否人脸时,我们并不需要知道眼睛的精确像素位置,只需要知道有两个眼睛就行了。但在一些其他领域,保存特征的具体位置就很重要。

使用池化可以看作增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当假设成立时,池化可以极大提高网络的统计效率。

由于池化综合了全部邻居的反馈,这使得池化单元少于探测单元成为可能。这种方法提高了网络的计算效率。

同时,在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像分类时,分类层的输入必须是固定大小,而这通常通过调整池化区域的步长来实现。

卷积与池化作为一种无限强的先验,可能导致了欠拟合。

四、基本卷积函数的变体

当在神经网络领域讨论卷积时,通常不是指标准的离散卷积运算,实际应用的函数略有不同。

首先,神经网络中的卷积,通常是指由多个并行卷积组成的运算。这是因为具有单个核 的卷积只能提取一种类型的特征,我们通常希望网络的每一层能在多个位置提取多种类型的特征。

另外,输入也不仅仅是实值的网格,而是由一系列观测数据的向量构成的网络。例如,一幅彩色图像在每一个像素点都会有红黄蓝三种颜色的亮度。在多层的卷积网络中,第二层的输入是第一层的输出,且在每个位置包含多个不同卷积的输出。

因为卷积网络通常使用多通道的卷积,所以即使使用了核翻转,也不一定保证网络的线性运算是可交换的,只有其中每个运算的输出和输入具有相同的通道时,这些多通道的运算才是可交换的。

有时我们会希望跳过核中的一些位置来降低计算的开销(相应的代价是提取特征的质量下降),我们可以把这一过程看作对全卷积函数输出的下采样。每次跳过的像素称为步幅(stride)。当然也可以对不同的移动方向定义不同的步幅。

任何卷积网络的实现中都有一个重要的性质,就是能够隐含地对输入用零进行填充(pad)使得它加宽。如果没有这个性质,表示的宽度在每一层就会缩减。对输入进行填充允许我们对核的宽度和输出的大小进行独立的控制。

如图,这是一个卷积核的计算过程(步长为2,使用填充,两个核):

零填充的设定有三种情况。第一种是无论怎样都不使用零填充的极端情况,称为有效(valid)卷积此时输出的所有像素都是输入中相同数量像素的函数,这使得输出像素的表示更加规范。但是此时输出的大小在每一层都会缩减。如果卷积核非常大,缩减率就会非常显著。第二种情况是只进行足够的零填充来保持输出和输入具有相同的大小。这称为相同(same)卷积。此时网络可以包含任意多的卷积层,因为卷积运算不改变下一层的结构。然而,输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。这可能导致边界像素有一定程度的欠表示。第三种情况称为全(full)卷积,它进行了足够多的零填充,使得每个像素在每个方向上恰好被访问了相同次数。这导致学得一个在卷积特征映射的所有位置的都表现不错的单核更为困难。通常零填充的最优数量介于有效卷积核相同卷积之间。

实现卷积网络时,通常也需要除卷积以外的其他运算。为了实现学习,必须在给定输出的梯度时能够计算核的梯度。在很多情况下,例如步幅大于1,我们不能通过卷积实现。

之前我们说过卷积是一种线性运算,所以可以表示成矩阵乘法(将输入张量变为一个扁平的向量)的形式。其中包含的矩阵是关于卷积核的函数。这个矩阵是稀疏的,并且核的每个元素都复制给矩阵的多个元素。通过卷积定义的矩阵转置乘法可以用于在卷积层反向传播误差的导数。

卷积、从输出到权重的反向传播 、从输出到输入的反向传播, 这三种运算,对于训练任意深度的前馈卷积网络,以及训练带有重构函数的卷积网络,都足以计算它们所需的所有梯度。

关于卷积网络的反向传播,更多请看: 卷积神经网络(CNN)反向传播算法

五、经典网络

1. LeNet-5

LeNet-5是针对灰度图片进行训练的。第一层使用 6 个 5x5 的过滤器。步幅为 1 . 然后进行平均池化操作(现在流行最大池化),使得特征图缩小了一半,接下来又是卷积层,使用了一组 16 个 5x5 的过滤器,然后又是池化层,最后得到 5x5x16 = 400 个参数。 接下来是全连接层,最后得到 84 个特征,使用 softmax 来分类。相比现代的版本,LeNet-5 只有 6 万个参数,而现在的神经网络参数量经常成千万级。

总之,我们可以发现:随着网络越来越深,图像的高度和宽度再缩小,而网络通道数量在不断增加。

2. AlexNet

AlexNet 与 LeNet-5 非常相似,不过它要大得多,包含了近 6000 万个参数。此外,AlexNet 还使用了 ReLu 激活函数。本来经典的 AlexNet 中还包含一种叫做”局部响应归一化层“(LRN),但是后来发现LRN起不到太大作用,因此现在并不用LRN来训练网络。

正是通过 AlexNet 论文,计算机视觉群体开始重视深度学习,并确信深度学习可以用于计算机视觉领域。 这篇论文也相对容易理解。 论文链接:ImageNet Classification with Deep Convolutional Neural Networks

3. VGG-16

VGG没有很多超参数。是一种只需要专注于构建卷积层的简单网络。

VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。

VGG-16 的 16 是指这个网络一共有16层,总共有 1.38 亿个参数,但是它的结构并不复杂。它揭示了一种规律:卷积层的过滤器数量在每一组卷积层都翻倍,直到 512 。同时,在论文中揭示了,随着网络的加深,图像的高度和宽度都按一定规律不断缩小,每次池化后缩小一半。因此图像缩小的比例和通道数增加的比例是有规律的。

4. 残差网络(Residual Networks, ResNets)

非常深的网络很难训练,因为存在梯度消失和梯度爆炸的问题。ResNet采用了跳跃连接的技巧,它可以从某一网络层获取激活,然后反馈给另外一层。

残差块 利用残差块能够训练更深的网络,因此ResNet其实就是将很多这样的残差块堆积在一起。有两种残差块的设计:

这两种结构是分别针对ResNet34和ResNet50/101/152,右边的“bottleneck design”要比左边的“building block”多了1层,增添1*1的卷积目的就是为了降低参数的数目,减少计算量。

之所以可以实现跳跃连接,是因为使用了 same 卷积,如果维度不同,我们需要再增加一个矩阵来映射到相同维度。

1x1 卷积 1x1 卷积可以从根本上理解为一个全连接层,有时它被称为 Network in Network。 假设有一个 28x28x192 的输入层,通道数量很大,如何把它压缩至 28x28x32 呢?我们可以用 32 个 1x1 的过滤器。这就是压缩通道数的方法。 当然,1x1 卷积也可以扩展通道。

ResNets 的结构如下:

5. Inception

Inception架构的主要思想是考虑怎样用容易获得密集组件近似覆盖卷积视觉网络的最优稀疏结构。Inception模型的基本结构如下,**在多个不同尺寸的卷积核上同时进行卷积运算后再进行聚合,并使用1*1的卷积进行降维减少计算成本**。 Inception Module使用了3中不同尺寸的卷积和1个最大池化,增加了网络对不同尺度的适应性。

Inception 的基本模块如图:

GoogleNet采用9个Inception模块化的结构,共22层,除了最后一层的输出,其中间结点的分类效果也很好。还使用了辅助类结点(auxiliary classifiers),将中间某一层的输出用作分类,并按一个较小的权重加到最终分类结果中。这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练大有益处。 结构如图:

本节参考: 卷积神经网络常见架构AlexNet、ZFNet、VGGNet、GoogleNet和ResNet模型


扩展阅读:


以上内容如有谬误还请告知。