本章内容是想跟大家介绍搭建深度学习神经网络构建中的矩阵运算。但是由于这样会显得有点枯燥,所以故意引进空间观并和矩阵运算进行对比。这样会有趣的多。
我去年在脑子里大量进行矩阵运算时,我开始觉得宇宙是一个矩阵游戏。前段时间马斯克也发表了类似的言论,我深表同感。
首先,为什么要把深度学习跟矩阵运算联系在一起?
在我刚开始介绍如何自学深度学习时,我说过线性代数会帮助我们如何搭建一个神经网络。线性代数讲的就是矩阵运算。
空间的存在与理解:
在搭建神经网络时,我们首先要考虑的是里面的神经细胞是否完全正确连通。与生物的复杂的神经网络很不一样,深度学习中的神经网络的架构本质就是一个矩阵。
我们描述某一层CNN的神经网络的形状时,通常我们会用经过某层网络后的数据的形状来进行描述,这里我们有一个叫shape的词。
接着,我们可以看一下以下图片里面的网络结构:
图1:网络结构
引用自:
https://engmrk.com/convolutional-neural-network-3/
这里我们可以看到这个网络的结构是逐层压缩,但是层数是逐渐增加的。
第一层:对一个shape是(28,28,1)的数据卷积成(24,24,32),卷积核的大小为(5,5),数量是32,并且移动的步长为1。
第二层:对一个shape是(24,24,32)的数据进行池化,池化的步长是(2,2),所以数据大小会缩小一倍。
第三层:对一个shape是(12,12,32)的数据卷积成(8,8,64),卷积核的大小为(5,5),数量是64,并且移动的步长为1。
第四层:对一个shape是(8,8,64)的数据进行池化,池化的步长是(2,2),所以数据大小会缩小一倍。
第五层:对数据进行全连接,shape为(1024),所以数据shape会变成(1024)。
第六层:对数据进行全连接,shape为(10),所以数据shape会变成(10)。
这里有个计算CNN网络每层输出的数据大小与卷积核公式的关系。
引用自:
http://machinelearninguru.com/computer_vision/basics/convolution/convolution_layer.html
说到这里,大家是不是还觉得神经网络的搭建跟空间观还是连不上来?
其实上面的卷积网络(CNN)就有点像空间逐渐坍塌的过程。以下所说的宇宙是指整个空间,而世界指的是宇宙大爆炸之后和所有星球都毁灭之前的空间。也就是世界包含于宇宙之内。
在进行卷积时,除了图片的(height,width,channel)外,通常我们还会进行批量处理,也就是batchsize,那么真正的网络结构为(batch,height,width,channel),也就是四维空间。
三维空间:
图2:三维矩阵空间
图3:三维真实空间
引用自:
https://www.livescience.com/62547-what-is-center-of-universe.html
三维空间也就是我们日常生活中看到的只有长宽高的世界。
四维空间:
图4:四维矩阵空间
引用自:
https://www.livescience.com/62547-what-is-center-of-universe.html
首先我们看到的是一张三维空间的图片,然后我们看到一张四维空间的图片。这里就可能跟我们的日常生活比较贴近了。batch这一维就是时间维度,它会随着时间推移平铺(h,w,c)这个三维空间。(h,w,c)就可以理解为长宽高,这里不做描述。
由于现在深度学习的神经网络一般只涉及到四维空间,但是我们可以为了增加趣味,给空间进行增维。因为锻炼这种空间想象能力可以帮助我们更快更准确地搭建网络。
五维空间:
图6:五维矩阵空间
图7:五维真实空间
引用自Interstellar(侵删)
五维真实空间相当于是四维空间平铺成一个四维空间面,也就是相当于我们常说的世界线。我个人认为五维空间的世界线是趋于同一个终点的,也就是说对于某些事情分支不一样,但是结局是趋于一致的。我们可以把它想象成一条线,但是这条线有由很多线组成。这里引用了Interstellar的一张图,里面主角通过干扰时间线来告知自己的女儿真相,结果导致世界线的坍塌结局趋于一致。
六维空间:
图8:六维矩阵空间
六维矩阵空间:把五维空间的平面无限平铺。
六维真实空间:
六维真实空间是五维真实空间的平铺,也就是世界线的平铺,拥有无穷无尽的可能性,也就是有我们动漫迷所说的”命运石之门”。但是这都是在基于当前宇宙是诞生的状态下。所以我觉得可以理解为,如果宇宙是存在的,它应该是六维的空间。它包含了这个宇宙里面所能发生的可能性事情。如果真的有神存在,那么他应该是高于六维的存在。高于六维的存在,我们人类无法看到他的全貌,只有他对自己进行投影我们才能看到他。他相当于宇宙的观察者,对于宇宙所发生的一切,他可能毫不关心,对他也毫无意义。“在宇宙的观察者面前,时间和距离是毫无意义的”(摘自于魔兽世界阿格拉玛的步伐)。
七维空间以上就是平行宇宙了。
七维空间:
七维矩阵空间:
在进入七维矩阵空间之前,我们首先要把六维矩阵空间想象成一个点,然后把这个点平铺成一条线,就是七维矩阵空间。
七维真实空间:
在七维的真实空间里面,线上的每一个点都包含了单一宇宙里面所可能发生的事情以及可能性。但是六维空间的粒度问题,它可能无法包含宇宙发生大爆炸到世界毁灭的过程。而在七维空间里面,则可以稳定地包含住这个可能性。在在七维空间的这条线上,与六维空间的区别也可以理解为是一个里表关系。六维空间无法窥探这个世界的开始与终结,而七维空间则能够进行观察。其实这点跟三维空间和四维空间是类似的,三维空间也可以为一个点,它是静止的,你在里面的话你只能看到的是此时此刻,而四维空间则可以看到三维空间的此时此刻的开始与终结。
八维空间:
八维矩阵空间:
把七维空间所组成的线平铺成面。
八维真实空间:
在八维的真实空间里面,我们所认识的世界肯定是诞生了,也肯定会终结。它好比是七维空间的蝴蝶效应的产物。在七维空间,世界是诞生了,但是它诞生的原因因为增维而变得多样了。现在我们普遍认为是发生了大爆炸诞生了我们的世界,而八维空间里面,则有可能有各种各样的原因使我们的世界诞生了。而同样的,也有各种各样的原因使我们的世界毁灭了。也就是说,八维空间里面,宇宙肯定是存在的,世界也是肯定诞生了,但是怎样诞生和怎样毁灭,可能性就变得多种多样了。
九维空间:
九维矩阵空间:把八维空间的平面无限平铺。
九维真实空间:
在八维真实空间里面说了,宇宙肯定是存在的,世界也肯定是诞生了。而在九维空间里面,宇宙肯定也是存在的,但是世界就可能不会诞生了。
十维空间:
十维矩阵空间:把九维矩阵空间再抽象成一个点,把它平铺成线。
十维真实空间:
在十维的真实空间里面,宇宙也可能不存在了。在这个特别的空间里面,九维空间里面的所有因果关系都不会存在,因为它可以随意改变。在这个维度里面,能看到的是万千世界。如果真的有十维的存在的话,它有可能是我们所认识的世界的绝对的主宰。
十一维空间:
十一维矩阵空间:把十维矩阵空间的线平铺成面。
十一维真实空间:
在十一维空间里面,就是关于宇宙是如何以何种形式形态存在的问题。它可能在某个节点存在,或者不存在。
十二维空间:
十二维矩阵空间:把十一维矩阵空间的平面无限平铺。
十二维的真实空间:
在十二维空间里面,跟宇宙完全不同规则的空间无限存在。也就是在这些不同规则的世界里面,里面的物理法则将会很不一样,需要建立另外的科学体系去理解那些世界。
在搭建神经网络时,经常要做的是对矩阵空间进行坍塌运算或者增维运算。刚开始有可能有点不太习惯,但是多锻炼几次之后你会觉得很有意思,同时你会发现你的空间想象能力会增强。下面我会列出一些图片和代码方便大家理解。
例如在四维空间里面,让空间沿着某一维进行坍塌。我们可以理解为对这一维进行压缩运算,而压缩时进行的是什么运算,则要看具体要求。一般是取叠加值或者平均值。
在tensorflow里面,我们会用到reduce_sum这个函数来实现这个功能。
具体的例子1:
图8:四维矩阵空间
图9:三维矩阵空间
这里有一个四维空间,我们要对这个四维空间(b,h,w,c)的b这一维进行压缩,压缩时的运算取叠加,那么结果就会变成一下一个消掉b维的三维空间。这个三维矩阵里面的每一个值都是一个叠加起来的值。
代码:
data = tf.reduce_sum(data,axis=0)
具体的例子2:
图10:四维矩阵空间
图11:压缩h维后的矩阵空间
这里有一个四维空间,我们要对这个四维空间(b,h,w,c)的h这一维进行压缩,压缩时的运算取叠加,那么结果就会变成一下一个消掉h维的三维空间。这个三维矩阵里面的每一个值都是一个叠加起来的值。
代码:
data = tf.reduce_sum(data,axis=1)
具体的例子3:
有没有想过把所有空间压成一个点会怎样?
没错,它就是我们所认识的黑洞。在一个大于一维空间里面,存在着一个点空间的话,会极大扭曲这个点空间周围的空间。可以理解为点空间的周围的规则是要建立跟这个点空间的过渡空间,所以这篇区域会经历从体到面到点的过程。
为什么要存在黑洞,虫洞?
这个纯粹是我的个人脑洞。以上帝视觉来观看的话,因为空间只是一个点的时候,它能够很简单的并且极大的不干扰其他空间的范围之下,来对这个宇宙来进行编辑。例如想把高维空间的某两个地方连接起来,虽然说在高维空间里面,只需要进行增减维过程,就能够快速到达目的空间,但是这样操作起来太麻烦了,不如弄个点空间,来让两个空间扭曲地连接在一起。虽然不美观,但是却能够大大减少计算量。
对于这个问题,记得以前看某部动画的时候,还讨论过一个问题。
当你有可以进行空间移动的超能力可以选择,你会选择坐标移动还是空间移动?
如果给我选择的话我会选择空间移动,因为空间移动只要熟悉了整个高维空间的构造,就能够快速进行移动,而坐标移动虽然算式简单,但是计算量往往更大一些,消耗时间更多。
代码:
data = tf.reduce_sum(data)
空间的增维可以理解为每隔三维进行一次点抽象,再对这个点进行平铺成线和面。
搭建神经网络时最基本的是要让网络能够连接起来。
把矩阵运算跟宇宙空间联想在一起,可以增添做AI的趣味性。