一、CNN 简介
CNN的精华是:三概念两核心,这里做个简要的概要性介绍。
1、CNN 两核心——卷积和池化
(1)卷积
主要起到作用是抽取特征,使网络具有一定转移不变性,也有一定降维的作用。概述:设定一个n行m列的卷积窗口,采用的relu(elu,leakyrelu)做为激活函数函数,对输入X进行卷积操作。
注意:卷积可能单通道或者多通道卷积;积操作时分为 padding 和非 padding 两种方式,padding 也分为很多方式,比如zero-padding,mean-padding等;对同一个输入可以设置不同大小卷积和,或从不同的位置,或不同的卷积步长多次进行卷积,目的就是为了尽可能多的抽取特征。
(2)池化
主要起降维的作用。概述:设置一个n行m列的池化窗口,对输入X进行池化操作,采用relu(elu,leakyrelu)做为激活函数。也可采用sigmoid或tans型激活函数,但注意函数的饱和死区特性导致的反向传播时的梯度消失问题,可以配合Batch Normalization使用。池化也有很多方式,比如最大值池化、平均值池化。
2、CNN 三概念——局部感受野、权值共享和下采样/降采样
(1)局部感受野:卷积操作时卷积窗口与输入X重合的部分。
(2)权值共享:卷积操作或池化操作时,卷积窗口或池化窗口的权值不发生变化。
(3)下采样/降采样:就是池化操作。
可见,卷积和池化的随机组合赋予了CNN很大的灵活性,因此也诞生了很多耳熟能详的经典网络:AlexNet,VGGNet,Google Inception Net,ResNet,四种网络在深度和复杂度方面一次递增。AlexNet获得了ILSVRC(ImageNet Large Scale Visual Recognition Challenge)比赛2012年冠军(8层神经网络,top-5错误率16%,使用更多额外数据可达到15.3%),VGGNet获得2014年ILSVRC的亚军(19层神经网络,top-5错误率7.3%),Google Inception Net获得2014年ILSVRC冠军(22层神经网络,top-5错误率6.7%),ResNet获得2015年冠军(top-5错误率3.57%,152层神经网络)。
二、CNN 经典模型
1、LeNet5
LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。
LenNet-5 共有 7 层(不包括输入层),每层都包含不同数量的训练参数,如下图所示。
LeNet-5 中主要有 2 个卷积层、2 个下抽样层(池化层)、3 个全连接层3种连接方式。
(1)LeNet5 特征
1)卷积神经网络
使用三个层作为一个系列: 卷积,池化,非线性
2) 使用卷积提取空间特征
3)使用映射到空间均值下采样(subsample)
4)双曲线(tanh)或 S 型(sigmoid)形式的非线性
5)多层神经网络(MLP)作为最后的分类器
6)层与层之间的稀疏连接矩阵避免大的计算成本
(2)LeNet-5 的训练算法
训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:
第一阶段,向前传播阶段:a)从样本集中取一个样本(X,Yp),将X输入网络;
b)计算相应的实际输出Op。
在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))第二阶段,反向传播阶段
a)算实际输出Op与相应的理想输出Yp的差;
b)按极小化误差的方法反向传播调整权矩阵。
(3)LaNet-5的局限性
CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。
2、AlexNet
AlexNet是由 Hinton 的学生 Alex Krizhevsky 在 2012 年提出的深度卷积网络,可以看做是 Lenet 加深加宽版本。AlexNet 中采用了一系列的新的技术点:成功应用了 Relu、Dropout 和 LRN 等 trick,首次采用 GPU 进行加速。
整个AlexNet有8个需要训练参数的层(不包括池化层和LRN层),前5层为卷积层,后3层为全连接层,如图4所示。AlexNet最后一层是有1000类输出的Softmax层用作分类。 LRN层出现在第1个及第2个卷积层后,而最大池化层出现在两个LRN层及最后一个卷积层后。ReLU激活函数则应用在这8层每一层的后面。
整个网络呈一个金字塔结构,具体来说:
(1)输入图片是224 * 224像素的三通道图片;
(2)第一层使用11 * 11的卷积核,滑动步长为4个像素,输出为96个特征图并进行最大值池化;
(3)第二层使用5 * 5卷积核,卷积产生256个特征图,并进行最大池化;
(4)第三层,第四层均使用3 * 3卷积核,输出384个特征图;
(5)第五层使用3 * 3卷积层,输出256个特征图,并进行池化;
(6)第六层,第七层为全连接层,分别包含 4096 个隐层,也就是说,到全连接层时只剩4096个特征值;
(7)最终,第八层为 softmax 层,得到最终的分类结果。
(1)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的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
(6)使用数据增强技术包括图像转换,水平反射和补丁提取。
,随机地从256´256的原始图像中截取224´224大小的区域(以及水平翻转的镜像),相当于增加了(256-224)2´2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
(7) 使用 mini-batch SGD 训练模型,具有动量和重量衰减的特定值。
(8)每一层权重均初始化为0均值0.01标准差的高斯分布,在第二层、第四层和第五层卷积的偏置被设置为1.0,而其他层的则为0,目的是为了加速早期学习的速率(因为激活函数是ReLU,1.0的偏置可以让大部分输出为正)。
(9)学习速率初始值为0.01,在训练结束前共减小3次,每次减小都出现在错误率停止减少的时候,每次减小都是把学习速率除以10 。
(10)局部响应归一化。在使用饱和型的激活函数时,通常需要对输入进行归一化处理,以利用激活函数在0附近的线性特性与非线性特性,并避免饱和,但对于ReLU函数,不需要输入归一化。然而,Alex等人发现通过LRN这种归一化方式可以帮助提高网络的泛化性能。LRN的作用就是,对位置(x, y)处的像素计算其与几个相邻的kernel maps的像素值的和,并除以这个和来归一化。
3、VGGNet(Visual Geometry Group)
VGGNet 是牛津大学计算机视觉研究组(Visual Geometry Group)和Google DeepMind公司的研究员们一起研发的深度卷积神经网络。主要特点是 “简洁,深度”。 深, 是因为VGG有19层,远远超过了它的前辈; 而简洁,则是在于它的结构上,一律采用 stride 为1的 3×3 的 filter,以及 stride 为 2 的 2×2 的MaxPooling。
VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复的堆叠3×3的小型卷积核和2×2的最大池化层,构建了16~19层深度的卷积神经网络。整个网络结构简洁,
都使用同样大小的卷积核尺寸(3×3)和最大池化尺寸(2×2)
。VGGNet的扩展性很强,迁移到其他图片数据上的泛化性很好,因此,截止到目前为止,也常被用来抽取图像的特征。
VggNet 一共有六种不同的网络结构,但是每种结构都有5组卷积,每组内有 2~3 个卷积层,卷积都使用3x3的卷积核,同时每组尾部会连接一个2x2的最大池化层用来缩小图片尺寸。每组内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。卷积后面是三个全连接层
。在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛。
(1)要点
● 仅使用3x3尺寸的filter与AlexNet的第一层11x11 filter 和ZF Net的7x7 filter 完全不同。作者的推理是两个3x3 conv层的组合具有5x5的有效感受野。这又可以模拟更大的 filter,同时保持较小filter尺寸的优势。其中一个好处是减少了参数的数量。此外,使用两个转换层,我们可以使用两个ReLU层而不是一个。
● 3个背对背的conv层具有7x7的有效感受区域。
● 随着每层输入卷的空间大小减小(转换层和池层的结果),当您沿着网络向下时,由于filter数量的增加,卷的深度会增加。
● 有趣的是注意到每个maxpool层之后过滤器的数量翻倍。这加强了缩小空间尺寸的想法,但增加了深度。
● 在图像分类和本地化任务方面都做得很好。作者使用一种本地化形式作为回归。
● 使用Caffe工具箱构建模型。
● 在训练期间使用scale jittering比例抖动作为一种数据增强技术。
● 在每个转换层之后使用ReLU层并使用批量梯度下降进行训练。
● 在4个Nvidia Titan Black GPU上训练了两到三周。
● LRN层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。
(1)VGGNet 训练 技巧
先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快
。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。在训练中,VGGNet 还使用 Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果
。
(2)在训练的过程中,比AlexNet收敛的要快一些,原因为:
使用小卷积核和更深的网络进行的正则化;
在特定的层使用了预训练得到的数据进行参数的初始化。
4、GoogleNet
inception(也称GoogLeNet)是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。inception的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。
inception 跳出直线加深网络层数的思路,
通过增加“宽度”的方式增加网络复杂度
,避免陷入卷积核选择的陷阱,让程序自己学习如何选择卷积核。具体来说中,是在每一个卷积层,并行使用1 * 1卷积核,3 * 3 卷积核,5 * 5卷积核和池化,同时提取不同尺度的特征,然后通过1*1的卷积核对每一个分支进行降维后,最后将结果合并拼接在一起。直观地看起来,好像结构复杂了很多,本来只要一两个卷积就可以完成地计算,现在却要使用四五种不同地操作。但是仔细分析可以发现,这样地设计不仅减少了参数地数量,而且由于增加了网络地“宽度”,网络对多种尺度地适应性就更好了。
要点
1、在整个架构中使用了 9 个Inception模块,总共超过100层!
2、没有使用全连接层!使用全局平均 pooling,从7x7x1024 volume到1x1x1024 volume。这节省了大量参数
。
3、使用的参数比AlexNet少12倍。
4、在测试过程中,创建了相同图像的多个作物,并将其输入网络,并对softmax概率进行平均,以便为我们提供最终解决方案。
5、利用R-CNN的概念来检测它们的检测模型。
6、Inception模块有更新版本(版本6和7)。
7、接受“一周内几个高端GPU”的训练。
(1)1x1 卷积的作用
可以看到图中有多个黄色的1x1卷积模块,这样的卷积有什么用处呢?
作用1:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征
。这个观点来自于Network in Network(NIN, https://arxiv.org/pdf/1312.4400.pdf),图1里三个1x1卷积都起到了该作用。
左侧是是传统的卷积层结构(线性卷积),在一个尺度上只有一次卷积;右图是Network in Network结构(NIN结构),先进行一次普通的卷积(比如3x3),紧跟再进行一次1x1的卷积,对于某个像素点来说1x1卷积等效于该像素点在所有特征上进行一次全连接的计算,所以右侧图的1x1卷积画成了全连接层的形式,需要注意的是NIN结构中无论是第一个3x3卷积还是新增的1x1卷积,后面都紧跟着激活函数(比如relu)。将两个卷积串联,就能组合出更多的非线性特征。
作用2:使用1x1卷积进行降维,降低了计算复杂度
。图2中间3x3卷积和5x5卷积前的1x1卷积都起到了这个作用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。
(2)多个尺寸上进行卷积再聚合
图中可以看到对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起。这种全新的结构有什么好处呢?Szegedy从多个角度进行了解释:
解释1:在直观感觉上在多个尺度上同时进行卷积,能提取到不同尺度的特征
。特征更为丰富也意味着最后分类判断时更加准确。
解释2:利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度
。
5、ResNets
对于深度神经网络来说,VGGNets 证明了加深网络层次是提高精度的有效手段,但是由于梯度弥散的问题导致网络深度无法持续加深。梯度弥散问题是由于在反向传播过程中误差不断累积,导致在最初的几层梯度值几乎为0,从而无法收敛。经过测试,20层以上的深层网络,会随着层数的增加,收敛效果越来越差,50层的网络是20层的网络所得错误率的一倍。这一现象称为深度网络的退化问题。
ResNet就是为了解决这个问题而提出的,因而帮助我们训练更深的网络。 它引入了一个 residual block(残差块)
与普通的CNN相比,ResNet 最大的不同在于
ResNet 有很多的旁路直线将输入直接连到网络后面的层中,使得网络后面的层也可以直接学习残差
,这种网络结构成为 shortcut 或 skip connection。这样做解决了传统CNN在信息传递时,或多或少会丢失原始信息的问题,保护数据的完整性,整个网络只需要学习输入、输出差别的一部分,简化了学习的难度和目标。
从实际实验的结果来看,残差网络的效果是非常明显的。如论文里所说,类似VGGNet的结构在超过20个参数层以后,收敛效果会大打折扣,准确率比较差,但是简单地加入一些“捷径”(shortcut)连接边后,使其转变为残差结构,收敛效果都急剧提高,精度也随着训练次数地增加持续提高,并且不断加深网络深度还可以持续提高准确率,残差网络与VGG结构地对比如图所示: