深度学习实战 第6章卷积神经网络笔记


第6章 卷积神经网络

卷积神经网络(Convolutional Neural Network,CNN)是在实际应用中最为成功的一种神经网络,其专门用于处理格状结构数据,比如图片数据就可以看成是由像素组成的二维格状数据。之所以称为“卷积”是因为其数据处理方式类似于数学中的卷积操作,该网络也是人工智能领域受生物启发最成功的模型之一,该模型儿乎垄断了机器视觉方面的研究。

6.1 卷积操作

1.卷积的组成部分:卷积核(Kernel),特征映射或特征图(Feature Map)。卷积其实就是对数据加权求和

2.在机器学习中,我们的输入数据通常是一个多维数组,因此卷积核也将是一个多维数组。卷积只在小段时间内有效,超过该范围的影响因子都为零。这也就意味着,在实践中我们不需要进行无限的累加,只需要有限的累加计算即可

3.假设使用二维图像 \(I\) 作为我们的输入,其二维卷积核用 \(K\) 表示,如下式所示,就为该输入图像的卷积。

\[S(i,j)=(I*K)(i,j)=\sum_m \sum_n I(m,n)K(i-m,j-n) \]

卷积适合交换律,因此还可以写成如下式所示的形式。

\[S(i,j)=(K*I)(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) \]

4.在大多数机器学习库中,虽然实现的是互相关操作,但仍然称其为卷积,而我们也将互相关操作继续称为卷积操作

只需要记住,在机器学习中卷积就是局部特征乘以对应的权重,然后再累加起来即可。卷积核权重与数据局部特征一一对应,此时也叫作有效卷积(Valid Convolution)

1

6.2 卷积的意义

1.哺乳动物视觉系统初级视皮层(Primary Visual Cortex,V1)具有的三个重要性质。

V1层就如一张网一样排列在空间中,当光线仪穿过视网膜的下半部分时,V1对应的半区域就进入兴奋

V1包含着许多简单细胞,这些简单细胞仪对图像中小部分区域进行线性映射,这也称为局部感受野(Localized Receptive Field),而卷积网络的卷积特征提取单元也主要仿真简单细胞的这一性质。

V1也包含着许多复杂细胞,它们在简单细胞中探测特征,并且对于特征的小幅平移具有不变性的检测能力,这也是卷积网络中池化(Pooling)单元的灵感来源。同时这些复杂细胞对于照明中的一些变化也具有不变能力,不能简单地通过在空间位置上池化来刻画,而这些不变性给卷积网络中的一些跨通道池化策略带来了灵感,例如Maxout单元。

如果从机器学习的角度出发,卷积带来了两个重要的思想:稀疏连接(Sparse Connectivity)参数共享(Parameter Sharing)

6.2.1 稀疏连接

1.如图6-2(b)所示,在传统的神经网络中,每个神经元都会连接到上层的所有神经元中,这种连接也叫作全连接(Full Connectivity),而如图6-2(a)所示,神经元只会连接到上层中的部分神经元,这种连接就被称为稀疏连接(Sparse Connectivity)或稀疏交互(Sparse Interactions)。这两种连接最直观的区别是参数数量的巨大差异,参数数量是机器学习中模型能力强弱最直观的体现,模型能力又直接影响着是否容易过拟合,因此稀疏连接也算是一种有效防止过拟合的手段

2

2.稀疏连接也不仅仅是通过减小模型能力来提升泛化性能。例如在处理图像时,输入图片可能有数以百万计的像素,那么单独的像素和图像就几乎没有什么关联性,但我们可以通过在数百像素内探测小的有意义的边角特征来进一步处理图像。参数的减少也意味着我们所需的内存资源以及计算操作的减少,这对于效率的提升是巨大的。假设我们有 \(m\) 输入单元 \(n\) 输出单元,一次传播我们就需要 \(m * n\) 个参数连接。在实践中,每次计算就需要\(O(m * n)\)时间复杂度。如果我们将每个输出单元都限制在 \(k\) 连接参数的稀疏连接方式,那么所需的参数就减少为 \(k * n\) 个,计算时间复杂度就为\(O(k * n)\)。通常 \(k\) 往往远小于 \(m\),因此这对于效率的提高是非常显著的

3.在深层卷积网络中,稀疏连接在单层中信息是不完整时,稀疏网络会通过间接连接而补全低层网络的输入信息。如图6-3所示,虽然每个神经元都是稀疏连接,但 \(g3\) 仍然通过 \(h2\)\(h3\)和 $ h4 $补全了所有的输入信息,多层稀疏连接使得网络仅仅依靠构造局部稀疏连接,就能高效地表述复杂的网络交互。

3

6.2.2 参数共享

1.参数共享(Parameter Sharing)指的是在模型的多处使用相同的参数。在神经网络中,参数共享还有一个同义词叫作权重捆绑(Tied Weights),这表示在某处使用的权重,也将会被绑定到其他的地方使用。在卷积网络中,卷积核会在图像的各个位置进行卷积。因此卷积不是在特定的位置学习特征,而是在数据的各个区域提取特征。比如,某套卷积参数可以提取垂直边缘特征,该特征可能频繁存在图片的各个位置,因此经过卷积的扫面,实际上是对图片进行了一次垂直边缘特征过滤检测。

