【深度学习初探】Day01 - 卷积神经网络(CNN)的基础概念
一、卷积神经网络的研究背景
机器学习大背景下,主要有三大热点方向:计算机视觉(Computer Vision)、自然语言处理(Natural Language Process,NLP)、语音识别(Speech Recognition)。
而计算机视觉主要包括:图像分类(Image Classification)、目标检测(Object Detection)、风格迁移(Neural Style Transfer)、语义分割(Semantic Segmentation)等。
在计算机视觉领域,这些操作都需要处理大量的图像数据,一张大分辨率图像(RGB,三通道)可能包含非常多的数据(十万至百万级),如果直接作为神经网络输入层,将导致输入层单元非常多,计算量非常大,训练一个有这么多参数的神经网络,对计算量和内存的需求相当大,即使成功了,我们难以获得足够的数据避免神经网络过拟合。
因此为了能在计算机视觉技术中使用任意大小的图像,我们引入了基于卷积运算的卷积神经网络(Convelutional Neural Network)。
1.1 卷积网络减少参数的途径
假设一张图片包含1000 × 1000 × 3(RGB,三通道)数据量,把这些数据输入给输入层,如果隐藏层单元有1000个,那么输入层和第二层之间的权重向量大小为3,000,000 × 1000(全连接网络),这显然是巨大的数据量。
而CNN中并不是直接输入整个图像,参数只有卷积核中的参数加上偏置(Bias)这一参数,参数数量大大减少。使用图像的空间安排从图像中提取特征,同时保持图像本身的空间安排不被改变,我们可以采用输入图像,定义权重矩阵,再输入被卷积以从图像中提取特殊特征而无需损失图像本身空间安排的有关信息。综合下来就大大减少了图像的参数数量。
1.2 何为“神经网络”
神经网络,在这里指的是人工神经网络(Artificial Neural Networks,简称ANNs),是一种模仿生物神经网络行为特征的算法数学模型,由神经元、节点与结点间的连接(突触)所构成。下图是一个生物神经网络的构成:
将这个神经网络单元抽象成一个数学模型,我们也叫它感知器,它接收多个输入(x1, x2, x3 …),产生一个输出,好比神经末梢感受外部环境的刺激,产生电信号,传导至神经元。
单个感知器就是一个简单模型,但并不符合现实世界的实际决策模型,现实生活往往是由多个感知器构成,且有多层的神经网络,下图是一个经典的神经网络模型,由输入层、隐含层、输出层组成。
人工神经网络用于映射任意复杂非线性关系,鲁棒性(Robust)、记忆能力、自学习能力极强,可以用于分类、预测、模式识别等领域。
1.3 何为“卷积神经网络”
卷积神经网络(Convolutional Neural Networks-简称CNN)是近年来发展起来的一种高效识别方法,它听起来像是一个奇怪的生物学和数学的结合,但它成为了计算机视觉领域最有影响力的创新之一。
一般的,CNN基本结构包括两层,第一层为特征提取层,每个神经元的输入与前一层的局部接受域相连,提取该局部的特征,一旦局部特征被提取,它与其他特征间的位置关系也随之确定下来;第二层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。
此外,由于一个映射面上的神经元共享权值,这减少了网络自由参数的个数,而且卷积神经网络中每一个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减小了特征分辨率。
二、使用卷积神经网络做图像识别
2.1 提取特征
假设给定一张图片,这张图片既可能是像素字母X或者字母O,如何通过CNN网络识别出它是X还是O呢?
如果使用经典神经网络模型,那就需要用全连接的方式,把整幅图作为神经网络模型的输入,图像尺寸越大,其连接的参数就变得越多,计算量会非常大。其实每个神经元没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息,这就是卷积神经网络降低参数数目的一个重要手段——局部感受野。
我们知道,字母X和字母O都有其显著特点,但生活中的这两个字符不可能都是上图那种标准的正像素画,还可能有平移、缩放、旋转、微变形等,如下图所示:
我们的目标是将各种形态变化的X和O都能用CNN准确识别出来,这就涉及到如何有效提取特征作为识别的关键因子。对于CNN来说,由于“局部感受野”策略,它会一小块一小块来比对,在两幅图像中大致相同的位置找到一些粗糙的特征(小块图像)进行匹配,如下图所示:
对于上图的字母X(正X),我们可以提取出三块明显特征,用像素画表达就是这三种:
假设用像素值"1"表示白色,用像素值“-1”表达黑色,可以得出字母X的三个重要特征矩阵:
至此,我们完成了图像识别的第一步,提取特征。然后,CNN就使用这些特征,与图像进行匹配计算。
2.2 卷积(Convolution)
当给定一张新图时,CNN并不能准确知道这些特征要匹配原图的哪些部分,所以它会在原图中把每一个可能的位置都进行尝试。这个时候,我们把这个提取的特征(Feature)称为一个过滤器(Filter)。用这个过滤器,对齐图片的左上角,从左上角开始,一点一点地比对,这个过程就叫卷积。卷积的过程可以用以下几张图片来直观演示。
因为上图过滤器是 3 × 3 的,然后原图是 6 × 6 的,所以一排要比对4次,然后比对4排,所以这个卷积得到的矩阵应该是一个 4 × 4 矩阵。
每次卷积具体的计算方法就是,把相应位置的数值相乘再相加,得到的结果作为新矩阵的元素。然后继续平移就可以了。
最终得到完整的 4 × 4 矩阵。
那么对于我们这个X图像,利用特征值比对,我们可以发现。如果特征值和原图的两个像素点都是白色,那么11=1,如果均为黑色,那么(-1)(-1)=1,也就是说,每一对能匹配上的像素,相乘结果为1,相反,任何不匹配的像素,相乘结果为-1。
经过特征比对计算,我们得到了一个全1矩阵:
然后,我们计算出图像这块比对的特征值:(1+1+1+1+1+1+1+1+1)/ 9 = 1,这个1是写在这个 3 × 3 矩阵的中央那格的,如图所示:
至此,我们实际上才比对出图像的一个像素点。对于其他位置,我们也用一样的方法,计算出每一个像素点的值,得到一个新的二维数组。再使用另外两种过滤器进行比对,最后得到了三个二维数组。
这个新的二维数组,我们也有专业术语,称为feature map。其中的值,越接近1,表示对应位置和feature的匹配越完整,越接近-1,表示对应位置和feature的反面匹配越完整,而值接近0的表示对应位置没有任何匹配,或者说没有什么关联。
当图像尺寸增大时,这一卷积的过程计算量也会显著增加,filter的大小和数目一定也会增长,最后计算量还是会变得相当庞大。为了再次减少计算量,我们需要引入另一个有效工具——池化。
2.3 池化(Pooling)
”池化“就是将输入图像缩小,减少像素信息,只保留重要信息。
池化操作很简单,通常情况下,池化区域是 2 × 2 大小,然后按照一定规则转换成相应的值。常见规则有:取这个池化区域内的最大值(max-pooling)作为结果像素值、取池化区域内的平均值(mean-pooling)作为结果的像素值等。下图显示了左上角池化区域的max-pooling结果:
然后平移取第二块(这次不需要像卷积那样有交叉了):
依次进行,最后经过池化的结果如下:
对三个feature map做同样操作,得到三个最大池化结果二维数组:
至此,池化完毕,此时相当于保留了每一块内的最佳匹配结果(最大值最接近1,匹配最好),不具体关注窗口内哪一块匹配,而是确信某个地方匹配上了。
加入了池化层,图像缩小了很多,很大程度上减少了计算量,降低机器负载。
2.4 激活函数ReLU(Rectified Linear Units)
常用的激活函数有sigmoid、tanh、relu等,前两者比较常见于全连接层,而ReLU常见于卷积层。
前面讲到感知机(神经细胞),感知机在接收到各个输入后,进行求和,再经过激活函数后输出。激活函数的作用是用来加入非线性因素,把卷积层输出结果做非线性映射。
在卷积神经网络中,激活函数一般使用ReLU(The Rectified Linear Unit,修正线性单元),它的特点是收敛快,求梯度简单。计算公式也简单,max(0,T),即对于输入的负值,输出全为0,对于正值,则原样输出。
对于刚才卷积层得到的结果,通过ReLU函数计算,如下图:
第一个值为0.77,是正值,则原样输出,取0.77。
第二个值为-0.11,为负值,则结果为0输出。
以此类推,对所有feature map执行ReLU激活函数后得到的二维数组:
通常,我们在卷积完毕后就使用ReLU函数激活,然后再进行池化。
2.5 深度神经网络
将上述的卷积、激活函数、池化组合在一起,然后反复增加更多的层,就变成了深度神经网络,如下两图所示:
一张图片往往经过好几层的深度神经网络的处理,最后得到一个新的feature map,送入全连接层进行图像分类。
2.6 全连接层(Fully Connected Layers)
全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。
首先将经过卷积、激活函数、池化的深度网络后的结果串在一起,如下图:
神经网络是监督学习,在模型训练时,根据训练样本对模型进行训练,从而得到全连接层的权重(比如:预测字母X的所有连接的权重),也就是说,通过不断训练得到加权求和的值,得出什么值偏向于是字母X,什么值是偏向于O。全连接层经训练可以得知,出现哪些值就可以判定是字母X或O了。
对刚才模型训练得出来的权重,以及经过前面的卷积、激活函数、池化等深度网络计算出来的结果进行加权求和,得到各个结果的预测值,取值最大的作为识别的结果。如下图,最后计算出来字母X的识别值是0.92,字母O的识别值是0.51,那么结果就判定为X。
全连接层也可以有多个,多次进行,如下图:
三、卷积神经网络(Convolutional Neural Networks)
在第二部分中,我们将一张图片经过特征提取、卷积、激活函数、池化、全连接层进行了图像识别,其实,这整套流程下来,就是一个“卷积神经网络”(CNN)。整个CNN的流程可以用下图表示:
事实上,卷积网络本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确表达式,只需要对已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。
CNN有一个头重脚轻的特点(越靠近输入权值越小,越靠近输出权值越多),呈现倒三角形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。
卷积神经网络CNN主要用来识别位移、缩放以及其他形式扭曲不变性的二维图像。在CNN的特征检测层对训练数据进行学习,避免了显式的特征抽取,而隐式地从训练数据中学习。由于同一特征映射面上的权值相同,所以网络可以并行学习。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。
四、几种常见的卷积神经网络
4.1 LeNet
LeNet诞生于1994年,由深度学习三巨头之一的Yan LeCun提出,他也被称为卷积神经网络之父。LeNet主要用于手写字符的识别与分类,准确率高达98%。网络结构如下:
网络特点:
- 每个卷积层包括三部分:卷积、池化和非线性激活函数(sigmoid激活函数)。
- 使用卷积提取空间特征。
- 降采样层采用平均池化。
- 输出层采用欧式径向基函数(Euclidean Radial Basis Function)单元。
- 一共6层,3个卷积层,2个下采样层,1个全连接层
4.2 AlexNet
AlexNet有Hinton的学生Alex Krizhevsky于2012年提出,可以算作LeNet的一种更深更宽的版本,证明了卷积神经网络在复杂模型下的有效性。其网络结构如下图:
8层网络结构(不计激活、池化、LRN和dropout层),有5个卷积层和3个全连接层。第一卷积层使用大的卷积核,大小为1111,步长为4;第二卷积层使用55的卷积核大小,步长为1;剩余卷积层都是33的大小,步长为1。激活函数使用R二LU。池化层使用重叠的最大池化,大小为33,步长为2。在全连接层增加了dropout,第一次将其实用化。
网络特点:
- 使用两块GPU并行加速训练,大大降低训练时间。
- 成功使用了ReLU作为激活函数,解决了网络较深时的梯度弥散问题。
- 使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力。
4.3 VGGNet
VGGNet是牛津大学计算机视觉组和Google DeepMind公司一起研发的深度卷积神经网络,该网络的泛化性能很好,容易迁移到其他的图像识别项目上,可以下载VGGNet训练好的参数进行很好的初始化权重操作,很多卷积神经网络都是以该网络为基础,比如FCN,UNet,SegNet等。VGG版本很多,常用的是VGG16,VGG19网络。
下图是VGG16的网络结构,共16层(不包括池化和softmax层),所有的卷积核都使用33的大小,池化都使用22的大小,步长为2的最大池化,卷积层深度依次为64 -> 128 -> 256 -> 512 -> 512。
网络特点:
- 深。把网络层数加到了16—19层,还不包括池化和softmax层。
- 将卷积层提升到卷积块的概念。卷积块由2~3个卷积层构成,使得网络有更大感受野的同时能降低网络参数,同时多次使用R二LU激活函数有更多的线性变换,学习能力更强。
- 在训练时和预测时使用Multi-Scale做数据增强。训练时将同一张图片缩放到不同的尺寸,再随机裁剪到224*224的大小,能够增加数据量。预测时将同一张图片缩放到不同尺寸做预测,最后取平均值。
4.4 ResNet
ResNet(残差神经网络)由微软研究院的何凯明等4名华人于2015年提出,成功训练了152层超级深的卷积神经网络,效果非常突出,而且容易结合到其他网络结构中。
下图为残差神经网络的基本模块(专业术语叫残差学习单元),输入为x,输出为F(x)+ x,F(x)代表网络中数据的一系列乘、加操作,假设神经网络最优的拟合结果输出为H(x)= F(x)+ x,那么神经网络最优的F(x)即为H(x)与 x 的残差,通过拟合残差来提升网络效果。
为什么转变为拟合残差就比传统卷积网络要好呢?因为训练时可以保证残差为0,保证增加残差学习单元不会降低网络性能,假设一个浅层网络达到了饱和的准确率,后面再加上这个残差学习单元,起码误差不会增加。
通过不断堆叠这个基本模块,就可以得到最终的ResNet模型,理论上可以无限堆叠而不改变网络的性能。下图是一个34层的ResNet网络。
网络特点:
- 使得训练超级深的神经网络成为了可能,避免了不断加深神经网络,准确率达到饱和的现象。
- 输入可以直接连接到输出,使得整个网络只需要学习残差,简化学习目标和难度。
- ResNet是一个推广性非常好的网络结构,容易和其他网络结合。