CNN 浅析和历年 ImageNet 冠军模型解析

阅读数:22637 2017 年 5 月 21 日

今天在这里我给大家讲解一些深度学习中卷积神经网络的原理和一些经典的网络结构

卷积神经网络原理浅析

卷积神经网络(Convolutional?Neural?Network,CNN)最初是为解决图像识别等问题设计的,当然其现在的应用不仅限于图像和视频,也可用于时间序列信号,比如音频信号、文本数据等。在早期的图像识别研究中,最大的挑战是如何组织特征,因为图像数据不像其他类型的数据那样可以通过人工理解来提取特征。

在股票预测等模型中,我们可以从原始数据中提取过往的交易价格波动、市盈率、市净率、盈利增长等金融因子,这即是特征工程。但是在图像中,我们很难根据人为理解提取出有效而丰富的特征。在深度学习出现之前,我们必须借助 SIFT、HoG 等算法提取具有良好区分性的特征,再集合 SVM 等机器学习算法进行图像识别。

SIFT 对一定程度内的缩放、平移、旋转、视角改变、亮度调整等畸变,都具有不变性,是当时最重要的图像特征提取方法之一。然而 SIFT 这类算法提取的特征还是有局限性的,在 ImageNet?ILSVRC 比赛的最好结果的错误率也有 26% 以上,而且常年难以产生突破。

卷积神经网络提取的特征则可以达到更好的效果,同时它不需要将特征提取和分类训练两个过程分开,它在训练时就自动提取了最有效的特征。CNN 作为一个深度学习架构被提出的最初诉求,是降低对图像数据预处理的要求,以及避免复杂的特征工程。CNN 可以直接使用图像的原始像素作为输入,而不必先使用 SIFT 等算法提取特征,减轻了使用传统算法如 SVM 时必需要做的大量重复、烦琐的数据预处理工作。

和 SIFT 等算法类似,CNN 训练的模型同样对缩放、平移、旋转等畸变具有不变性,有着很强的泛化性。CNN 的最大特点在于卷积的权值共享结构,可以大幅减少神经网络的参数量,防止过拟合的同时又降低了神经网络模型的复杂度。

卷积神经网络的概念最早出自 19 世纪 60 年代科学家提出的感受野(Receptive?Field37)。当时科学家通过对猫的视觉皮层细胞研究发现,每一个视觉神经元只会处理一小块区域的视觉图像,即感受野。到了 20 世纪 80 年代,日本科学家提出神经认知机(Neocognitron38)的概念,可以算作是卷积网络最初的实现原型。

神经认知机中包含两类神经元,用来抽取特征的 S-cells,还有用来抗形变的 C-cells,其中 S-cells 对应我们现在主流卷积神经网络中的卷积核滤波操作,而 C-cells 则对应激活函数、最大池化(Max-Pooling)等操作。同时,CNN 也是首个成功地进行多层训练的网络结构,即前面章节提到的 LeCun 的 LeNet5,而全连接的网络因为参数过多及梯度弥散等问题,在早期很难顺利地进行多层的训练。

卷积神经网络可以利用空间结构关系减少需要学习的参数量,从而提高反向传播算法的训练效率。在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一个卷积操作只处理一小块图像,进行卷积变化后再传到后面的网络,每一层卷积(也可以说是滤波器)都会提取数据中最有效的特征。这种方法可以提取到图像中最基础的特征,比如不同方向的边或者拐角,而后再进行组合和抽象形成更高阶的特征,因此 CNN 可以应对各种情况,理论上具有对图像缩放、平移和旋转的不变性。

一般的卷积神经网络由多个卷积层构成,每个卷积层中通常会进行如下几个操作。

  1. 图像通过多个不同的卷积核的滤波,并加偏置(bias),提取出局部特征,每一个卷积核会映射出一个新的 2D 图像。
  2. 将前面卷积核的滤波输出结果,进行非线性的激活函数处理。目前最常见的是使用 ReLU 函数,而以前 Sigmoid 函数用得比较多。
  3. 对激活函数的结果再进行池化操作(即降采样,比如将 2×2 的图片降为 1×1 的图片),目前一般是使用最大池化,保留最显著的特征,并提升模型的畸变容忍能力。

一个卷积层中可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享。那我们为什么要共享卷积核的权值参数呢?答案很简单,降低模型复杂度,减轻过拟合并降低计算量。

(点击放大图像)

