卷积神经网络

  1. 卷积神经网络convolutional neural network:CNN:是指那些至少在网络的某一层中使用了卷积运算来代替一般的矩阵乘法运算的神经网络。
  2. 卷积神经网络专门处理具有类似网格结构的数据的神经网络。如:时间序列是一维网格,图像数据是二维网格。

一、卷积运算

1.1 数学卷积

1.1.1 卷积定义

  1. 示例:一个激光传感器输出 , 表示宇宙飞船在时刻 的位置的观测结果。假设传感器包含噪声,则 与飞船在时刻 的真实位置有偏离。

    可以利用观测结果的均值来估计飞船的位置。假设越近的观测结果越相关,于是对最近的观测结果赋予更高的权重。

    为权重函数,其中 表示观测结果距离当前时刻的间隔,则得到时刻 飞船真实位置的估计:

    这种运算就称作卷积convolution,用符号星号 表示。

    理论上 可以为任意的实值函数,但是在这个示例中要求:

    • 是个有效的概率密度函数,否则 就不是一个加权平均。
    • 在自变量为负数时,取值为零。否则涉及到未来函数,因为激光传感器只能输出 时刻之前的观测结果。
  2. 通常当计算机处理数据时,连续的数据会被离散化,因此时间 只能取离散值。

    假设 都是定义在整数时刻 上,则得到离散形式的卷积:

    实际操作中,因为只能存储有限的数据,所以这些函数的值在有限的点之外均为零。因此无限级数的求和最终是有限级数的求和。

  3. 在卷积神经网络中,函数 称作输入,函数 称作核函数,输出有时被称作特征图 feature map

  4. 可以对多个维度进行卷积运算。

    如果二维图像 作为输入,则需要使用二维核函数 ,卷积运算的输出为:

    其中 表示二维图像 的像素点的坐标, 表示该坐标处的像素值。

    • 通常 的尺寸较大,如 ;而 的尺寸较小,如

    • 因为卷积是可交换的,所以可以等价写作:

      这称作翻转flip了核。

      卷积的可交换性在数学证明中有用,但是在神经网络中很少使用。

1.1.2 数学卷积与矩阵乘法

  1. 离散卷积可以视作输入矩阵与一个特殊的核矩阵的乘法。

    • 对于一维的离散卷积,核矩阵的每一行必须和上一行移动一个元素后相等。

      这种类型的矩阵叫做Toeplitz矩阵。

    • 对于二维的离散卷积,核矩阵对应着一个双重块循环矩阵。

      该矩阵大部分元素相等,且非常稀疏(几乎所有元素都为零)。

  2. 卷积运算可以转换成矩阵乘法,所以不需要对神经网络库的实现作出大的修改。

1.1.2.1 一维卷积和矩阵乘法
  1. 循环矩阵的定义:

    可以利用循环矩阵求一维卷积。

  2. 假设有两个长度分别为 的序列 , 则一维卷积为:

    卷积的长度为

    • 首先用 0 扩充序列 :
    • 由于用 取卷积 ,因此构造 的循环矩阵:

      这里列优先,因此第一列是完全顺序的。

    • 一维卷积为:

      其中

1.1.2.2 二维卷积和矩阵乘法
  1. 二维卷积:

    假设

    • 先将 扩充到 维:。扩充之后的新矩阵为 。其中:

    • 构造一个列向量 :将 的第一行转置之后将其成为 的前 个元素;接下来是第二行的转置....第 行的转置。

    • 中的每一行,都按照一维卷积中介绍的循环矩阵生成的方法构成一个 的循环矩阵。这些矩阵记做:

    • 用这些循环矩阵构造一个大的块循环矩阵:

    • 计算: 。将 的结果分配到 的各行(与构造 相反的过程),即得到二维卷积。

1.2 神经网络卷积

