神经网络和深度学习之神经元和感知器
一、计算机和人相互依存
当今社会,计算机在我们的生活和工作中扮演着重要的角色,人类使用计算机帮助他们进行大量的计算,通过计算机让每个人相互通信等等。但时代的进步让我们对计算机的要求越来越高,人类希望它能够从事越来越复杂的工作。乍看计算机进行计算以及通信工作的原理好像很复杂难懂,实际上计算机能够进行这些工作是因为人们已经给它设定好了程序,计算机只要按照这些程序规范执行就好了,这是一种单向的工作模式,这种情况下,计算机是完全不会“思考”的,只知道按程序执行指令,而我们却想赋予计算机思考的能力,这便是人工智能的起点。
图1.1.1
我们希望计算机“思考”什么呢?比如,我们希望计算机能够帮我们识别出图片中动物是猫还是狗,帮我们对于图片中存在各种物体做标识,帮我们翻译一段文字,或者帮我们分析一段话或者一段句子中蕴含着说话人的什么情感等等。这些工作对人类而言非常简单,甚至一个2,3岁的孩子也完全可以很好的分辨出一张图片中的动物是猫还是狗,但这些对于计算机而已,却是非常困难的,因为计算机不会“思考”,它不明白什么是狗,什么是猫,除非我们训练它去认识狗和猫,这便是后来的机器学习。
图1.1.2
二、 我们的神经细胞
要想计算机学会“思考”,首先来看看人类是如何思考的。
生命是神奇,美妙,复杂的,这种复杂程度不知道是计算机系统的多少倍,人类能够思考并从事各种各样的复杂的工作,是因为我们身体内部微小的神经细胞起着作用。
神经细胞也叫神经元,它的功能是接受某些形式的信号并对之做出反应,比如传导兴奋、处理并储存信息以及发生细胞之间的联结等。正因为神经元的这些功能,才能使得人和动物能够对外界环境的变化做出反应。毋庸置疑,越高级的动物,神经元的个数和神经元之间的连接越复杂。
图1.1.3
神经元由树突、胞体、轴突、髓鞘、神经末梢等组成。树突接受信息,并转换成电信号,轴突传输电信号及处理等,神经末梢对信息进行反应。一个神经元完成了一个简单的信息接收,处理,输出的基本动作。人工智能专家们就从这里得到启发,开始了人工智能模型——“神经网络”的研究。
三、人造神经元
哲学告诉我们,世界上的万物都是联系的。生物学的神经元启发我们构造了最简单原始的“人造神经元”。下图中的圆就好比一个神经元,它接受外部输入,在圆内进行简单或复杂的处理后形成输出,在神经网络中我们称之为感知机。
图1.1.4
神经元是人体神经系统的基本结构和功能单位,是无数个神经元相连而成(如下图1.1.5所示),这是一个非常复杂的网络系统。神经元间联系方式是互相接触,而不是细胞质的互相沟通。接触部位的结构特化称为突触,通常是一个神经元的轴突与另一个神经元的树突或胞体借突触发生机能上的联系,神经冲动由一个神经元通过突触传递到另一个神经元。
图1.1.5
同理,从人体神经系统的构成可以进一步创建更加复杂的人造神经系统,比如我们让多个人造神经元(感知机)相连接,便形成了人工智能里面声称的“神经网络”。如下图所示,一个圆圈代表一个神经元,黄色的第一层称为输入层,蓝色的第二层称为隐藏层,隐藏层可以有多层,绿色的第三层称为输出层。
图1.1.6
四、神经元第一次工作
现在我们需要神经元来帮我们处理一个信息,把10加仑(gallon)的汽油换成以升(L)为单位的汽油。对于加仑和升两种单位,国际上有标准的换算比例,1加仑=3.785412升,我们可以用一个公式来表示,即\(G=3.78L\)或者\(y=3.78x\),通过公式,我们可以简单的换算就知道答案,这个难不到读过初中的你。再仔细看看,\(y=3.78x\)不就是在坐标系中过原点的一条直线吗?3.78是直线的斜率。
接着我们用神经元来进行学习换算(忽略一下激活层),如下图1.1.7,神经元的输入为\(x\),我们给输入x赋了一个权重\(\alpha\),最后经过神经元的计算,得到输出\(y\)。
图1.1.7
在神经元的计算中,最重要的一步是必须知道权值\(\alpha\),才能得到输出\(y\),怎么换算呢?首先,正真的值应该是37.8升,核心就是神经元把正确答案37.8的和它预测的答案来对比着不断学习改进!第一步,先像人一样猜猜看,假设\(\alpha=3\),则神经元预测值\(y'=30\)升。
“这与实际值有差异吧,误差为37.8-30=7.8升;哦,我明白了!”神经元继续想着下一个计算。
“再计算一次我肯定能减小误差,让\(\alpha=3.5\)吧”,这一次预测值为35升。
“第二次计算误差为\(37.8-35=2.8\)升,哈哈误差在不断缩小,也许下一次计算就接近真实值了!”
“这次我让\(\alpha=4\),哦,糟了,预测值为40升,与实际值的误差为\(37.8-40=-2.2\)升,过了!”
“好吧,我知道怎么调整了......”
神经元就这样从误差中不停的学习,最后输出的值越来越接近真实值,这无疑是一次成功的训练!
五、由神经元联想到感知器
现在我们有两堆豆子,豆子的特征如下表所示,我们想通过计算机预测一下哪一种是黄豆,哪一种是蚕豆。对于识别两种不同种类的物体,人类眨巴眼就可以很容易的分辨出来,但计算机怎么分辨?是否有解决方案,答案是肯定的。
表1.1.1
我们用坐标来直观的可视化这些特征,如下图1.1.8所示。两种豆子的长宽分别落在一定值范围内,他们有明显的特征,分布在坐标中的不同区域。
图1.1.8
如果我们想分类这两种豆子,用一条线是否就可以清晰的把它们分开?线的上面是蚕豆,线的下面是黄豆,如下图1.1.9所示。这样的线在数学中是一条线性线段,在神经网络中被称为线性回归。只要计算机能通过线性回归给出一条最合理的分类线,那么计算机就完成了分类任务,也就意味着计算机可以认识豆子了!是的,就是这么简单!
图1.1.9
你或许会问,这种线太多了,比如下面图1.1.10(a)就不是一个很好的分类线,它完全没有把黄豆和蚕豆分开,图(b)也未能把两种豆子分开,或许图(c)应该不错,它把两种豆子很明显的分类开了,但图(c)的分类线并不一定是最优的,怎样才能找到最优的一条线呢?这正是感知器内部需要做的工作,它通过一系列的计算,找出最优的线性线段,也就是我们的最优分类线。反观我们的神经系统,人体神经元也是通过树突接收信号,在细胞质中经过处理后通过轴突传到其他地方的,原来,神经元和感知器如此类似!
图1.1.10
But!这里强调一下,人体神经系统中神经元接收到信号,并不是马上就传导,而是要在信号刺激较达到一定阈值时候才开始处理信息并把信息传导出去。这跟之前我们用\(y=\alpha x\)这样的线性线段来进行加仑和升的换算不一样,我们把\(y=\alpha x\)看成一个感知器,我们输入\(x\)必定会有一个\(y\)与之对应,不管\(x\)多小,\(y\)也会及时的响应输入\(x\)。而生物神经元传导是需要有个阈值刺激的,\(x\)小了,神经元并不理会。由于我们喜欢模仿生物神经元的工作,所以通常在神经网络的应用实践中,生物神经元这种处理信号的方式也会被我们抄袭过来。这就是我们常常在线性感知器后面加入激活函数的意义。当信号达到一定阈值,激活层才能处理信息并输出。如下图1.1.11所示。
图1.1.11
加入激活函数后,前面线性感知器的输出就不是线性的了,我们把线性输出做了非线性化处理,整个网络称得上是真正的完美。但是为什么我们需要加入激活,激活是什么呢?第二节我们会详细讲到。
六、线性回归的缺陷
前面我们提到过一次线性回归,什么是线性?从数学上来讲就是变量\(x\)和变量\(y\)的函数图形呈现为一条直线或线段,那么我们就说\(x\)和\(y\)是一种线性关系,不仅如此,其实还有一些数学解释也可以说明什么是线性,但这里,我们用上面的分类线\(y=\alpha x+\beta\)就可以说明了,而实际上线性回归问题就是感知器的非网络表达形式。
上面的感知器可以有效的进行二分类,在实际应用中我们也经常这样使用,但是这种感知器就一定很强大吗,有没有它完成不了的分类呢?当然,万事万物都有局限性,我们引入几个逻辑门来阐明一下这种局限性。
我们曾经在逻辑电路中学过与门,或门,与非门,或非门,异或门等几种基本原件,如下图1.1.12,这些原件组成的电路构成了最早的计算机。虽然这些原件的名字听起来太理工科了,但是我们可以换个方式来理解这些生硬的器件,比如,儿子想看动画片,与门表示完成作业和吃完饭两个条件均满足才能看动画片;或门表示,只要完成作业或者吃完饭两个条件其中有一个满足就可以看动画片等等,对照表1.1.2,你可以更容易地去理解。
图1.1.12
继续观察这些逻辑门均有两个输入,一个输出,输入我们可以用1或0表示,输出也可以用1或0表示,实际上计算机也就是通过0和1来处理信息的,计算机把0视为假,1视为真,并把0和1组成的一系列信息经过处理,得到一个输出。现在,我们把这些逻辑门视为几个逻辑函数,这些函数的输入输出是什么关系呢,我们用下表1.1.2表示。
表1.1.2
图1.1.13
紧接着我们看看最后一个逻辑函数——异或逻辑,糟糕!一个感知器根本没办法进行正确的分类,我们不希望看的事发生了,它无法解决这个有趣的问题,但我们希望计算机再智能一点,能够帮助我们进行正确的分类。有解决方法吗?仔细想想其实不难,再增加一个感知器怎么样?如图1.1.15所示,Yes!这达到了我们想要的效果。让不同的感知器或者多个感知器一起工作,这是神经网络的核心思想。
感知器的局限性好像与我们后续的神经网络关系不大,但事实并不是如此,因为神经网络的一个重要设计特征就来源于对这个局限性的了解。神经网络并不仅仅就是解决一些简单的问题,比如把设定好的黄豆和蚕豆样本使用线性回归进行分类,实际上我们面临很多不可分的问题,异或门就是其中最简单的线性不可分的代表。引入这些概念其实我们是想强调一点——别忘了加入激活函数,把线性问题非线性化,这样会解决我们遇到的很多难题。
图1.1.14
图1.1.15
事实上的确如此,生活中我们没多大可能会遇到如此简单的线性问题,因为大多数事物的分布或者运动规律都不是线性的,这给我们的工作带来的不止是挑战,还有阻碍,但更多的是趣味,就是因为有了这些有趣的问题,才使得这世界多姿多彩。
参考文献:
1、《Python神经网络编程》[英]塔里克·拉希德