举个例子,如图 5-2 所示,如果我们的图像尺寸是 1000 像素×1000 像素,并且假定是黑白图像,即只有一个颜色通道,那么一张图片就有 100 万个像素点,输入数据的维度也是 100 万。接下来,如果连接一个相同大小的隐含层(100 万个隐含节点),那么将产生 100 万×100 万 = 一万亿个连接。

仅仅一个全连接层(Fully?Connected?Layer),就有一万亿连接的权重要去训练,这已经超出了普通硬件的计算能力。我们必须减少需要训练的权重数量,一是降低计算的复杂度,二是过多的连接会导致严重的过拟合,减少连接数可以提升模型的泛化性。

图像在空间上是有组织结构的,每一个像素点在空间上和周围的像素点实际上是有紧密联系的,但是和太遥远的像素点就不一定有什么关联了。这就是前面提到的人的视觉感受野的概念,每一个感受野只接受一小块区域的信号。这一小块区域内的像素是互相关联的,每一个神经元不需要接收全部像素点的信息,只需要接收局部的像素点作为输入,而后将所有这些神经元收到的局部信息综合起来就可以得到全局的信息。

这样就可以将之前的全连接的模式修改为局部连接,之前隐含层的每一个隐含节点都和全部像素相连,现在我们只需要将每一个隐含节点连接到局部的像素节点。假设局部感受野大小是 10×10,即每个隐含节点只与 10×10 个像素点相连,那么现在就只需要 10×10×100 万 =1 亿个连接,相比之前的 1 万亿缩小了 10000 倍。

简单说,全连接就是上图的左边部分,而局部连接就是上图的右边部分。局部连接可以大大降低神经网络参数量,从 100M*100M = 1 万亿,到 10*10*100 万 =1 亿。

(点击放大图像)

上面我们通过局部连接(Locally?Connect)的方法,将连接数从 1 万亿降低到 1 亿,但仍然偏多,需要继续降低参数量。现在隐含层每一个节点都与 10×10 的像素相连,也就是每一个隐含节点都拥有 100 个参数。假设我们的局部连接方式是卷积操作,即默认每一个隐含节点的参数都完全一样,那我们的参数不再是 1 亿,而是 100。不论图像有多大,都是这 10×10=100 个参数,即卷积核的尺寸,这就是卷积对缩小参数量的贡献。

简单说,卷积就是使用完全相同的(参数相同)的模板去进行局部连接,所以参数量可以继续骤降

我们不需要再担心有多少隐含节点或者图片有多大,参数量只跟卷积核的大小有关,这也就是所谓的权值共享。但是如果我们只有一个卷积核,我们就只能提取一种卷积核滤波的结果,即只能提取一种图片特征,这不是我们期望的结果。好在图像中最基本的特征很少,我们可以增加卷积核的数量来多提取一些特征。

图像中的基本特征无非就是点和边,无论多么复杂的图像都是点和边组合而成的。人眼识别物体的方式也是从点和边开始的,视觉神经元接受光信号后,每一个神经元只接受一个区域的信号,并提取出点和边的特征,然后将点和边的信号传递给后面一层的神经元,再接着组合成高阶特征,比如三角形、正方形、直线、拐角等,再继续抽象组合,得到眼睛、鼻子和嘴等五官,最后再将五官组合成一张脸,完成匹配识别。

因此我们的问题就很好解决了,只要我们提供的卷积核数量足够多,能提取出各种方向的边或各种形态的点,就可以让卷积层抽象出有效而丰富的高阶特征。每一个卷积核滤波得到的图像就是一类特征的映射,即一个 Feature?Map。一般来说,我们使用 100 个卷积核放在第一个卷积层就已经很充足了。

那这样的话,如上图所示,我们的参数量就是 100×100=1 万个,相比之前的 1 亿又缩小了 10000 倍。因此,依靠卷积,我们就可以高效地训练局部连接的神经网络了。卷积的好处是,不管图片尺寸如何,我们需要训练的权值数量只跟卷积核大小、卷积核数量有关,我们可以使用非常少的参数量处理任意大小的图片。每一个卷积层提取的特征,在后面的层中都会抽象组合成更高阶的特征。

我们再总结一下,卷积神经网络的要点就是局部连接(Local?Connection)、权值共享(Weight?Sharing)和池化层(Pooling)中的降采样(Down-Sampling)。

