CNN初探

“本文共6200余字,浅显易懂,预计阅读时间12分钟”

卷积神经网络(Convolutional Neural Network, CNN/ConvNets)是一种专门来处理具有类似网格结构数据的前馈神经网络(feed-forward neural networks),它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。事实上,目前CNN在图像识别的认知能力,已经超越了人类自身。本文将从以下四个方面对CNN进行阐述:

卷积神经网络解决什么问题

诞生——从神经科学获得灵感

原理——卷积池化和全连接层

总结

一 卷积神经网络解决什么问题

目前卷积神经网络主要应用于计算机视觉领域。如下图所示,为图像自动生成标签的任务,就可以通过卷积神经网络来实现。

对于人类来说,识别上面这张图片几乎是一个无意识的动作。然而这张图片在计算机看来,却是一个480(height) * 480(width) * 3(depth/RGB)的像素点阵组成的数字组合,每个数字的取值范围都在0~255之间。计算机如何通过这样的一个多维数组,将输入的图像进行分类并计算其概率,就是卷积神经网络主要解决的问题。

二 诞生——从神经科学获得灵感

1958年,David Hunter Hubel和Torsten Wiesel在The JohnHopkinsUniversity通过对小猫进行实验,观察猫的脑内神经元是如何响应投影在猫前方屏幕上的图像。实验表明,小猫脑内的每个单个神经元只对特定的图像特征有反应,比如有些神经元会被图像中横向的边缘所激活,另一些神经元则被纵向的或者对角方向的边缘所激活,而还有些神经元对亮光带和暗光带的反应模式也不相同。

这说明,单个神经元的作用域并不是整个图像,而只是图像的一个子集,这个子集就叫做感受野(Receptive Field)。相邻的神经元有着相似的,相互重叠的感受野,所有神经元有序的组织起来共同形成对图像的认知。整个实验的过程及结论被记录在了他们1959年发表的论文中,这篇论文奠定了此后二十年间他们对大脑皮层研究取得优秀成果的基础。

他们还在研究中发现,视觉系统的信息处理是分层的

图片来源:https://www.leiphone.com/news/201605/zZqsZiVpcBBPqcGG.html#rd

受感受野及视觉系统的分级信息处理的启发,第一个卷积神经网络——时延神经网络(Time Delay Neural Networks,TDNN)于1989年被Hinton等人提出,初衷是为了解决语音识别中传统方法隐马尔可夫模型(HiddenMarkov Model,HMM)无法适应语音信号中的动态时域变化的问题。该结构参数较少,进行语音识别不需要预先将音标与音频在时间线上进行对齐,实验证明TDNN相比HMM表现更好。

随后,LeCun于同年在识别手写邮政编码的系统中引入了卷积运算,并且通过反向传播的方法从图像中自动学习到了卷积核系数,使得整个训练过程完全自动化,实现了第一个真正意义上的卷积神经网络。

真正使卷积神经网络大放异彩,在计算机视觉领域应用的如火如荼的事件,还要源于2012年举办的年度计算机视觉领域“奥林匹克”比赛——ImageNet竞赛。Alex Krizhevsky使用卷积神经网络将图片分类的错误率从26%降低至了15%,这绝对是一个惊人的进步。从那时起,众多的大佬级公司开始重视并应用卷积神经网络于他们的产品中。

图片来源:http://suo.im/5havK4

三 原理——卷积池化和全连接层

如果你看懂了上面介绍的卷积神经网络的起源,那么恭喜你,对于卷积神经网络的学习你已经成功一半了,因为卷积神经网络究其根源就是对视觉系统的模拟。源于模拟而最终超越,人类就是这么可怕。

下面我们开始具体讲解卷积神经网络的原理。在讲解神经网络之前,先简要回顾一下神经网络的基本概念。

a 神经网络基础

神经网络是一种运算模型,由大量的神经元相互联接构成。每个节点(参见下图a)代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重。典型的神经网络连接——全连接——如下图b所示:

https://towardsdatascience.com/exploring-activation- functions-for-neural-networks-73498da59b02)

那么,读者可以简单估算,针对MNIST数据集(一个流行的手写数字数据库,其中共包含了60000个训练样本和10000个测试样本,每个样本是一个28 * 28像素的灰度图像。)进行分类的全连接神经网络模型,仅从输入层到隐藏层一共有多少参数(权重+偏置)需要被训练?

假设该模型只含有唯一的隐藏层并且隐藏层中的神经元数量为32,输入层到隐藏层参数个数:

28 * 28 * 32 + 32= 25,120

假设该模型只含有唯一的隐藏层并且隐藏层中的神经元数量为2048,输入层到隐藏层参数个数:

