卷积神经网络(Convolutional Neural Network, CNN) 的出现,表明人们可以通过自行设计网络架构,提升神经网络模型在一些任务上的表现。卷积神经网络更多地被用于计算机视觉领域,“卷积”一词虽是《信号与系统》课程中的专业术语,但实际上卷积神经网络可以看成是全连接神经网络的简化版本。

局部连接:给机器一张图片,用像素的形式描述则是一个矩阵,神经网络可以将矩阵数据作为输入,输出某个分类,表明图片中的对象是什么。对于图像分类问题,当然可以使用全连接神经网络处理,但这样做是没有效率的。神经网络的浅层只进行很简单的识别,假设输入一张鸟的图片,对于第一层隐藏层的神经元来说,可能只需要看图中某个范围,就能知道这部分是不是鸟嘴,而不需要注意整张图片的像素,也即是说,需要识别的模式(Pattern) 可能只在图片一个局部的范围,

权值共享:而同样的模式也可能出现在图片中的不同位置。比如下图中不同的鸟嘴区域,使用同样的检测器(Detector) 可能就能将它们识别出来。如果对不同位置设计不同的检测器,比如一个神经元检测左上角的鸟嘴,另一个神经元检测中间的鸟嘴,这两个神经元做的可能是一样的工作,等于用过量的参数和计算完成了同样的事情。

特征不变:设计卷积神经网络的第三个原因是,图片的像素可以进行二次抽样(Subsampling) 而不改变其中的内容。比如下图中,将横轴和纵轴中的奇数或偶数位置的像素拿掉,会得到原图四分之一大小的另一张图,但还是能看出图中有一只鸟。所以如果对图片进行这样的处理,应该不会影响最终分类的结果。

根据上面的思想,可以设计出卷积神经网络。

卷积神经网络架构

整个卷积神经网络的架构是这样的:输入是一张图片,通过一个或多个卷积层(Convolution Layer) 与池化层(Pooling Layer) 的组合,进行 Flatten (“展平”,一般保留英文原文) 操作后,丢进全连接神经网络,最后得到分类结果。后面会解释这些新出现的概念,注意模型中出现的所有参数是可以一起训练的,可以将其看成一个很深的神经网络,只是不同部分的设计有所不同。我们认为卷积层考虑了图片局部连接和权值共享的特点,而池化层考虑了特征不变的特点。

卷积层

假设输入一张 $6 \times 6$ 的图片,为简化讨论用 $0$ 和 $1$ 代表其中的像素值。在卷积层中,有许多的滤波器(Filter), 深度学习术语更常用卷积核(Convolutional Kernel) 来表示,每个卷积核其实就是一个矩阵,里面的参数是需要网络根据训练数据去学出来的。卷积核的大小(Size) 通常不大,如 $3 \times 3$, 这可以体现出图片局部连接的特点,即需要识别的模式远小于图片的完整大小。假设我们已经知道了具体的参数,来看看它们是如何工作的。

我们先将卷积核放在像素矩阵的左上角,卷积计算(各元素相乘后求和,即算内积) 后得到 $3$. 如果将步长(Stride) 设为 $1$, 下一步则将卷积核右移一个像素,在新的位置进行卷积计算,得到结果 $-1$. 如果步长为 $2$ 则在第一次计算完成后将卷积核右移两个像素,计算得到 $-3$.

在下面的例子中,我们都默认步长为 $1$. 扫完第一排后,则下移一个像素,从最左边再开始扫,依此类推,最终移动到右下角。我们发现卷积核中斜对角元素都是 $1$, 因此它扫过图片中斜对角比较大的局部时,会计算出较大的值,这即是一种局部连接。而在图片中有着不同的区域满足斜对角像素值较大,使用同一个卷积核计算会得到一样的效果,这体现了权值共享的特点。

由于卷积核的参数是学习出来的,我们使用参数不同的卷积核对原有图片反复计算内积,会计算出新的卷积结果,被叫做特征图(Feature Map). 我们默认提到的特征图是复数形式的,是多个卷积核得到的多个特征图的叠加,可以把它当作是一张新的图片,由于卷积运算的特点,它的长和宽比原来的图片要小一些。例如上面的例子中 $6 \times 6$ 的图片通过大小为 $3 \times 3$, 步长为 $1$ 的卷积核后,得到了 $4 \times 4$ 的图片。第二个特点在于,新的图片的像素点使用了更多的值进行描述,这取决于你使用的卷积核的个数。