其中,局部连接和权值共享降低了参数量,使训练复杂度大大下降,并减轻了过拟合。同时权值共享还赋予了卷积网络对平移的容忍性,而池化层降采样则进一步降低了输出参数量,并赋予模型对轻度形变的容忍性,提高了模型的泛化能力。

卷积神经网络相比传统的机器学习算法,无须手工提取特征,也不需要使用诸如 SIFT 之类的特征提取算法,可以在训练中自动完成特征的提取和抽象,并同时进行模式分类,大大降低了应用图像识别的难度;相比一般的神经网络,CNN 在结构上和图片的空间结构更为贴近,都是 2D 的有联系的结构,并且 CNN 的卷积连接方式和人的视觉神经处理光信号的方式类似。

下面介绍一下经典的卷积网络 LeNet5。

大名鼎鼎的 LeNet5? 诞生于 1994 年,是最早的深层卷积神经网络之一,并且推动了深度学习的发展。从 1988 年开始,在多次成功的迭代后,这项由 Yann?LeCun 完成的开拓性成果被命名为 LeNet5。

LeCun 认为,可训练参数的卷积层是一种用少量参数在图像的多个位置上提取相似特征的有效方式,这和直接把每个像素作为多层神经网络的输入不同。像素不应该被使用在输入层,因为图像具有很强的空间相关性,而使用图像中独立的像素直接作为输入则利用不到这些相关性。

LeNet5 当时的特性有如下几点。

  • 每个卷积层包含三个部分:卷积、池化和非线性激活函数
  • 使用卷积提取空间特征
  • 降采样(Subsample)的平均池化层(Average?Pooling)
  • 双曲正切(Tanh)或 S 型(Sigmoid)的激活函数
  • MLP 作为最后的分类器
  • 层与层之间的稀疏连接减少计算复杂度

LeNet5 中的诸多特性现在依然在 state-of-the-art 卷积神经网络中使用,可以说 LeNet5 是奠定了现代卷积神经网络的基石之作。Lenet-5 的结构下图所示。

(点击放大图像)

它的输入图像为 32×32 的灰度值图像,后面有 3 个卷积层,1 个全连接层和 1 个高斯连接层。

下面我们来介绍一些其他几个经典的卷积网络结构,AlexNet、VGGNet、Google Inception Net 和 ResNet,这 4 种网络依照出现的先后顺序排列,深度和复杂度也依次递进。

它们分别获得了 ILSVRC(ImageNet?Large?Scale?Visual?Recognition?Challenge)比赛分类项目的 2012 年冠军(AlexNet, top-5 错误率 16.4%,使用额外数据可达到 15.3%,8 层神经网络)、2014 年亚军(VGGNet,top-5 错误率 7.3%,19 层神经网络),2014 年冠军(InceptionNet,top-5 错误率 6.7%,22 层神经网络)和 2015 年的冠军(ResNet,top-5 错误率 3.57%,152 层神经网络)。

(点击放大图像)

如图所示,ILSVRC 的 top-5 错误率在最近几年取得重大突破,而主要的突破点都是在深度学习和卷积神经网络,成绩的大幅提升几乎都伴随着卷积神经网络的层数加深。

(点击放大图像)

前面提到的计算机视觉比赛 ILSVRC 使用的数据都来自 ImageNet,如上图所示。ImageNet 项目于 2007 年由斯坦福大学华人教授李飞飞创办,目标是收集大量带有标注信息的图片数据供计算机视觉模型训练。ImageNet 拥有 1500 万张标注过的高清图片,总共拥有 22000 类,其中约有 100 万张标注了图片中主要物体的定位边框。

(点击放大图像)

每年度的 ILSVRC 比赛数据集中大概拥有 120 万张图片,以及 1000 类的标注,是 ImageNet 全部数据的一个子集。比赛一般采用 top-5 和 top-1 分类错误率作为模型性能的评测指标,上图所示为 AlexNet 识别 ILSVRC 数据集中图片的情况,每张图片下面是分类预测得分最高的 5 个分类及其分值。

AlexNet 技术特点概要

AlexNet 是现代深度 CNN 的奠基之作。

2012 年,Hinton 的学生 Alex?Krizhevsky 提出了深度卷积神经网络模型 AlexNet,它可以算是 LeNet 的一种更深更宽的版本。AlexNet 中包含了几个比较新的技术点,也首次在 CNN 中成功应用了 ReLU、Dropout 和 LRN 等 Trick。同时 AlexNet 也使用了 GPU 进行运算加速,作者开源了他们在 GPU 上训练卷积神经网络的 CUDA 代码。