28 * 28 * 2048 + 2048 = 1,607,680

实践表明,当隐藏层神经元数量为32时,分类正确率大概为87%,而神经元数量增加至2048时,分类正确率为95%,但明显地,需要计算的参数个数也由~25000暴增至1.6M。随着参数个数的爆炸式增长,与之相伴的是神经网络的训练代价陡增

我们通过一个CNN实例看看卷积神经网络是如何解决这一问题的。

b CNN实例

卷积神经网络是一种深度神经网络,那必然就有多层处理结构。CNN一般分为卷积层池化层以及全连接层。卷积层负责特征的提取,池化层负责将数据简化,全连接层负责判断决策。卷积层,池化层数量一般不会限制,而是按需设计。

本文将通过下面这个例子来整体介绍卷积神经网络

跟此例有关的一部分图片截取自https://www.jianshu.com/p/fe428f0b32c1,此后不再单独声明。

上图展示的是一个9 * 9 像素的图片转化出来的二维数组,构成X字母的像素点位置用1表示,其余像素点的位置用-1填充。我们的任务是如何识别出图片上的字母——X。

b1 卷积(Convolution)层

卷积的基本概念

卷积是通过两个函数 f 和 w 生成第三个函数 s 的一种数学算子。

假设我们有一个函数 f(t) 用来表示在时刻t发生的某一新闻对股价的影响,且时刻t的股价不仅被该新闻所影响,还被之前每天发生的相关新闻所影响。显然,距离t时刻越近的新闻与股价越相关,所以我们使用加权函数 w(t-a) 对新闻赋予不同的权重,其中 a 表示发生该新闻的时间点,t-a 表示该新闻发生时刻 a 与当前的时刻 t 的时间间隔。

对于时刻 t,基于新闻的股价预测函数就可以如下定义:

即时刻t的股价预测结果是 t 时刻及之前所有新闻对股价的影响加权求和的结果。

将上例子中的 f 和 w 一般化,求s这种运算就叫做卷积。卷积运算通常用星号表示,这样我们就得到了离散形式的卷积公式

当 f 和 w 均为R上的可积函数时,我们可以得到卷积公式的积分形式

读者朋友们也不用一看到数学公式就头疼,事实上,在CNN中使用的卷积运算是一种相当简单的运算,容易理解。在卷积神经网络的术语中,第一个参数函数f叫做输入(input),第二个参数函数 w 叫做核函数(kernel function)。下面,接着上CNN实例给大家展开卷积层的实际计算是如何进行的。

实例的卷积层计算

假定卷积公式中的输入指的是整个二维数组,在第一次卷积运算时,我们采用如下的权重矩阵,即一个9 * 9 的二维数组,其中每一个数值代表了输入中相应像素点的权重。

左上角的9个元素中,主对角线上的权重均为1,剩余权重均为-1,表示我们希望提取的特征是向右下方向倾斜的直线。

为什么除了左上角的9个元素之外,其余的权重均为0呢?还记得我们在介绍卷积神经网络的诞生时提到过的感受野吗?每一个神经元所感受到的刺激都只是来自于输入的一个子集,而不是整个图像。所以我们在进行卷积计算的时候,每一次计算也都是仅作用于输入的一个子集中,而离该子集(感受野)较远的其它输入元素均没有权重。

现在我们使用输入和权重矩阵进行第一次卷积运算,也就是输入中的每一个元素的值乘以权重矩阵中对应位置的权重,将所有得到的乘积相加,就得到了运算结果:

接下来,将感受野稍微向右平移一个单元,使用如下权重矩阵对输入进行第二次卷积运算。

可得到运算结果:

注意,此时即使使用权重矩阵做卷积运算,在实现上其实仍然是全连接网络,因为每个输入神经元都参与了运算,即使它的权重为0。但是每次卷积计算都使用了几乎相同的权重矩阵,唯一不同的是根据感受野的位置不同而非零权重矩阵位置的改变。因此,我们将卷积核(kernal, 也可称为filter)定义为权重矩阵中共同的非零矩阵,即如下3 * 3 的二维数组:

将卷积核以步长(stride,每次平移的单位)为1滑动于整个输入,便可得到一个新的矩阵,这个矩阵我们称之为特征映射或者特征图谱(feature map)。

从特征图谱中我们可以清晰的看到,感受野与卷积核所表示的特征越匹配时,得到的运算结果越高,反之越低。即通过卷积运算,我们可以轻松将输入中的特征提取出来。

同样地,我们使用其它卷积核作用于输入,便可得到不同的特征图谱。将n个不同的卷积核作用于输入,得到n个特征图谱的过程,就是卷积层所做的事情--特征提取