前面例子中输入的是一张黑白图片,只用单个的 $0$ 或 $1$ 值就可以对每个像素点进行描述。如果现在输入的是一张 RGB 彩图,每个像素由红、绿、蓝三种颜色值进行描述,此时图片有 $3$ 个颜色通道(Channel). RGB 图的量化范围通常是 $0$ 至 $255$, 为了简化形式上图依旧用多个 $0$ 和 $1$ 的矩阵叠加进行表示。

对于多通道图片的卷积,卷积核也要变得立体,对应 $3$ 通道的图片,卷积核大小由单通道的 $3 \times 3$ 变成 $3 \times 3 \times 3$. 如果有人发明了新的图像编码格式,颜色通道变成了 $100$ 个,则卷积核大小变成 $3 \times 3 \times 100$. 这种多个矩阵叠加的形式,可以看成是三阶的张量(Tensor), 而矢量是一阶的,矩阵是二阶的。

很多人分不清楚阶(Order) 和维(Dimension) 两个概念,所以在此提一下,可自行查阅资料。

卷积层对比全连接层

我们接下来解释,为什么卷积层可以看成是全连接层的简化版本。

在全连接层中,等同于将图片中 $6 \times 6$ 的像素矩阵拉直成 $36$ 维向量,乘上权重参数后得到另一个向量。

而在卷积层中,同样想象成将像素矩阵拉直排列,使用卷积核去计算新的通道其中的某一个值时,可以看成是一个神经元计算。原来的全连接层中,神经元计算需要输入所有的 $36$ 个像素值,而在卷积层中,神经元只会和子矩阵的 $9$ 个像素值连接,而且参与运算的权重就是卷积核中的 $3 \times 3$ 个参数。上图中使用相同的颜色表示卷积核参数矩阵元素与图片像素子矩阵元素的对应关系。

所以卷积层可以看成是部分连接层,这样计算所需的参数量就变少了,这是一个理解的角度。现在假设我们使用第二个神经元去计算图片中另一个区域,会发现它和第一个神经元所需要的权重参数是一样的,因为我们想要识别的是同一种模式,这其实对应的就是卷积核在像素矩阵上的移动。这种权值共享,或者说参数共用的形式,进一步地减少了参数量。

但是由于一个卷积核只能计算出某种模式(比如鸟的嘴) 的特征通道(即单层特征图), 如果要完成分类任务,需要学得更多的特征信息,因此卷积层中需要多个卷积核得到多个特征通道组成特征图。我们可以将 RGB 图片的颜色通道,看作是原有的 $3$ 个特征通道,即将 RGB 图片看作是最原始的特征图。通过多个卷积层后,通道的数量变多,特征图的内容更丰富,一个像素的值由不同特征图中对应的多个值进行叠加描述,我们就认为学到了更多的特征信息。

边缘填充

通过对图像进行卷积虽然可以让像素矩阵的尺寸变小,但这种缩小可能会影响最终的效果,而权重数量由卷积核大小和数量决定。更关键的是没有充分利用到边缘像素的信息,可以发现它们只参与了一次卷积运算。为了解决这一缺点,可以在图像的周围填充像素,以使得原图中的边缘像素可以被重复使用,这种方法叫作填充(Padding).

最常见的填充方法是 Zero-Padding, 即在像素外围添加上值为 $0$ 的像素点,这种添加的像素点对原始图片信息带来的噪声影响较小,又能够保持最终得到的特征图与输入时尺寸一致,具体添加几圈要看卷积核的大小与移动的步长。另外卷积核扫描的位置将从填充像素为边角开始,这样就有效考虑了原图的边缘信息。

由于填充操作的存在,卷积层又可分为 vliad 和 same 两种形式,前者不采用填充操作,而后者要求进行填充,并保证输入输出的特征图尺寸一致。而在传统计算机视觉中,使用的滤波器尺寸都是奇数,这样方便填充时对称,也可以使矩阵有中心像素点。

池化层

通过卷积层后,得到特征图,池化层的目的是将特征图中的元素分组处理。比如最大池化 Max Pooling 方法, 每 $4$ 个元素为一组,每组取最大的元素将其留下来。这个思想启发于 Maxout Network, 是 Dropout 的改进版本。而池化的本质,其实就是进行了采样,进一步地选出特征图中具有代表性的信息,实现了降维或者说压缩的效果。