AlexNet 包含了 6 亿 3000 万个连接,6000 万个参数和 65 万个神经元,拥有 5 个卷积层,其中 3 个卷积层后面连接了最大池化层,最后还有 3 个全连接层。AlexNet 以显著的优势赢得了竞争激烈的 ILSVRC?2012 比赛,top-5 的错误率降低至了 16.4%,相比第二名的成绩 26.2% 错误率有了巨大的提升。

AlexNet 可以说是神经网络在低谷期后的第一次发声,确立了深度学习(深度卷积网络)在计算机视觉的统治地位,同时也推动了深度学习在语音识别、自然语言处理、强化学习等领域的拓展。

AlexNet 将 LeNet 的思想发扬光大,把 CNN 的基本原理应用到了很深很宽的网络中。AlexNet 主要使用到的新技术点如下。

  1. 成功使用 ReLU 作为 CNN 的激活函数,并验证其效果在较深的网络超过了 Sigmoid,成功解决了 Sigmoid 在网络较深时的梯度弥散问题。虽然 ReLU 激活函数在很久之前就被提出了,但是直到 AlexNet 的出现才将其发扬光大。
  2. 训练时使用 Dropout 随机忽略一部分神经元,以避免模型过拟合。Dropout 虽有单独的论文论述,但是 AlexNet 将其实用化,通过实践证实了它的效果。在 AlexNet 中主要是最后几个全连接层使用了 Dropout。
  3. 在 CNN 中使用重叠的最大池化。此前 CNN 中普遍使用平均池化,AlexNet 全部使用最大池化,避免平均池化的模糊化效果。并且 AlexNet 中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  4. 提出了 LRN 层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  5. 使用 CUDA 加速深度卷积网络的训练,利用 GPU 强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet 使用了两块 GTX?580?GPU 进行训练,单个 GTX?580 只有 3GB 显存,这限制了可训练的网络的最大规模。因此作者将 AlexNet 分布在两个 GPU 上,在每个 GPU 的显存中储存一半的神经元的参数。
  6. 数据增强,随机地从 256*256 的原始图像中截取 224*224 大小的区域(以及水平翻转的镜像),相当于增加了 (256224)2*2=2048 倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的 CNN 会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共 5 个位置,并进行左右翻转,一共获得 10 张图片,对他们进行预测并对 10 次结果求均值。

(点击放大图像)

整个 AlexNet 有 8 个需要训练参数的层(不包括池化层和 LRN 层),前 5 层为卷积层,后 3 层为全连接层,上图所示。AlexNet 最后一层是有 1000 类输出的 Softmax 层用作分类。LRN 层出现在第 1 个及第 2 个卷积层后,而最大池化层出现在两个 LRN 层及最后一个卷积层后。

(点击放大图像)

AlexNet 每层的超参数、参数量、计算量上图所示。

我们可以发现一个比较有意思的现象,在前几个卷积层,虽然计算量很大,但参数量很小,都在 1M 左右甚至更小,只占 AlexNet 总参数量的很小一部分。这就是卷积层有用的地方,可以通过较小的参数量提取有效的特征。

虽然每一个卷积层占整个网络的参数量的 1% 都不到,但是如果去掉任何一个卷积层,都会使网络的分类性能大幅地下降。

VGGNet 技术特点概要

VGGNet 是牛津大学计算机视觉组(Visual?Geometry?Group)和 Google?DeepMind 公司的研究员一起研发的的深度卷积神经网络。VGGNet 探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠 3*3 的小型卷积核和 2*2 的最大池化层,VGGNet 成功地构筑了 16~19 层深的卷积神经网络。VGGNet 相比之前 state-of-the-art 的网络结构,错误率大幅下降,并取得了 ILSVRC?2014 比赛分类项目的第 2 名和定位项目的第 1 名。

VGGNet 论文中全部使用了 3*3 的卷积核和 2*2 的池化核,通过不断加深网络结构来提升性能。下图所示为 VGGNet 各级别的网络结构图,和每一级别的参数量,从 11 层的网络一直到 19 层的网络都有详尽的性能测试。

(点击放大图像)

(点击放大图像)

虽然从 A 到 E 每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后 3 个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。

VGGNet 拥有 5 段卷积,每一段内有 2~3 个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64?–?128?–?256?–?512?–?512。其中经常出现多个完全一样的 3*3 的卷积层堆叠在一起的情况,这其实是非常有用的设计。