1.2.1 卷积定义

  1. 许多神经网络库会实现一个与卷积有关的函数,称作互相关函数cross-correlation。它类似于卷积:

    有些机器学习库将它称作卷积。事实上在神经网络中,卷积指的就是这个函数(而不是数学意义上的卷积函数)。

  2. 神经网络的2维卷积的示例:

    这里采用的是神经网络中卷积的定义: 。其中, 由核函数决定。因为 ,所以他们的取值范围是

  3. 单个卷积核只能提取一种类型的特征。

    如果希望卷积层能够提取多个特征,则可以并行使用多个卷积核,每个卷积核提取一种特征。我们称输出的feature map 具有多个通道channel

    feature map 特征图是卷积层的输出的别名,它由多个通道组成,每个通道代表通过卷积提取的某种特征。

    事实上,当输入为图片或者feature map 时,池化层、非线性激活层、Batch Normalization 等层的输出也可以称作feature map 。卷积神经网络中,非全连接层、输出层以外的几乎所有层的输出都可以称作feature map

  4. 神经网络中,卷积运算的作用就类似于滤波,因此也称卷积核为filter 滤波器。

    • 滤波器可以从原始的像素特征中抽取某些特征,如:边缘、角度、形状等。

      如:sobel 算子:

      其中 表示检测垂直边缘的滤波器,它沿着水平方向做卷积; 表示检测水平边缘的滤波器,它沿着垂直的方向做卷积。

      下图所示为一张原始的灰度图:

      经过 卷积之后:

      经过 卷积之后:

    • 实际上,在卷积神经网络中我们并不会手工设计卷积核,而是通过学习算法自动学得卷积核中每个位置的值。

1.2.2 输入填充

  1. 在卷积神经网络中,可以隐式地对输入填充零,使其得到加宽。

    如果未填充零,则网络每一层的宽度会逐层递减。根据卷积的性质,网络每一层宽度减少的数量等于卷积核的宽度减1。

    • 如果卷积核尺寸较大,则网络的宽度迅速缩减,这限制了卷积神经网络的网络深度。
    • 如果卷积核尺寸较小,则可用的卷积核的数量大幅度降低,这限制了卷积神经网络的表达能力。
  2. 对输入 有三种填充零的方式:valid 填充、same 填充、full 填充。

  3. valid 填充:不使用零来填充输入,卷积核只允许访问那些图像中能完全包含整个核的位置。

    valid 填充模式中,输出的大小在每一层都缩减。假设核的宽度是 ,则每经过一层,输出的宽度减少了

    如果输入图像的宽度是 ,则网络经过了 层之后,输出的宽度变成 。如果核的宽度 非常大时,缩减非常明显。最终网络会缩减到 1 。

  4. same 填充:使用足够的零来填充,使得输出和输入保持相同的大小。这是最常见的填充方式。

    • same填充模式中,网络可以包含任意多的卷积层,因为它不存在网络输出宽度缩减的问题。

    • same 填充模式的一个问题是:输入的边缘单元可能存在一定程度上的欠表达。

      因为输入的中间区域的单元的影响域为全部的输出单元,这意味着这些输入单元的信息会被很多输出单元所编码。而输入的边缘区域的单元的影响域只是输出单元的一部分,这意味着这些输入单元的信息仅仅被少量输出单元所编码。

  5. full 填充:在输入的两端各填充 个零,使得每个输入单元都恰好被卷积核访问 次。其中 为卷积核的宽度。

    • 它将从卷积核和输入开始相交的时候开始做卷积。

    • 假设核的宽度是 ,则每经过一层,输出的宽度增加了

      如果输入图像的宽度是 ,则网络经过了 层之后,输出的宽度变成

    • 它使得输入的边缘单元也能够得到充分表达。

    • full 填充的一个问题是:输出的边界单元依赖于更少的输入单元。

      这使得学习到的结果在输出的中间部分表现较好,边缘部分的表现较差。

1.2.3 三维卷积

  1. 卷积神经网络的输入图片可以是二维(黑白图片),也可以是三维的(彩色图片)。

    对于三维彩色图片,一个维度来表示不同的颜色通道(如红绿蓝),另外两个维度表示在每个通道上的空间坐标。

  2. 对于三维卷积:

    • 假设输入为张量 ,每个元素是 。其中: 表示输入单元位于 通道, 表示通道中的坐标。

    • 假设输出为张量 ,每个元素为 。其中: 表示输出单元位于 通道, 表示通道中的坐标。

      注意:输出的通道数量通常与输入的通道数量不等。

      输出有多个通道的原因是:使用了多个卷积核,每个卷积核会输出一个通道。

    • 假设核张量为4维的张量 ,每个元素是 。其中: 表示输出单元位于 通道, 表示输入单元位于 通道, 表示通道中的坐标。

      则三维卷积可以表示为:

      其中:

      • 遍历了图像平面上的所有坐标。
      • 遍历了输入的所有通道。
      • 是单个三维卷积的核,多个并行的核的卷积结果组成了输出的多个通道。
  3. 上述表述中,张量 的通道索引位于坐标索引之前,这称作通道优先channel-first

    还有另一种模式:通道索引位于坐标索引之后,这称作channel-last

    如:tensorflow 框架采用channel-last 的模式,theano 框架采用channel-first 的模式。这里默认采用channel-last 的方式来描述。