这里可能存在疑惑,使用梯度下降更新参数,对于 Max Pooling 这种形式该如何计算微分?由于在神经网络的前向传导过程中,具体的 Max 元素已经确定,因此可以将 Max Pooling 单纯地看作是一个线性的函数,其它较小的元素直接当作其不存在。使用反向传播算法可以算出不同元素对应的微分,其实是 $0$ 或者 $1$. 由于每次输入的图片不同,选出的 Max 元素也不同,所以进行更新的元素也会发生变化,因此不用担心这种方法只会更新一部分选出的参数。

对于池化还可以常用其它方式,比如 Average Pooling, 即平均池化,取每一组元素的平均值作为输出,这个形式容易求微分。使用何种池化方法,没有绝对的优劣之分。相比之下,最大池化操作除了保留显著的特征、降低维度的作用之外,还能够提供一些平移不变性,即假设图像的像素中出现了一些微小的扰动(比如某个像素为噪声值,或存在着小的位移), 最终池化的结果可能将不受影响。

全连接层

通过卷积层和池化后,输出变成了远比原图像尺寸小的新图像,每个像素都用多个数值描述,取决于卷积核的数量,因为在卷积的过程中使用 $N$ 个卷积核会得到 $N$ 个特征通道。通过多个不断的卷积与池化,图片尺寸会变得越来越小。举一个简化的例子,假设最终变成了尺寸为 $2 \times 2$ 的图片,且一共有 $2$ 个通道。

Flatten 操作即将其中所有的值取出来排列,拉成长长的一列,这就变成了全连接网络的层排列形式,因此这一层又叫作全连接层(Fully Connected Layer).

卷积神经网络可视化理解

[图片来自网络]

有时候扔给机器一张球鞋的图片,当它识别出球鞋时,你可能觉得机器很聪明;但如果它识别成美洲狮,你可能会觉得无语。可实际上,机器可能观察到了人类经常忽略掉的地方,比如上图中的红框处。

我们在训练卷积神经网络时,可以将中间层的特征图取出来看看是什么样的。注意,卷积核的参数只是连接层与层之间的线,而可视化的是特征图。如果对卷积核可视化,可以参考《信号与系统》或《数字图像处理》中对高斯等滤波器的可视化。

关于卷积神经网络可视化方法有许多研究,目前的理解是浅层的网络学习了一些点线之类的边缘特征,随着网络变深,学得的特征更加抽象,可视化出来人类难以理解,但对机器来说确是很有帮助。

卷积神经网络的应用

我们见到了卷积神经网络可以有效地用于计算机视觉领域的图片分类问题,实际上作为一种经典的神经网络模型架构,卷积神经网络可以衍生出许多应用,针对不同的应用情景,产生不同的局限性,对应不同的局限性进行有效改进或提出新方法,就成为了一篇新的论文。以下是需要掌握的经典结构与原始论文:

而在计算机视觉领域,基于卷积神经网络比较热门的研究分支有:

  • 目标检测
  • 人脸识别
  • 目标跟踪
  • 风格转换(风格迁移)
  • 图像标注
  • 等等…

不过做研究时也不能局限自己的思维,卷积神经网络其实还可以用于自然语言处理领域、语音识别领域。将不同的领域特性结合进神经网络模型,可以得到独特的角度,不过大部分论文的写作思路是:假设有 $M$ 个很不错的模型架构,现在又有 $N$ 个热门的研究任务,理论上可以发出 $M \times N$ 篇论文,所以可以从其他人没有尝试过的改进入手。这样的论文中十有八九是灌水的,对于其他人来说不一定有很强的借鉴意义和启发,从科研的角度来看,还是要力求进行本质上的创新。

比如上面是“你好”的音频频谱图,可以利用卷积神经网络对其频谱信息进行识别,从而完成语音识别的任务。但是像文本、视频和音频这样的数据,与图片有所不同,我们明显地发现它们存在着序列特征,例如视频从时间上就是一帧帧图像的组合,因此可能要设计更好的模型架构,来处理序列数据。这个时候需要一些领域性的知识,例如卷积神经网络中的卷积计算并不是无中生有,在信号与系统和数字图形处理知识中早就被人使用了。

如何更好地处理音频、视频、文本这样的数据呢,我们在下面一篇文章中进行介绍。