一、卷积运算

1.1 数学卷积

1.1.1 卷积定义

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

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

    一、卷积运算 - 图5 为权重函数,其中 一、卷积运算 - 图6 表示观测结果距离当前时刻的间隔,则得到时刻 一、卷积运算 - 图7 飞船真实位置的估计:

    一、卷积运算 - 图8

    这种运算就称作卷积convolution,用符号星号 一、卷积运算 - 图9 表示。

    理论上 一、卷积运算 - 图10 可以为任意的实值函数,但是在这个示例中要求:

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

    假设 一、卷积运算 - 图16 都是定义在整数时刻 一、卷积运算 - 图17 上,则得到离散形式的卷积:

    一、卷积运算 - 图18

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

  3. 在卷积神经网络中,函数 一、卷积运算 - 图19 称作输入,函数 一、卷积运算 - 图20 称作核函数,输出有时被称作特征图 feature map

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

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

    一、卷积运算 - 图23

    其中 一、卷积运算 - 图24 表示二维图像 一、卷积运算 - 图25 的像素点的坐标,一、卷积运算 - 图26 表示该坐标处的像素值。

    • 通常 一、卷积运算 - 图27 的尺寸较大,如 一、卷积运算 - 图28 ;而 一、卷积运算 - 图29 的尺寸较小,如 一、卷积运算 - 图30

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

      一、卷积运算 - 图31

      这称作翻转flip了核。

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

1.1.2 数学卷积与矩阵乘法

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

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

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

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

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

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

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

    一、卷积运算 - 图32

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

  2. 假设有两个长度分别为 一、卷积运算 - 图33一、卷积运算 - 图34 的序列 一、卷积运算 - 图35一、卷积运算 - 图36, 则一维卷积为:

    一、卷积运算 - 图37

    卷积的长度为 一、卷积运算 - 图38

    • 首先用 0 扩充序列 一、卷积运算 - 图39:

    一、卷积运算 - 图40

    一、卷积运算 - 图41

    • 由于用 一、卷积运算 - 图42 取卷积 一、卷积运算 - 图43,因此构造 一、卷积运算 - 图44 的循环矩阵:

      一、卷积运算 - 图45

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

    • 一维卷积为:

      一、卷积运算 - 图46

      其中 一、卷积运算 - 图47

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

    一、卷积运算 - 图48

    假设 一、卷积运算 - 图49

    一、卷积运算 - 图50

    • 先将 一、卷积运算 - 图51 扩充到 一、卷积运算 - 图52 维:一、卷积运算 - 图53。扩充之后的新矩阵为 一、卷积运算 - 图54 。其中:

      一、卷积运算 - 图55

    • 一、卷积运算 - 图56 构造一个列向量 一、卷积运算 - 图57 :将 一、卷积运算 - 图58 的第一行转置之后将其成为 一、卷积运算 - 图59 的前 一、卷积运算 - 图60 个元素;接下来是第二行的转置….第 一、卷积运算 - 图61 行的转置。

      一、卷积运算 - 图62

    • 一、卷积运算 - 图63 中的每一行,都按照一维卷积中介绍的循环矩阵生成的方法构成一个 一、卷积运算 - 图64 的循环矩阵。这些矩阵记做: 一、卷积运算 - 图65

      一、卷积运算 - 图66

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

      一、卷积运算 - 图67

    • 计算: 一、卷积运算 - 图68 。将 一、卷积运算 - 图69 的结果分配到 一、卷积运算 - 图70 的各行(与构造 一、卷积运算 - 图71 相反的过程),即得到二维卷积。

1.2 神经网络卷积

1.2.1 卷积定义

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

    一、卷积运算 - 图72

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

    一、卷积运算 - 图73

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

    一、卷积运算 - 图74

    这里采用的是神经网络中卷积的定义:一、卷积运算 - 图75 。其中,一、卷积运算 - 图76一、卷积运算 - 图77 由核函数决定。因为 一、卷积运算 - 图78,所以他们的取值范围是 一、卷积运算 - 图79

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

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

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

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

    一、卷积运算 - 图80

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

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

      如:sobel 算子:

      一、卷积运算 - 图81

      其中 一、卷积运算 - 图82 表示检测垂直边缘的滤波器,它沿着水平方向做卷积;一、卷积运算 - 图83 表示检测水平边缘的滤波器,它沿着垂直的方向做卷积。

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

      一、卷积运算 - 图84

      经过 一、卷积运算 - 图85 卷积之后:

      一、卷积运算 - 图86

      经过 一、卷积运算 - 图87 卷积之后:

      一、卷积运算 - 图88

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