1.2.4 降采样

  1. 如果对卷积层的输出进行降采样,则表示跳过图片中的一些位置。

    • 优点:可以降低计算开销。因为它降低了卷积层的输出单元数量,也就降低了高层网络的输入单元数量。
    • 缺点:提取的特征可能没有那么好,因为跳过的位置可能包含一些关键信息。
  2. 假设希望对输出的每个方向上,每隔 个像素进行采样,则:

    这里 称作降采样卷积的步幅。

  3. 可以对不同的方向定义不同的步幅。

    假设 方向的步幅为 方向的步幅为 , 则有:

  4. 降采样卷积有两种实现形式:

    • 通过直接实现步幅为 s 的卷积。
    • 先进行完整的卷积,再降采样。这种做法会造成计算上的大量浪费,不建议采用。

1.2.5 梯度计算

  1. 实现卷积神经网络时,为了能够学习模型,必须能够计算核的梯度。

    在某些简单情况下,核的梯度可以通过卷积来实现;大多数情况下(如:步幅大于1时),核的梯度无法通过卷积来实现。

  2. 卷积是一种线性运算,所以可以表示成矩阵乘法形式,涉及的矩阵是卷积核的函数。

    该矩阵有两个特性:该矩阵是稀疏的;卷积核的每个元素都复制到该矩阵的很多个位置。

  3. 假设要训练一个卷积神经网络,它包含步幅为 的步幅卷积,卷积核为 ,作用于多通道的图像 。则卷积输出为:

    假设需要最小化某个损失函数 ,则:

    • 前向传播过程:计算 ,然后将 传递到网络的其余部分来计算

    • 反向传播过程:假设得到一个张量 。为了训练网络,需要对过滤器的权重求导。

      ,则有:

      根据 的定义,有:

      则有:

    • 如果该层不是网络的输入层,则需要对 求梯度来使得误差进一步反向传播。

      , 则有:

      根据 的定义,有:

      则有:

      .

二、卷积层、池化层

  1. 卷积运算在神经网络中通过卷基层来实现。

  2. 对于卷积层的分层有两种观点:

    • 卷积层是由复杂的、三个阶段的子层组成的(如左图所示)。

      • 第一阶段子层:执行卷积运算。

        这个阶段是线性变换,其作用是从输入中提取特征。

      • 第二阶段子层:执行非线性的激活函数(如reLU单元)。

        这个阶段是非线性变换,其作用是引入非线性。

        实际应用中,这一阶段可以被丢弃,因为第三阶段也可以引入非线性。

      • 第三阶段子层:通过池化函数来调整输出。

        这个阶段也是非线性变换,其作用是降低输出的维度,但保留了大部分重要的信息。

    • 卷积层是简单的,仅仅包含卷积运算(如右图所示)。这是目前最流行的观点。

      在这个观点中,卷积层、非线性激活层、池化层都是简单的网络层,它们相互配合使用。它们的作用参考前面的三个阶段子层。

2.1 卷积层

  1. 传统的网络层要求输入的每个样本各维度是固定长度的,卷积层可以处理各维度非固定长度的样本数据,如:输入的图片可以为不同的分辨率。
  2. 卷积层的卷积运算主要包含了三个重要的思想:稀疏交互sparse interactions、参数共享parameter sharing 、等变表示equivariant representation

2.1.1 稀疏交互

  1. 传统的网络层是全连接的,使用矩阵乘法来建立输入与输出的连接关系。矩阵的每个参数都是独立的,它描述了每个输入单元与输出单元的交互。这意味着每个输出单元与所有的输入单元都产生关联。

    卷积层通过使用核矩阵来实现稀疏交互(也称作稀疏连接,或者稀疏权重),每个输出单元仅仅与少量的输入单元产生关联。

    这降低了网络的参数和计算量,不仅减少了模型的存储需求,也降低了计算复杂度。

  2. 每个输入单元影响的输出单元:

    • 对于传统全连接层,每个输入单元影响了所有的输出单元。
    • 对于卷积层,每个输入单元只影响了3个输出单元(核尺寸为3时)。

  3. 每个输出单元依赖的输入单元:

    • 对于传统全连接层,每个输出单元依赖所有的输入单元。
    • 对于卷积层,每个输出单元只依赖3个输入单元(核尺寸为3时)。

  4. 在卷积神经网络中,虽然卷积层每个输出单元只依赖于少量的直接输入单元,但是它可能间接依赖于大部分的间接输入单元。

    处在卷积网络更深层的单元,其接受域(即影响它的神经元)要比处在浅层的单元的接受域更大。