2.参数共享并没有影响神经网络的计算时间,其时间复杂度仍然为 \(O(k*n)\) ,但其显著地降低了需要存储的参数个数,原本需要存储 \(k*n\) 连接权重,而现在仅仅需要存储 \(k\) 个参数即可。比如识别一张1000* 1000像素的图片,假设第一隐藏层神经元为1万个,那么在全连接网络中,仅仅这一层的参数就需要100亿个,这是个可怕的数字。假设我们使用卷积网络,其卷积核由10×10的一百个参数组成,如果是稀疏连接,参数就可以降低到100万个。假设我们再使用参数共享连接,那需要存储的参数就仅仅只有100个了,从100亿到100这是非常显著的降低。

6.3 池化操作

1.在典型的卷积网络中,一层完整的卷积网络包含三个阶段:第一阶段称为卷积层,该层执行卷积操作生成一组特征图;第二阶段称为探测层,每一个特征值都会被送入一个非线性激活单元中进行激活;第三阶段称为池化层,负责将下层提取到的特征进行采样,缩小网络规模。

2.池化操作非常简单,例知最大池化(Max Pooling)其实就是筛选经过卷积映射后采样区域的最大值进行输出;平均池化(Average Pooling)其实就是将经过卷积映射后采样区域的平均值进行输出。需要注意的是,池化操作不仅可以缩小网络规模,还能获取输入数据的不变性特征
3.我们将池化用于同一卷积探测层之后,让模型拥有了平移不变性的能力。如果我们将池化用于不同的卷积探测层,那我们就可以得到旋转不变性

4.,下采样(DownSampling)相当于池化操作跳跃了单元进行池化。这种方式有效地提升了计算效率,假设 \(k\) 为跳跃的单元,那么在下一层中我们将降低大约 \(k\) 倍神经元输入数量。通过降低下一层维度,我们有效地减少下一层中的连接参数,不仅降低了内存消耗,而且还有利于学习效率的提升。

5.池化还是处理变长输入的基本手段之一。例如,处理图像识别任务时所拥有的图片数据大小不相同,但是在神经网络中,网络是固定的,假设输入单元为100,那我们只能输入100像素的图片。但如果拥有的是110像素的图片,那就需要对图片进行缩小或裁剪;如果拥有的是90像素的图片,那就需要对图片进行放大或填充;如果我们不想直接剪裁图片,那就可以利用池化操作将输入数据缩放在固定的尺寸上。

6.4 设计卷积神经网络

1.首先,神经网络中的卷积是由多个卷积核并行处理。由于特定的卷积核,在数据的多个位置进行卷积处理时,都只是在检测某一种特征,因此在网络的每层,我们需要多个卷积核提取不同的卷积特征作为候选。

其次,我们的输入通常也不仅仅是格状的二维数据,也可能为三维数据。例如,在图像识别时,图片的每个像素都是由红、绿、蓝三种颜色构成。因此,输入数据就变成了三维数组,其中一维表示颜色不同的通道,另外两维表示每一通道中图像像素的二维坐标。

我们使用四维数组 \(K_{i,j,k,l}\) 表示多道卷积核,其中下标 \(i\) 表示卷积核连接到输出的第 \(i\) 通道:下标 \(j\) 表示输入数据的第 \(j\)通道:下标 \(k\) 表示输入数据的第 \(k\) 行;下标 \(l\) 表示输入数据的第 \(l\) 列。而我们使用数组 \(V_{i,j,k}\) 表示第 \(i\)\(j\)\(k\) 列的输入数据,那输出单元 \(Z\) 的第 \(i\)\(j\)\(k\) 列的卷积结果就如下式所示。

\[Z_{i,j,k} = \sum_{l=1}^L \sum_{m=1}^M \sum_{n=1}^N V_{l,j+m-1,k+n-1} K_{i,l,m,n} \]

公式看起来可能有些复杂,但其实所表达的含义特别简单,其实就是将大小为m行n列的各通道数据,都乘以各自的权重,然后加起来放到对应的输出单元。由于数组下标是从1开始,因此需要减一。如果数据下标从零开始,可以直接将下标中的-1去除。

6.4.1 跨步卷积

1.为了减少计算花费,在池化操作时我们选择跨步(stride)的方法,将卷积结果进行跨步池化(下采样)。同样地,在不显著影响特征提取的前提下,也可以使用跨步卷积的方式进行特征提取。我们也可以将跨步卷积看作是对卷积操作的输出结果进行下采样,如图6-8(a)所示,我们使用步幅为2的跨步卷积提取特征,而在图6-8(b)中我们使用步幅为1的默认跨步进行完整的特征提取,然后再在提取到的特征图中进行跨步为2的下采样操作。显然,这两种方式在效果上是等价的,但卷积之后采样明显更浪费计算机资源,因此在实际操作中我们会使用跨步卷积,而不考虑卷积之后再采样。

