该文是对卷积神经网络的介绍,并假设你理解前馈神经网络。
如果不是,强烈建议读完《
推荐文章链接:
https://www.zhihu.com/
下面进入正题,开始我们的卷积神经网络之旅——
视觉感知
画面识别是什么
识别结果取决于什么
图像表达
画面识别的输入
画面不变形
前馈神经网络做画面识别的不足
卷积神经网络做画面识别
局部连接
空间共享
输出空间表达
Depth维的处理
Zero padding
形状、概念抓取
多filters
非线性
输出尺寸控制
矩阵乘法执行卷积
Max pooling
全连接层
结构发展
画面不变性的满足
平移不变性
旋转和视角不变性
尺寸不变性
Inception的理解
1x1卷积核理解
跳层连接ResNet
学习知识的第一步就是明确任务,清楚该知识的输入输出。
先观看几组动物与人类视觉的差异对比图。
1. 苍蝇的视觉和人的视觉的差异
2. 蛇的视觉和人的视觉的差异
通过上面的两组对比图可以知道,
这里引出一条知识:生物所看到的景象并非世界的原貌,
任何视觉系统都是将图像反光与脑中所看到的概念进行关联。
所以画面识别实际上并非识别这个东西客观上是什么,
画面识别实际上是寻找(学习)人类的视觉关联方式𝒇,
并再次应用。
下面用两张图片来体会识别结果取决于哪些因素。
1. 老妇与少女
请观察上面这张图片,你看到的是老妇还是少女?
以不同的方式去观察这张图片会得出不同的答案。
图片可以观察成有大鼻子、大眼睛的老妇。也可以被观察成少女,
2. 海豚与男女
上面这张图片如果是成人观察,多半看到的会是一对亲热的男女。
图片被识别成什么不仅仅取决于图片本身,
还取决于图片是如何被观察的。
我们知道了“画面识别是从大量的(x,y)
其中x是输入,表示所看到的东西。y是输出,表示该东西是什么。
在自然界中,x是物体的反光,那么在计算机中,
图像在计算机中是一堆按顺序排列的数字,数值为0到255。
你可以把这堆数字用一个长长的向量来表示,
上图是只有黑白颜色的灰度图,
这样,RGB颜色模型中,
在电脑中,一张图片是数字构成的“长方体”。可用 宽width, 高height, 深depth 来描述,如上图。
画面识别的输入x是shape为(width, height, depth)的三维张量。
接下来要考虑的就是该如何处理这样的“数字长方体”。
在决定如何处理“数字长方体”之前,
我们知道一个物体不管在画面左侧还是右侧,
我们希望所建立的网络可以尽可能的满足这些不变性特点。
为了理解卷积神经网络对这些不变性特点的贡献,
方便起见,我们用depth只有1的灰度图来举例。
想要完成的任务是:
若训练前馈神经网络来完成该任务,
下面我们用数字(16进制)对图片中的每一个像素点(
当使用右侧那种物体位于中间的训练数据来训练网络时,
若让该网络识别位于右下角的“横折”时,则无法识别。
解决办法是用大量物体位于不同位置的数据训练,
然而这样做十分不效率,因为我们知道在左侧的“横折”也好,
为什么相同的东西在位置变了之后要重新学习?
换句话说,也就是让不同位置用相同的权重。
卷积神经网络就是让权重在不同位置共享的神经网络。
在卷积神经网络中,我们先选择一个局部区域,
为了更好的和前馈神经网络做比较,
下图展示了被红色方框所圈中编号为0,1,4,
这个带有连接强弱的红色方框就叫做 filter 或 kernel 或 feature detector。
而filter的范围叫做filter size,这里所展示的是2x2的filter size。
第二层的节点0的数值就是局部区域的线性组合,
用x表示输入值,y表示输出值,用图中标注数字表示角标,
注:在局部区域的线性组合后,也会和前馈神经网络一样,
当filter扫到其他位置计算输出节点yi时,w1,w2,w
下面这张动态图展示了当filter扫过不同区域时,
这也就是为什么大家也叫前馈神经网络(feedforward neural network)为fully-connected neural network。
图中显示的是一步一步的移动filter来扫描全图,
空间共享也就是卷积神经网络所引入的先验知识。
输出表达
如先前在图像表达中提到的,图片不用向量去表示是为了保留图片平
同样的,卷积后的输出若用上图的排列方式则丢失了平面结构信息。
这也就是你们在网上所看到的下面这张图。
经过一个feature detector计算后得到的粉红色区域也叫做一个“
Depth维的处理
现在我们已经知道了depth维度只有1的灰度图是如何处理的。
但前文提过,
现象:2x2所表达的filter size中,一个2表示width维上的局部连接数,
在2D卷积中,filter在张量的width维, height维上是局部连接,
类比:想象在切蛋糕的时候,不管这个蛋糕有多少层,
下面这张图展示了,在depth为复数时,
图中红、绿、蓝颜色的节点表示3个channels。
黄色节点表示一个feature detector卷积后得到的Feature Map。
其中被透明黑框圈中的12个节点会被连接到黄黑色的节点上。
在输入depth为1时:被filter size为2x2所圈中的4个输入节点连接到1个输出节点上。
在输入depth为3时:被filter size为2x2,但是贯串3个channels后,
在输入depth为n时:
注意:三个channels的权重并不共享。
即当深度变为3后,权重也跟着扩增到了三组,如式子(3)所示,
计算例子:用xr0表示red channel的编号为0的输入节点,xg5表示green channel编号为5个输入节点。xb1表示blue channel。如式子(4)所表达,
当filter扫到其他位置计算输出节点yi时,
每个filter会在width维, height维上,以局部连接和空间共享,
并贯串整个depth维的方式得到一个Feature Map。
Zero padding
细心的读者应该早就注意到了,
Zero padding就可以在这时帮助控制Feature Map的输出尺寸,同时避免了边缘信息被一步步舍弃的问题。
例如:下面4x4的图片在边缘Zero padding一圈后,再用3x3的filter卷积后,
通常大家都想要在卷积时保持图片的原始尺寸。
选择3x3的filter和1的zero padding,或5x5的filter和2的zero padding可以保持图片的原始尺寸。这也是为什么大家多选择3x3和5x5的filter的原因。
另一个原因是3x3的filter考虑到了像素与其距离为1以内
尺寸:Feature Map的尺寸等于(input_size + 2 * padding_size − filter_size)/stride+1。
注意:上面的式子是计算width或height一维的。
不用去背这个式子。其中(input_size + 2 * padding_size)是经过Zero padding扩充后真正要卷积的尺寸。减去 filter_size后表示可以滑动的范围。
再除以可以一次滑动(stride)多少后得到滑动了多少次,
再加上第一个不需要滑动也存在的输出节点后就是最后的尺寸。
形状、概念抓取
知道了每个filter在做什么之后,
我们知道不同的形状都可由细小的“零件”组合而成的。
卷积的每个filter可以探测特定的形状。
比如下图的第一个“大”形状可由2,3,4,5基础形状拼成。
除了基础形状之外,颜色、对比度等概念对画面的识别结果也有影响
可以从下面这张图中感受到不同数值的filters所卷积过后的
如我们先前所提,图片被识别成什么不仅仅取决于图片本身,
而filter内的权重矩阵W是网络根据数据学习得到的,
拿老妇与少女的那幅图片举例,当标签是少女时,
下图展现了在人脸识别中经过层层的卷积后,所能够探测的形状、
卷积神经网络会尽可能寻找最能解释训练数据的抓取方式。
多filters
每个filter可以抓取探测特定的形状的存在。
因此我们自然而然的会选择用多个不同的filters对同一个图
如下图,同一个图片,经过两个(红色、绿色)
每增加一个filter,就意味着你想让网络多抓取一个特征。
这样卷积层的输出也不再是depth为1的一个平面,
如下图所示,当我们增加一个filter(紫色表示)后,
卷积层的输入是长方体,输出也是长方体。
这样卷积后输出的长方体可以作为新的输入送入另一个卷积层中处理
加入非线性
和前馈神经网络一样,经过线性组合和偏移后,
将卷积所得的Feature Map经过ReLU变换(elementwise)
输出长方体
现在我们知道了一个卷积层的输出也是一个长方体,
CS231n原文链接:
http://cs231n.github.io/
计算例子请体会CS231n Demo部分的演示:
http://cs231n.github.io/
矩阵乘法执行卷积
如果按常规以扫描的方式一步步计算局部节点和filter的权重
因为卷积层的每个输出节点都是由若干个输入节点的线性组合所计算
读过我写的线性代数教程的读者请回忆,
其中一个矩阵所表示的信息是多组权重,另一个矩阵所表示的信息是
大家习惯性的把组成成分放在矩阵乘法的右边,
所以这个大型矩阵乘法可以用
Wrow · Xcol表示,其中
Wrow · Xcol都是矩阵。
卷积的每个输出是由局部的输入节点和对应的filter权重展成
那么Wrow中的每一行则是每个filter的权重,有F·F·
Xcol的列的个数则表示每个filter要滑动多少次才可以把
最后我们得到:
当然矩阵乘法后需要将Wrow · Xcol整理成形状为W2H2D2的三维张量以供后续处理(
Xcol则也需要逐步的局部滑动图片,
Max pooling
在卷积后还会有一个pooling的操作,
max pooling的操作如下图所示:
max pooling在不同的depth上是分开执行的,
Max pooling的主要功能是downsamping,
那么我们就反过来思考,这些“冗余”信息是如何产生的。
直觉上,我们为了探测到某个特定形状的存在,
比如下图中,我们还是考虑探测“横折”这个形状。
卷积后得到3x3的Feature Map中,真正有用的就是数字为3的那个节点,
所以用3x3的Max pooling后,并没有对“横折”的探测产生影响。
网络也会去学习与Max pooling近似效果的权重。因为是近似效果,
Max pooling还有类似选择句的功能。假如有两个节点,
但是Max pooling也有不好的地方。
当抓取到足以用来识别图片的特征后,接下来的就是如何进行分类。
全连接层(也叫前馈层)
通常卷积网络的最后会将末端得到的长方体平摊(flatten)
卷积神经网络大致就是covolutional layer, pooling layer, ReLu layer, fully-connected layer的组合,例如下图所示的结构。
这里也体现了深层神经网络或deep learning之所以称deep的一个原因:模型将特征抓取层
下图简述了机器学习的发展,
以上介绍了卷积神经网络的基本概念。
以下是几个比较有名的卷积神经网络结构,
CS231n链接:
http://cs231n.github.io/
LeNet:第一个成功的卷积神经网络应用
AlexNet:类似LeNet,但更深更大。
ZF Net:增加了中间卷积层的尺寸,
GoogLeNet:减少parameters数量,
VGGNet:只使用3x3 卷积层和2x2 pooling层从头到尾堆叠。
ResNet:引入了跨层连接和batch normalization。
DenseNet:将跨层连接从头进行到尾。
总结一下:这些结构的发展趋势有:
使用small filter size的卷积层和pooling
去掉parameters过多的全连接层
Inception(稍后会对其中的细节进行说明)
跨层连接
接下来会谈谈我个人的,
需要明白的是为什么加入不变性可以提高网络表现,
提出满足新的不变性特点的神经网络是计算机视觉的一个主要研究方
可以说卷积神经网络最初引入局部连接和空间共享,
因为空间共享,在不同位置的同一形状就可以被等价识别,
个人觉得卷积神经网络克服这一不变性的主要手段还是靠大量的数据
Deformable Convolutional Networks似乎是对此变性进行了进行增强。
与平移不变性不同,
我们知道filter的size是事先选择的,
从直观上思考,如果选择小范围,再一步步通过组合,
这恐怕ZF Net让第一层的stride和filter size更小,VGGNet将所有filter size都设置成3x3仍可以得到优秀结果的一个原因。
但是,除了形状之外,
同时,小尺寸的堆叠需要很多个filters来共同完成,
所以一次性使用多个不同filter size来抓取多个范围不同的概念是一种顺理成章的想法,
Inception
下图是Inception的结构,尽管也有不同的版本,
你也一定注意到了蓝色的1x1卷积,撇开它,
输入(可以是被卷积完的长方体输出作为该层的输入)进来后,
但在实际的网络设计中,究竟该如何选择需要大量的实验和经验的。
接下来我们再看右边的这个结构,多了很多蓝色的1x1卷积。
1x1卷积核
如果卷积的输出输入都只是一个平面,
但卷积的输出输入是长方体,
如下图所示,如果选择2个filters的1x1卷积层,
这就是为什么上面Inception的4个选择中都混合一个1x
而max pooling用来去掉卷积得到的Feature Map中的冗余信息,所以出现在1x1卷积之前,
跳层连接
前馈神经网络也好,卷积神经网络也好,都是一层一层逐步变换的,
但现实中是否有跳层组合的现象?
比如说我们在判断一个人的时候,
这时我们会靠单个五官,外加这个人的着装,
这样,即便图片本身是残缺的也可以很好的判断它是什么。
这和前馈神经网络的先验知识不同,
残差网络就是拥有这种特点的神经网络。
需要注意的是每一层并不会像我这里所展示的那样,
用下图举一个更易思考的例子。
图形1,2,3,4,5,6是第一层卷积层抓取到的概念。
图形7,8,9是第二层卷积层抓取到的概念。
图形7,8,9是由1,2,3,4,5,6的基础上组合而成的。
但当我们想要探测的图形10并不是单纯的靠图形7,8,9组成,
当层数变深后,会越来越难以保持,还需要max pooling将冗余信息去掉。
一个合理的做法就是直接将上一层所抓取的概念也跳层传递给下下一
就好比在编程时构建了不同规模的functions,
同时,因为ResNet使用了跳层连接的方式。也不需要max pooling对保留低层信息时所产生的冗余信息进行去除。
Inception中的第一个1x1的卷积通道也有类似的作用,
两个结合方式各有优点。
concatenate当需要用不同的维度去组合成新观念的时候
又比如双向LSTM中正向和逆向序列抓取的结合常用相加的方式结
在下图的ResNet中,前一层的输入会跳过部分卷积层,
在下图的DenseNet中,
后续
随着时间推移,各个ResNet,
但基本都是上文描述的概念的组合使用加上其他的tricks。
如下图所展示的,加入跳层连接的Inception-
但对我而言——
真正重要的是这些技巧对于各种不变性的满足。
本文作者 YJango,日本会津大学人机交互实验室在读博士生,
点击右下角“阅读原文”,可参与讨论
并解锁更多作者的深度好文~
【完】
量子位读者6群开启,对人工智能感兴趣的朋友,欢迎加量子位小助手的微信qbitbot2,申请入群,一起探讨AI。
想要更深一步的交流?
量子位还有自动驾驶、NLP、CV三个专业讨论群,仅接纳相应领域的一线工程师、研究人员等。
同样需要添加qbitbot2为微信好友,提交相应说明,符合条件后将被邀请入群。(审核较严,敬请谅解)
量子位正在招募编辑/记者等岗位,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
△ 扫码强行关注『量子位』
追踪人工智能领域最劲内容