全文共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年发表的论文中,这篇论文奠定了此后二十年间他们对大脑皮层研究取得优秀成果的基础。

他们还在研究中发现,视觉系统的信息处理是分层的。图片来源:真的,关于深度学习与计算机视觉,看这一篇就够了 | 雷锋网公开课

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

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

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

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

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

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

a) 神经网络基础

什么是神经网络? 具体对神经网络及我们后面要提到的后向传播算法(Backpropagation)的讲解请查看本专栏发布的科普文章:

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

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

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

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

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

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

b) CNN实例

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

本文将通过下面这个例子来整体介绍卷积神经网络:跟此例有关的一部分图片截取自《[透析] 卷积神经网络CNN究竟是怎样一步一步工作的?》,此后不再单独声明。

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

b1) 卷积(Convolution)层

卷积的基本概念

卷积是通过两个函数

生成第三个函数

的一种数学算子。

假设我们有一个函数

用来表示在时刻

发生的某一新闻对股价的影响,且时刻

的股价不仅被该新闻所影响,还被之前每天发生的相关新闻所影响。显然,距离t时刻越近的新闻与股价越相关,所以我们使用加权函数

对新闻赋予不同的权重,其中

表示发生该新闻的时间点,

表示该新闻发生时刻

与当前的时刻

的时间间隔。

对于时刻

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

即时刻

的股价预测结果是

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

将上例子中的

一般化,求

这种运算就叫做卷积。卷积运算通常用星号表示,这样我们就得到了离散形式的卷积公式

均为

上的可积函数时,我们可以得到卷积公式的积分形式

读者朋友们也不用一看到数学公式就头疼,事实上,在CNN中使用的卷积运算是一种相当简单的运算,容易理解。在卷积神经网络的术语中,第一个参数函数

叫做输入(input),第二个参数函数

叫做核函数(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函数。

假设

,那么Softmax函数的定义可以写作:

其中

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

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

我们预测输出结果是X。

四、总结

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

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

卷积神经网络的优势在于:大大降低了训练参数的数量,从而提高了运行效率并且也不容易发生过拟合现象

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

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

卷积神经网络中仍然有很多细节我们这篇文章没有涉及到,比如降低过拟合的Dropout层

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

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

Softmax的损失函数

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

参考资料

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

好文推荐:

CNN初探就为大家介绍到这里了,欢迎大家留言给我们提建议,并关注我们的公众号。

微信文章链接:CNN初探​mp.weixin.qq.com

cnn起源_CNN初探相关推荐

  1. cnn起源_CNN双语新闻(翻译+字幕+讲解):夏令时的起源及争议

    -ZlF)JLSr;pD|qckzqXwYHDW.pfC63cvz, 正文文本Dd6!b_BKE^u)fF6z38. It was in 1918 during the First World War ...

  2. python cnn模型_CNN系列模型发展简述(附github代码——已全部跑通)

    目录: 1 LeNet 2 AlexNet 3 VGG 4 GoogLeNet 5 ResNet 6 DenseNet 7 Non-Local Networks 8 Deformable Convol ...

  3. python cnn 股市_CNN预测股票走势基于Tensorflow(思路+程序)

    源代码,请在文末查询 前言 我们希望找出跟随价格上涨的模式.通过每日收盘价,MA,KD,RSI,yearAvgPrice 本次推文研究只是展示深入学习的一个例子. 结果估计不是很好.希望抛砖引玉,给大 ...

  4. cnn程序流程图_CNN 训练流程

    CNN 训练流程 1 .图像预处理 ( 1 ) 尺度调整:将不同大小的训练样本集图像尺寸调整为 48*48 ( 2 ) 对比度变换:将图像对比度归一化的三种方法 A. 将三个彩色空间的像素围绕平均像素 ...

  5. 「技术综述」有三AI不得不看的技术综述

    https://www.toutiao.com/i6715153780863664653/ 文/编辑 | 言有三 最近遇到了很多新手来交流,网上资料甚多,筛选有时候是个大问题,一般遇到一个新方向,找技 ...

  6. 【总结】超1000页有三AI文档资源领取方法汇总!

    这几年我们平台输出了很多内容,有免费的也有付费的,有图文也有视频,本次对我们所有文档类资源领取方法做一个汇总. 由于公众号分享资源经常会面临失效的问题,因此我们将所有文档资源放置在了有三AI知识星球中 ...

  7. 【完结】AutoML如何应用于模型优化,这些文章可以作为一个参考

    文/编辑 | 言有三 自动化机器学习技术是非常重要的基础研究,也是如今深度学习模型优化中的热点方向,我们开辟了一个专栏,专门讲解AutoML在深度学习模型优化中的一些重要思路,本次来给大家进行总结. ...

  8. 【杂谈】有三AI知识星球指导手册出炉!和公众号相比又有哪些内容?

    让大家久等了,由于我们知识星球内容太多,一直没有整理出完整的阅读手册,这次我们发布有三AI知识星球的指导手册V1.0版本,来介绍我们知识星球的使用方法,下面是手册的主要内容,文末提供手册下载方法. 1 ...

  9. 【杂谈】有三AI不得不看的技术综述(超过100篇核心干货)

    文/编辑 | 言有三 有三AI很少写零散的报导,因为我们的文章通常都是提炼与总结,一般遇到一个新方向,找技术综述读一读是最合适的开始,大家也可以拓展一下自己的知识边界,今天总结一下有三AI迄今为止发过 ...

最新文章

  1. 策略模式 极其简单的列子
  2. linux管道的执行顺序
  3. MPB:西农焦硕组-​土壤微生物响应环境变化的系统发育保守性和环境阈值
  4. BZOJ 1084: [SCOI2005]最大子矩阵【DP】
  5. ae绘图未指定错误怎么办_早晨深化设计研究院47个快捷键50个CAD技巧助你神速绘图,玩转CAD...
  6. OpenShift 4之访问权限分级授权
  7. Sphinx index.rst
  8. 白盒测试之基本路径测试法
  9. 软件需求分析学习笔记
  10. 嵌入式 CIF/4CIF/QCIF/D1分辨率
  11. 多层json字符串转map_java json字符串转map集合递归嵌套
  12. MeshLab源码阅读笔记
  13. VulnHub 靶场--October
  14. kubernetes pod NodeLost 分析
  15. 牛客网刷题:Q3禁忌雷炎(一般)
  16. 微信企业号回调 java_微信公众平台企业号回调模式的URL验证——Java
  17. 全球都在研发的虚拟气候设备,是治愈“失眠”的最优解吗?
  18. 时间复杂度空间复杂度分析
  19. VehicleDynamicsAndCoontrol(四) -LONGITUDINAL VEHICLE DYNAMICS
  20. 解决电脑扩展屏幕模糊的小技巧

热门文章

  1. [js点击]JavaScript之Ajax技术之02
  2. atom php 方法跳转,推荐几个Atom插件,其中有让代码跳转到声明处的
  3. 四大“化学融合”、两大核心平台能力,华为首次系统解读OneStorage
  4. Mac如何利用qq提取图片上的文字
  5. android-支持多种屏幕[声明适用于 Android 3.2 的平板电脑布局] 七
  6. 安装集成开发工具包XAMPP
  7. PFC相关知识点汇总梳理
  8. 关羽闯关的c语言编程,腾讯中国象棋残局264关怎么过 三国演义264关关羽降汉攻略...
  9. GMAT750分冲刺-Quantitative
  10. 聊聊我的同事Tong