如果我们想要在输入数据的每个方向上进行采样,我们只需要在每次卷积之后,将行下标和列下标同时乘以 \(s\) 即可,如式(6.7)所示。当然,也可以根据实际需要分别对行和列进行不同步幅的跨越。4

6.4.2 零填充

1.在默认情况下,卷积网络每经过卷积核大小为k的卷积后,网络大小至少会缩小k1。如图6-9所示,假设我们的输入数据为16维,卷积核大小为6,那么在默认情况下,我们的网络每层就会减少5,因此该网络会在三层之后将网络输出缩减为1,我们之所以将“神经网络”改名为“深度学习”,就是想强调我们应该使用深层的网络模型去表征数据。但在默认情况下,我们想要深层的网络模型就需要减小卷积核的大小,但减小卷积核大小,特征提取的能力也将减弱。因此,这是一个两难的问题。

5

2.所谓零填充(Zero Padding),就是在每一层网络的边缘填充上输出为零的神经元。我们就可以任意地选择卷积网络的层数,而不需要考虑卷积缩减的影响。

有效卷积(Valid Convolution):有效卷积其实就是没有零填充的卷积,该卷积要求卷积核与输入单元一一对应。假设输入单元的宽度为 \(m\) ,卷积核的宽度为 \(k\),那其输出的宽度就为 \(m-k+1\) 。随着网络层数的增加,该网络每一层的神经元数量也会显著地减少,直至缩减为1。因此,有效卷积需要仔细衡量卷积核尺寸与网络层数的利弊

相同卷积(Same Convolution)相同卷积就是填充零神经元将网络补充回原来大小的卷积操作。由于该卷积没有改变网络结构,因此可以自由地选择网络的层数及态积卷积核的尺寸。但由于网络边缘实际连接参数较少,在网络的边缘会出现欠表示现象

全卷积(Full Convolution):全卷积则是最极端的一种零填充的方式,经过全卷积后,神经元的数量不但不会减少,还会增加。假设输入单元的宽度为 \(m\) ,卷积核的宽度为 \(k\),那么输出的宽度就为 \(m+k-1\),该过程在网络左右边缘各添加 \(k-1\) 个零神经元进行卷积。这种卷积方式在网络边缘会出现更为严重的欠表示现象。

4.在实践中,最佳的零填充数量总是介于有效卷积与相同卷积之间。

6.4.3 非共享卷积

1.在某些情况下,我们并不一定真正想用卷积,而只是构造局部连接的网络层。这种网络结构和卷积网络相同,只是每一个“局部卷积核”都有着不同且独立的连接权重,这种局部连接网络我们也称之为非共享卷积(Unshared Convolution)。如下式所示,我们可以使用一个6维数组进行表示。

\[Z_{i,j,k} = \sum_l \sum_m \sum_n V_{l,j+m-1,k+n-1} W_{i,j,k,l,m,n} \]

其中 \(W_{i,j,k,l,m,n}\) 表示非共享卷积权矩阵,而 \(i\) 表示输出的通道, \(j\) 表示输出的行,\(k\) 表示输出列, \(l\) 表示输入的通道, \(m\) 表示输入的行, \(n\) 表示输入列。

当数据具有空间局部特征,但该特征并没有重复出现在整个特征空间时,局部连接层就会得很有用。如图6-11所示,比较了卷积连接、局部连接和全连接的网络结构示意图,其中不同字母表示不同的连接权重。在局部连接中,每个连接权重都是不同的,而在卷积连接中,连接权重多次重复出现。

6

6.4.4 平铺卷积

1.平铺卷积(Tiled Convolution)就是介于卷积与局部连接之间的一种折中处理。

2.平铺卷积非常类似于同时使用多个跨步卷积交替地进行卷积处理。假设我们使用两个尺寸为6的卷积核进行平铺卷积,那么第一个卷积核函数就会与输入的第1-6单元进行卷积;第二个卷积核函数就会与第2-7单元进行卷积;然后第一个卷积核再与输入的第3-8单元卷积,这样依次交替进行。如图6-12所示,比较了卷积、平铺卷积核局部连接的网络结构。我们使用 \(t\) 表示平铺卷积中卷积核的数量,如果 \(t=1\) 就退化为传统的卷积操作;\(m\) 表示输入维度, \(k\) 表示卷积核大小,当 \(t=m-k+1\) 时就退化为传统的局部连接。如下式所示,下标 \(i、j、k\) 分别表示第 \(i\) 输出通道 \(j\)\(k\) 列,下标 \(l、m、n\) 表示第 \(l\) 输入通道 \(m\)\(n\) 列, \(t\) 表示卷积核数量。而%表示取模运算。

\[Z_{i,j,k} = \sum_l \sum_m \sum_n V_{l,j+m-1,k+n-1} W_{i,l,m,n,j\%t+1,k\%t+1} \]

7