1.2.2 输入填充

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

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

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

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

    valid 填充模式中,输出的大小在每一层都缩减。假设核的宽度是 一、卷积运算 - 图90 ,则每经过一层,输出的宽度减少了 一、卷积运算 - 图91

    如果输入图像的宽度是 一、卷积运算 - 图92 ,则网络经过了 一、卷积运算 - 图93 层之后,输出的宽度变成 一、卷积运算 - 图94 。如果核的宽度 一、卷积运算 - 图95 非常大时,缩减非常明显。最终网络会缩减到 1 。

    一、卷积运算 - 图96

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

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

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

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

    一、卷积运算 - 图97

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

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

    • 假设核的宽度是 一、卷积运算 - 图101 ,则每经过一层,输出的宽度增加了 一、卷积运算 - 图102

      如果输入图像的宽度是 一、卷积运算 - 图103 ,则网络经过了 一、卷积运算 - 图104 层之后,输出的宽度变成 一、卷积运算 - 图105

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

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

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

    一、卷积运算 - 图106

1.2.3 三维卷积

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

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

    一、卷积运算 - 图107

  2. 对于三维卷积:

    • 假设输入为张量 一、卷积运算 - 图108 ,每个元素是 一、卷积运算 - 图109 。其中:一、卷积运算 - 图110 表示输入单元位于 一、卷积运算 - 图111 通道,一、卷积运算 - 图112 表示通道中的坐标。

      一、卷积运算 - 图113

    • 假设输出为张量 一、卷积运算 - 图114 ,每个元素为 一、卷积运算 - 图115 。其中:一、卷积运算 - 图116 表示输出单元位于 一、卷积运算 - 图117 通道,一、卷积运算 - 图118 表示通道中的坐标。

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

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

      一、卷积运算 - 图119

    • 假设核张量为4维的张量 一、卷积运算 - 图120 ,每个元素是 一、卷积运算 - 图121 。其中:一、卷积运算 - 图122 表示输出单元位于 一、卷积运算 - 图123 通道,一、卷积运算 - 图124 表示输入单元位于 一、卷积运算 - 图125 通道,一、卷积运算 - 图126 表示通道中的坐标。

      则三维卷积可以表示为:

      一、卷积运算 - 图127

      其中:

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

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

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

1.2.4 降采样

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

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

    一、卷积运算 - 图134

    这里 一、卷积运算 - 图135 称作降采样卷积的步幅。

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

    假设 一、卷积运算 - 图136 方向的步幅为 一、卷积运算 - 图137一、卷积运算 - 图138 方向的步幅为 一、卷积运算 - 图139, 则有:

    一、卷积运算 - 图140

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

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

    一、卷积运算 - 图141

1.2.5 梯度计算

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

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

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

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

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

    一、卷积运算 - 图145

    假设需要最小化某个损失函数 一、卷积运算 - 图146 ,则:

    • 前向传播过程:计算 一、卷积运算 - 图147 ,然后将 一、卷积运算 - 图148 传递到网络的其余部分来计算 一、卷积运算 - 图149

    • 反向传播过程:假设得到一个张量 一、卷积运算 - 图150一、卷积运算 - 图151 。为了训练网络,需要对过滤器的权重求导。

      一、卷积运算 - 图152 ,则有:

      一、卷积运算 - 图153

      根据 一、卷积运算 - 图154 的定义,有:

      一、卷积运算 - 图155

      则有:

      一、卷积运算 - 图156

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

      一、卷积运算 - 图158, 则有:

      一、卷积运算 - 图159

      根据 一、卷积运算 - 图160 的定义,有:

      一、卷积运算 - 图161

      则有:

      一、卷积运算 - 图162

      .