2.1.2 参数共享

  1. 参数共享:在模型的多个位置使用相同的参数。

    • 传统的全连接层中,权重矩阵不同位置处的参数相互独立。

    • 卷积层中,同一个核会在输入的不同区域做卷积运算。

      • 核函数会在输入的不同区域之间共享,这些区域的大小就是核函数的大小。
      • 物理意义:将小的、局部区域上的相同的线性变换(由核函数描述),应用到输入的很多区域上。
  2. 卷积运算在存储需求和计算效率方面要大大优于传统网络层的稠密矩阵的乘法运算。

  3. 网络参数比较:

    • 对于传统全连接层: 的权重 只使用了一次 。
    • 对于卷积层: 的权重 被共享到

2.1.3 等变表示

  1. 如果一个函数满足:输入发生改变,输出也以同样的方式改变,则称它是等变的equivariant

    如果函数 满足 ,则称 对于变换 具有等变性。

  2. 对于卷积层,它具有平移等变的性质:如果 是输入的任何一个平移函数(如:将图片向右移动一个像素),则下面的两个操作的结果是相同的:

    • 先对图片进行卷积之后,再对结果应用平移函数
    • 先对图片应用平移函数 ,再对图片进行卷积

    因为根据定义有:

    例如:

    • 当处理时间序列时,如果把输入中的一个事件向后延时,则卷积的输出中也发生相应的延时。
    • 当处理图像时,如果平移了输入的图片,则卷积的输出结果也平移了相同的量。
  3. 卷积对于某些变换并不是等变的:如缩放变换(改变图像的尺寸)、角度变换(旋转)。

    这些非等变的变换需要其它机制来处理(而不是卷积)。

2.2 池化层

  1. 池化运算也叫亚采样或者下采样。池化运算用一个矩阵区域内部的某个总体统计量来作为神经网络在该矩阵区域的输出,它综合了该矩阵区域的信息。

    • 最大池化:定义一个窗口,并从窗口内取出最大值作为总体统计量。
    • 均值池化:定义一个窗口,并从窗口内取出平均值作为总体统计量。
    • 其他常见的还有: 范数以及基于中心像素距离的加权平均函数作为总体统计量。

  2. 池化层就是对输入专门执行池化运算的网络层。

    池化层可以减少该层的输出数量。这意味着减少了网络下一层的输入数量,可以减少网络整体参数数量,降低计算量,减少参数存储需求,提高网络计算效率。

  3. 池化层输出的数量由池化的宽度 和步幅 决定。设输入单元的数量为 ,设池化的位置为 ,则有:

    每个位置对应一个输出单元,因此输出单元的数量为 ,其中 为向下取整数。

    如下所示,池化层的输入单元数量为 6 ,池的宽度为3、步幅为 2,池化层的输出单元数量为 2 。

  4. 池化层的宽度 可以随着输入图片尺寸的不同而动态调整,这可以解决图像任务中输入图像尺寸不同的问题。

2.2.1 平移近似不变性

  1. 当输入做出了少量的平移时,最大池化能够获得输出的近似不变性。即:当输入平移一个微小的量时,经过最大池化的输出近似不变。

    下图给出了输入右移了一个单位时,最大池化的输出。可以看到:当输入的每个位置的值都发生改变时,最大池化的输出只有一半的值发生了改变。

    • 最大池化平移近似不变性的原因:最大池化单元只对周围存在的最大值比较敏感,而不关心最大值的精确位置。

    • 如下图所示,平均池化并没有平移近似不变性。事实上,最大池化、平均池化、以及其它池化对于平移变换均具有等变性。

  2. 局部平移不变性是个很重要的性质。该性质表明:网络只关心某个特征是否出现,而不关心它出现的具体位置。如:判断是否人脸时,并不关心眼睛的具体位置,只需要知道一只眼睛在脸的左边、一只眼睛在脸的右边。

    但是有些领域,特征的具体位置很重要。如:判断两条线段是否相交。

