作者:YJango
日本会津大学|人机交互实验室博士生
量子位 已获授权编辑发布
该文是对卷积神经网络的介绍,并假设你理解前馈神经网络。
如果不是,强烈建议读完《
如何简单形象又有趣地讲解神经网络是什么?》
这篇文章后后再来读该篇。
推荐文章链接:
https://www.zhihu.com/
question/22553761/answer/
126474394
下面进入正题,开始我们的卷积神经网络之旅——
目录
-
视觉感知
-
图像表达
-
前馈神经网络做画面识别的不足
-
卷积神经网络做画面识别
-
局部连接
-
空间共享
-
输出空间表达
-
Depth维的处理
-
Zero padding
-
形状、概念抓取
-
多filters
-
非线性
-
输出尺寸控制
-
矩阵乘法执行卷积
-
Max pooling
-
全连接层
-
结构发展
-
画面不变性的满足
-
平移不变性
-
旋转和视角不变性
-
尺寸不变性
-
Inception的理解
-
1x1卷积核理解
-
跳层连接ResNet
视觉感知
一. 画面识别是什么任务?
学习知识的第一步就是
明确任务
,清楚该知识的输入输出。
卷积神经网络最初是服务于画面识别的,
所以我们先来看看画面识别的实质是什么。
先观看几组动物与人类视觉的差异对比图。
1. 苍蝇的视觉和人的视觉的差异
2. 蛇的视觉和人的视觉的差异
△
更多对比图请参考http://chuansong.me/n/
2656056
通过上面的两组对比图可以知道,
即便是相同的图片经过不同的视觉系统,也会得到不同的感知。
这里引出一条知识:生物所看到的景象并非世界的原貌,
而是长期进化出来的适合自己生存环境的一种感知方式。
蛇的猎物一般是夜间行动,
所以它就进化出了一种可以在夜间也能很好观察的感知系统,感热。
任何视觉系统都是将
图像反光
与脑中所看到的
概念
进行关联。
所以画面识别实际上并非识别这个东西客观上是什么,
而是寻找人类的视觉关联方式,并再次应用。如果我们不是人类,
而是蛇类,那么画面识别所寻找的f就和现在的不一样。
画面识别实际上是寻找(学习)人类的视觉关联方式𝒇,
并再次应用。
二. 图片被识别成什么取决于哪些因素?
下面用两张图片来体会识别结果取决于哪些因素。
1. 老妇与少女
请观察上面这张图片,你看到的是老妇还是少女?
以不同的方式去观察这张图片会得出不同的答案。
图片可以观察成有大鼻子、大眼睛的老妇。也可以被观察成少女,
但这时老妇的嘴会被识别成少女脖子上的项链,
而老妇的眼睛则被识别为少女的耳朵。
2. 海豚与男女
上面这张图片如果是成人观察,多半看到的会是一对亲热的男女。
倘若儿童看到这张图片,看到的则会是一群海豚(
男女的轮廓是由海豚构造出的)。所以,识别结果受年龄,
文化等因素的影响,换句话说:
图片被识别成什么不仅仅取决于图片本身,
还取决于图片是如何被观察的。
图像表达
我们知道了“画面识别是从大量的(x,y)
数据中寻找人类的视觉关联方式f,并再次应用。
其中x是输入,表示所看到的东西。y是输出,表示该东西是什么。
在自然界中,x是物体的反光,那么在计算机中,
图像又是如何被表达和存储的呢?
图像在计算机中是一堆按顺序排列的数字,数值为0到255。
0表示最暗,255表示最亮。
你可以把这堆数字用一个长长的向量来表示,
也就是tensorflow的mnist教程。然而,
这样会失去平面结构的信息,为保留该结构信息,
通常选择矩阵的表示方式:28x28的矩阵。
上图是只有黑白颜色的灰度图,
而更普遍的图片表达方式是RGB颜色模型,即红(Red)、绿(
Green)、蓝(Blue)三原色的色光以不同的比例相加,
以产生多种多样的色光。
这样,RGB颜色模型中,
单个矩阵就扩展成了有序排列的三个矩阵,
也可以用三维张量去理解,
其中的每一个矩阵又叫这个图片的一个channel。
在电脑中,一张图片是数字构成的“长方体”。可用
宽width, 高height, 深depth
来描述,如上图。
画面识别的输入x是shape为(width, height, depth)的三维张量。
接下来要考虑的就是
该如何处理这样的“数字长方体”
。
画面不变性
在决定如何处理“数字长方体”之前,
需要清楚所建立的网络拥有什么样的特点。
我们知道一个物体不管在画面左侧还是右侧,
都会被识别为同一物体,这一特点就是不变性(
invariance),如下图所示。
我们希望所建立的网络可以尽可能的满足这些不变性特点。
为了理解卷积神经网络对这些不变性特点的贡献,
我们将用不具备这些不变性特点的前馈神经网络来进行比较。
图片识别—前馈神经网络
方便起见,我们用depth只有1的灰度图来举例。
想要完成的任务是:
在宽长为4x4的图片中识别是否有下图所示的“横折”。图中,
黄色圆点表示值为0的像素,深色圆点表示值为1的像素。
我们知道不管这个横折在图片中的什么位置,
都会被认为是相同的横折。
若训练前馈神经网络来完成该任务,
那么表达图像的三维张量将会被摊平成一个向量,作为网络的输入,
即(width, height, depth)为(4, 4, 1)的图片会被展成维度为16的向量作为网络的输入层。
再经过几层不同节点个数的隐藏层,最终输出两个节点,分别表示“
有横折的概率”和“没有横折的概率”,如下图所示。
下面我们用数字(16进制)对图片中的每一个像素点(
pixel)进行编号。
当使用右侧那种物体位于中间的训练数据来训练网络时,
网络就只会对编号为5,6,9,a的节点的权重进行调节。
若让该网络识别位于右下角的“横折”时,则无法识别。
解决办法是用大量物体位于不同位置的数据训练,
同时增加网络的隐藏层个数从而扩大网络学习这些变体的能力。
然而这样做十分不效率,因为我们知道在左侧的“横折”也好,
还是在右侧的“横折”也罢,大家都是“横折”。
为什么相同的东西在位置变了之后要重新学习?
有没有什么方法可以将中间所学到的规律也运用在其他的位置?
换句话说,也就是
让不同位置用相同的权重
。
图片识别—卷积神经网络
卷积神经网络就是让权重在不同位置共享的神经网络。
局部连接
在卷积神经网络中,我们先选择一个局部区域,
用这个局部区域去扫描整张图片。
局部区域所圈起来的所有节点会被连接到下一层的一个节点上。
为了更好的和前馈神经网络做比较,
我将这些以矩阵排列的节点展成了向量。
下图展示了被红色方框所圈中编号为0,1,4,
5的节点是如何通过w
1
,w
2
,w
3
,w
4
连接到下一层的节点0
上的。
这个带有连接强弱的红色方框就叫做
filter
或
kernel
或
feature detector
。
而filter的范围叫做
filter size
,这里所展示的是2x2的filter size。
第二层的节点0的数值就是局部区域的线性组合,
即被圈中节点的数值乘以对应的权重后相加。
用x表示输入值,y表示输出值,用图中标注数字表示角标,
则下面列出了两种计算编号为0的输出值y
0
的表达式。
注:
在局部区域的线性组合后,也会和前馈神经网络一样,
加上一个偏移量b
0
。
空间共享
当filter扫到其他位置计算输出节点y
i
时,w
1
,w
2
,w
3
,w
4
,
包括b_0
是共用的。
下面这张动态图展示了当filter扫过不同区域时,
节点的链接方式,最后一帧则显示了所有连接。可以注意到,
每个输出节点并非像前馈神经网络中那样与全部的输入节点连接,
而是部分连接。
这也就是为什么大家也叫前馈神经网络(feedforward neural network)为fully-connected neural network。
图中显示的是一步一步的移动filter来扫描全图,
一次移动多少叫做stride。
空间共享也就是卷积神经网络所引入的先验知识。
输出表达
如先前在图像表达中提到的,图片
不用
向量去表示是为了保留图片平
面结构的信息。
同样的,卷积后的输出若用上图的排列方式则丢失了平面结构信息。
所以我们依然用矩阵的方式排列它们,就得到了下图所展示的连接。
这也就是你们在网上所看到的下面这张图。
在看这张图的时候请结合上图的连接一起理解,即输入(绿色)
的每九个节点连接到输出(粉红色)的
一个节点
上的。
经过
一个
feature detector计算后得到的粉红色区域也叫做一个
“
Convolved Feature”
或
“Activation Map”
或
“Feature Map”
。
Depth维的处理
现在我们已经知道了depth维度只有1的灰度图是如何处理的。
但前文提过,
图片的普遍表达方式是下图这样有3个channels的RGB颜
色模型。当depth为复数的时候,每个feature detector是如何卷积的?
现象:
2x2所表达的filter size中,一个2表示width维上的局部连接数,
另一个2表示height维上的局部连接数,
并却没有depth维上的局部连接数,
是因为depth维上并非局部,而是全部连接的。
在2D卷积中,filter在张量的width维, height维上是局部连接,
在depth维上是贯串全部channels的。
类比:
想象在切蛋糕的时候,不管这个蛋糕有多少层,
通常大家都会一刀切到底,但是在长和宽这两个维上是局部切割。
下面这张图展示了,在depth为复数时,
filter是如何连接输入节点到输出节点的。
图中红、绿、蓝颜色的节点表示3个channels。
黄色节点表示一个feature detector卷积后得到的Feature Map。
其中被透明黑框圈中的12个节点会被连接到黄黑色的节点上。
-
在输入depth为1时:被filter size为2x2所圈中的4个输入节点连接到1个输出节点上。
-
在输入depth为3时:被filter size为2x2,但是贯串3个channels后,
所圈中的12个输入节点连接到1个输出节点上。
-
在输入depth为n时:
2x2xn输入节点连接到1个输出节点上。
注意:
三个channels的权重并不共享。
即当深度变为3后,权重也跟着扩增到了三组,如式子(3)所示,
不同channels用的是自己的权重,式子中增加的角标r,
g,b分别表示red channel, green channel, blue channel的权重。
计算例子:
用x
r0
表示red channel的编号为0的输入节点,x
g5
表示green channel编号为5个输入节点。x
b1
表示blue channel。如式子(4)所表达,
这时的一个输出节点实际上是12个输入节点的线性组合。
当filter扫到其他位置计算输出节点y
i
时,
那12个权重在不同位置是共用的,如下面的动态图所展示——
透明黑框圈中的12个节点会连接到被白色边框选中的黄色节点上。
每个filter会在width维, height维上,以局部连接和空间共享,
并贯串整个depth维的方式得到一个Feature Map。
Zero padding
细心的读者应该早就注意到了,
4x4的图片被2x2的filter卷积后变成了3x3的图片,
每次卷积后都会小一圈的话,经过若干层后岂不是变的越来越小?
Zero padding就可以在这时帮助控制Feature Map的输出尺寸,同时避免了边缘信息被一步步舍弃的问题。
例如:
下面4x4的图片在边缘Zero padding一圈后,再用3x3的filter卷积后,
得到的Feature Map尺寸依然是4x4不变。
通常大家都想要在卷积时保持图片的原始尺寸。
选择3x3的filter和1的zero padding,或5x5的filter和2的zero padding可以保持图片的原始尺寸。这也是为什么大家多选择3x3和5x5的filter的原因。
另一个原因是3x3的filter考虑到了像素与其距离为1以内
的所有其他像素的关系,
而5x5则是考虑像素与其距离为2以内的所有其他像素的关系。
尺寸:
Feature Map的尺寸等于(input_size + 2 * padding_size − filter_size)/stride+1。
注意:
上面的式子是计算width或height一维的。
padding_size也表示的是单边补零的个数。例如(4+
2-3)/1+1 = 4,保持原尺寸。
不用去背这个式子。其中(input_size + 2 * padding_size)是经过Zero padding扩充后真正要卷积的尺寸。减去 filter_size后表示可以滑动的范围。
再除以可以一次滑动(stride)多少后得到滑动了多少次,
也就意味着得到了多少个输出节点。
再加上第一个不需要滑动也存在的输出节点后就是最后的尺寸。
形状、概念抓取
知道了每个filter在做什么之后,
我们再来思考这样的一个filter会抓取到什么样的信息。
我们知道不同的形状都可由细小的“零件”组合而成的。
比如下图中,
用2x2的范围所形成的16种形状可以组合成格式各样的“更大”
形状。
卷积的每个filter可以探测特定的形状。
又由于Feature Map保持了抓取后的空间结构。
若将探测到细小图形的Feature Map作为新的输入再次卷积后,则可以由此探测到“更大”
的形状概念。
比如下图的第一个“大”形状可由2,3,4,5基础形状拼成。
第二个可由2,4,5,6组成。第三个可由6,1组成。
除了基础形状之外,颜色、对比度等
概念
对画面的识别结果也有影响
。卷积层也会根据需要去探测特定的概念。
可以从下面这张图中感受到不同数值的filters所卷积过后的
Feature Map可以探测边缘,棱角,模糊,突出等概念。
如我们先前所提,图片被识别成什么不仅仅取决于图片本身,
还取决于图片是如何被观察的。
而filter内的权重矩阵W是网络根据数据学习得到的,
也就是说,我们让神经网络自己学习以什么样的方式去观察图片。
拿老妇与少女的那幅图片举例,当标签是少女时,
卷积网络就会学习抓取可以成少女的形状、概念。当标签是老妇时,
卷积网络就会学习抓取可以成老妇的形状、概念。
下图展现了在人脸识别中经过层层的卷积后,所能够探测的形状、
概念也变得越来越抽象和复杂。
卷积神经网络会尽可能寻找最能解释训练数据的抓取方式。
多filters
每个filter可以抓取探测特定的形状的存在。
假如我们要探测下图的长方框形状时,
可以用4个filters去探测4个基础“零件”。