(点击放大图像)

如上图所示,两个 3*3 的卷积层串联相当于 1 个 5*5 的卷积层,即一个像素会跟周围 5*5 的像素产生关联,可以说感受野大小为 5*5。而 3 个 3*3 的卷积层串联的效果则相当于 1 个 7*7 的卷积层。除此之外,3 个串联的 3*3 的卷积层,拥有比 1 个 7*7 的卷积层更少的参数量,只有后者的 55%。

最重要的是,3 个 3*3 的卷积层拥有比 1 个 7*7 的卷积层更多的非线性变换(前者可以使用三次 ReLU 激活函数,而后者只有一次),使得 CNN 对特征的学习能力更强。

作者在对比各级网络时总结出了以下几个观点。

  1. LRN 层作用不大。
  2. 越深的网络效果越好。
  3. 1*1 的卷积也是很有效的,但是没有 3*3 的卷积好,大一些的卷积核可以学习更大的空间特征。

    InceptionNet 技术特点概要

    Google?Inception?Net 首次出现在 ILSVRC?2014 的比赛中(和 VGGNet 同年),就以较大优势取得了第一名。那届比赛中的 Inception?Net 通常被称为 Inception?V1,它最大的特点是控制了计算量和参数量的同时,获得了非常好的分类性能——top-5 错误率 6.67%,只有 AlexNet 的一半不到。

    Inception?V1 有 22 层深,比 AlexNet 的 8 层或者 VGGNet 的 19 层还要更深。但其计算量只有 15 亿次浮点运算,同时只有 500 万的参数量,仅为 AlexNet 参数量(6000 万)的 1/12,却可以达到远胜于 AlexNet 的准确率,可以说是非常优秀并且非常实用的模型。

    Inception?V1 降低参数量的目的有两点:第一,参数越多模型越庞大,需要供模型学习的数据量就越大,而目前高质量的数据非常昂贵;第二,参数越多,耗费的计算资源也会更大。

    Inception?V1 参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:一是去除了最后的全连接层,用全局平均池化层(即将图片尺寸变为 1*1)来取代它。全连接层几乎占据了 AlexNet 或 VGGNet 中 90% 的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。

    二是 Inception?V1 中精心设计的 Inception?Module 提高了参数的利用效率,其结构如图 10 所示。这一部分也借鉴了 Network?In?Network 的思想,形象的解释就是 Inception?Module 本身如同大网络中的一个小网络,其结构可以反复堆叠在一起形成大网络。

    (点击放大图像)

    我们再来看 Inception?Module 的基本结构,其中有 4 个分支:第一个分支对输入进行 1*1 的卷积,这其实也是 NIN 中提出的一个重要结构。1*1 的卷积是一个非常优秀的结构,它可以跨通道组织信息,提高网络的表达能力,同时可以对输出通道升维和降维。

    可以看到 Inception?Module 的 4 个分支都用到了 1*1 卷积,来进行低成本(计算量比 3*3 小很多)的跨通道的特征变换。

    第二个分支先使用了 1*1 卷积,然后连接 3*3 卷积,相当于进行了两次特征变换。第三个分支类似,先是 1*1 的卷积,然后连接 5*5 卷积。最后一个分支则是 3*3 最大池化后直接使用 1*1 卷积。

    Inception?Module 的 4 个分支在最后通过一个聚合操作合并(在输出通道数这个维度上聚合)。

    同时,Google?Inception?Net 还是一个大家族,包括:

    • 2014 年 9 月的论文 Going?Deeper?with?Convolutions 提出的 Inception?V1(top-5 错误率 6.67%)。
    • 2015 年 2 月的论文 Batch?Normalization:?Accelerating?Deep?Network?Training?by?Reducing?Internal?Covariate 提出的 Inception?V2(top-5 错误率 4.8%)。
    • 2015 年 12 月的论文 Rethinking?the?Inception?Architecture?for?Computer?Vision 提出的 Inception?V3(top-5 错误率 3.5%)。
    • 2016 年 2 月的论文 Inception-v4,?Inception-ResNet?and?the?Impact?of?Residual?Connections?on?Learning 提出的 Inception?V4(top-5 错误率 3.08%)。

    Inception?V2 学习了 VGGNet,用两个 3*3 的卷积代替 5*5 的大卷积(用以降低参数量并减轻过拟合),还提出了著名的 Batch?Normalization(以下简称 BN)方法。BN 是一个非常有效的正则化方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅提高。

    BN 在用于神经网络某层时,会对每一个 mini-batch 数据的内部进行标准化(normalization)处理,使输出规范化到 N(0,1) 的正态分布,减少了 Internal?Covariate?Shift(内部神经元分布的改变)。

    BN 的论文指出,传统的深度神经网络在训练时,每一层的输入的分布都在变化,导致训练变得困难,我们只能使用一个很小的学习速率解决这个问题。而对每一层使用 BN 之后,我们就可以有效地解决这个问题,学习速率可以增大很多倍,达到之前的准确率所需要的迭代次数只有 1/14,训练时间大大缩短。

    而达到之前的准确率后,可以继续训练,并最终取得远超于 Inception?V1 模型的性能——top-5 错误率 4.8%,已经优于人眼水平。因为 BN 某种意义上还起到了正则化的作用,所以可以减少或者取消 Dropout,简化网络结构。

    ResNet 技术特点概要

    ResNet(Residual?Neural?Network)由微软研究院的 Kaiming?He 等 4 名华人提出,通过使用 Residual?Unit 成功训练 152 层深的神经网络,在 ILSVRC?2015 比赛中获得了冠军,取得 3.57% 的 top-5 错误率,同时参数量却比 VGGNet 低,效果非常突出。

    ResNet 的结构可以极快地加速超深神经网络的训练,模型的准确率也有非常大的提升。

    ResNet 最初的灵感出自这个问题:在不断加神经网络的深度时,会出现一个 Degradation 的问题,即准确率会先上升然后达到饱和,再持续增加深度则会导致准确率下降。

    这并不是过拟合的问题,因为不光在测试集上误差增大,训练集本身误差也会增大。假设有一个比较浅的网络达到了饱和的准确率,那么后面再加上几个的全等映射层,起码误差不会增加,即更深的网络不应该带来训练集上误差上升。

    而这里提到的使用全等映射直接将前一层输出传到后面的思想,就是 ResNet 的灵感来源。假定某段神经网络的输入是 x,期望输出是 H(x),如果我们直接把输入 x 传到输出作为初始结果,那么此时我们需要学习的目标就是 F(x)=H(x)-x。

    (点击放大图像)

    这就是一个 ResNet 的残差学习单元(Residual?Unit),ResNet 相当于将学习目标改变了,不再是学习一个完整的输出 H(x),只是输出和输入的差别 H(x)-x,即残差。

    (点击放大图像)

    上图所示为 VGGNet-19,以及一个 34 层深的普通卷积网络,和 34 层深的 ResNet 网络的对比图。可以看到普通直连的卷积神经网络和 ResNet 的最大区别在于,ResNet 有很多旁路的支线将输入直接连到后面的层,使得后面的层可以直接学习残差,这种结构也被称为 shortcut 或 skip?connections。

    传统的卷积层或全连接层在信息传递时,或多或少会存在信息丢失、损耗等问题。ResNet 在某种程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络则只需要学习输入、输出差别的那一部分,简化学习目标和难度。

    (点击放大图像)

    上图所示为 ResNet 在不同层数时的网络配置,其中基础结构很类似,都是前面提到的两层和三层的残差学习单元的堆叠。

    在使用了 ResNet 的结构后,可以发现层数不断加深导致的训练集上误差增大的现象被消除了,ResNet 网络的训练误差会随着层数增大而逐渐减小,并且在测试集上的表现也会变好。

    (点击放大图像)

    小结

    此就将 ALexNet、VGGNet、Inception Net、ResNet 四种经典的卷积介绍完了,下面我们简单总结一下。我们简单回顾卷积神经网络的历史,上图所示大致勾勒出最近几十年卷积神经网络的发展方向。

    Perceptron(感知机)于1957 年由 Frank?Resenblatt 提出,而 Perceptron 不仅是卷积网络,也是神经网络的始祖。Neocognitron(神经认知机)是一种多层级的神经网络,由日本科学家 Kunihiko?Fukushima 于 20 世纪 80 年代提出,具有一定程度的视觉认知的功能,并直接启发了后来的卷积神经网络。

    LeNet-5 由 CNN 之父 Yann?LeCun 于1997 年提出,首次提出了多层级联的卷积结构,可对手写数字进行有效识别。可以看到前面这三次关于卷积神经网络的技术突破,间隔时间非常长,需要十余年甚至更久才出现一次理论创新。

    而后于2012 年,Hinton 的学生 Alex 依靠 8 层深的卷积神经网络一举获得了 ILSVRC?2012 比赛的冠军,瞬间点燃了卷积神经网络研究的热潮。AlexNet 成功应用了 ReLU 激活函数、Dropout、最大覆盖池化、LRN 层、GPU 加速等新技术,并启发了后续更多的技术创新,卷积神经网络的研究从此进入快车道。

    在 AlexNet 之后,我们可以将卷积神经网络的发展分为两类,一类是网络结构上的改进调整(图 6-18 中的左侧分支),另一类是网络深度的增加(图 18 中的右侧分支)。

    2013 年,颜水成教授的 Network?in?Network 工作首次发表,优化了卷积神经网络的结构,并推广了 1*1 的卷积结构。在改进卷积网络结构的工作中,后继者还有 2014 年的 Google?Inception?Net?V1,提出了 Inception?Module 这个可以反复堆叠的高效的卷积网络结构,并获得了当年 ILSVRC 比赛的冠军。

    2015 年初的 Inception?V2 提出了 Batch?Normalization,大大加速了训练过程,并提升了网络性能。2015 年年末的 Inception?V3 则继续优化了网络结构,提出了 Factorization?in?Small?Convolutions 的思想,分解大尺寸卷积为多个小卷积乃至一维卷积。

    而右侧分支上,许多研究工作则致力于加深网络层数,2014 年,ILSVRC 比赛的亚军 VGGNet 全程使用 3*3 的卷积,成功训练了深达 19 层的网络,当年的季军 MSRA-Net 也使用了非常深的网络。

    2015 年,微软的 ResNet 成功训练了 152 层深的网络,一举拿下了当年 ILSVRC 比赛的冠军,top-5 错误率降低至 3.46%。

    我们可以看到,自 AlexNet 于 2012 年提出后,深度学习领域的研究发展极其迅速,基本上每年甚至每几个月都会出现新一代的技术。新的技术往往伴随着新的网络结构,更深的网络的训练方法等,并在图像识别等领域不断创造新的准确率记录。

    CNN 的技术日新月异,当然其中不可忽视的推动力是,我们拥有了更快的 GPU 计算资源用以实验,以及非常方便的开源工具(比如 TensorFlow)可以让研究人员快速地进行探索和尝试。在以前,研究人员如果没有像 Alex 那样高超的编程实力能自己实现 cuda-convnet,可能都没办法设计 CNN 或者快速地进行实验。

    现在有了 TensorFlow,研究人员和开发人员都可以简单而快速地设计神经网络结构并进行研究、测试、部署乃至实用。

    答疑环节

    Q1:tensorflow 的学习路线?

    黄文坚:如果想快速入门,可以结合 MNIST 数据集,尝试 MLP、CNN 进行图像分类,而后尝试在 MNSIT 上实现 AutoEncoder。此后,可以学习 TensorBoard,这是一个非常方便的可视化工具。之后掌握进阶的 CNN、RNN,强化学习训练方式。然后如果有兴趣,可以掌握单机多 GPU 并行计算,多机多 GPU 分布式训练。目前 TensorFlow 中还推出了很多组件,比如 TF.Learn,Slim,XLA、Fold 等,可以针对需求探索。

    Q2:目前主流的深度学习工具主要包括 TensorFlow,Caffe 和 Mxnet。相比于其他两个库,您认为 TensorFlow 的主要优势是哪些?未来 TensorFlow 的发展趋势着眼于哪些方面,谢谢老师~

    黄文坚:Caffe 是比较经典的老框架,缺陷在于使用配置文件定义网络结构,调试网络不是很方便,并且基于层的构筑方式,一层一层的堆叠网络,对于一些更灵活的图的结构,表示不方便,并且分布式也不完善。

    MXnet 是国人推出的框架,主要作者是陈天奇和李沐。MXNet 非常灵活,支持多种编程范式,并且分布式性能很好,支持的前端语言绑定很多。缺点是,开发团队小,框架产品代码质量稳定性不如 TensorFlow。并且非常缺完善的文档和资料。

    TensorFlow 是 Google 大力研发的框架,大约有 100-200 人的全职的 Engineer 在协作开发,拥有产品级的代码质量,完善的稳定,高可靠性,适合生产环境使用。同时其计算图定义模式,也非常灵活,可以进行各种灵活的调试。并且目前大部分新推出的 Paper 和研究,都使用 TensorFlow 进行实现,可用的模型代码非常多。

    在 TensorFlow Models 库中,也有大量可靠的开源模型实现,比如 SyntaxNet,TextSum 等。并且 TensorFlow 在 Github 上,获得的 star 数名列机器学习库第一,基本是第 2- 第 10 名之和。

    Q3:tensorflow 在文本领域表现如何?

    黄文坚:做文本分析和处理,主要使用 RNN,少数情况使用 CNN。这两种网络 TensorFlow 都支持的非常好和完善。并且新推出的 TensorFLow Fold 支持动态的批输入,可以对动态的 RNN 结构产生巨大的提速。

    Q4:如何选择网络的层数和神经元个数?

    黄文坚:深度学习的层数和神经元个数条数一直是一个经验占比非常重的问题。在 TensorFlow 中,可以使用 TensorBoard 观察 train loss 和 test loss,如果 train loss 下降慢,并且 test loss 没有上升,可以加大模型拟合能力,即加深网络和增大神经元个数。如果 train loss 难以下降,并且 test loss 开始反弹,则应控制模型的容量,即模型的拟合能力,保持层数和神经元个数不过大,同时使用各种减轻过拟合的方法,比如 dropout、batch normalization 等。

    如果 train loss 难以下降,并且 test loss 开始反弹,则应控制模型的容量,即模型的拟合能力,保持层数和神经元个数不过大,同时使用各种减轻过拟合的方法,比如 dropout、batch normalization 等。

    Q5:如何将 tensorflow 应用在实际项目中,涉及的数据转换及数据结构应该是怎样定的?

    黄文坚:TensorFlow 的格式可以使用 numpy 的数组,输入数据通过 placeholder 转为 tensor,即多维数组格式,这是 TensorFlow 的核心数据格式。

    同时对有空间关联性和时间管理性的数据,应连接 CNN、RNN 进行处理,其他类型数据,应使用 MLP。

    Q6:RNN 和 CNN 分别适用哪些场景?

    黄文坚:CNN 适合空间和时间有关联性的场景,比如图片分类,文本分类,时间序列分类等。

    RNN 主要适合有时间关联性的场景,并且对时间先后顺序敏感,适合文本分类,语言模型等。

    Q7:我是 java 程序员,5 年工作经验,如何更好学习 TensorFlow?

    黄文坚:TensorFlow 最主流的接口是 Python,不过目前也推出了 Java 接口。如果感兴趣,可以直接先从 Java 接口入手,不过非脚本语言,调试可能不方便,后期可以再学习 Python 接口。

    Q8:黄老师您好。请问如何看待 Keras 和 Tensorflow 的关系?Keras 作为更高层的库,应该和 TF 一起学习掌握还是更推荐底层的 TF 作为深度学习框架的入门呢?

    黄文坚:keras 已经被合并到 TensorFlow 中了,目前可以属于 TF 的一个组件。推荐先学习 TensorFlow,掌握一些底层机制,后面当需要快速构建大型神经网络实验时,可以学习 keras。并且学习过 tensorflow 后,keras 将非常简单。

    作者介绍

    黄文坚,《TensorFlow 实战》作者,该书获得 Google TensorFlow 工程研发总监 Rajat Monga、360 首席科学家颜水成教授、北大长江学者崔斌教授的推荐,出版后曾获京东、亚马逊、当当计算机类图书销量第一, 并获台湾知名出版社引进版权。现任职 PPmoney 大数据算法总监,负责集团的风控、理财、互联网证券等业务的数据挖掘工作。Google TensorFlow Contributor。前明略数据技术合伙人,领导了对诸多大型银行、保险公司、基金公司的数据挖掘项目,包括金融风控、新闻舆情分析、保险复购预测等,并多次获客户方报送评奖。曾就职于阿里巴巴搜索引擎算法团队,负责天猫上亿用户的个性化搜索系统。曾参加阿里巴巴大数据推荐算法大赛,于 7000 多只队伍中获得前 10 名。本科、研究生毕业于香港科技大学,在顶级会议和期刊 SIGMOBILE MobiCom、IEEE Transactions on Image Processing 发表论文,研究成果获 SIGMOBILE MobiCom 最佳移动应用技术奖,并获得两项美国专利和一项中国专利。


    感谢杜小芳对本文的审校。

    给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

    收藏

    评论

    微博

    发表评论

    注册/登录 InfoQ 发表评论