2.2.2 模拟其它不变性

  1. 最大池化只能对空间的平移具有不变性,而无法对空间的旋转具有不变性。

    可以将空间的旋转角度进行离散化,每个角度对应一个卷积,然后采用最大池化。这种做法也可以实现空间的旋转不变性。

    下图中,使用多个滤波器和一个最大池化单元可以学得旋转不变性。

    • 当输入旋转某个角度时,对应的滤波器被激活。
    • 只要任意一个过滤器被激活,最大池化单元也相应被激活。

  2. 最大池化的空间平移不变性是原生的,其他变换的不变性则必须采用这种多通道的方法来实现。

2.3 卷积层、池化层的先验

  1. 先验有强弱之分:

    • 弱的先验具有较高的熵,即较大的不确定性。如:方差很大的高斯分布(方差无穷大就成了均匀分布)。
    • 强的先验具有较低的熵,即很小的不确定性。如:方差很小的高斯分布(方差很小意味着随机变量取值几乎确定)。

    一个无限强的先验对于参数在参数空间的某些取值的概率是0。即:永远不支持参数取这些值。

  2. 卷积层也可以看做是一个全连接层,但是它的权值有两个无限强的先验:

    • 层内的权重都是重复的,同一个权重将复用多次。
    • 层输出单元的接受区域内的权重非零,其它权重都是零。

    这些先验表明:卷积层学得的函数只包含了局部连接关系,并且具有稀疏性、平移等变性。

  3. 最大池化层也是一个无限强的先验:每个最大池化单元都具有对少量平移的不变性。

  4. 卷积与池化只有当先验的假设合理,且正确时才有用。

    • 如果任务依赖于保存精确的空间信息,那么使用最大池化将增大训练误差。

    • 如果任务需要对输入中相隔较远的信息进行合并,那么卷积所需要的先验可能就不准确。

      因为卷积拥有平移等变性,相隔的远近没有意义。

2.4 计算复杂度

  1. 对于卷积层,假设输入的feature map 为:宽度 、高度 、输入通道数 。假设一共 个卷积核,每个卷积核的宽度为 、高度为 。假设沿着宽度方向卷积的步幅为 ,沿着高度方向卷积的步幅为

    则输出的feature map 的几个参数为(其中 为向下取整数):

    • 宽度:

      其推导过程参考池化层的推导。

    • 高度:

    • 输出通道数

    卷积过程中的几个指标:

    • 参数数量: ,它也就是核张量的尺寸。

    • 计算量(以一次乘-加计算为单位):

      考虑输出feature map 中的每一个值,每个值都是通过一次卷积计算得到。每个卷积计算的乘-加 运算量为 。 一共有 这样的值,则最终计算复杂度为上式。

  2. 对于池化层,假设输入的feature map 为:宽度 、高度 、输入通道数 。假设池化窗口的宽度为 、高度为 。假设沿着宽度方向池化的步幅为 ,沿着高度方向池化的步幅为

    则输出feature map 的几个参数为:

    • 宽度:
    • 高度:
    • 输出通道数

    池化过程中的几个指标:

    • 参数数量:0 。因为池化过程是无参数的。

    • 计算量(以一次求最大值或者均值的计算为单位):

      考虑输出feature map 中的每一个值,每个值都是通过一次池化计算得到。每个池化计算的运算量为 1 个单位。 一共有 这样的值,则最终计算复杂度为上式,其中

    事实上,单次求最大值或者均值的计算量要小于单次乘-加 的计算量,因此池化层的计算量要远远小于卷积层的计算量。

  3. 对于普通的全连接层,假设输入单元数量为 个,输出单元数量为 个,其中:

    则:

    • 参数数量:

      因此,全连接层的参数数量是卷积层参数数量的 倍。

      当输入feature map 宽高为 32x32,卷积核宽高为2x2,步长为1时,全连接层的参数数量是卷积层参数数量的 24.6 万倍。

    • 计算量:(以一次乘-加计算为单位):

      因此,全连接层的计算量是卷积层计算量的 倍。

      当输入feature map 宽高为 32x32,卷积核宽高为2x2,步长为1时,全连接层的计算量是卷积层计算量的 256 倍。

2.5 全连接层转卷积层

  1. 通常情况下,卷积神经网络的最后几层都是全连接层加一个输出层(如:一个softmax 层)。

    事实上,全连接层可以和卷积层相互转换。

  2. 假设在全连接之前,网络的feature map 的形状为 ,即:通道数为 、宽度为 、高度为 。假设输出一个长度为 的一维向量。

    • 如果后接全连接层,则需要将其展平为长度为 的一维向量。权重