注意,前面提到LeCun的贡献在于在CNN中,这种卷积核不再需要人工提供而可以自动学习出来,因此,特征工程这种复杂工程在图像识别里变得不再重要。

卷积核是由权重矩阵演化而来,所以可以认为卷积层其实是全连接层的一种特例。但是这种特例又简化了全连接层需要的参数,接下来将详细介绍卷积层解决参数爆炸问题的原理。

卷积层解决参数爆炸问题

连接稀疏和权值共享。

什么是连接稀疏?什么是权值共享?我们直接看下面的对比图:

在典型的全连接神经网络中,全连接层的每个神经元都会受到输入层中所有神经元的影响,且权值各不相同。而卷积层中的神经元只受到感受野范围内输入层神经元的影响,且权值固定。

注意,卷积层中的不同神经元并不是代表不同的卷积核,而是作用于不同感受野的相同卷积核。直观上就能看出来卷积层需要训练的参数少了很多。

还记得我们开头针对MNIST数据集训练全连接神经网络时,从输入层到隐藏层有多少参数需要被训练吗?当隐藏层神经元个数为2048时,需要训练的参数个数为~1.6M。那么卷积神经网络中的卷积层需要训练的参数个数是多少呢?假定卷积核的大小是5 *5。只有一个卷积核的卷积层神经元数为

通过一个动图来看一下神经元的数量是如何计算出来的:

但是由于权值共享的特点,这576个神经元共享5 * 5个权重,也就是说,不管神经元的个数有多少,参数只有25个。我们之前一直没有提过偏置,好消息是,偏置也是共享的,即单个卷积核的参数个数为26个。一个卷积核代表了一种类型特征的提取,假如在卷积层中加入另外99种特征,也就是还需要99个卷积核,需要训练的参数个数也仅为2600个,大大降低了训练代价。

只一个卷积层么?

还记得之前提到的视觉神经系统是分级的结论吗?大脑皮层V1区的视觉神经元只能提取出一些零散的边缘特征,V2区的神经元在V1区神经元的输出的基础上得到了一些基本形状信息,V4区的神经元又在V2区神经元的输出的基础上得到了更高级别的形态信息。如此一层层的直至得到图像的整体信息。

卷积神经网络也是同样,第一层卷积层由于感受野较小,往往以得到一些基本边缘信息为主要目的,比如横向边缘,纵向边缘,较短小的圆弧等。而第二层卷积层基于第一层卷积层的输出,便可以得到这些边缘信息的组合情况,比如是否匹配长方形,是否有半圆形状等,以此类推,卷积层越多,最终会得到越复杂的特征信息。

如上图,第一层卷积层的感受野为3,每个神经元只受到输入层中相邻3个神经元的影响。第二层卷积层相对于第一层卷积层的感受野也为3,但对于原始图像来说,它的感受野增加至了5,这就是为什么越深层的卷积网络越能得到更整体的图像信息。

加入对卷积结果的激活函数

由于在卷积层中的计算都是线性的,所以为了解决非线性问题,一般在每个卷积层后都会跟着一个激活层(activation layer),用来增加系统的非线性特性。在这一层,我们可以选用tanh或者sigmoid函数,但是科学家们发现ReLU(Rectified Linear Units,线性整流单元)函数在不影响准确度的同时可以加快训练的速度,同时还可以缓解深度神经网络的噩梦--梯度消失问题(vanishing gradient problem)。

通俗的说,它会将输入中的负值转换为0,正值保持不变。下面是将CNN实例中ReLU层应用于之前我们得到的特征图谱之后的结果。

虽然定义是至少包含一层卷积层的神经网络叫做卷积神经网络,但是卷积神经网络往往不只包含卷积层。下面将接着介绍几种典型的在卷积神经网络中被普遍使用的层。

b2 池化层

池化层,解决过拟合和图像变形问题

池化层(pooling layer,也称为下采样层subsampling layer)中的池化函数(pooling function)使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。池化函数包括最大池化(max pooling)函数、平均池化(mean pooling)函数、L2-norm池化函数等。用最常见的最大池化函数来举例,它就是对池化层的输入中的一块固定大小的区域(池化区域)取最大值来代表这块区域。

实例中的池化层计算

我们定义池化区域的大小为2 * 2,并且步长为2,那么对之前ReLU层的输出做池化,就会得到下面的结果:

可以看出,通过池化函数的引入能够在保留显著特征的基础上减少了需要训练的参数,从而达到加快训练速度并且防止过拟合的效果。另外,池化函数也能够使整个系统更好的适应输入的平移缩放等变形问题,当我们关心某个特征是否出现而不关心它出现的具体位置时,池化层显得尤为重要。

仔细看上面池化层的输入的话,会发现在每个矩阵的最右边新增了一列,最下边新增了一行,元素均为0,这个操作叫做padding。因为通常池化区域的大小为2 * 2,并且池化区域通常相互之间不覆盖,所以步长也为2,通过padding的方式可以保证图像的边缘区域也可以被池化操作覆盖。

需要注意的是,padding操作也常用于卷积操作前,因为与位于图像中心的像素点不同的是,图像边缘的像素点只能被卷积核计算一次,导致在深度神经网络中边缘的信息很容易丢失,所以可以采用对卷积层的输入做padding的方式来保留边缘特征。

继续按照上述方式计算其他特征的池化:

b3 全连接层

实例计算

在卷积神经网络的最后往往有一个或多个全连接层(fully connected layer),目的就是为了根据提取出的特征进行最终的分类。假设我们只需要辨别图像上的字母是X还是O,即二分类问题,那么明显我们最后是需要得到一个2 * 1维的向量,这个向量中的两个值分别对应于X和O的得分。即:

首先,需要将之前得到的三张特征图谱进行扁平化处理,即将4 * 4 * 3的矩阵展开成一个48* 1维的向量

这时,我们可以将48* 1维的向量看作是人工神经网络的输入层,每一个元素就是输入层的一个神经元。然后定义一个权重矩阵,通过全连接层对输入进行加权求和,便可得到最终的每个分类的得分情况(此处为了简化计算过程,省略偏置)。全连接层与传统人工神经网络的原理相同,此处不再赘述。

经过已经训练完成的全连接层,可以得到分类X的得分为128,分类O的得分为92。

但是,上述的问题是一个针对二分类的全连接层的打分,对于多分类的问题,我们一般预测分到某一类的概率,这种方式该如何实现呢?

用Softmax 激活函数预测多分类的概率

提到预测概率时,我们可能首先会想到的是逻辑回归模型,在逻辑回归模型(

预测概率的逻辑回归算法

)中我们介绍过Sigmoid函数,它可以将输入转为值域为 (0,1) 的一组概率值。但是Sigmoid函数的局限性在于它只能被用来作二分类。对于多分类问题,较常使用的是基于逻辑回归的多分类扩展,Softmax函数。

假设z = aw + b,那么Softmax函数的定义可以写作:

其中为Softmax的输入,C为类别的数量。将Softmax函数代入上一步中我们求得的每个分类的得分中,即:

即图像中的字母有99%的可能性为X,1%的可能性为O:

我们预测输出结果是X。

四 总结

至此,一次基于结构最简单的卷积神经网络的的图像分类过程就结束了。让我们回顾一下整个过程:

其中,只有卷积层和全连接层包含了训练参数,而如我们之前所说,卷积层是全连接层的一种特殊情况,所以实际上卷积神经网络的训练过程(后向传播过程)与传统神经网络是基本一致的,我们这里由于篇幅的原因也不再赘述。

卷积神经网络的优势在于:

大大降低了训练参数的数量,从而提高了运行效率并且也不容易发生过拟合现象

对图像的平移、缩放等提高了容忍度,提升了预测的准确度和系统的健壮性

由于这些优势的存在,使得卷积神经网络在图像处理领域中被广泛使用。下图就是一个经典的卷积神经网络架构——LeNet-5,它是1998年由LeCun提出的用来识别支票上手写数字的7层卷积神经网络:

卷积神经网络中仍然有很多细节我们这篇文章没有涉及到,比如

降低过拟合的Dropout层

ReLU函数为何能缓解梯度消失问题?

1 * 1大小的卷积核有什么用处?

Softmax的损失函数

由于篇幅限制,我们将在之后的公众号文章中为大家讲解。

参考资料:

[1] 卷积神经网络-维基百科 : https://en.wikipedia.org/wiki/Convolutional_neural_network

[2] 时延神经网络(TDNN)原理及其TensorFlow实现 : https://www.sohu.com/a/141935381_723464

[3] A Beginner's Guide ToUnderstanding Convolutional Neural Networks : https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks/

[4] How toclassify MNIST digits with different neural network architectures : https://medium.freecodecamp.org/how-to-classify-mnist-digits-with-different-neural-network-architectures-39c75a0f03e3

[5] 卷积-维基百科:https://en.wikipedia.org/wiki/Convolution

[6] How doesrectilinear activation function solve the vanishing gradient problem in neuralnetworks? :https://stats.stackexchange.com/questions/176794/how-does-rectilinear-activation-function-solve-the-vanishing-gradient-problem-in

[7] 《深度学习》人民邮电出版社. [美] 伊恩·古德费洛 [加] 约书亚·本吉奥 [加] 亚伦·库维尔

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181105G1K5UQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券