人工智能技术与现代应用

人工智能的定义

人工智能(ArtificialIntelligence,AI)学科从1956年正式提出,目前已取得长足的发展,成为一门广泛的交叉和前沿科学。

总的说来,人工智能的目的就是让计算机这台机器能够像人一样思考。如果希望做出一台能够思考的机器,那就必须知道什么是思考,更进一步讲就是什么是智慧。什么样的机器才是智慧的呢?它们能不能模仿人类大脑的功能呢?

我们这里讲一种人工智能的分类是按照强弱来分类的。这种强弱不是说人工智能机器人的强弱,而是它能够在多大程度上,来达到人类的水平。

弱人工智能

我们说弱人工智能其实已经广泛地存在,很多很多技术里面都使用到了弱人工智能。

弱人工智能的定义就是:一个机器,它能够在某一个方面,达到和人类相同的水平。比如说下棋的程序,比如说简单的识别程序。它都在单个方面,达到了和人类同等的水平。

强人工智能

什么叫做强人工智能呢?就是说一台机器在所有方面,都达到了人类的智能水平。就是说,它已经和一个正常人,是没有任何区别的。

超人工智能

那我们要介绍一个概念叫超人工智能,这是新提出来的一个概念,也是大家担忧的一个东西。就是当一台电脑,它在所有方面都远远超越正常人的时候,我们就把这种人工智能叫做超人工智能。

如果我们仅仅是达到强人工智能的时候,我们并不需要担忧这个人工智能,它会不会对我们的生活造成影响。它无非就是个正常人,它再坏,也不就是个犯罪分子。但这个超人工智能就不一样了。它如果是个好人的话,它无疑对我们的生活做很多好事。它如果是个坏人的话,它对我们就可能造成毁灭性的打击。

所以说,如果未来有超人工智能的出现,那它势必会大大改变我们的生活。

 

人工智能的定义:

 

人工智能是一门交叉和前沿科学。人工智能的目的就是要制造出能够像人一样思考的机器,或者计算机。

人工智能又分为,弱人工智能、强人工智能和超人工智能。

 

弱人工智能就是:一个机器,它能够在某一个方面,达到和人类相同的水平。

 

强人工智能就是一台机器在所有方面,都达到了人类的智能水平。就是说,它已经和一个正常人,是没有任何区别的。

 

超人工智能就是在所有方面都远远超越正常人。

 

如果我们仅仅是达到强人工智能的时候,我们并不需要担忧这个人工智能,它会不会对我们的生活造成影响。它无非就是个正常人,它再坏,也不就是个犯罪分子。但这个超人工智能就不一样了。它如果是个好人的话,它无疑对我们的生活做很多好事。它如果是个坏人的话,它对我们就可能造成毁灭性的打击。

 

所以说,如果未来有超人工智能的出现,那它势必会大大改变我们的生活。

 

 

什么是图灵测试?

为什么人工智能这么难实现呢?计算机的速度现在如此的快,最快的计算机可以几秒钟读完图书馆里面所有的书,内存可以大到存下世界上所有书的知识。有些我们觉得非常困难的事情啊,比如说:微积分、金融系统、翻译等等,对它们来说,都太简单了。有些我们觉得非常容易的事情,比如说:视觉,动态,移动,直觉等等,对电脑来说,真是太难了。这到底是为什么呢?用一个计算机前辈的话说:“所有人类需要思考的事情,计算机都远远超越了人类。所有人类都不需要思考就做到的事情呢,计算机,就远远不如人类。”那些非常简单的事情,比如说我们拿起一本书这么简单的事情,对计算机就非常的难,这是一系列复杂的物理动作,包括肩膀手肘,手腕里面的肌肉,它配合着我眼睛的运作,使得我们能够在三维空间里面准确地拿到这个位置。

这是因为我们通过几亿年的进化、优化出来的。包括经络和肌肉,都是祖先已经帮我们安排好了的。要人去帮计算机把这些都配置好是非常非常困难的。对你来说非常轻而易举的事情,是因为我们脑子里面的这些软件已经非常非常完美了,但是对计算机来说没有这么完美的软件,它完全靠蛮力来算是非常非常费时的一件事情。

总的来说,对计算机而言,它学的东西越多,速度越慢。但对人来说,你教给人的知识越多,它反应是越快的。这是人和计算机的一个非常大的区别。

我们再来讲一下这个电脑速度的发展。其实现在电脑速度的发展已经非常快了,像我们国家的天河二号。它每秒能够进行3.4亿亿次计算,但它非常非常大,占地有700多平米。

电脑处理速度的发展

电脑发展的定律叫做摩尔定律:定律是由英特尔(Intel)创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。

每两年,硬件的运算速度就会翻一倍。如果两年前,花一千美元能够买一台2G的电脑。现在花一千美元能够买一台4G的电脑。那我们想,计算机达不到人类的水平是因为速度太慢吗?人类的大脑的运算速度已经有生物学家测量出来了,是一亿亿次每秒。那么说,现在最快的计算机已经达到跟人类一亿的运算速度了,但它为什么没办法和人脑一样的思考呢?是因为软件方面的问题。

所以说,我们现在的计算机的运算速度已经达到了强人工智能的水平,它至少可以在硬件上面和人脑PK一下了。当然,我们现在还不能去买一台天河二号放在家里,这是不现实的。可能在未来的10到20年,我们买一台家用电脑,它和人脑的运算速度是差不多快了。所以,我们又要想到一个问题,我们人脑的运算速度这么快,当我们算一个数的时候,还需要经过几秒钟的算的时间,这是为什么呢?

这是因为我们跟电脑的基本的组织结构是不一样的。我们需要接受一些信号的时候,要经过非常非常复杂的处理,才能够进行一些判断。电脑只需要非常小的一个时间单位就把这个东西给算出来了。所以当我们看到一个计算机的智能可以模拟一个蚂蚁,我们会觉得它很可爱。但当有一天,计算机的智能接近于我们人类中最傻的一个人的时候又或者有一计算机的智能已经超越我们,甚至更高的水平的时候,我们可能就没有办法理解这样的事情了。

空气动力学上说,人奔跑到一定的速度,就能够飞起来。那么我们能不能够说,一个计算机,它的运算速度达到一定的极限以后,它就能够产生一定的智能呢?这是有可能,这也是老师在这里开的一个玩笑。

到底什么时候能够出现强人工智能?就是和人类同样智能水平的机器,很多人的看法都是不一样的。包括专业的学者,包括专门做人工智能研究的人,他们也有可能有很多很多的分歧。

有些专家就做了一个问卷调查。涵盖了数百位这个人工智能的专家。问卷内容是, 你预测的人工智能在什么时候会出现?并且让回答者做了一个乐观的估计,不需要给出一个具体时间,而是拟一个时间段,比如说10年到20年, 20年到50年。

就算是最差的一种情况啊,也就是说,我们在有生之年,都能看到这个和人类同样智能水平的机器的出现的。还有一种人预测,在我们的有生之年里面就能够看到超人工智能的出现。也就是说,看到一个电脑,它在所有的方面都能远远凌驾于人类的这么一个机器的出现。并且,这些专家预测了,超人工智能的这种模式,未来超人工智能,它是一种什么样的模式出现的呢?

超级人工智能的工作模式

1、先知模式

它能够回答所有的问题,包括对人类来说非常非常复杂的问题。比如说,我们怎么样造一个更好的机器等。我们给它任何复杂的问题,它都能够回答出来,这叫做先知模式。

2、精灵模式

它就像我们佩戴在身上的这种东西,跟着人走,它能够执行任何的高级命令。比如说,我让它把这个书翻开,或者又就像一个很好的仆从一样,跟着每个人。

3、独立意识模式

或者是,它是一种独立的意识模式,它比我们聪明很多。他可以执行任何开放式的任务,就有点像终结者里面那个施瓦辛格。它也可能会有自己的意识。所以第三种情况,相对来说,风险性比较大的,他太自由了,所以他产生独立意识的可能性也比较大。

老师之前提到了很多的专家和学者,都没有提到他们的名字,并不是说这些学者都不够优秀,或者不够出名,而是我觉得,你要是真正来做这个领域的研究,或者深入的了解这个领域呢,你都会清楚,如果你只是过来学学这个学科呢,你没必要知道谁说了这个话,或者谁做了这个调查。但是有一个人的名字大家一定要知道。这个人不但是非常有名,而且对人工智能整个领域的奠基做出了非常重大的贡献。

诺贝尔奖大家都知道是颁给科学领域最杰出的科学家的,但诺贝尔当年在世的时候没有计算机,所以诺贝尔奖没有设立计算机的奖项。但是有一个跟诺贝尔奖有同样含金量的奖项叫做“图灵奖”。下面我们来介绍一下图灵。

介绍图灵就需要提到一部电影,这部电影叫做《模仿游戏》。电影就是描述了图灵在第二次世界大战时帮助盟军破译德军密码的事情,他传奇的一生做出了非常多的成就。图灵不但设置了图灵奖,更重要的是他还定义了一个如何测试机器的智能水平的测验叫做图灵测验。

图灵测验:如果电脑能在5分钟内回答由人类测试者提出的一系列问题,且其超过30%的回答让测试者误认为是人类所答,则电脑通过测试。

比如我们现在很多手机上都有SIRI和一些公众号,也可以进行交谈,但它们是不足以通过图灵测试的一些软件。我们现在就来测试一下SIRI系统,看它是不是能达到图灵测试的水平。

你不管和它说多少句,它都不会烦,但如果你和一个真人,不停的打招呼,他肯定会说,你这个人是不是有毛病啊?我们还是能够非常轻松地把它和真正的人给区分开来。

如果我们需要这个SIRI的程序员像真人,那也行, 问我第一次的时候它说:“你好!” 问它第二次的时候:“ 你怎么又说?”问我第三次的时候说:“你烦死了!”我们这样设置一下, 不就可以了吗? 但这不一样啊,如果我早上手机放在这和它说了句:“你好!”然后过了一段时间我一个朋友过来拿着说:“你好!”它就说:“你烦死了!”那我这个朋友就会觉SIRI是不是有问题。 所以,我们在设计人工智能的时候不但需要智能,还需要辅助。 比如说要识别区别讲话的这个人是不是就是刚才的那个人。所以人工智能是非常复杂的,想想好像特别简单, 但其实上是很难的。 比如我问一个手机:“你看看窗外什么景色啊?”机器根本就说不出来。这就是我们讲的一个图灵测验的一个内容。

 

计算机处理速度的不断增长,已经高达亿亿次的计算速度,但是还不能与人类的智能相提并论;

在有生之年可以见到强人工智能的出现;

人工智能氛围三种模式:

先知模式,能回答所有的复杂问题;

精灵模式,能像server一样,提供服务;

独立意识模式,有自己思考问题的能力。

图灵测试,除了能回答问题,还要有一种模式识别,是计算机科学技术,人工智能,测试,程序设计,FPGA,UML,DSP,面向对象,数据采集,现场可编程门阵列,J2EE ,工作流,软件无线电等等的一种综合合成后产生的,人工智能测试。

 

 

人工智能的主要学派

我们这节课的最后来讲一下人工智能的基础。人工智能这门课是一门前沿的交叉学科。什么是交叉学科?就是这门学科它涵盖了非常多其他学科的知识。为什么会出现交叉学科呢?交叉学科主要是针对一些开放性的问题,就比如说“人工智能”。学哲学的人觉得他想来解答这个问题,学心理学的人也有一套解决这个问题的思路。最多的就是学计算机的人,直接就把人工智能做出来,但学计算机的人也有可能有很多不同的思路。所以人工智能这门课它包括:哲学、数学、神经科学等。

神经科学主要是研究脑科学,包括很多生物学的科学家,他们通过观察生物的脑的运作来解释人脑到底是怎么操作的。心理学和人工智能其实是非常像的,我们买一本心理学的书和一本人工智能的教科书放在一起。发现有非常多的相似之处。第一章都是讲学科,第二章都是讨论记忆,第三章则是推理。所以心理学很多时候都会阐述很多人工智能需要了解的问题。然后是计算机工程,计算机工程就更加直接了,包括编程、SIRI等很多的人工智能都是计算机工程的工程师们把它做出来的。还有就是语言学,人工智能里面有很多关于自然语言处理和自然语言理解方面的一些问题都包括了一些语言学的成分。有这么多知识支持着这门学科,所以人工智能是一门重要的交叉学科。

由于有这么多学科的人来参与人工智能这个问题的讨论,所以人工智能就产生了一些主要的学派。我们这里讲到学派,并不是像大家想的像武侠小说。学派就是他的研究偏向于某一种理论基础。因为人工智能这门学科并没有大家都笃定的一套理论基础。不同的科研人员可能选择不同的基础。

生理学派或连接主义

比如说连接主义,它可能需要观察神经,大脑是怎样运作的,靠现象来说话。这个学派的人可能认为大脑是怎么运作的,电脑就该怎么运作。这样才能生成一个真正的人工智能。这个方向,现在发展得非常好。但是这个方向不一定就是对的。为什么呢?这个人类在发明飞机的时候,首先看到飞机是有翅膀的,但是鸟是拍着翅膀飞的,但实际上我们做出来的飞机却并不是拍着翅膀飞的。所以只要我们能够达到人工智能这个目的,至于它是不是和人是一个原理其实并不是特别重要。

逻辑学派或符号主义

接下来还有符号主义,符号主义主要是一些做数理逻辑、心理学的一些人,都会偏向于做这个方向的一些研究。这个研究在前一段时间比较火,最近几年没有很大的发展。但我们不能觉得它现在不行以后就肯定不行。学科学派都是此起彼伏的,最后人工智能到底是由哪一派的人做出来还是学派结合地做出来,都是不知道的。

行为主义或控制论学派

说到结合,由于现在人工智能领域已经开始商用化,已经有很多的工程师开始介入到这个领域来了。所以像老师就没有所谓的学派,这个原因是因为,最开始做人工智能的人都不是一直做人工智能的,他有可能本来就是做计算机研究的,甚至可能是做生物学或者是心理学的。他是对这门学科产生了兴趣,才来做人工智能研究的。现在很多人工智能的学者,他有可能一开始就做人工智能研究。所以他就没有所谓的一个学派的分别。以后, 学派之间的关系会越来越淡。

 

人工智能的主要涉及的领域非常多,像我们刚才说的弱人工智能就是在某一个领域。已经达到人类水平的机器已经深入到我们生活的很多角落里面去了。

计算机视觉

比如说计算机视觉中的图像识别、图像分割等。大家都玩过美图秀秀这个软件吧,它就是能把照片中的任务自动的变得非常好看,这个功能其实就用到了计算机视觉的一些知识。比如我要面部五官定位,那么等于是我找了一个专门做PS的人帮我把这个图给P了一遍。


      自然语言理解

其他的关于自然语言理解包括google翻译等,我们把一段文字输入到网页里面,它能自动就把文字翻译过来,相当是一个翻译的专家专门为你做了这件事情。当然,这个技术现在还不是特别成熟,我们可以看到有很多机器翻译的反例在网上。

机器人技术

以前我们说机器人技术,似乎对我们非常的遥远!多么高大上!但现在你花上一千块钱,就能在家电商场买一个机器人扫地机放在家里。它能够自动的判断地上的灰尘和杂物,它能把它清理掉,当然也是还不够成熟。有一天我看到一个网友发帖子说,他打开门收个快递,发现机器人扫地机就离家出走了,这说明,机器人技术还有很多需要改进的地方。

以后会有越来越多的机器人走进我们的生活,这也是人工智能对我们生活一个最直观的影响。

 

人工智能兴起是是有很多其他领域的专家由于对人工智能研究产生兴趣构成的,所以,人工智能起初有很多学派之分。

 

弱人工智能已经在市面上可以轻易地买到了,但是还存在很多缺点。

 

状态空间法

 前一阵子,老师有个朋友向老师推荐了一部电影。当时他绘声绘色的跟老师描绘了一下,非常非常的好玩,老师非常地感兴趣啊,就想一定要看这部电影。过了几天以后,老师把名字给忘了,但电影还是想看啊,又不好意思问人家,老师没办法,就打开某度搜索,我就把这部电影从网络上搜出来。老师想了一下,好像记得是一部法国电影,我就把“法国电影”打进去一搜,出来六千多个结果,这怎么办呢? 我不可能重新看所有的结果吧,我还得再找找线索。我后来想想,这部电影说的不是现代的事情,于是我打了一个“中世纪进去”,很明显,搜索的结果变少了,只有一千多条,但是,还是没办法找啊!后来我冥思苦想找了好久,好像他提到过,这是一个关于谋杀案的事情,最后我把“法国电影”、“中世纪”、“谋杀案”打进去以后,就出现了一个搜索结果,好像就是这部电影名字叫做《香水▪ 一个谋杀犯的故事》。终于老师如愿以偿的找到了这部电影。看完了以后,觉得非常非常的好看。

今天我们着重来讲讲这个“搜索技术”。刚才我说的这个例子可能很多同学在生活中都碰到过。在网络上搜索各种各样的资源,比如音乐、电影、文件等等,说明这个搜索技术对我们的日常生活已经产生了非常大的影响。

搜索是怎么样在电脑中进行的?

可以说搜索是人工智能的一个基本问题。我们更可以说搜索是计算机的一个基本问题。任何一台计算机设备它都要用到搜索技术,这个技术实在是太基础了,所以每一台计算机设备都要用到。我们更可以认为搜索是人类智能的一个基本问题。我们人在进行视觉识别,包括我们听到一个声音,我们看到一个图象,说一句话的时候,其实在脑海中都进行了搜索。

状态空间法

说到这个搜索问题,我们就不得不讲状态空间。什么叫做状态空间呢?状态空间就是计算机在进行搜索的时候的一个空间。状态呢?任何一个设备比如手表,它有时钟的指数和分钟的指数。当时钟的指数和分钟的指数都确定的时候,我们可以说这个手表处于一个状态,也就是现在的时刻。比如现在是13点40分,这是一个具体的状态,那么所有的手表的状态有多少种呢?假如它只有时钟和分钟的话,那就是12*60总共是720种状态,这样就构成了一个手表的状态空间。

其它的东西也有很多的状态空间,举个很有意思的例子:树袋熊除了在睡觉就是在找东西吃,它的状态就非常简单,它23个小时在睡觉, 1个小时在找东西吃。

像空调也有很多种状态,比如说它在制冷,或者说制热,这是它处的状态,但它的状态空间是一个非常大的一个范围,比如空调上面它有很多其他的参数,当它所有的参数都处于一个确定的值的时候,我们说空调处于一个什么样的状态,比如说制热多少度,这是一个状态;制冷多少度又是一个状态。它可能的所有状态的集合就组成一个状态空间。

状态(State):是表示问题求解过程中每一步问题状况的数据结构,它可形式地表示为: S={S0,S1,…},当对每一个分量都给以确定的值时,就得到了一个具体的状态。

状态空间里面我们还要讲一下操作这个问题,就是说我们从一个状态到另外一个状态之间,要经过一个什么样的操作才能从一个状态切换到另外一个状态呢?很多设备都做了这种人机交互的接口。比如说,按钮,我按一下这个按钮,它就从一个状态切换到了另一个状态。我们在设计设备的时候,我设计一些函数或者手段,当我们按这个按钮的时候,其实就是触发了这种函数或者手段。

操作(Operator): 也称为运算符,它是把问题从一种状态变换为另一种状态的手段。操作可以是一个机械步骤,一个运算,一条规则或一个过程。操作可理解为状态集合上的一个函数,它描述了状态之间的关系。

比如我们小时候玩过很多游戏像俄罗斯方块,积木从上面掉下来,我们按一个键,就变了一个方向,就说明我们通过操作让积木从一个状态切换到了另一个状态。说到状态空间呢,计算机学家都通常会提到一个游戏,就是围棋。围棋的状态空间,非常非常大。大家可能觉得,这个棋盘非常小,为什么这个空间这么大呢?围棋有391个交叉的点,391个交叉的点上,都有3种情况,有棋和没棋,有棋有两种情况,黑棋在这,白棋在这,它总共有多少种布局呢?它有3391,这是一个什么样的概念呢?可能大家没有接触过这么大的一个数,这个数,如果我们用最强的电脑来算的话,也要算到人类灭绝那天都算不完。

 

所以我们进行围棋下棋的时候,不可能把所有的棋局都考虑一遍再来进行判断,我们在进行搜索问题的时候就是在一些非常非常大的空间里面进行搜索。这时候我们必须要想一些办法。

还有一个问题叫做旅行商的问题,也经常是人工智能和做计算机研究的人非常喜欢考虑的。旅行商问题在接下来的课程中可能会经常提到。这个问题是三十多年前提出来的,那个时候大概只要商人去这么多地方出差。他要去30多个地方,他怎样走一遍的距离是最短的?

这样一个问题也是一个非常大的搜索空间。如果说我们有20个城市的话,这个数量级也是相当相当大的。不是计算机一下能够算出来的。怎样找到最短的距离呢?也要涉及到一个搜索的问题。搜索的问题在什么时候要考虑呢?如果计算机能够把东西都算一遍的话,不管它怎么搜,问题都不大。当我们没有能力把所有的空间都遍历一遍的话,我们才要用到这个搜索技术。

状态空间一般由4个部分组成。

 

初始状态的集合:比如空调,它出厂的时候是关着的。手表买回来的时候是00点00分。操作符的集合:设备上这么多按钮都是操作符,这些按钮都能够改变设备的状态。目标检测函数:我们要搜到一个什么样的目标。空调和手表,虽然都有状态空间,但它不是一个搜索问题。如果我们要用状态空间来进行搜索的话,我们就一定要有一个搜索的目标。比如说我们的旅行商问题,我们要有一个合理的走的路线,这就是一个搜索的目标。目标检测函数:就是检测当前的状态是不是我们的目标状态。有些时候我们的目标很简单,当我们的目标很复杂的时候,可能需要一个比较复杂的检测函数来检测。路径费用函数:就是来衡量某一个搜索的方法好不好。比如刚才我们说的走法,比如说我们算的是时间的一个花费。也可能算我们花的钱的花费。我们要找一个旅行方案,但是路径费用函数不一样。你要的是最省时的方案呢?还是最省钱的方案呢?这是两种不同的方案,它搜出来的结果也是不一样的。我们就是由这个路径费用函数来决定的。老师定义了一个非常简单也非常好玩的一个状态空间,我们来看下面这个图。

这个图我们模拟了一个非常简单的打怪物的游戏。操作有三种,第一种,我攻击怪物,结果是怪物的血量-1。还有一种是怪物攻击我,结果是我的血量-1。最后一种是我给自己治疗,这个操作的结果是我的血量+2。我们为了打败这个怪物,就有一个目标状态。这个目标状态,我的血量要>0,怪物的血量要=0.还有路径费用问题,我每攻击怪物一次回合数+1。

初始状态时最开始我碰到怪物的时候,我的血量是3,怪物的血量是5。

我们希望在最短的回合内,把怪物打败是最好的方案。我们可能有很多很多种方法可以达到这个目标,但我们想要找到最快的一种方法这就是一个搜索的问题。比如100个回合以后我把怪物打死了,目标虽然达成了,但是这个方法不一定是好的。搜索的问题就是找到一种非常快的或者是好的方法达到我们的目的。

说到这个搜索问题,还有一个非常经典的游戏。人工智能和游戏有非常大的渊源。我们说的游戏包括像棋牌类、八数码问题,比如我们小时候玩的拼图、移图的游戏。它有9个格子,8个数。一开始这8个数是混乱的。最后我要把它移城12345678,这么固定的一个顺序。8数码问题初始状态可能就是一个随机的状态。操作就是可以把这个棋往空的地方上下左右移。很多的拼图(jigsaw)也是这样来移的,这就是一个典型的搜索问题。

我们在讲人工智能搜索问题的时候绝大多数人都会给这个例子,因为这个例子非常的经典。如果你学了这门课,我给你举打怪物的例子,但你到别的地方去,人家给你看八数码这个例子你不明白,我们还是来讲讲八数码的例子。

很多人都用到这个例子。像中国的华容道其实跟这个也很像。华容道的游戏,曹操,最开始在上面,旁边都是张飞、马超、 赵云等等。最后你要把曹操从这个格子里面给移出来。这个移法也是一个搜索问题。它有很多种走法,还不是很容易走,老师小时候走了好多遍都没走出来。

搜索的问题,都是一个东西有很多固定的状态,它都是能从一个状态搜索到另外一个状态,这中间我到底要进行一些怎样的操作能够最快的达到这个目的。

 

深度优先搜索和广度优先搜索

我们在搜索策略中又分一个叫广度优先搜索和深度优先搜索。这是我们今天讲的另外两个比较关键的概念。这两个概念在我们讲的公司的面试和考试里面都经常会提到。

关于这个深度优先搜索和广度优先搜索老师先举一个非常通俗的例子。假如有一天你在校园里面看到一个背影非常好看的女孩子。长头发,穿着白色的裙子,穿着校服还有一双旅游鞋,你看了一眼她就不见了,你非常想把她找出来。

如果你这样找:把全校所有女生都叫到操场上来,深度优先搜索怎么搜索呢?一个一个地叫上来看是不是长头发,是不是白裙子,是不是穿校服,是不是穿旅游鞋,不是的话就让她走,是的话就让她留下,一个一个找,找完以后转过去,看看哪一个是你要找的那个人。广度优先搜索怎么找呢?先让穿白裙子的站一边,不穿白裙子的都走。白裙子里面,长头发的站一边,不是长头发的先走。最后穿旅游鞋的站一边,不是旅游鞋的先走。剩下这些人你再把她转过去,看看哪个是你想要的。这就是一个深度优先和广度优先的一个例子。这个例子不一定举得很好,这里只是举一个例子,大家不要深究。

广度优先搜索:从初始节点S0开始逐层向下扩展,在第n层节点还没有全部搜索完之前,不进入第n+1层节点的搜索。Open表中的节点总是按进入的先后排序,先进入的节点排在前面,后进入的节点排在后面。

可以看图上,这是一个八数码的图。第一层,有三种挪法:第一钟就是把中间的8移上去;第二种就是把2移到右边;第三种,把3移动到中间。广度优先搜索会先把所有的三种挪法都看一遍,看是不是我们要找的序列。如果说不是的话,我再看下一层。在下一层,我们上一层的第一种挪法又有三种新的展开。我们就是这样一层一层的往下过。直到找到我们要找的那个序列为止。广度优先还比较好理解。

深度优先搜索:从初始节点S0开始,在其子节点中选择一个最新生成的节点进行考察,如果该子节点不是目标节点且可以扩展,则扩展该子节点,然后再在此子节点的子节点中选择一个最新生成的节点进行考察,依此向下搜索,直到某个子节点既不是目标节点,又不能继续扩展时,才选择其兄弟节点进行考察。

看这个图,先从最边上的那种挪法开始,如果最边上的挪法不是我想要找的那个序列的话,它从最边上这个挪法又往下扩展。一直在挪,挪完以后,再看是不是。把整个一条树走到最边境。

 当然,你问老师这两种方法到底是哪一种比较好,老师不敢说。这两种方法都各有各的优点。它都是叫一种全局搜索, 就是要把所有的空间都要走一遍。

有限深度优先搜索:我们先进行深度优先搜索,当搜索深度达到了深度界限,而尚未出现目标节点时,就换一个分支进行搜索。

比如说我挪八位码,挪到一定的程度以后,如果还没找到,我就觉得这个方向不太对,我就把它原路挪回来,然后我再从另外一个方向开始挪。这个有界深度优先搜索最明显的例子就是走迷宫。我们沿着迷宫的线路走,发现离目的地越来越远的时候,我们又会走回来。

包括我们在开车找路的时候也经常会碰到这样的问题,我们不会一条巷子走到底,发现碰到墙我们再往回折。基本上我们走到一定的深度,发现不太对,就会往回折。

迭代加深搜索:先任意给定一个较小的数作为dm,然后按有界深度算法搜索,若在此深度限制内找到了解,则算法结束;如在此限度内没有找到问题的解,则增大深度限制dm,继续搜索。 

迭代加深搜索是一种回避选择最优深度限制问题的策略,它是试图尝试所有可能的深度限制:首先深度为0,然后深度为1,然后为2,等等,一直进行下去。

问题:迭代加深搜索看起来会很浪费,因为很多节点都要扩展多次。

假如我要去找一个药店,向东西南北四个方向,我先往东走两公里找一找,没找到,我又往西走两公里,没找到。东西南北两公里发现都没有药店。我就把搜索的范围增加到5公里。往东走5公里,再往西走5公里。再找不到我再变成10公里,直到我把药店找到为止。这就叫做迭代加深搜索方法。这种方法,在实际的生活中也是非常常见的。但是这种迭代加深搜索,还是一种非常盲目的搜索方法。如果光用这种方法,搜索效率还是非常低的。很多种情况下,我们对搜索的目标是有一定的了解的。如果我们对搜索目标和搜索范围没有任何了解的话,我们只能像刚才所说的那样。

就像我刚才说的那个例子。假如北边全部是一片森林,如果你知道这个信息以后你肯定就不会往北边走了。如果我告诉你西面有学校或者商圈,你肯定会认为那边有药店的概率会比较大,这种就是叫启发式。

启发式运用某种方式或方法去判定事物的知识和技能

 

 我们说的具体一点,像八位码的问题。看上去好像是盲目的搜,但高手都知道是怎么搜的。包括玩魔方,我们要把六个面的颜色都挪成一样。不会玩的人,随便挪可能永远挪不成那样。会玩的人可能几步就挪成那个样子了。



八位码问题就是我们当前状态,和我们要找的那个目标状态。它是有一个差别的。比如说我们9个格子里面有8个数,它和最终状态差的很近的话,那么是不是这个状态就比较好了。如果差的很远,那么这个状态就比较不好。

当然具体的来说,启发式信息它包括两个部分。

这两个部分一起叫做估价函数,记为f(x),它由两个部分组成。第一个部分叫做g(x),为从初始节点S0到节点x已经实际付出的代价。从刚开始搜,到我们现在这个状态,是不是付出了很大的一个代价。 代价表现在很多方面,比如这个旅行商问题,就是我们花费的钱,或者是走得时间。八位码问题就是我挪的这个步数。他根据不同的问题,这个代价是不一样的。

H(x)表现的就是当前状态和目标状态的一个差异。启发式就是要猜测,从这个节点开始到找到我们目标节点的可能性有多大。

这是我们存在的两个约束,在设计这个启发式的时候我们经常要考虑这两方面的问题。

 

深度优先搜索,就是从一个起始节点的一侧开始,一直向下遍历到底。

广度优先搜索,就是按每次挪动一步分层,每次遍历一层。

有限深度优先搜索,就是将深度优先搜索先限定一个深度,到达这个深度没找到就返回起始节点。

迭代加深搜索,就是有限深度优先搜索的改进,当某个深度到达不了时,就加深搜索深度。

如果搜索没有方向,则会很耗时间。所以产生了启发式。

启发式:运用某种方式或方法,判定是我的知识和技能。

 

 

A*搜索

下面我们来介绍一种具体的算法,我们把它叫做A*算法。

 A*算法很重要,它广泛应用于游戏、导航等多种应用程序中。我们在打网游的时候站在一个高地上打一个怪,它如果走直线的话有可能会撞到墙,如果不走直线的弯着过来走什么样的路径?这就是一个搜索问题。它有可能绕一个大圈过来,它也有可能绕一个小圈过来。比较智能的情况是绕一个小圈过来,不然就被你白打。这是一个典型的搜索问题,这种算法很多时候就是用A*算法实现的。

 A*算法: 就是一种启发式算法,它的估价函数由两部分组成。避免对已经扩展的路径进行再扩展。

                                                        f(x)=g(x)+h(x)

g(x)是已经走过的路程的代价,即从初始节点到x的最小距离。h(x)是从x到目标节点的最小距离。

对于具体的这个八数码的问题,g(x)很简单,我们挪了多少步,g(x)就等于几。h(x)是怎么回事呢?h(x)是1,2,3,4,5,6,7,8,假如我们把它们叫成牌的话,h(x) 等于它们不在位的距离和。图上这个例子是这样分布的,28316475,2它现在在的这个位子,它离它应该在的位置的距离是1,像3,4,5,7已经在牌好的位置上了,所以它们的不在位距离是0。像2,8,1,6,1的差距也是1,6的差距也是1,8它现在在最上面,但它应该在最下面,所以8的差距是2。所以h(x)在这样一个状态下,它的值是1+1+1+2=5. 这就是我们A*算法的h(x)的一个例子。

如果说换到我刚才说的那个打怪物的那个例子里面,它的h(x)应该怎么设计呢?我最终要把这个怪物打死,当然我的生命值是越高越好,那么我现在的状态就是,我的血量减去怪物的血量,要越高越好。所以这里的h(x)设计成我的血量减去怪物的血量。我的血量越来越少,怪物的血量越来越多,这种状态肯定是我不想看到的。

那么,这就是我们关于h(x)的另外一个例子,这个函数,在启发式算法也好,A*算法里面也好,都是非常关键的东西。所以大家一定要学会去设计这个函数,这个函数是根据你对目标的一个理解来设计的,不是盲目设计的。 如果这个设计得不好的话, 你可能会在搜索的过程中走很多的弯路。 这个图是我们这个A*算法在8位码的一个搜索的图。

我们可以看到,我们这个初始状态和刚才那个例子是一样的,2831647空格5。初始状态旁边有个0+4,说明g(x)是0,我们还没有走任何步骤。4是什么意思呢?4是说当前状态和目标状态的一个差异,就是不在这个顺序上的数和在这个顺序上的数加起来的一个和。这个状态它可以衍生出来的下一个状态,它有三种挪法。这三种挪法都会导致它的g(x)加1,但是这三种挪法导致的h(x)呢?也就是它现在的状态与目标状态的差异呢?左边一种和右边一种都是增大的,只有中间一种是减小的。那我们就假定先从中间一种开始搜,然后我们在用同样的方法又衍生出三种状态,其中有两种状态它的h(x)都是一样的,在这种情况下,我们就把两种状态都展开,发现我们得到了4种状态。g(x)就是说初始步数都移了3步,但有一种状态离目标状态是非常近的,它只有两个数不在牌位上,那我们就理所应当的从这个状态开始往下搜了。这里我们要注意的非常关键的一点就是,我们不是沿着一个地方一直往下搜,就不会往回走了,什么时候会回走呢?比如说我们搜索到第四步的时候,我们这里是4+1,但这里4加1变成4加3的话,那么我们会觉得这条路径搜索是不对的,我们要走到哪里去搜呢?我们要走到我们最左边的这个3+3这里开始搜,因为它是现在我们这个候选状态中总体的估价函数最小的一个。而不是随便找一个,我们是永远从总共加起来的和最小的一个往下来搜,这就是我们A*算法的一个主要内容。

 

 

游戏AI中的规则

哎,又被电脑虐了,这个AI真是设计得太强了,老师根本就玩不过它,今天老师非得研究研究,这个游戏AI到底是怎么样运作的,我们今天就来学习《游戏AI和基于规则的系统》

经常玩游戏的同学可能对游戏AI已经非常非常熟悉了。我们玩即时对战游戏中对战的电脑其实并不是我们玩的时候有个机器人在电脑前玩,而是在程序里面有一个AI的程序,程序能够模拟人和玩家进行对战。

还有的网络游戏中一些在野外的怪物包括NPC( non playercharacter),也就是说非玩家角色,比如说商店的老板、卖药的、卖武器的,这些NPC就会一些非常简单的命令,当然也有非常复杂的NPC,基本上就是“你好!”、“欢迎惠顾!”、“ 谢谢惠顾!”,大概就是一些这样的简单的命令。

我们打的BOSS也可以叫做AI,它们都会很多命令比如攻击、防守, 逃跑等。今天我们讲一讲游戏AI就为了介绍基于规则的系统。很多AI都是由规则来规范游戏里面这些角色,我们来看一下什么样的AI是好的AI呢?

一般来说设计AI的时候有考虑三点:

1、愚蠢的 AI不可行。如果一个AI太蠢,比如说你一直打它都不过来,这肯定是不行的。我记得以前魔兽世界里面有一个领袖叫凯恩血蹄,它是牛头人的领袖。按道理来说, 这个角色非常非常强大,但因为这个AI设计得不好,60级的时候它就被一个猎人放风筝(你打它一下, 它就会来追你),但是因为你的射程非常远,它又跑得没你快,所以它就被你一路这样打死。这就证明这个AI设计得是有缺陷的,所以不能设计过于愚蠢的AI。

2、不可设计随机的AI。如果一个游戏的AI设计得过于随机的话,这个玩家会非常郁闷。比如说我们玩游戏的时候碰到一个怪物,一开始打的时候发现它满地喷火。打了半天发现打不过啊,然后我们回去换了一身装备专门针对它喷火这个技能整装待发,重新走到它面前,发现它又开始放冰魔法了,这就说明这个AI设计得太过于随机了,这个随机的敌人就太致命。所以,AI也不能设计得太随机。

3、不能设计太过于复杂的AI。这个复杂AI的意思就是说不能让它耗费太多电脑的资源。不能开个AI电脑就非常卡,这就说明AI太复杂。 

以上就是关于什么样的AI是一个好的AI。说到这个游戏AI ,就不得不提一件陈年往事。这是在我们人工智能史上一个里程碑的事情。就是“深蓝”电脑,”深蓝“是IBM公司生产的世界上第一台超级国际象棋电脑,是一台超级并行处理计算机,计算能力惊人,平均美妙可计算棋局变化200万步。1997年5月,IBM公司研制的深蓝计算机战胜了国际象棋大师斯帕洛夫。这个事件引起了广泛的关注,大家说人工智能战胜了人类了,舆论又开始炒作。其实是很多专家在一起研究了一个下象棋的系统,这个系统只能下国际象棋,它就可以看成是一个下国际象棋的专家,我们就说这种系统叫做专家系统。说起来,卡斯帕罗夫还挺冤的。深蓝这个电脑是由IBM公司和其他十几位国际象棋专家联合开发的。而这十几位专家专门的研究了卡斯帕罗夫下棋的技巧很多时间。然后再和IBM的电脑工程师花了很长时间才做了这么一件事情。并不是说这台电脑打败了它,而是说这十几位专家和电脑一起打败了他。所以我们觉得他是虽败犹荣。但是这个事情告诉我们,如果说我们给予电脑足够的知识,以及给予电脑足够的沟通的话,那么可以使得电脑在某一个领域非常的擅长。

在很多领域都有了非常非常多的应用。 比如说中医诊断、气象预测等,这些都是只有该领域的专家才能够做的事情,现在我们用计算机就能做到相同的事情,我们把这些计算机统称为专家系统。那么我们还说回到游戏AI里面来,游戏AI也是专家系统的一种,它是专门负责在游戏中陪玩家玩的。只是我们在游戏中经常碰到的AI都比较弱。我们来了解一下网游中是如何设计一个怪物AI的?

我们看以上这张图片,这是一个熊怪,它看上去凶神恶煞,其实它确实非常厉害,老师以前玩游戏的时候无数次的倒在它脚下。这样一个熊怪,我们经常看到它在游走,或者它在和玩家打,我们还看到它在跑或者在逃,它的这种行为其实是由一些列的规则来约束的。老师举出的这些规则:

R1:当没有任何玩家在身边时,进入游走状态;

R2:当有玩家进入一定范围时,进入警戒状态;

R3:当有玩家接近或受到玩家攻击时,进入战斗状态;

R4:当血量不足20%时,进入逃跑状态;

R5:当血量降至0时就进入死亡状态。

 

有限状态机

上节所说的这五种状态,我们在AI设计的时候用了一种叫做有限状态机的系统。我们今天学习的第一个非常重要的概念。

以上是一个有限状态机的图。图中间有刚才我提到的五个状态,什么叫有限状态机呢?就表示在有限个状态之间转移的数学模型。就是说明这个AI它只会在这五个状态的中不停地转换。比如说演示有一个人过来把这个怪杀了。它先从游走,然后到警戒,接着到战斗,然后到逃跑,最后到死亡。如果一个玩家过来被这个怪打死了, 先是游走,再是警戒,再到战斗,然后它不会逃跑,它打死这个人了,它又回到了游走状态。这就是有限状态机。

有限状态机跟上节课提到的状态空间有什么不同呢?状态空间它不仅需要一个初始状态,还需要一个终止状态,并且普遍用于解决贯穿始末的全套问题。就是说它往往描述的不是一个物体的问题,它往往描述的是几个物体的。比如说我们描述的是一个玩家和一个怪物的状态看成是一个状态空间。往往一个怪物的变化,就经常看成一个有限状态机。所以说这个有限状态机和状态空间是不一样的。有限状态机通常用来描述一个物体的状态转换,而状态空间中通常就会有多个角色。有限状态机经常描述的是一个角色,而状态空间经常描述得是多个角色的问题,所以状态空间的状态通常比有限状态机的状态要多得多。我们看到这里只有5个,可能还有很多有很多状态的复杂的例子,但是我们这里只举出了5个来说明有限状态机这个有限状态机。

我们还进一步地想到,要使得AI更加的人性化,有时候为了增加游戏的可玩性,我们会给游戏AI一定的随机性。比如说,这个怪物和玩家在打的时候没有血了,它有两种可能性,80%的情况下是跑,它不跟你打,还有20%的情况,它会狂暴,就是说我生气了,我要打死你,这个攻击力会增加等,这种情况下我们要用新的数学模型,我们把这种数学模型叫做FuzzyState Machine(FuSM)。就是从一种状态转换到另外一种状态的时候是有一定的概率的。我们看以下这副图,我们新增了一个状态叫狂暴,从战斗到逃跑,我们有一条边,从战斗还有一个箭头到狂暴这个状态,从战斗到逃跑这个状态有80%的概率,到狂暴这个状态有20%的概率。这个概率,会在边上写出来。

还有一点,这个有限状态机的节点就是这个圆圈,就是每一个状态,边就是规则的前面的部分。那些规则的前件,比如说从游走到警戒这条边,这就说明当有玩家进入它的视觉范围内。当从警戒到游走又不一样了,就是当有玩家从它的警戒范围内撤走,包括游走到战斗,就是由玩家直接从超出它警戒范围意外的地方攻击到它,那么它就直接进入到战斗状态,当然你也可以说它有一条线,从游走直接划到死亡,那就说明有些时候我们级别高了,到非常低的区域去的时候,就直接把怪秒杀了。看到没看清楚你上来就直接把它打死了。

 所有说游戏AI基本上就是通过有限状态机,或者模糊状态机等这样一些数学模型作为基础来设计的。

 

 

专家系统

说了这么多游戏AI的内容,现在我们来了解一下什么叫做基于规则的系统

人工智能中很多规则,我们把它看成是一个产生式:产生式是由美国数学家波斯特(E.POST)在1934年首先提出,它根据串代替规则提出了一种称为波斯特机的计算模型,模型中的每条规则称为产生式。产生式表示法已经成了人工智能应用最多的一种知识表示模式,尤其在专家系统方面,许多成功的专家系统都是采用产生式知识表示方法。

简而言之,它就是一个如果发生什么事情,那么就怎么做的一个规则,其实我们生活中的很多知识,都可以以产生式的形式表现出来。比如,如果明天天晴,那么天上的云就会比较少。

我们生活中非常多的知识,都可以用产生式的形式表现出来。我们可以看到,专家系统也是一个基于规则的系统。专家系统里面,有很多很多条规则,作为知识库,它是跟推理引擎相交互的一个系统,然后我们通过知识规划,最后给用户一个解释。说起来似乎有点抽象,其实,专家系统中最重要的是:如何建立一个有效的知识库

就像我们刚才说的那个下围棋的例子,那么多的围棋专家为什么要经过那么长的时间才能把深蓝电脑给做出来?就是因为学围棋的人和学计算机的人他们之间的沟通是有障碍的。围棋的人,说的一个东西要解释给计算机的人,最后再变成一个程序的话,这需要非常多时间的交流。可以说那些做深蓝电脑的程序员,它到最后就有可能成为一个围棋高手,因为它和那么多的专家交流了那么多的时间。

那么在我们基于规则的专家系统中,出现了问题怎么办?比如说,规则非常非常多的情况下我们如何去检索这些规则?但我们发现一种情况,它和规则A是匹配的,和规则B也是匹配的,到底怎么取舍,都是专家系统中的一些主要问题。我们除了基于规则的专家系统以外,还有一种叫基于框架的专家系统。这种专家系统,主要是给专家用的专家系统。比如说有一些问题我们通过计算机把它定义好,然后再通过专家把症状什么的填进去以后,最后就能给我们一个结论。这就叫基于框架的专家系统。这种专家系统就不太适合给用户来用,它通常是给专家用。但现在,我认为在我们日常生活中有一种可谓是专家系统的一种非常通俗的一种应用,那就是我们熟知的“大众点评网”。

为什么说“大众点评网”是个专家系统呢?比如说你来到深圳或者长沙,你要找吃喝玩乐的话,这个系统就相当于一个对这个城市非常了解的一个专家。大众点评就是一个基于框架的专家系统。基于框架的专家系统就是要填写很多的属性。比如说,这个菜打多少分,我把它填好,别的用户它来看这个系统的时候,它就能看到,这个地方有哪些东西好吃,有哪些地方好玩,所以说这就叫基于框架的专家系统。其他的还有一些各种各样的专家系统,这节课上就不详细讲了。

那么我们来构建一个专家系统呢?那我们如何来设计专家系统呢,它主要分为三步:

第一步:设计初始知识库

比如说深蓝电脑是由一群专门下围棋的和一群计算机工程师一起设计的。比如,计算机工程师问围棋专家:“这个到底该怎么设计?”围棋高手A说他一般是这样下的,围棋高手B又说他喜欢这样下等等,他们会有很多种思路。所以导致这个初始知识库的设计,是有很多困难的,我们把很多专家的意见进行归纳和总结,最后精炼出非常少量的规则,然后构建出初始知识库以后,然后就要进行第二步。

第二步:原型机的开发与试验

专家系统跟我们互联网很多产品的开发是一样的,因为提到原型这个概念,很多做互联网开发的应该很熟悉。比如微信,现在功能很多,基本上什么功能都有,又能付款又能玩游戏,但是它在一开始推出的时候只有一个核心功能发短消息和特色功能发语音消息。包括我们一开始在构建一个专家系统的时候,比如说诊断系统,它就只能进行非常简单的触诊,或者说简单的症状的判断,那么我们在试验的时候,只能对原型机进行试。当我们发现,对原型机的试验都不能通过的时候,那肯定是我们的知识库出了问题,那么我们就要赶快的修改我们的知识库,然后再进行后续功能的开发。

第三步:知识库的改进和归纳

所以说这三步,不是一步一步就这样下来的,它是一个递归和循序渐进的,也许说它迭代反复了很多代,最后我们才把这个专家系统设计了出来。

专家系统在很多领域都有应用,包括我们刚才说的中医诊断,因为这个例子已经比较成熟了,它在很多地方都有应用。还有像股票投资,股票投资的专家系统当然没有那么容易做,因为这个东西的收益实在太大,但是有很多人研究怎么样用专家系统来进行股票投资,并不是专家系统在股票投资上得到了非常高的一个成就。当然也有很多的系统出来,因为诱惑非常大,所以有很多人在做这件事情。

还有就是天气预测,大部分情况下,都是靠机器完成的,因为有很多数据、指标,靠人,靠夜观星象是看不出来的。还有我们的导航系统,对我们日常生活造成了非常大影响的专家系统。你到哪里去,你要问一个当地人,你不管你对一个地方再怎么熟,也不可能把所有的道路,怎么走都记得非常清楚,所以导航系统是真正的一个通晓地理状况的一个专家。

 

 

游戏中的世界观与知识表示

刚才大家看到的这个视频是一个叫做龙与地下城的桌面游戏,这个游戏中国的很多同学可能不太熟悉,但是看过《生活大爆炸》的同学应该非常熟悉,主角谢尔顿和他那帮朋友们,几个高智商的科学家,就经常玩这个游戏,这是一个情景模拟加角色扮演的一个桌面游戏,它比我们玩的其他的桌面游戏都要复杂很多,因为它有一个庞大的世界观。

什么叫做世界观呢?就是说它这里面定义了很多的东西,比如说很多种族,比如说很多怪物、技能之类的,世界观是我们很多很多奇幻游戏的源头,包括像龙、地精、狗头人之类的怪物,都是从这里面出来的。最重要的是这个游戏创造了很多只属于这个虚拟世界的知识,那些著名的RPG,在我们看来非常经典的包括魔法门系列、英雄无敌系列、和博德之门系列等,都是这个桌面游戏改编而来。

那么我们首先有了一系列的知识,桌面游戏的知识,是写在一张纸上的,到最后,它变成了一个程序里面的知识,这就是构造了一个虚拟的世界。这个过程就涉及到很多如何使这些知识表示得能让计算机知道,这个过程不单单是人类语言和机器语言翻译的一个过程,很多情况都是一个知识表示的一个过程。这就是我们今天要讲的这节课,关于如何表示知识。

我们看到,在现实语言中,我们可以说,玩家A对怪物B造成了一些伤害,这是我们人类能够读得懂的一种语言,但机器语言通常是这样子的,通常你要告诉他,玩家A的攻击力是多少怪物B的防御力是多少然后玩家A对怪物B造成了一次攻击,然后我们这个攻击一减。 所以计算机和人类最大的不同就是,计算机会比较容易去理解一些结构化非常明确的数据,而计算机能够理解你的语言,也是因为它把你的语言转化成了数据结构才理解清楚的,所以说知识表示,在人和计算机的沟通上面,起了非常大的作用,这也是我们人工智能这门学科的一个核心问题,甚至是非常基本的一个问题。如果说,我们的所有知识,都能让电脑表征得非常清楚的话,那么我们说,人工智能的实现就指日可待了。

首先我们来看一下什么是知识知识是我们人看到很多种现象通过我们大脑进行一个加工,得到一个思维的结果


      知识是一个结论性的东西,当然,也不是说所有的知识都是正确的,知识还具有一些不确定性,和很多很多种特性。我们下面来看两个和知识有关的重要概念,一个叫数据,一个叫信息,什么叫做数据呢,我们计算机里面所有存储的东西,都可以叫数据,我们看黑客帝国里面,他把一个计算机一展开,就是一个满屏的0101010,的矩阵,就说明,这个虚拟世界的 所有东西,都只是数据,数据就是存储在硬盘或者光盘里面01的组合。

什么叫信息呢? 信息就是数据的语义,就是数据在特定场合下的具体含义

这个可能理解起来比较生硬。有次我去参加一起面试,面试官就问我,数据和信息的区别我解释了一些以后,那个面试官还不是很满意,最后我就说,信息就是有用的数据,他说对对对他说你理解到了这个点,就说明你明白了数据和信息的区别。我们说,数据不一定是游泳的,因为有很多数据是冗余的,比如我们说,今天下雨了,存在电脑上,但有可能我们存了100遍今天下雨了,你说这里面都有用吗?这里面可能只有一条有用。信息呢,可能就一条,最近几天都在下雨。这就是数据和信息的一个区别。

知识是对很多信息得到关联以后得到的一种信息结构,它是事实和信息之间的规则形成的,它是经过加工,理解,整理,改造以后得到的信息。老师理解下来呢,但凡是知识,它都是有一定的预见性的。信息很多都是发生过的事情,我们通过整理这些信息可以对未来来进行一定的判断,这样的一些就可以成为知识。这是我们讲信息数据和知识三者之间的关系。

 

 

 

 

 

传统的知识表示方法

 

有哪一些知识表达的方法呢?知识表示的方法其实在计算机领域其实非常非常多,这节课我们不可能一一拿出来介绍。我们介绍一些非常典型且非常非常实用的一些方法,首先我们要讲一阶谓词逻辑表示法。

一阶谓词逻辑表示法

一阶谓词逻辑表示法就是把用逻辑(谓词)表示知识,实际上是把人类关于世界的认识变成一个包含个体、函数和谓词的概念化形式。比如说, 敲击这是一个谓词,开电脑这是一个谓词,我们大部分的行为或者思维都可以用主语加一个谓语,或者再加一个宾语这种形式表示出来,如果我们能把所有的知识,都用一阶谓词逻辑表示出来的话,那么我们就能得到一种知识表示的方法。

基本步骤

1、给出有关世界的个体、函数和谓词

2、构造一阶谓词公式(集)

3、对公式(集)给出解释,使该解释是相应公式(集)的一个模型。

一阶谓词逻辑表示法,它有很多很多种应用,比如说, 这是一本书,这个物体是x,isbook(x)就表示这是一本书。我们说张三是一个人,我们定义一个谓词, is Human或者是Human

 

一阶体现在哪里呢,就是说Human后面只有一个参数,如果human后面有两个参数,我们就说它是二阶的,比如说hit(x,y)就是x打了y一下。

我们说一阶谓词逻辑经常能表示非常多的简单的知识。然后我们通过逻辑表示方法,这个逻辑,在数学表示上,用一个箭头来表示,我们在两个一阶谓词逻辑中用一个逻辑来连接。它可以来表达一些比较复杂的知识。它可以在不同的知识之间建立联系。

我们现在举个例子,说人人都受法律的管制, 我们定义两个谓词, 第一个谓词叫做“是人”, 第二个谓词叫做“受法律管制”,其实这个人人都受法律管制,我们可以把它拆成这样子,如果一个东西它是人,那么这个单位,就应该受到法律的管制,我们把它拆成这样子以后呢,就好来做知识表示了。我们把它表示为, Human(x)后面打个箭头, lawed(x)。同样的,再举一个例子,如果一个人犯了罪, 那么它就应该受到惩罚,

如:

1.        Human(x)->Lawed(x)  人人都受法律管制,x是同一个人

2.        commit(x)->punished(x) 如果由于某个x是人而受法律管制,则这个人犯了罪就 

                                                       一定要受到惩罚。

 我们这里构造一个新的谓词, COMMIT,就是犯罪的意思,当然,commit也有很多其他的意思, commit x箭头punished(x) punished就是受惩罚的意思,如果x犯了罪的话,那么x就要受到惩罚。这里x不一定是人,如果我们一定要加上一个是人的谓词的话,我们这里介绍一个与的表示,是一个向上的尖角,我们把它叫做与。那它既是人,又犯了罪的话,那么它就应该受到惩罚。

我们知道了一阶谓词表示法和这个逻辑表示法以后就可以构造很多很多复杂的知识,让计算机记住,逻辑表示法有些什么样的优点呢?

1、严格性:一阶谓词逻辑具有完备的逻辑推理算法,可以保证其推理过程和结果的正确性,可以比较精确地表达知识。

2、通用性:命题逻辑和谓词逻辑是通用的形式逻辑系统,具有通用的知识表示方法和推理规则,有很广泛的应用领域。

3、自然性:命题逻辑和谓词逻辑是采用一种接近于自然语言的形式语言表达知识并进行推理的,易于被人所接受。

我们带到这个自然语言的时候呢,我们讲一下知识表示与自然语言的之间的一些关系。不是所有的知识都能够被语言所表达的。有些知识蕴含在数据之间可能需要通过一些数学公式来进行表达,这些知识可能用语言表达非常复杂,用一个数学公式或者几个数学公式很容易就表达出来了,或者更加形象化,有些知识用图片表达出来就更加的直观。比如我们看图片一个例子。

这个人物关系图就是属于一种我们经常可以看到的一个非常直观的一个知识表达的一种方法,我们看到很多明星闹绯闻以后,大家就会把他们之间的这种人物关系图一个一个列出来,为什么呢?因为他们这种人物关系太过于复杂了,把这个人物关系图摆在你面前,这种知识表示方法就非常直观。当然这些知识是可以用语言表达的,还有一些知识是不能用语言表达的,我们这里要说的是不是所有的知识都是用语言表达才是最好的,不是所有的语言都是知识,这和刚才我们说的数据和知识的关系是一样的。只有一些我们把语言精练加工以后才能变成知识。

产生式表示法

它的基本特点就是一组规则,即产生式本身。

每个规则分左边(前件)和右边(后件)。

如:天上下雨 → 地上湿

它左边表示情况,是什么条件, 这个条件发生的时候,右边的操作就被调用了,叫产生式表示法。我们逻辑表示法主要是讲那些一阶谓词逻辑,把它们组织起来,让它能够在不同的知识中建立关系

产生式通常没有谓词逻辑表示法那么复杂,它通常就是一个前件,一个后件。

产生式也具有一定的缺点:

1、知识库维护难

2、效率低。为了模块一致性

3、理解难。由于规则一致性彼此之间不能调用。

它比较容易发生这种匹配上的一些问题,也容易发生一些叫做规则冲突,就是当很多很多规则都被匹配到的时候,到底应该选哪一个?还有一点,就是它这个知识库这么多规则,我要维护起来非常难.为什么要维护呢?因为知识库不是一开始建立的时候,不是完全准确的,或者不是完全已经建好,当我们发现有新的知识要进来,或者我们要改某条知识的时候用产生式方法是比较麻烦的。

 

 框架表示法

 

 

马文·闵斯基(Marvin Lee Minsky)出生于1927年,是一位美国人工智能领域的科学家,麻省理工学院人工智能实验室的创始人之一,著有几部人工智能和哲学方面的作品。曾获得多项荣誉,于1969年获得图灵奖,1990年获得日本奖,1991年获得IJCAI Award for Research Excellence,2001年获得本杰明·富兰克林奖章。

 

它是由非常有名的计算机学家Minsky提出的。框架表示提出了一个用框架来表示知识的一种理论,框架表示知识呢它的特点就是把一个物体看成是很多个组成的部分。比如教室这个概念这条知识,我们就把教室这个概念中所有的子部分,比如说黑板、课桌、椅子等,把它放到教室这个概念的下面。

 框架表示法是一种描述对象(事物、事件或概念等)属性的数据结构,在框架理论中,框架是知识表示的基本单位。

对象就把它表示成为由很多属性组成的一个物体。比如教室,有些教室,它有多少张桌子,多少张椅子,桌子和椅子就是教室的属性。当我们对一个物体的属性和属性值都了解得非常清晰的时候,就说明我们对这个物体所相关的知识,已经表示得非常清楚了。

定义:

一个框架由若干个“槽”(Slot)结构组成,每个槽又可分为若干个“侧面”。

槽:描述对象某一方面的属性;

侧面:描述相应属性的一个方面。

通常情况下对于一个相对简单的物体来说,只有槽,没有侧面。比如黑板是教室的一个槽,它又有自己的侧面,比如现在有黑色的黑板和白色的黑板,当槽值和侧面值都非常确定的时候啊,我们对教室的样子,就有一个非常明确的理解了。这些槽值和侧面值可以是数值,也可以是字符串,还可以是布尔值(只有两个取值,一个是0,一个1,叫布尔值),然后在满足某种给定的条件时应该执行的动作或过程,或者另一个框架的名称。这就是我们把一个框架中间还定义了一些触发式的一些规则它就是把一些规则放到了框架里面去表示。将规则使用一定的等级,把它们组织了起来。让它具有一定的结构感。

这幅图是框架的基本表示形式。可以看到它有一个“框架名”,有一个“槽值”,有一个“槽名”有很多很多“侧面” 还有一些“约束条件”

这个框架网络有一些横向联系和纵向联系

框架网络的横向联系:一个框架的槽值和侧面值,可以是另外一个框架的名字。刚才我们说教室的槽值是黑板,黑板也可以是一个框架。这种就是横向联系。这是框架之间的一个联系。

框架网络的纵向联系:抽取共同属性构成一个上层框架,对专有属性分别构成下层框架,并在下层设立专用的槽(一般称“继承”槽)

纵向联系怎么样去理解呢?它其实很好理解。学过面向对象编程的就更好理解了。比如说,我们有语文老师,数学老师,化学老师,生物老师,我把每个老师他共有的属性比如都是教师,我们把教师这个共有属性抽取出来就得到教师这个框架的属性。比如我们说向下叫特化,向上叫泛化,这样一个结构。现在这幅图就是一个框架网络的实例。这就是一个教师员工框架和学生员工框架, 它们总体都是属于师生员工的结构。这样的框架就很有利于我们去维护知识结构。

 

优点:

结构性:便于表达结构性知识

继承性:下层框架可继承上层框架的槽值,也可进行补充和修改

自然性:与人在观察事物时的思维活动一致

它善于表达一些具有结构性的知识。 很多知识都是具有结构性的,你把它作为规则一条条的写出来,是非常冗余的 也没有什么效率,但是如果说让它按一个结构来布置出来的话就非常省时省力。

比如说像之前那个框架网络的实例,我们的框架写成规则的话可以写成非常非常多层比如说教师1是一个教师,教师2是一个教师......这样就很没有必要,如果写成框架的就非常直观。所以框架网络就有这样一些优点。

缺点:

主要缺点是不善于表达过程性的知识

所以说这个逻辑表达非常擅长的,框架表达就不太擅长,逻辑表达非常善于表达那些过程性的知识。像下雨了,地上就会湿,用框架来表达,就不太方便,用一个规则就非常方便地表示出来了。我们在游戏中看到一个人物属性表啊,就其实就是是一个非常典型的框架表示法。比如这个人物他的力量值、敏捷值等都有各种相应的属性

计算机里面的知识表示出来都是非常框架性的。其实现实生活中的知识们要人为地把它变成框架性去表示。

剧本表示法

接下来我们再介绍最后一种知识表示的方法。这个知识表示的方法非常的有意思,它叫做剧本表示法。顾名思义就是把所有的知识表示成一个剧本。

剧本不知道大家明不明白,我们拍电影的时候经常有一幕一幕的场景,比如说这一幕皇帝走进来了,妃子们跟他请安,然后太后又走进来了,皇后又走进来了。。。像这种就叫剧本。这个表示法是由Schnak在1975年通过概念依赖理论提出来的一种方法。

比如说他把去饭店里面吃饭这个事情,他把去饭店吃饭这个事情表示为一个剧本,它先有一个进入条件。吃饭这个事件有很多属性,它其中一个属性,就是进入条件。吃饭这个剧本的进入条件是什么呢,那就是顾客饿了,顾客有钱,顾客要招待亲友等等。它有一个属性叫角色, 有顾客有服务员,有厨师,有经理有老板,还有一个属性叫道具,有食品,桌子,菜单,钱, 等等。然后他把脚本就放进去了 它有第一幕,第二幕......真的和歌剧一样,它把吃饭这个事情定义成了一个剧本。

 1、剧本:描述特定范围内原型事件的结构。

 2、剧本的组成

    (1)进入条件:指出剧本所描述的事件可能发生的先决条件,即事件发生的前提条件

    (2)角色:描述事件中可能出现的人物。

    (3)道具:描述事件中可能出现的有关物体。

    (4)场景:描述事件序列,可以有多个场景。

    (5)结局:给出剧本所描述的事件发生以后必须满足的条件。

这种方法很直观的表示了一些日常生活中的一些很难以被表示的一些知识。比如去餐厅吃饭这个事情,说起来很简单,如果你要让计算机了解,还真不好怎么办让计算机了解。这种剧本法就提供了一种结构性的框架。

像刚刚说的角色、道具、进入条件,还有每一幕到底有些什么样的操作这样的话如果我们有很多很多这样的脚本都教给计算机,然后我再告诉计算机今天发生了一些什么样的事情,计算机是不是就可以能够把今天发生的事情通过跟自己学到的脚本进行匹配,然后理解到, 原来你今天先去餐馆里面吃了饭, 下午去商场里面买了东西, 最后去看了电影。如果你没有办法把这些比如说去餐馆里面吃了饭,去电影院看了电影,去商场购物这样一些知识结构化的告诉电脑的话,它们就没有办法帮我们理解这些知识  并帮助我们做出更好的判断。 这就是叫做脚本表示法。

 

 

语义网络表示法

 

语义网络的表示

我们最后来看一个语义网络的表示法,之前我们说的谓词逻辑的表示法和这个自然语言非常的接近,但是这个语义网络的表示法和自然语言就更加的接近了。它几乎是从自然语言演化而来的一种表示方法。这个表示法,肯定是由研究语言学的那些专家提出的。因为他们研究了那么久的语言,他们觉得能够用语言描述的东西就都好办,他们就设计了一个语义网的表示法我们来看看语义网是一个什么样的概念呢?

表示方式:每一个要表达的事实用一个“结点”表示,而事实之间的关系用“弧线”表示。即,有向图表示的三元组,(结点1,弧,结点2)连接而成。

 它就是要表达一个事实,通常用节点加上弧线这样一个结构来表示的,它是一个有向图,我们来看这个例子,这个例子是由10个节点表示的一个语义网。它所说的就是《魔戒》前传霍比特人的一个故事情节。故事情节当然是非常简约的一个故事情节,我们通过一个语义网把它表示出来了。

这个语义网中间有个索林,索林的左边有个矮人的节点,它们中间的这个弧,我们把它叫做isa,就是“是一个”的意思,连起来的意思就是索林是一个矮人的意思。旁边有个比尔博,它是霍比特人的主角,魔戒主角的伯伯。他旁边有个霍比特人,这两个节点也是由isa这个弧连起来的,它的意思是“比尔博是一个霍比特人”。

 魔戒和比尔博是什么关系呢?我们画了一条弧,上面是belongs.“魔戒”它属于“比尔博”。实际上它后来也给到他的后辈去了。“比尔博”还拥有一个“精灵剑”所以说和“精灵剑”还有一条弧线,“精灵剑”旁边有一条弧上写着ako是什么意思呢?“精灵剑”和“武器”间是什么关系呢?我们不能说“精灵剑”isa“武器”,虽然“精灵剑”它是一个“武器”,但是我们这里说的是“精灵剑” a kind of “武器”,因为“精灵剑”这里不是指的一把“精灵剑”,而是指的“精灵剑”这种武器种类,所以它是一种“武器”,所以我们看到,整个这幅图表达的大概的意思就是说,“比尔博”拿着|“魔戒”和“索林”这群“矮人”,一起打败了“史矛革”,我们看到“史矛革”旁边有个“恶龙”的节点。“史矛革” isa“ 恶龙”,也就是说史矛革是一只恶龙。这个故事,用自然语言表达也不复杂,用这个图来描述对我们来说可能更难看懂,但是对计算机来说,它特别喜欢这样的东西。

大家要记住,计算机喜欢的是怎么样的一个数据结构?它不喜欢语言那样的非常凌乱非常难以定义的这种东西,计算机特别喜欢像图,像框架,像矩阵,这样的一些就算没有数字,但是非常结构化的,如果我们能把知识表示为这样一种结构的话,就非常容易被计算机所了解。

 最后我们再看一张人物关系图,我们刚才也提过人物关系图我们最后看一下,这里有一张人物关系图,这是《神雕侠侣》的中的人物关系图它非常的复杂, 但它也是典型的一种语义网的表示方式。我们看到“杨过”和“小龙女”之间有根弧线,叫做“情侣”, 就说明“杨过”和“小龙女”是情侣关系,“杨过”和“黄蓉”之间有一条虚线叫做“敌师关系“大家可以讨论一下,但是这个图呢是一个非常典型的语义网络表示法当然我们人也可以看得懂但是这种东西给计算机看的话它可能更加容易看得懂。

知识表示还有在其他的领域有非常多的应用。比如说,在计算机视觉的形状表征上,这也是非常大的一个领域。我们人分成一个猫和一个狗,非常容易,但是计算机分出一个猫和一个狗,特别是当猫和狗的形状大小差不多的时候就非常非常难。人很难用语言描述给告诉计算机,一个猫和一个狗到底哪里长得不一样。那么怎么办呢?我们只能想办法把这些人知道的知识表征出来。

 这里就涉及到一个形状表征的问题。这是在计算机视觉中,非常重要的一个领域。如果我们能够把所有的形状都表征得很清楚,且非常具有区分性的话。那么电脑在识别这些形状的时候就没有任何的难度了。如果你跟电脑说,一个猫啊就是小小的头,一条尾巴,四只脚,这样的一个身子,然后你跟电脑说,一只狗也是小小的头,四只脚,这样的身子。那有可能猫和狗一来,它就搞不清楚了。而人在学习猫和狗的形状的时候,是经过了非常多的视觉刺激和训练才得到这样的技能,这并不是因为我们从小看得多就会,而是因为我们脑中,本来就有一套完备的系统能够很好的区分物体。但电脑没有这样一套系统,所以电脑要学到区分这些物体,是非常非常难的。

 

 

 

常用的推理方式

聊起推理啊,大家通常都会想到那些耳熟能详的大侦探们,英国的福尔摩斯,中国的狄仁杰,日本还有这个非常著名漫画形象,名侦探柯南。他们都有一个特点,就是聪明绝顶。似乎这个推理,是一个非常高端的智能行为。心思缜密的推理家们似乎能够从蛛丝马迹中找到线索,从而推断出事情的真相。所以大家都觉得, 侦探们有着异常强大的推理能力。其实每个人都会推理,这是人具有智能的一个基本表现,侦探们因为其敏锐的观察能力,广泛的知识面,和其在经常进行脑力思考训练下得到的强大的分析能力,使得其在获得通过观察获得少量线索和证据时,能够根据其广泛的知识面和思维能力推测出更多的事实,最终找到想要知道的真相。

我们人类其实每天都会进行这样的脑力劳动,只是日常生活中的事情,没有案情那么刺激而已。比如老师来到这个桌子上,观察到这个桌子上有点水珠,老师就会通常日常的知识推断出,书本放上去,会弄脏。这是因为老师知道一些规则比如说,如果桌上有水珠,那么桌子上是湿润的。如果湿润的桌子上面放书,那么书会被弄脏,所以,老师观察到桌上有水珠,就能推断出不能把书放上去,这是因为我们通过这些规则的前件,也就是,IF 后面的那些部分,往后件也就是THEN的那些部分推理。得到结论, 我们管这种方法叫做正向推理

有正向推理,就有反向推理,老师一看桌子有水渍,就知道,早上有人来打扫过卫生了,这是为什么呢,因为老师知道以下两条规则。

如果有人抹过桌子,那么桌子会变湿润。第二条规则, 如果有人来打扫卫生,那么他就会把桌子抹了。我们从这些规则的后件,也就是结论,推测出原因,从后往前来推,这种方法叫做反向推理。

 这也是我们计算机中, 使用的两种比较主要的推理方法。

你看,其实我们在日常生活中,都是推理专家,只是日常生活中的事情,没有那么惊悚而已,如果我们看到的不是水渍,而是血渍,那就成为一个侦探案件了。

这个正向推理和反向推理是我们这节课的第一个内容。

正向推理

我们看一下的这个工作机制

它从一组表示事实的谓词或命题出发,使用一组推理规则,来证明目标谓词公式或命题是否成立。
  实现正向推理的一般策略是:先提供一批数据(事实)到总数据库中,系统利用这些事实与规则的前提匹配,触发匹配成功的规则(即启用规则),把其结论作为新的事实添加到总数据库中。继续上述过程,用更新过的总数据库中的所有事实再与规则库中另一条规则匹配,用其结论再修改总数据库的内容,直到没有可匹配的新规则,不再有新的事实加到总数据库为止。

反向推理

而反向推理的一般策略是先假定一个可能的目标,系统试图证明它,看此假设目标是否在总数据库中,若在,则假设成立。否则,看这些假设是否证据(叶子)结点,若是,向用户询问,若不是,则再假定另一个目标,即找出结论部分中包含此假设的那些规则,把它们的前提作为新的假设,试图证明它。这样周而复始,直到所有目标被证明,或所有路径被测试。

刚才老师说的这些推理,都是非常严谨的,这种严谨的推理是不是有种似曾相识的感觉啊,大家学数学的时候,是不是经常要做证明题啊,那其实就是一个我们经常用这个正向推理和反向推理的一种比较常见的实例。

计算机非常善于解各种各样的数学问题,比人要快多了。就是因为数学世界的逻辑非常的严谨。但是,计算机在做现实世界的一些问题时候,就经常会解不出来。我们管这个问题叫做常识推理。

常识推理

常识推理是人工智能领域一个长期存在的疑难杂症。很多人都想尝试解决它,但仍然是人工智能的一个难题。为什么呢?因为比如说数学里面的一个规则,是100%正确的。比如说如果会先a平行于b,直线b平行于c,那么直线a平行于c,类似的规则我们叫做定理和公理,非常的多。我们通常把这些推理都称为单调推理

还有一种特殊的单调推理我们把他称为演绎推理。最近有部美剧叫做《基本演绎法》,讲的也是侦探破案的故事,其中的演绎两个字,就是从这里来的。

演绎推理

定义:从一般性的原理出发,推出某个特殊情况下的结论。简单来说就是一种从一般到特殊的推理。

比如最近这个吸毒被抓的明星很多。我们知道第一点,吸毒被抓的名字会被封杀。第二点,我们知道,男星A吸毒被抓了,所以我们能得到结论,男星A会被封杀。这个演绎推理通常由三个部分组成,我们有时候又称之为“三段论”。我们在数学的学习过程中,也经常会碰到类似的推理例子,比如说,所以三角函数都是周期函数,sinx是三角函数,所以sinx是周期函数。类似的例子很多。不管在生活中还是学习中都经常会碰到。

但是,我们在生活常识中,没有这么多的公理或是定理。比如,鸟会飞,这是一条常识,但是这条常识,不是100%正确的,鸵鸟就不会飞对吧。所以如果我们用单调推理啊,比如说刚才所介绍的三段论来说,由第一条鸟都会飞,第二条,鸵鸟是鸟,所以鸵鸟也会飞,来推理得到的结论就是错误得了。

当规则不是100%正确的时候啊,我们通过这种严谨的数学逻辑推理来判断一些生活常识问题,就会出现很多碰壁的情况。所以,之前有很多学者,聪明绝顶的学者,尝试把常识推理当成一个数学问题来求解,都以失败告终。而我们人的推理系统恰恰是可以随时推翻我们知道的这些规则的。比如刚才鸵鸟那个例子,当我们知道鸵鸟不会飞的时候啊,就会推翻或者更新,我们之前的那条规则,这种推理啊,叫做非单调推理。至于怎么更新呢,简单来说,可以靠概率。比如之前那条规则是100%的鸟都会飞的,我们得到一个反例鸵鸟以后,就把这条规则更新为99%的鸟都会飞。这种我们把它叫做基于概率的非单调推理。

非单调推理

是指在推理过程中随着推理的向前推进及新知识的加入,不仅没有加强已推出的结论,反而要否定它,使得推理退回到前面的某一步,重新开始。(一般是在知识不完全的情况下进行的)

我们今天讲这个知识推理经常会讲到数学,因为数学中有一个逻辑学,跟我们今天讲的知识推理有很大的渊源。我们可以看到,现在人工智能的一些顶级的期刊和会议上都还经常会有一些跟逻辑学相关的研究发表,其实就是我们之前在第一讲中提到的符号主义。这些学者还在尝试通过一套严谨的数学理论来解释一些智能问题。虽然现在这一块不是研究方向的主流,但还是很有了解的必要的。喜欢逻辑的同学也可以在这个方向做研究。如果要在计算机的世界去解决现实世界的推理问题。我们肯定是不能用自然语言的,因为自然语言其实是不严谨的,这个二义性我们在下一节课里面会详细讲。总之,我们在计算机里推理用的是一种符号语言。

 

命题和命题逻辑

今天介绍一种主要的推理方法,它叫做命题逻辑。命题大家应该并不陌生。我们在数学中经常接触这个概念,这里的命题有所不同,这里的命题就是一种符号语言,它用来将自然语言形式化,也就是处理成命题,这种命题是一种严谨的符号语言。

什么是命题?

人们的思维活动是靠自然语言来表达的。 然而, 由于自然语言易产生二义性, 用它来表示严格的推理就不合适了。为了解决这个问题, 在数理逻辑中引进了一种形式化的语言, 这是一种符号语言。

它是能判断真假的陈述句。

比如说,下面这几个例子

(1)人的血液是白色。

(2)上海是中国的一座城市。

(3)今年春节真热闹啊!

(4)天在下雨。 

哪些不是程序句呢?比如说问句, 你看了昨天的新闻吗? 就不是一个命题,一个命题就一定能给出一个判断,这个命题是一个真命题还是一个假命题,对于一个问句啊,我们没办法判断它的真假,所以疑问句就不是命题。

 自然语言的命题计算机还不好处理,我们的命题太复杂,所以我们这里要介绍一种原子命题,就是一种最简单的命题。

原子命题:不能再分解为其他命题的命题叫原子命题。

原子命题中的“原子”取原子的“不可再分”之意, 它是最基本的命题,相当于自然语言的简单陈述句。

刚才我们给出的那四个命题都是原子命题。

但很多时候我们会碰到一些命题,比如“玛丽是一个女飞行员”,它一个句子中包含了两个或多个命题,所以我们要把这种复合的命题拆分成原子命题,比如“玛丽是一个女的”和“玛丽是一个飞行员”。

命题的联结词

下面我们来讲命题的联结词,这部分内容在离散数学中,也出现过。 首先将的是“非”这个联结词。

是一个命题, 则由否定词┐和命题组成的复合命题┐称为的否定式, 读作“非”。┐的真值定义为

    ┐为真 iff(当且仅当)为假

命题┐的关系可以用下表表示      

 

P

 

 

P

 

 

0

 

1

 

 

1

 

0

 

  这里这个表啊,就是我们说的真值表,接下来我们讲其他的联接词的时候也会出现这样的真值表,这里1就是真,0就是假,很明显如果一个命题是真,那么它的非命题就是假。

 然后我们讲另外一个联结词,,它的符号用一个向上的箭头∧表示。这个箭头我们叫它合取词。

命题P与上命题Q,表示为P∧Q,可以称它是P和Q的合取式,读作“P且Q”。

 PQ的真值定义为

 PQ为真 当且仅当  P, Q都为真,它的这个真值表,就如下所示

       

 

 P         Q

 

 

PQ

 

 

0           0

 

0          1

 

1          0

 

1           1

 

 

0

 

0

 

0

 

1

 

可以看到,只有两个命题都为真的时候,它们的与命题,也就是合取式才为真。这个很好理解吧。

析取式

然后我们讲析取式,与合取式对应的,就是析取式。析取式也成为两个命题的或命题

用析取词∨来表示, 所以P, Q组成的复合命题P∨Q称为P, Q的析取式, 读作“P或Q”。

          P∨Q的真值定义为

         P∨Q为真当且仅当 P, Q至少有一个为真

 

 P         Q

 

 

∨ Q

 

 

0           0

 

0          1

 

1          0

 

1           1

 

 

0

 

1

 

1

 

1

 

看这个真值表, 我们两个命题P和Q只要有一个是真,那么P∨Q就是真。

我们今天总共要讲5个最常用的 联结词,现在讲了三个,分别是非,与,或。这三个又是这5个中最为常用的3个。

蕴含式

 第四个要介绍的联结词是蕴含式

P,Q是两个命题, 则由蕴含词一个往右的箭头→和题P, Q组成的复合命题P→Q称为P,Q的蕴含式,读作“如果P, 则Q”。        

 P→Q的真值定义为        P→Q为假  当且仅当 P为真而Q为假       因此, P为假时,不管Q为真还是假, P→Q都为真;而P,Q同时为真时,P→Q也为真。

 复合命题PQ的真值表如所示。蕴含词→是自然语言中的连接词“如果……, 则……”、 “若……, 则……”、“如果……, 那么……”等的逻辑抽象。 但是, 从真值表可以看出: 蕴含词→与自然语言中的连接词“如果……, 则……”是有区别的。 自然语言中的“如果……, 则……”是联系两个有逻辑关系的语句

P→Q真值表

 

 P         Q

 

 

→ Q

 

 

0           0

 

0          1

 

1          0

 

1           1

 

 

1

 

1

 

0

 

1

 

 

其实按照我们自然语言的逻辑,P和Q的真假,和如果P那么Q的真假是并没有这种简单的关系的。比如我们说如果今天下雨,那么路上车少。这个规则的真假,其实与今天下没下雨,或者路上车的多少不能说有这种对应关系。

那我们怎么理解这个真值表呢?比如我们说一条规则P-》Q,如果它的前提是真的时候结果也是真的,我们认为这条规则是对的。这个好理解。如果前提是真的时候,结果却没发生,我们有理由相信这条规则是假的,这也好理解。如果我们前提是假的,结果也是假的,我们还是可以相信这条规则对不对,因为你没办法去否定它。如果前提是假的时候,结果是真的,这个是最难理解的。按我们人的常识,我认为这种时候,这条规则应该不靠谱,但是我们计算机比较宽宏大量啊,即便这样,它还是愿意相信,这条规则是真的。所以只要不是前提发生的情况下,结果是错误的,其他的情况,计算机都愿意去相信这条如果P则Q是真的。 

等值式

最后,我们来讲这个等值式 

若P,Q是两个命题,  则由等值词↔和

命题P,Q组成的复合命题P ↔ Q称为P,Q

的等值式,读作“P当且仅当Q”。

        P↔ Q的真值定义为

        P↔ Q为真 iff  P, Q同真值

   P↔ Q真值表

 

 P         Q

 

 

P     Q

 

 

0           0

 

0          1

 

1          0

 

1           1

 

 

1

 

0

 

0

 

1

 

到这里,我们已经学习完5种联结词,分别是非,与,或, 蕴含式和等价式,以及它们的真值表,可能大家觉得有点枯燥,但这个是我们机器推理的一个基础,希望大家能够掌握。

下面我们来看一个题目:

求出(P∧Q)∧┐P的真值表

我们在求真值表的时候,第一步,都是把这个式子中出现的命题的真值表写出来

这里是P和Q的真值表,然后我们要分步的解出这个句子,我们先求出P∧Q的真值,然后我们再求出┐P对应的真值     

 

P         Q

 

 

Q

 

 

0           0

 

0           1

 

1           0

 

1           1

 

 

0

 

0

 

0

 

1

 

          

 

P         Q

 

 

Q

 

 

P

 

 

0           0

 

0           1

 

1           0

 

1           1

 

 

0

 

0

 

0

 

1

 

 

1

 

1

 

0

 

0

 

 最后啊, 我们把这个P ∧Q和┐P分别看成一个新的命题 S和T,然后再来求S∧T得真值, 看第一行,S是0,T是1的时候,S∧T应该也是0;第二行,一样的也是0,第三行和第四行,可以看出都是0,这种情况下,我们可以说公式(P∧Q)∧┐P是一个永假式,因为不管什么情况下,这个公式都是假的,还有一种叫永真式 的,大家应该就可以很容易理解了,那就是不管什么情况下,这个公式都是真的。

 我们可以通过这样一个真值表来确定一个复合命题的真假情况。

 

简单的决策树模型

人工智能发展到一定阶段的时候学者们就发现,这个智能不能靠我们人类完全告诉机器,因为这个世界上的知识和信息都是无止尽的,所以,我们需要让机器学会如何自己学习,于是就产生了机器学习这个研究方向,专门来研究如果让计算机通过数据来学习到知识。今天我们就来介绍一种非常经典的机器学习算法,叫做决策树算法。

我们回想一下我们自己的学习过程,我们学一些知识的时候会有很多例题,但我们考试的时候,老师经常会出一些我们没有见过的题型。我们如果好好学习了这些例题的话,就能解出那些没有见过的题目。这是因为我们人类有归纳的能力。中国人把这个能力叫做融会贯通,举一反三等等。所以,我们也希望机器具有这种能力,所以决策树算法就是一种典型的归纳学习。

决策树(Decision tree)是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策树对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。 

我们来看一下决策树算法的定义,首先,我们说决策树算法是一种分类方法。这是我们这门课第一次提到分类这个概念,分类问题,这是人工智能里面一个非常重要的概念,我们之后会有一节课专门来讲分类问题的相关知识。在这里就不详细讲了,我们这里强调的是,决策树就是通过归纳,学习到的一种分类的能力。我们来看一个决策树的例子。

简单的决策树的模型

可以看出这副图很像一棵倒着的树,这个棵树用来分类所有有着X、Y两种属性的数据,可以把这些数据分为三类。我们可以看到类1,类2,类3. 怎么分类的呢,我们从最上面开始,首先判断这个数据的X属性是否等于1,就是最上面那个圆圈,如果不是的话,就直接判断为类1,是的话呢,我们再判断这个数据的Y的大小,我们看到第二个圆圈,它往下有三个分支,说明它不是一个判断是否的问题,而是看Y的数值的范围,所以,如果Y<A时,分为类1,A<Y<B时分为类2,B<Y<C时,分为类3.这样说有点抽象,我们来看一个非常现实的例子。我们学校里面啊,有这么一类喜欢逃课的学生啊。我们看一下他们的上课的决策树。

这个图就非常鲜明了,这些同学每天呆在宿舍里,去不去上课首先判断这节课会不会点名,如果不会点名的话就不去了,非常的现实,如果点名了的话,他们就判断这个寝室到教室的距离,如果寝室到教室的距离在三分钟以下,那么就走着去。如果在需要多过三分钟,就跑着去,如果十分钟还到不了啊,就干脆不去了。这也是他们这个脑海中每天进行的一次分类,他们对于每天关于上不上课的信息主要考虑两个属性,一个是是否点名,一个是能否及时赶到,然后分类的结果,就有三种,一种是不去,一种是跑着去,一种是走着去。南开大一个老师啊,为了惩罚这些学生,在考卷前面加了这么一道选择题。

我们还是回到这个决策树算法上来。我们下面来讲讲怎么样才能得到这样一颗决策树呢?就跟我们学习时,需要例题一样,我们需要给电脑一组数据去训练它,大家应该发现了,这个决策树算法对训练数据有一定的要求,这些数据都应该有一些共同的属性并且每一个数据都有一个明确的分类。

例如我们有这样一组数据,可以看到这组数据都有这些属性,年龄,收入,学生,信用等级,且都有一个分类,会买电脑,和不会买电脑。这些属性里面有些是数值的,比如年龄,有些是有几种等级,比如收入和信用等级,还有些是判断性质的,比如是否是学生。类别这里是两种,其实可以有很多种不同的分类。在这样一组数据的基础上,我们就能生成一棵决策树。生成决策树有什么好处呢?假如你问老师:“老师你什么时候心情比较好?”我说:“我在以下1000种情况下,心情比较好。第一种,天气晴朗,我头脑清晰,在咖啡厅喝咖啡......第二种......哎哎,我还没说完,你别走......"估计没听几条你就走人了,如果老师这样回答:”我只要身体健康,且睡眠充足的时候,就心情比较好。“明显后者比较有智能对不对。  

我们生成决策树,一方面对数据进行了整理和归纳,也就是说在数据中学习到了有用的规则,另一方面,我们能够通过决策树来对没有见过的数据进行分类。

比如这个买电脑这组数据,年龄这个属性有三种情况,收入也有三种情况,学生两种,信用两种,总共啊,有3*3*2*2=36种情况,但我们只有14个数据,所以我们要通过这14个数据来得到一个对这36种情况的一个是否会买电脑的判断。

 

 

决策树举例

 在充分了了解了这个决策树的重要性以后啊,我们来讲讲怎么从数据中生成一个决策树。生成决策树有很多种方法,我们介绍一种最典型的,叫做ID3的算法。这个算法早在1975年就被提出来了。为了更加通俗的解释这个算法,我们再举一个例子。

这里我们借鉴了一个非常流行的例子。Cs这个游戏大家应该都听说过吧,这是我们读中学的时候非常流行一个游戏,现在有这个穿越火线等都是属于这种系列的,我们统称为第一人称射击游戏。假设你在玩这个Cs的时候,有一个非常难缠的对手,我们管他叫小明吧,你和他玩了四局游戏以后,感觉他很厉害,所以想从他的游戏数据里面来分析他的这个战术行为来学习学习。我们看看有些什么游戏数据。


                 

            决策树举例

  武器 | 子弹数量 | 血 | 行为
  ——————————————
        机枪 |    多    | 少 | 战斗
         机枪|    少    | 多 | 逃跑
         手枪|    少    | 多 | 战斗
         手枪|    少    | 少 | 逃跑

 

 

这是这个小明啊,他在玩CS的时候,什么时候打,什么时候跑的例子。这个数据中包含了3种考虑的因素,分别是武器种类,子弹数量,和血量。分类有两种行为,一种叫战斗,一种叫逃跑。总共有四条数据。我们先看这三个属性,武器种类,玩过的大家都知道,对于我们这个作战能力的影响非常的大,能不能迅速的解决敌人,主要就看你手上的武器,明显这个机枪肯定比手枪要强。然后是这个子弹数量,这也是一个关键因素,子弹充足的时候打起来肯定比较有信心,你枪再强,没子弹也只能先逃跑找个地方躲起来。最后这个血量也是很好理解的, 没血了冲上去就是送人头对不对。

理解好这三个属性我们就要看看如果说我们通过ID3这个算法来分析这组数据,能够得到一个什么样的结果呢?首先我们先介绍一下信息熵这个概念。

信息熵:是关于这组信息的有序度,也可以说是确定性的一个衡量值,我们通常用它来描述某个属性值的数据对于分类的重要性,如果这组数据越有序,那么它的熵就越低,反之就越高。

这个有序就是有用,可以说这个属性对于做出分类是否给出了确定性的信息。比如说,你问一个人晚上出不去散步,他说月亮圆他出去,月亮不圆他也出去,那他给出的这两条信息啊,其实就是无序的,也就是非常不确定的。这个时候月亮圆和不圆的熵都很高,如果他说月亮圆他就出去,月亮不圆他就不出去,这两句话就非常明确了,这个时候熵就很低。注意到我们说熵的时候可以是指的属性值,比如说月亮圆的熵很高,也可以是指的属性,比如说月亮这个属性的熵很高,这些都是可以计算出来的。我们觉得这组数据给出的信息非常的明确,比如,我们看到CS游戏那组数据中其实子弹的多少就是一个信息很明确的一组数据,当子弹多的时候这个玩家小明很明确的会去打一打试试看,实在打不过再跑嘛。这个时候我们说子弹多,这个属性值的熵很低,它为0,就是明确得不能再明确了。这个是怎么算出来的呢?它是由下面这个公式计算出来的。

 

这里是一个求和公式,n是分类的个数。我们这里只有两种分类,逃跑和战斗,所以n=2。

Sum是这个属性值的数据的总数,我们看到子弹多这个属性啊,只有1条数据,所以sum=1,上面的di啊,是关于这个属性值的数据中在不同的分类中的数量。我们这里只有一条数据它是关于战斗的,所以d战斗=1, d逃跑=0。那么

这就是子弹多的熵。那么子弹少的信息熵怎么算呢,同样的,套用公式, n=2,这个时候,由于关于子弹少有三条数据,所以sum=3,这三条数据里面啊,两条是逃跑,一条是战斗,所以d战斗=1, d逃跑=2。那么

我们得到子弹多和子弹少的信息熵以后,就可以计算这个子弹这个属性的信息熵。属性的信息熵由一下公式来计算

这里sum是所有数据的条数,我们这里都是4,n还是2,这里的di啊,是这个属性值的数据的个数。其实就是一个加权平均值,综合来计算这些属性值的信息熵。所以对于子弹多这个属性值, d=1, 子弹少,d=3所以计算出来

这就是这个属性的信息熵,我们同样的,可以计算出武器手枪,武器机枪的信息熵。

我们首先来看这个武器的熵

然后是这个血量同样我们首先要计算两个属性值的熵,它们分别是

 

到这里,我们将三个属性的熵全都计算完了,我们之前说这个信息熵,表示的是一组数据的混乱程度, 所以这个值,应该越小越好。 

但是我们衡量这三个属性主要用的是一个叫信息增益的参数, 这个参数是通过我们整个属性的一个期待信息熵,我们叫它E(S),减去每个属性的信息熵来求得的。 增益这个名词一听就感觉得到,这个值应该越大越好。

 这个期待信息熵怎么算呢?

 它和求这个属性熵一样,不过它是考虑的行为的比例。

 比如这组数据中, 有两个逃跑行为, 两个战斗行为

 那么它的期待信息熵为

如果这组数据啊, 的行为全部都是逃跑,或者全部都是战斗,那么这组数据的信息熵就是

在这个例子中,我们可以计算出,三个属性的信息增益分别是

 

如果一个属性的信息增益量越大,这个属性作为一棵树的根节点就能使这棵树更简洁,我们就能把这个树写成



最后我们来讲,如何根据我们的信息增益计算结果来生成决策树,这个决策树,我们先选择增益最高的作为最上面的根节点, 就是我们的子弹数量, 可以看到在子弹数量多的情况下,我们就可以直接的做出战斗行为的判断,然后再继续根据增益依次画出决策树。可以看到,决策树的根都是属性,叶子都是行为,连接根与根和叶子的是属性值。这里由于武器类型和血量的增益都是一样,所以可以有两种合理的画法,老师这里给出一种,这个决策树我们可以理解为,有子弹就上,没子弹的话,如果血量多就上,其他情况还是逃吧。如果我们要学习这名玩家的策略,碰到敌人时,就应该优先考虑子弹的数量,如果还有反应时间的话,我们再来考虑武器和血量。

 当然,我们这里还要讲一点就是,就算不计算信息增益,我们也能够构造出关于这组数据的决策树,比如我们一定要从血量作为根节点开始。

 

 

 

什么是语言

相信大多数同学都有过和计算机对话的经历,我们这个苹果手机上搭载了SIRI,我们的微信上也有一些公众号,它们能够在一定程度上跟我们进行文字交流。可见计算机能够理解自然语言,也就是我们人类的语言,使得我们觉得人工智能更加的平易近人了。今天我们就来详细的聊一聊自然语言理解这门技术,语言是人类区别其他动物的本质特性之一。在所有生物中,只有人类才具有语言能力。当然,我们话不能说的这么绝对。

语言:语言是人类区别其他动物的本质特性。在所有生物中,只有人类才具有语言能力。人类的多种智能都与语言有着密切的关系。人类的逻辑思维以语言为形式,人类的绝大部分知识也是以语言文字的形式记载和流传下来的。因而,它也是人工智能的一个重要,甚至核心部分

有些报道说猩猩也会一定的语言,2004年的报道中,美国有只猩猩啊,说是会1000个单词的手语,可以和人类通过手语交流,这个猩猩发音好像由于构造原因不能发那么多复杂的音节,但人家不傻,可以用手语交流,不禁让老师感叹也许这个人猿星球中的未来,还真说不准什么时候就会到来。但不管怎么说,这个语言是高级智能的一种最直观的反应。人类的逻辑思维以语言为形式,人类的绝大部分知识也是以语言文字的形式记载和流传下来的。因此,它是人工智能的一个重要,甚至是核心的一个部分。

当然,这门技术不光光是用在人机交互这个功能上。我们用机器翻译的时候就需要用到自然语言理解的技术,未来如果这门技术发展到非常成熟了,我们就不需要学四六级了,不管去什么国家,带个电脑做翻译, 你说一句中文,它说一句英语。这种工具在很多的科幻片里面都出现过。非常的方便,但是现在大家还是要好好学英语,因为这个技术现在还不够成熟,大家可以期待我们的后代能够免去学习外语的痛苦。但是话说回来,我们这节课还真要用到一些英文,因为传统的自然语言理解的就是建立在英文的基础上的。

大家似乎没法回忆自己是如何掌握第一门语言了吧?也就是中文的学习过程,但英文的学习过程大家应该都还记得比较清楚,很多同学可能从小学就开始学英文。可见学习一门语言其实是蛮难的一件事。我们人学习语言最难是什么?有人说是语法,有人说是单词量。但有一点,大家会不会很好奇,那就是计算机可以瞬间记住一本词典,也可以瞬间就背下所有的语法,那为什么它理解语言就那么难呢?觉得计算机学习语言容易的学者,在计算机刚刚流行的时候特别的多,那时候很多专家认为,用不了多长时间,计算机就能和人类自如的交流。但后来很多事实证明,我们之前太高傲了,也太小看自然语言了。自然语言理解已然成为了人工智能中最难攻破的难点之一。

为什么电脑理解语言这么的难呢?我们首先要知道啊这个语言的理解不仅仅是背单词和背语法那么简单,我们的自然语言理解是有二义性的,这种从各个层次上广泛存在的各种各样的歧义性或多义性是造成困难的根本原因,比如说:

 例:冬天,能穿多少就少;

     夏天,能穿多少就多

 例:剩女产生的原因有两个:一是谁都看不上(看不上别人)

                           二是谁都看不上(别人看不上她)

 例:单身人的由来:原来是喜欢一个人(别人)

                  现在是喜欢一个人(独身)

这种例子你给计算机,估计要晕菜了。要理解这种句子,不但需要对词汇了解,还要断句,还要联系上下文的语境,从这个角度说,英文的机器理解较中文还要简单一点。中文这个断句实在是一个非常难的地方。这也是很多老外啊,在学习中文时候,非常崩溃的地方。

比如,南京市 长江大桥  和 南京市长 江大桥

还有自然语言中经常用到了一些修辞手法,例如,讽刺,暗喻,夸张,排比,反问等等。

还有诸多俚语,也就是方言,就更难理解了。

比如这是老师看到网上流传的中文六级考题:

小明和小强正在谈论小红,这时小红走了过来,小明对小强说:“说曹操曹操就到。”

问:谁到了?

  A.小明B.小强C.小红 D.曹操

 

上司:“你这是什么意思?”小明:“没什么意思。意思意思。”上司:“你这就不够意思了。”小明:“小意思,小意思。”上司:“你这人真有意思。”小明:“其实也没有别的意思。”上司:“那我就不好意思了。”小明:“是我不好意思。”

请问以上“意思”分别是什么意思?

这些题目啊,就更加场景化,你必须还要了解中国的一些国情,才有可能能够明白,这种题目,对老外来说简直就是梦魇一般。

更有甚者。比如中国的古文古诗,连我们自己都难都要专门的学习很久的时间才能学懂,比如这首《施氏食狮史》全是由一个音节组成,简直是丧心病狂。

石室诗士施氏,嗜狮,誓食十狮。氏时时适市视狮,十时,适十狮适市,是时,适施氏适市,施氏视是十狮,拭矢试,使是十狮逝世,适石室,石室湿,氏使侍拭石室,石室拭,始食是十狮尸,始识是十狮尸,实十石狮尸,试释是事。

所以说,人尚且如此,何况机器呢?但是没办法,这个自然语言理解的需求实在是太大了,虽然任务艰巨,学者们还是尝试解决这个问题。

 

 

词法分析

我们现在就来看一下,我们人工智能领域是如何尝试实现自然语言理解的。

首先我们知道,任何一门语言都是由词构成的。英语里面是单词,单词下面还有词根,中文的词可以拆成字,其实可以对应英语的词根。所以这个词的理解就是语言理解的第一步。我们把它叫做词法分析

词法分析的主要目的是找出词汇的各个词素,从中获得语言学信息。

在英语等语言中,找出句子中的一个个词汇是一件很容易的事情,因为词与词之间是由空格来分隔的。但是要找出各个词素就复杂得多。

如:importable,它可以是im-port-able或import-able

这是因为im, port和import都是词素。而在汉语中要找出一个个词素则是再容易不过的事情,因为汉语中的每个字就是一个词素。但是要切分出各个词就远不是那么容易。

:“我们研究所有东西”,可以是“我们—研究所—有—东西”也可以是“我们—研究—所有—东西”。

词法分析的另外一个任务就是,英文中有很多词语有不同的形态,比如动词有不同的时态和第三人称等等,名词有单复数等等,我们如果把这些不同形态都放到词库里面的话,这个会大大增加搜索的难度,所以通常我们都是通过词法分析,就不同形态的单词对应到它原来的形态中去。

如:He catches twobutterflies

这里的catches 和butterflies 就要对应到它们的原型 catch 和butterfly上面去

这就是我们所说的词法分析。

 

 

 

句法分析

我们要理解一个句子啊,用词法分析还是远远不够的,所以我们还要用到句法分析

怎样进行句法分析呢? 

句话分析主要是

句法分析是对句子和短语结构进行分析。

句法分析主要作用有:

1)分析句子或短语结构,确定构成句子的各个词、短语之间的关系以及各自在句子中的作用等,并将这些关系表达为层次关系。

2)规范句法结构,在分析句子的过程中,把分析句子各成分间关系的推导过程用树图表达,使这种图成为句法分析树。

这里大家应该都知道什么是树,这是离散数学中的图论中的一个概念,在我们计算机的数据结构中经常会用到这种树形结构。

所以,这里我们看到,我们要计算机来理解一个句子,就要先讲这个句子转化为一个树的结构,这其实就是要将一个语文问题转化为一个数学问题。我们知道计算机是非常擅长求解数学问题的,所以,只要我们将一个问题能够从数学的层面理解它,那么这个问题就非常好用计算机来求解了。

但是难就难在我们啊,很难从数学层面去理解一些问题。就比如你说这个语言问题啊,如果有个公式可以求解的话,那么我们计算机理解语言也就没有潜在的困难了,比如我每个词语都能够由一个数学公式来表达,那么计算机来理解一个数学公式就容易多了。

所以我们还是要尝试把我们的语言,结构化,模块化,定义化,并使词语和句子之间的关系越明确越好,所以我们需要这个句法分析。

句法分析是由专门设计的分析器进行的,其分析过程就是构造句法树的过程,将每个输入的合法语句转换为一棵句法分析树。 

这里什么叫合法语句呢?就像我们平常说的一些比较规范的话,或者我们书本上的很多句子都是合法语句,但口语中就不一定,比如说我们说句子的合法结构是主谓宾,但我们口语中经常会出现宾主谓

一个句子是由各种不同的句子成分组成的。这些成分可以是单词、词组或从句。句子成分还可以按其作用分为主语、谓语、宾语、宾语补语、定语、状语、表语等。这种关系可用一棵树来表示,如对句子:

He  wrote a  book.

可用图示的树形结构来表示

我们看一下,它用图来表示啊,就是这样子的,首先它是一个句子,我们认为任何一个句子啊,都至少有主语和谓语把,然后谓语又分为动词和宾语,然后分成这种结构以后,我们将这个句子中的的每个单词都对应到这个树的每个叶子上去,如果在中文中,也是一样,他写了一本书,他对应主语,写了对应动词,一本书对应宾语。当然,我们还有一些更加复杂的句子结构,可以看这个图。

这个图中啊,增加了例如终结符,冠词等等新的分支,这样的树结构就能够对应更加复杂的句子。

句法分析中,除了这种叫树结构的分析法以外还有一种也不得不介绍的,叫转移网络,这个转移网络,和我们之前介绍的那个有限状态机,又有点相似了。它本质上啊也是一个有限状态机。

 它也是一种图结构,我们这里又加深了一种计算机特别喜欢图结构的印象对不对。那么什么是转移网络呢,我们简单的说一下,扩充转移网路啊,就是把句子输入到类似这个图的一个网络中去,我们看到这个图有6个圆圈.它就代表我们在理解句子中处于的6个状态

这个转移网络怎么来理解句子呢?比如我们说有这样一句待理解的话,

The small black ducksswallow flies

我们这个转移网络,要从第一个单词开始一个一个处理。那么我们看到a,b上分别有一个箭头,说明句子可以从a,b两个位置输入,Det是冠词的意思,那么如果这个句子是由冠词开始的,那么就从a输入,否则则从b输入,比如有些句子像 JACK loves Rose就应该是从b节点输入。然后这个句子每通过一条边,则处理完一个单词,比如说这句话有6个单词,那么它就要走六条边。我们看一下,它的状态转移就如图所示

它首先从a状态进入,然后经过a到b这条弧,处理了the 这个单词,然后在通过b节点上有一个到自己的弧,上面写着adj也就是形容词,这个句子走了两次这条弧,分别处理完了small和black 这两个形容词,才走出b状态,因为ducks是一个名字,然后走到c状态,依次这样处理完6个单词以后,最后走到终结状态。这个状态转移网络啊,对比这个树结构来处理句子,有一个比较明显的优点,就是一个句子中,像某个名字前面的形容词,可能很多个,比如我们介绍一些领导人的时候,前面的称谓,可能很多。

看过《冰与火》的同学应该知道,里面龙女丹妮莉丝,每次出场的时候都有一大串的前缀,比如龙之母,大草原的卡丽熙,先民的女王等等等等,反正每次都说一大串,如果我们用这个树结构去处理这种句子啊,我们就要设计很多很多种树的结构来匹配不同结构的句子,而用了转移网络以后不管一个名词前面加多少个形容词,我们用一个自己到自己的这种弧就可以解决了,所以说,我们可以用一个转移网络来处理不同结构的句子。

这节课的最后啊,我们再来讲一下自然语言理解中的一个关键部分的发展,就是说啊,我们讲这个自然语言理解,就不得不讲这个语料库

语是语言的语,料是材料的料,库是仓库的库。说的通俗点,就像我们厨师需要食谱一样,对每种食材都要有性质的了解,比如这个胡椒,比较麻,是配料,这个生姜,比较辣等等。说的技术一点,比如说我们中医配药,他需要一个药谱,每一种药材,都有自己的特性。同样的,我们想让计算机了解人类的语言,那就要给它一个像词典或字典一样的东西,比如我们这个语料库,字典是什么,就是用人类语言去解释另一些人类语言,而语料库就可以理解为我们给计算机的一个字典,语料库中记录的就是用机器语言去解释人类语言。当然,其实语料库也是可以被人使用的,它同时也兼具了一些字典和词典的功能。

语料库还有一个重要的特点,那就是,语料库中存放的是在语言的实际使用中真实出现过的语言材料;

这是语料库最重要的一点,没有结合语料库之前啊,计算机的自然语言理解其实是非常的机械的,只会说一些非常非常呆板的话语,一听就不是真人。现在我们很多人机对话软件中可以说出来一些非常口语话的句子,比如会说“你别开玩笑了”,来表示否定,这种就是用到真实的语料库,其实那些话,都不是它想出来的,而是有真人,在相同的环境下,说过同样的话。

但是真实语言,也不是就一股脑的全都放进语料库中去了,我们还需要对其进行一定的加工。

然后我们具体来看一下语料库有些什么样的功能?

1、首先,我们说,我们怎么告诉一些关于人类语言的,计算机又很好理解的东西呢?我们首先想到的就是数据,这个语料库啊,首先统计了一些数据,比如说一个字它有很多种意思,每种意思它出现的频率是多少?这个对于计算机来说是非常有用的,我们理解一句话中某个词或者字的时候啊,如果没有其他的信息,我们就按这个字或者词最长见的意思去理解,对不对。语料库还对一些词语进行了词性的标注,比如形容词,动词等等。

2、其次啊,语料库中记录了很多词与词,或者字与字之间的关系,有一些特定的词语它们通常都会一起出现,比如饕餮,比如,非......不可,如果......那么,之间的常用的一些用法,如果你仅仅是告诉计算机每个字或者每个词的意思,那么它理解起来可能会非常的生硬。这种也可以说是帮助计算机结合上下文来理解一个句子。这个在汉语中还体现在一个分词上,也就是你告诉电脑一句话,到底它应该怎么去把这句话拆成几个词去理解。

3、最后,语料库还能帮助计算机更好的理解语法,因为实际生活中的语言,可能不是严格的按照语法来叙述的,比如:“它的事,鬼知道。”这种句子,如果我们按结构树的方式让计算机去处理,可能会发现啊,它不是一个合法的句子。所以,我们统计下来啊,实际生活的语言,很大部分,都不是严格按照语法来的,这点不光光是咱们中文,在很多西方的语言中也很频繁。所以语料库是来自于我们真实语言的,它也是帮助计算机来理解我们真实语言的。

 所以对计算机来说,有时候,理解一本书,比和一个真人聊天,其实是要容易的,这一点,跟人又是相反的。我们再来具体看一个语料库的例子

我们找到一个语料库的网站,它叫语料库在线,是一个开发的资源。

我们看到,它旁边有现代汉语语料库,古代汉语语料库,这一看就知道,一个是现代文的,一个是古代文的。这里其实就是一个跟一般的字典很像的功能。然后是这个分词和词性自动标注。这里也是语料库的一个常见功能

比如我们输入一段

南京市,长江,大桥

下面的处理结果

南京市/ns   长江/ns  大桥/n

这个分词的结果很明确,每个词后面的字母,分别代表了什么意思呢,我们点一下右上的这个词类标记代码,可以看到,ns是地名,n是普通名词,这个网站上面还有很多功能,也还有很多其他的语料库,大家有兴趣的话,可以自己去网上找一找。

 

 

模糊集合

大家好,我们今天来讲模糊计算。这也是我们人工智能的一个主要分支。首先我们来看看什么叫模糊?

现实生活中,通常会说模糊不清,也就是说这个事物很难明确的归类。专家们在刚开始设计这个人工智能的时候啊,都喜欢告诉计算很多明确的概念和规则,这样的系统在处理现实世界的很多问题时,经常会发现有很多情况是没有办法明确的划分的。所以,专家们开始反思,其实我们的语言就是具有一定的模糊性的,我们看到一个汽车而开到了85公里/小时,我们说这个车速度很快,并不是因为我们脑袋里面有条规则说时速85公里每小时等于很快,而是我们对于80公里/小时这个数值,我们可以有很多语言来描述它,比如:“有点慢,有点快,很快,非常快,特别快”等等,但我们觉得这个速度和很快这个词汇或者说这个概念最为贴近,所以我们这样去形容他。但这并不是说,我们认为这种情况下,说这个速度有点快,或者是特别快就是错的。

如果说我们给电脑的是这样一套清晰的规则的话啊,那么你说85码快,或者特别快,电脑就会跳出来说,你说的不对, 85码就很快,这样的人工智能啊,我们认为它过于死板,所以, 后来计算机学家们研究出一门叫模糊计算的技术, 专门用来给计算机解释现实世界中这些模糊不清的概念。

“模糊”:指概念外延不明确的不确定性。

模糊这个概念有时候容易和概率方面的概念混淆,我们先举一个例子

假如你不幸在沙漠迷了路,而且几天没喝过水,这时你见到两瓶水,其中一瓶贴有标签:“纯净水概率是0.95”,也就是95%,另一瓶标着“纯净水的程度是0.95”,你选哪一瓶呢?前者就是概率,说明这瓶水有可能不是纯净水,可能是毒药什么的。后者就是模糊概念,说明这瓶水啊,虽然不是100%纯净的,有一定的杂质,但基本上人都会选后者,没必要赌对吧。

对模糊这个概念了解以后我们再来看看什么叫模糊集合?

一般而言,在不同程度上具有某种特定属性的所有元素的总和称为模糊集合。

我们说20岁叫青年,30岁也叫青年,现在40岁也叫青年,但30岁叫成青年比40岁叫青年啊,更加的恰当对不对?

比如这个例子:

青年={年龄|15岁≤年龄≤40},就说明, 15岁的人和40岁的人对于青年这个概念的隶属程度是一样的。

但这显然不够科学,所以我们用一个模糊集合来表示青年这个概念是怎么样的呢?我们把15岁到40岁之间每一个年龄点,都给一个0-1之间的数来衡量这个年龄点。跟青年这个概念的隶属关系。这个衡量的值越大,说明这个年龄被形容成青年就越恰当。那么怎么样,把这个年龄和衡量的值给对应起来呢。

我们在这里使用一个隶属函数来实现这种对应。看这个图。横坐标是年龄,纵坐标是隶属青年这个概念的值,曲线是呈一个拱形,说明,越中间的年龄啊,就越青年,越两边的年龄就越不是青年。

这个曲线的数学形式是

这里的μA(x)就是这里纵坐标的取值

所以说,模糊集合的基本思想就是把经典集合中的隶属关系加以扩充,将元素对“集合”的隶属程度由只能取0和1这两个值推广到取单位闭区间[ 0,1]上的任意数值,从而实现定量地刻画模糊对象。 

那么模糊集合一般是怎么表示的呢?

例如对论域U={1,3, 5, 7,9},

什么叫论域呢?就是我们刚才说的年龄啊,速度之类的,我们需要来讨论的事物,或者是事物的属性的集合。

可用模糊集AB分别把其中数据的模糊概念“大”和“小”表示出来。

所以说模糊集A是大这个概念,而模糊集B是小这个概念

可以设:

                  A={0, 0, 0.2, 0.6, 1}

                  B={1, 0.5, 0.1, 0, 0}

其中:说明, 1这个数,因为在论域里面是第一个数,所以在A这个集合,也就是大这个集合的对应的隶属值是第一个数,这个数是0,我们这个隶属值可以表示为μ(1)=0.在B这个集合,也就是小这个集合的第一个数是1,所以,它和模糊概念大的隶属程度是 0,而和模糊概念小的这个隶属程度是1. 我们也可以依次的看出, 3、5、7、9的对应关系。注意到虽然大和小两个概念是相对的,但1个数对两个概念的隶属值并不一定是互补的,也就是一个数对大的隶属度并不一定是1减去它对小的隶属度。像这个例子中, 3对大的隶属度是0,对小的隶属度是0.5,加起来就不等于1.

我们在看一个别的例子哦,我们通常会说有些狗聪明,有些狗笨,这个狗的智商啊,也是个模糊概念。

比如我们这个例子中,我们的论域是5只狗,

看图片不知道大家能不能认出来哦

它们分别是

边境牧羊犬,金毛,柯基犬,吉娃娃,斗牛犬

我们建了两个模糊集聪明狗和笨狗

分别是

聪明狗={1, 0.8, 0.6, 0.2, 0.1}

   笨狗={0.1,0.2,0.4, 0.8, 0.9}

这是老师按照往上这个狗的智商排名来做的一个集合。

边境牧羊犬是公认的智商最高的狗啊,所以,它在这个聪明狗这个集合中的隶属值就很高。我们这个隶属值可以表示为μ聪明狗(边境牧羊犬)=1.而它在笨狗这个概念中的隶属度就很低了。而斗牛犬的智商,很不幸的,在犬类里面是倒数的,所以,它在笨狗中的隶属度有0.9,我们说μ笨狗(斗牛犬)=0.9.

 

模糊关系

我们刚才谈了一些模糊集合,这些模糊集合为了更加明确的表示,我们这里介绍几种比较典型的表示方法。

1、Zadeh

若给定有限论域U,U={u1, u2,····, un},用A(u)代替µA(u), 则U上的模糊集合A可表示为:

这里面+并不是求和的意思,而是一个分隔符比如刚才那个例子用这个方法可以表示 

2、序偶表示法

如考虑论域U={1,2,3,···,10}上“大”、“小”两个模糊概念,并分别用模糊集合A、B表示如下:

A={(4,0.2),(5,0.4),(6,0.5),(7,0.7),(8,0.9),(9,1),(10,1)}

B={(1,1),(2,0.9),(3,0.6),(4,0.4),(5,0.2),(6,0.1)}

模糊集里面每一对数,都表示了论域中的一个元素以及这个元素在这个集里面对应的隶属值。

这里在集合A中,没有1、2、3对应大这个概念的隶属值,所以,默认1、2、3在大概念上的隶属值为0。

同样的,在集合B中, 7、8、9、10在小这个概念的隶属值也为0。

这就是序偶表示法。 

模糊集合的表示法很多,我们这节课主要介绍以上两种方法。 

有些时候我们要去结合思考两个模糊概念,比如刚才那个宠物狗的例子,如果我们说我们知道了那几种宠物在聪明这个概念上的隶属度,又知道了它们在可爱上的隶属度,那么它们在既聪明又可爱的概念上的隶属度是什么样子的呢,这里就涉及到一个模糊集合的运算问题。

 比如我们买东西经常会讲一个概念,叫“性价比”。这其实就是两个概念,性能和价格的一个综合考虑。比如说,我们说某5样商品,比如5款手机吧,它们在性能优越,和价格实惠两个指标上的隶属集分别为A和B。 

A={0.9, 0.5,0.6, 0.8, 0.8}

B={0.7, 0.8,0.3, 0.7, 0.85}

那它们在性价比上的隶属集为多少呢?其实就是既价格实惠又性能优越对不对。

这个时候我们用一个“∩”,也就是 我们要求集合A和集合B这两个模糊集合的交集。

我们会求两个普通集合的交集,如果是把A和B看成普通集合的话,那么它们的交集应该就是A∩B={0.8} 对不对。

但我们现在是两个模糊集,所以, 我们这里的交集是求每一对元素的下界, 在这里, 就是每一对元素的最小值。

(AB)(u)=A(u)⋀B(u)=min{A(u), B(u)}

所以

(AB={min(0.9,0.7),min(0.5,0.8), min(0.6,0.3),min(0.8,0.7), min(0.8,0.85),} 

={0.7,0.5,0.3,0.7,0.8}

 这就意味着,如果一件商品,它不是既有实惠的价格,又有很好的性能,我们就不能够管它叫高的性价比。 

这就是两个模糊集合的交运算,同样的道理, 求两个模糊集的并运算与普通集合也不一样。两个模糊集的并运算就变成了求每一对元素的上界,在这里,就是每一对元素的最大值。

所以,

AB:   (AB)(u)=A(u)⋁B(u)=max{A(u), B(u)}

这两个模糊集的并集表达的意思就是说, 比如刚才那个例子, 就是一件商品性能优异或价格实惠,两个优点有一个的隶属度。 

 

补运算

这节课我们还要介绍一种模糊集的运算, 叫补运算,就是如果我们知道这5件商品它们在性能优异这个概念上的隶属度,我们能不能计算出它们在性能低下上的隶属度呢?可能很多同学已经想到怎么求了。

我们将每一个元素都被1减一下,就得到了这个模糊集的补集,因为模糊集中的元素大小都是大于0小于1的。

例如

集合A={0.9,0.5, 0.6, 0.8, 0.8}是五个商品在性能优越上的隶属度。

A’={0.1, 0.5, 0.4, 0.2, 0.2}就是这五个商品在性能不好或者性能低下上的隶属度。

所以说这就是A补的计算方法

A´:    A´(u)=1-A(u)

以上就是三种我们要主要介绍的在模糊集上的运算方法。可以看到,模糊集上的运算有一个特点,就是它不会改变模糊集的大小,也就是模糊集中元素的个数,这一点和普通集合有着明显的区别。

模糊统计法 

我们这里介绍一种叫做模糊统计法的方法,这个方法具体是怎么样的?我们先来看一个例子。 

现在有一个非常流行的词,叫“经济适应男”。这其实是一个模糊概念对不对,因为没有什么规定到底多少收入算经济适应男,那么老师先收集了5个男青年的这个月收入情况,分别是2500,4000,6500,5000,12000。

如果说我们要求这几个男青年的论域,在经济适用男这个概念上的隶属程度的话,要怎么做呢, 如果我们用这个模糊统计法啊, 我们要去找一定数量的评委,于是,老师收集了5位女性她们对于这个经济适应男收入的一个评价范围,也就是她们认为什么样收入的男士可以归属到这个范围,比如说2500-4500这个统计啊,大家都知道,一般我们统计的数是不会这么小的。 一般都是一个比较大的数。这里我们只是为了说明这个方法的使用,所以用了一个比较小的统计样本数,我们来看一下, 它们分别是

“2500-6500、3000-5000、4500-5000、5000-7000、3500-6000”

然后啊,有了这些数据我们就能计算这个隶属度了,首先是2500的这个收入,这个收入, 5个人里面只有1个人认为是属于这个范畴的,所以说,它在这个概念上的隶属度为五分之一,也就是0.2.对不对,只有第一个人2500-4000是包含了这个收入的,所以是5分之一,同样的, 4000这个数啊,我们发现,5个人都认为是在这个范畴内的,所以它的隶属度非常高,是5分之5,也就是1。

 我们继续求6500,5000,和12000的隶属度,可以分别求出为0.4、1和0.

 所以这就是我们的模糊统计法。

模糊统计试验

在论域U中给出一个元素u,再考虑个具有模糊集合A属性的经典集合A*,统计元素u对各个A*的归属次数。 UA*的归属次数和n的比值就是uA的隶属函数。

这个经典集合A*啊,就是我们刚才统计的5个收入的范围。

当我们做了足够多的统计的时候,这个每个元素的隶属值就会趋于平稳。

 

模糊集合的贴近度

模糊集合的贴近度这是我们衡量两个模糊集有多接近的一个指标,为了求这个贴近度,我们要学习两个新的概念,一个叫内积,一个叫外积

这个内积的符号,用一个小圆圈来表示。

它是A集合和B集合每个元素的交集然后求并集,通过我们刚才所讲的这个模糊集合上的运算啊,这个元素的交集就是两个元素取最小的一个,并集就是两个元素求最大的一个,所以这个内积啊,就是AB两个模糊集每对元素都取最小的以后,再在这些两两较小的元素中,取最大的一个, 不知道大家听明白没有。 

我们来看一个例子:

A=(0.2,0.6, 1, 0.8, 0.4),  B=(0.3,0.5,1, 0.7, 0.3)

这里(B)=(0.2∧0.3)∨(0.6∧0.5)∨(1∧1)Ú(0.8∧0.7)∨(0.4∧0.3)

         =0.2∨0.5∨1∨0.7∨0.3=1

同样的,我们的外积,就是两两中最大的一个的集合里面,取最小的一个。这个外积的符号用一个大圆圈里面一个叉来表示。

所以

那么用刚才我们算内积的这两个集

我们刚才说,要用内积和外积来计算贴近度,我们认为,如果两个模糊集越相近,那么它们之间的内积会越大,它们的外积,会越小,所以,我们用一个符号N来表示两个模糊集合AB的贴近度的话, 

这里的交运算和补运算跟之前我们学过的一样。那么对于刚才那个例子,内积为1,外积为0.3的情况下, 外积的补运算为1-0.3=0.7, 0.7和1求交运算得到结果为0.7. 这就是AB两个集合的贴近度。

 

 

 

模糊分类

上节课我们主要介绍了模糊计算的一些基本知识。这个模糊计算它相对于我们传统的精确计算,是一种特殊的计算方法。这节课我们来主要介绍我们人工智能领域是如果利用模糊计算的。其中模糊计算是人工智能领域最早应用于工业领域的技术之一,也就是最早创造出价值的技术之一。当然,这个技术一开始也没有应用于机器人和人机交互这些相对前沿的领域,但却在家电领域 发挥出了很好的效能。

日本的家电大家都很熟悉吧,例如松下,日立,索尼等等,日本的家电产品之所以在消费者市场上占有很大的一席。

与其早在上世纪80年代末期就很好的运用了模糊控制技术有着很大的关系。上世纪80年代末是什么概念啊,当时啊,在我们中国,家里有台黑白电视机就是很不得了的事情了,一般那时候一个镇上或者村上都只有几台电视,一台小电视都是几十个人围着看,那个时候开始日本就将这个模糊控制技术应用到了这个家电的控制系统上去。

举个例子, 像洗衣机啊, 我们不是经常说全自动洗衣机吗,这个洗衣机的自动控制系统啊,就用到了很多模糊计算的理论,不知道大家有没有观察过洗衣机,仔细观察过的同学就会发现啊,洗衣机每次洗衣服的时候,就算在同一种程序下啊,根据衣服的材质,脏的程度和量的不同啊,洗衣经过的步骤,每一步的时间也是不同的。这就说明这个洗衣的程序是有一定的智能的,如果是按精确理论来设计的话,那么机器就很呆板。比如转多少下、放多少水、洗衣的强度都是固定的,这样设计的洗衣机被证明是不好用的。而在模糊控制理论下设计的洗衣机啊,它更能根据衣物的具体情况,生成更为合理的洗涤方案,这样就大大的提高了洗衣机的效能。我们接下来就来讲讲,模糊理论具体是如何应用的。

我们今天主要讲这个系统中主要用到的三种技术

模糊识别

模糊规则

模糊推理

 

 

 

 

模糊命题

首先来讲这个模糊识别。和模式识别只有一个字的差别,它也属于是模式识别的一种,可以看成是模糊模式识别。

定义:

设论域Un个模糊集Ai (i=1, 2,···, n)为n个标准模式,任取u0U,若存在i∈{1,2,···,n},使得

  

则称u0相对地属于Ai

 

回忆一下,什么叫做论域,其实我们之前的例子中,那些实实在在的物体的概念的集合,比如说狗的集合,汽车,电脑的集合等等,这是论域。然后什么是标准模式呢?就是我们之前说的那些模糊概念,比如汽车的速度,有慢,很慢,快,很快等等。所以,我们的这个模糊识别就是把一个论域中的对象,识别到某一个它隶属度最高的一个模糊概念上去,比如90公里每秒这个速度,它是论域中的一个对象,我们要把它对应到某一些个模糊概念上去,发现隶属度最高的那个模糊概念,比如说很快,就是关于这个对象在这些个模糊概念上的模糊识别结果。 

我们来具体看看这个识别过程是怎么样的。我们来看一个具体的例子:

设有6种商品的集合为U={u1, u2, u3,u4,u5, u6}, 将这些商品分为滞销商品、脱销商品、畅销商品三类,分别对应于模糊集A1,A2, A3,  且我们还知道他们在每个模糊概念

滞销商品

 

脱销商品

 

畅销商品

 

这种表示方法在上一节课中,我们已经介绍过了,这个看上去像分子和分母的表示,其实说的是, 这个分母是这个论域中的某个对象,而分子,是其在这个模糊概念上所对应的隶属度,我们的模糊识别通常是用一种叫做最大隶属原则的方法来进行判断的,比如对于u2这个商品,它在A1,A2,A3上的隶属度分别为0.1,0.1和0.8,那么我们模糊识别就讲它隶属程度最高的那个类别,在这里是A3,也就是畅销商品类,作为我们的识别结果。同理,这个例子中u1,u4,u5都是属于A1这个 类,u2,u3,u6都是属于A3这个类。这就是我们所说的,这个模糊识别的问题。

 

 

 

模糊命题

首先来讲这个模糊识别。和模式识别只有一个字的差别,它也属于是模式识别的一种,可以看成是模糊模式识别。

定义:

设论域Un个模糊集Ai (i=1, 2,···, n)为n个标准模式,任取u0U,若存在i∈{1,2,···,n},使得

  

则称u0相对地属于Ai

 

回忆一下,什么叫做论域,其实我们之前的例子中,那些实实在在的物体的概念的集合,比如说狗的集合,汽车,电脑的集合等等,这是论域。然后什么是标准模式呢?就是我们之前说的那些模糊概念,比如汽车的速度,有慢,很慢,快,很快等等。所以,我们的这个模糊识别就是把一个论域中的对象,识别到某一个它隶属度最高的一个模糊概念上去,比如90公里每秒这个速度,它是论域中的一个对象,我们要把它对应到某一些个模糊概念上去,发现隶属度最高的那个模糊概念,比如说很快,就是关于这个对象在这些个模糊概念上的模糊识别结果。 

我们来具体看看这个识别过程是怎么样的。我们来看一个具体的例子:

设有6种商品的集合为U={u1, u2, u3,u4,u5, u6}, 将这些商品分为滞销商品、脱销商品、畅销商品三类,分别对应于模糊集A1,A2, A3,  且我们还知道他们在每个模糊概念

滞销商品

 

脱销商品

 

畅销商品

 

这种表示方法在上一节课中,我们已经介绍过了,这个看上去像分子和分母的表示,其实说的是, 这个分母是这个论域中的某个对象,而分子,是其在这个模糊概念上所对应的隶属度,我们的模糊识别通常是用一种叫做最大隶属原则的方法来进行判断的,比如对于u2这个商品,它在A1,A2,A3上的隶属度分别为0.1,0.1和0.8,那么我们模糊识别就讲它隶属程度最高的那个类别,在这里是A3,也就是畅销商品类,作为我们的识别结果。同理,这个例子中u1,u4,u5都是属于A1这个 类,u2,u3,u6都是属于A3这个类。这就是我们所说的,这个模糊识别的问题。

 

模糊语言

然后我们来讲这个模糊规则和这个模糊推理,我们之前讲过这个一般的基于规则的推理,我们稍微回忆一下,我们一般规则,通常有前件和后件, 前件是一个以IF,也就是如果xx开头的语句,后件是THEN,也就是那么什么什么开头的语句。

我们之前所讲的那些规则的条件和结论通常都是明确的,但是我们自然语言中的很多条件和结论,其实都是一些模糊的概念,比如我们说某某某是个年轻人,这个年轻人就是一个模糊的概念,所以如果把这样的语句作为条件或者结论的规则,就叫做模糊规则。

我们自然语言中,还会出现很多模糊量词,比如极少,很少,几个,少数,多数,几乎所有,等等。这样的量词就叫模糊量词。以及一些模糊可能性,比如或许, 必须, 非常可能,非常不可能, 有些假等等。这样的一些规则啊,你给到那些传统的基于规则的系统,它们就不知道怎么用,所以我们要建立一种基于模糊计算的规则推理系统。

比如这种可能性的语言我们给它们一个叫做置信度的参数,这个置信度在英文中叫做,confidence  factor, 简称(CF),比如我们有一条模糊规则,如果天上有乌云,那么很有可能要下雨了我们将很有可能这个模糊可能性转化为一个置信度的话,就可以这样来表示这条规则。

IF 天上有乌云, THEN 要下雨了(CF:0.9)

说明这条规则在90%的情况下,都是正确的, 我们把很有可能这个词语转化为了一个90%的置信度。这个置信度啊,就是我们模糊规则的一个标志性的参数。

模糊推理最大的一个特点啊,就是它应用了一些模糊的规则,其次啊就是它实现了一种具体的计算匹配度的方法。

匹配度

就是我们在当前条件与数据库中所有的规则进行匹配时,很多情况下,都不会找到一条规则,是100%匹配的,于是啊,我们就会需要去计算一个当前条件与某个规则的条件的匹配程度。

比如我们说有一条模糊规则,如果一个人年轻,那么他长跑的体力好。那么当我们得到的条件是一个人年龄是35岁,这个条件,与这条规则的匹配度就可以这样来算,我们把35岁看成是年龄论域的一个对象,然后我们事先可以设定一个年龄和年轻这个模糊概念的隶属函数,然后通过这个隶属函数,我们就可以计算出35岁这个年龄在年轻这个模糊概念上所对应的隶属值,然后这个隶属值,就可以看成是我们年龄是35岁,与一个人是年轻这条规则的条件的匹配度。

 

模糊推理

模糊推理的另外一个最大的特点就是它能够根据不同的模糊条件,得到不同的模糊结论。也就是说,我们模糊推理的结论,不仅仅局限于我们规则库中THEN后面,也就是规则后件的那些结论。

如果说,我们的规则是,一个人年轻,那么他长跑的体力就好,我们现在的条件是,一个人年幼,那么他的体力应该是如何呢? 我们这里把年龄设为一个论域,如果年幼,那么在体力的论域上的推理得到的一个模糊概念是什么样的呢?

年龄论域: {10岁, 20岁, 30岁}

体力论域:(5公里, 10公里, 15公里)

模糊概念: 年轻体力好

两个论域上的模糊集分别是{0.5,1,0.6}、 {0.2,0.5.0.9}

也就是说如果我们假设年轻是A,体力好是B,我们的规则就是A->B,那么如果说年幼是A*的话,那么我们要求的就是B*。那么B*可以通过 A*与A->B 这个规则的内积所求得。

什么是内积我们也在上一节课介绍过了,那么这里A->B是一种模糊关系,我们说A中的论域有3个,B的论域也有三个,那么其实我们说如果A那么B这个规则啊,其实就包含了3乘以3也就是9条规则对不对,比如说如果一个人10岁,那么它长跑能跑5公里,这条规则,我们可以给它一个置信度,这个置信度啊,我们取,10岁在年轻上的隶属度以及5公里在体力好上的隶属度的一个较小值,所以说我们这个模糊算子A->B,就是A与B的倒置相交得到的一个矩阵。

比如我们刚才那个例子,

 A={0.5,1,0.6} B={0.2,0.5,0.9} 那么它们得到的A->B的模糊算子矩阵就是这样的:0.5与{0.2,0.5,0.9}取小={0.2,0.5,0.5}

       1与{0.2,0.5,0.9}取小={0.2,0.5,0.9}

       0.9与{0.2,0.5,0.9}取小={0.2,0.5,0.6}

然后这个模糊算子矩阵,再被这个A*={1.0.3,0.2} 这个模糊集来求内积,也就是最小中的最大,得到的B*={0.2, 0.3, 0.2} , 这就是我们通过模糊推理根据年幼这个模糊集条件得到的结论。 

大家可能很多疑问,比如说,为什么模糊算子是这样设计的?实际上,模糊算子有很多种,刚才这种是比较常见的一种,根据不同的模糊算子得到的结论也是不同的,也就是得到B*是不同的,我们可以通过计算贴近度的方法,来找到与B最贴近的那个B*, 作为我们模糊推理的结果。

 我们介绍完了模糊推理的基本知识,然后我们来看一下,这个在洗衣机啊,这个家电的控制上,到底是怎么应用的。

我们的这个洗衣机里面啊,通常都有一些传感器,来测量例如水位啊,水浑浊度啊,水温等等。我们通过传感器测量到的这些参数,都是一些数值,对不对。 我们首先要做的就是把这些数值给模糊化,比如说水的浑浊度,我们设置有,特清,清,较清,中, 较浑浊,浑浊,特浑浊 七个模糊集。然后,我们要设置关于这七个模糊概念的隶属函数,比如这个图。 这个图的横坐标,0到6,其实就是我们根据传感器测量到的指数,这些指数啊,就是一个论域,关于浑浊度的论域,然后同样的,我们把这个水温以及洗涤时间也模糊化,水温有这个,低,中,高, 三种,而洗涤时间,有短,较短,标准,较长,长,5种 。这是第一步,当然,还有很多参数可以模糊化,我们这里只是列举了三种。

为什么要模糊化呢?是为了去应用一些模糊规则,比如说,我们知道当谁比较混沌,水温又比较低是,我们的洗涤时间就较长,等等这样的规则,是我们人通过测验检测出来的,这些规则如果按精确的数字来表达的话,可能会有不计其数的组合,但我们把这些参数都模糊化以后,就有了比如下表的,一个模糊规则表

这样一来,是不是规则就很有限了呢。有了这些规则以后啊,我们在实际洗衣的程序中,把测量到的参数,对应好相对应的模糊集上,然后计算出匹配度最高的那条规则,然后再进行模糊推理,就可以很好的控制,洗衣时间,洗涤剂量,以及洗衣强度等参数,然后来更好的洗净衣物和保护衣物。然后到浑浊度达到一个值的时候,能够自动的停止。这就是今天我们介绍的,模糊计算,在现实工业和生活中的应用,不知道大家是不是听明白了呢?

 

 

概率论相关基础知识

我们有时候发现,我们问计算机一个问题,计算机现在往往给你一个关于这个问题答案的几种情况,并给出它们的概率。比如我们在用搜索引擎时,我们打一个“电”字,搜索引擎啊,就自动的把“电视剧、电影”等等用户在键入“电”字以后,最常用的几种后续的搜索情况给列举了出来。

比如我们问明天是否会下雨,电脑会给一个降水概率。

这种情况,我们一般叫它预测

预测:即通过现在发生的事情来判断以后还未发生的一些事情的情况

但有些时候啊,我们还要求计算机通常现在发生的事情,来推测已经发生过的一些事情。大家发现我们在输入搜索词条的时候啊,有时候会输错啊,比如我们看过这个 超能陆战队啊,打成超能六战队的时候,系统会自动的跳出“超能陆战队”的结果。这就是啊,电脑收到“超能六战队”的时候会推测出,用户是因为要搜索“超能陆战队”打错了而输成了“超能六战队”。这就不是预测对吧,因为是先输出错了,再搜索的,所以,这是在推测之前发生的一件事情。这种事情,通常是通过一种叫做贝叶斯方法的技术完成的。

贝叶斯方法是一种计算假设概率的方法。

在我们介绍贝叶斯方法之前,我们先简单的讲讲几个概率的概念。

什么叫概率?

若在大量重复试验中,事件A发生的频率稳定地接近于一个固定的常数p,它表明事件A出现的可能性大小,则称此常数p为事件A发生的概率,记为P(A)。

就像我们经常丢硬币,当我们丢的次数非常非常多的时候,我们会发现正面和反面的概率会是一样的,都是50%。当然,这需要一个完美的硬币,也就是前后都没有图案的,比如美国的一元硬币啊,就有人做实验投了几百万次,发现,正面的概率要略高于反面。

条件概率:就是在某种条件下的事件A发生的概率

这个条件,我们也可以说成是当事件B发生时,即是说事情B发生时,事件A发生的概率。我们把它记成P(A|B)。比如我们说我们投硬币的时候啊,如果我们先把硬币朝上,放在我们手中,再投,我们就会有一个条件概率, 因为是我先把硬币朝上放在手上,再投出硬币朝上的概率。也有人统计过, 说这两个事情是有影响的。所以啊,这是个条件概率。如果, 我们说我们投硬币的时候,有些人会先深呼吸一下,这个事情,相信是对投出的结果是没有影响的,所以我们称这两个时间是独立事件,在这种情况下啊,我们认为

P(AB)=P(A)*P(B)

 

乘法定律:设A、B为两个任意的非零事件,则其乘积的概率等于A(或B)的概率与在A(或B)出现的条件下B(或A)出现的条件概率的乘积。

P(A·B)=P(A)·P(B|A)

或 P(A·B)=P(B)·P(A|B)

也就是说,A*B是指两件事情都发生的概率,这个概率,我们可以这样来计算,我们首先知道事件A发生的概率,然后我们设法知道当事件A发生以后事件B发生的概率,然后我们把这两个概率相乘就得到了两个事件一起发生的概率。

 

比如:“明天天气晴朗”且“公园人多”的概率就等于“明天天气晴朗”的概率乘以“在天气晴朗的条件下公园人多”的概率。

值得注意的是,如果说一个事件A,对另外一件事件B的概率没有影响,就是两个概率是独立的情况下,这个时候,P(B|A)=P(B),同理P(A|B)=P(A)。

 

贝叶斯公式

介绍完这三个概念,分别是概率,条件概率和乘法定理以后,我们就可以开始介绍贝叶斯公式了。

贝叶斯定理由英国数学家贝叶斯 ( ThomasBayes 1702-1761 ) 发展,用来描述两个条件概率之间的关系,比如 P(A|B) 和P(B|A)。按照乘法法则:P(A∩B)=P(A)*P(B|A)=P(B)*P(A|B),可以立刻导出

如上公式也可变形为:P(B|A)=P(A|B)*P(B)/P(A)

其实我们刚才在介绍乘法定律的时候啊,就可以看到,AB事件同时发生的概率可以由两种方法计算出来,第一种是先知道A发生的概率,然后再通过在A发生的条件下B发生的概率来计算,另一种是先知道B发生的概率,然后再通过B发生的条件下A发生的概率来计算。我们把这两部分等同起来,就得到P(A)·P(B|A)=P(B)·P(A|B)。这四个概率里面只要知道三个的话,就能算出第四个。这个公式通常用来计算其中的一个条件概率那么我们就把它写成 

P(B|A)=P(B)·P(A|B)/ P(A)

这个公式非常的有用,因为我们经常会发现一些现象,或者是结果,我们希望知道这些结果是怎么造成的,然后我们推断一个原因,然后我们想知道我们推断有多大的正确性的时候,就通常会用到贝叶斯方法。

因为我们对这个原因和结果本身出现的概率有一定的了解,且我们知道这个原因造成这个结果的概率大概是多少,所以我们就能通过贝叶斯公式来推测这个结果是由这个原因造成的概率。

比如,老师收到一条中奖信息,说中了1000万,我们把它叫做事件A,我们通常会推断这是老师给我发的信息,我们把它叫做事件B。我们这样推断是很有把握的,也就是说,我们认为P(B|A)是很高的,其A是B的一个结果,先有骗子要骗我,我然后才收到假的信息。

为什么我们这个推测很有把握呢?因为我们首先知道,中一千万的概率是很低的,也就是说P(A)很小,然后最近老师经常收到这种信息,所以P(B)很大,也就是骗子给我发信息的频率很高,最后骗子给我发的信息,大多都是中奖信息,也就是说P(A|B)的概率是很高,所以我们通过贝叶斯公式P(B|A)=P(B)·P(A|B)/P(A)可以推测得到一个很高的概率。也就是说这个推测概率,和P(A)是呈反比的,比如我们说不是1000W,是10块钱,我们可能就不会觉得是个骗子短信,因为中10块钱还是有可能的。还有一个原因啊,骗子发短信也很少发10块钱的对不对,也就是10块钱的时候啊说P(A)增大了,且P(A|B)的概率见笑了,在这种情况下,我们P(B|A)的概率会降低。也就是说,如果中了10块钱的情况下,我们还会考虑考虑真假,不会笃定说是骗子短信了。

同样的,如果在十几年前, 还没有那么多骗子发短息骗人的时候,也就是P(B)还很小的时候,也就是说当P(B)减小时候,P(A|B)也会减小,我们收到一条这样的短信,也许我们还会相信这种好事真的会发生,现在还是不要搭理,更不要打电话去咨询什么的。

有些时候,我们也许不知道P(B),也许B这个事件啊,总是在某些事情发生以后才会发生,所以说,我们不能断言,或者说不好单独统计B的概率的时候,我们会通过全概率公式来求B得概率,也就是说,我们不直接统计B发生的概率,而是统计B所有发生的情况下,的条件概率, 然后在统计这些条件所发生的概率最后,来计算出B的概率。

这就是我们所讲的贝叶斯理论。我们通常管这个公式中的P(A)和P(B)啊,叫先验概率P(A|B)和P(B|A)叫后验概率

我们人很多时候说自己是后知后觉,其实也就是,我们经常是先知道了一件事情的后验概率,然后反过来才发现原来先验概率是这样子的。也就是说,我们人对很多事情的看法,都是很主观的,然后当我们经历了很多事情以后啊,就会不停的去修正这些主观的看法,当你很成熟的时候,也就是说,对很多事情的看法是很客观的,就是说得到了很多事情的一个比较客观的先验概率,但是你不去经历,也就是获取很多后验概率的话,你又没办法得到一个事情的先验概率,不知道同学们知不知道老师所说的意思。

 

贝叶斯分类

既然这个贝叶斯理论这么有名,那么它到底有什么用呢?它不会是个空有其表把?

贝叶斯(约1701-1761) Thomas Bayes,英国数学家。约1701年出生于伦敦,做过神甫。1742年成为英国皇家学会会员。1761年4月7日逝世。贝叶斯在数学方面主要研究概率论。他首先将归纳推理法用于概率论基础理论,并创立了贝叶斯统计理论,对于统计决策函数、统计推断、统计的估算等做出了贡献。他死后,理查德·普莱斯(Richard Price)于1763年将他的著作《机会问题的解法》(An essay towards solvinga problem in the doctrine of chances)寄给了英国皇家学会,对于现代概率论和数理统计产生了重要的影响。贝叶斯的另一著作《机会的学说概论》发表于1758年。贝叶斯所采用的许多术语被沿用至今。

 

在这个理论刚出来的时候,大家还并不知道它的伟大,贝叶斯本人和很多伟大的艺术家一样,它的作品只有在他死后才发现其珍贵的价值。

贝叶斯方法被后人用于很多推理和分类,下面我们来介绍一下什么是朴素贝叶斯分类

它是一种基于贝叶斯理论的十分简单的分类方法叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。

通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。

 朴素贝叶斯分类的正式定义如下:

现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

     1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

     2、统计得到在各类别下各个特征属性的条件概率估计。即

比如来自亚洲的人的皮肤颜色,黑色的是百分之多少,黄色的是百分之多少。

然后来自非洲人的皮肤颜色,美洲人的。。等等然后是亚洲人的眼球颜色,非洲人的眼球颜色,美洲人的。。。就这样来计算各种不同的属性

   3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

      

因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,这是贝叶斯分类方法的一个重要假设,也是它被称为朴素的另外一个原因,所以有:

       

可以看到,整个朴素贝叶斯分类分为三个阶段:

第一阶段——准备工作阶段

这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

第二阶段——分类器训练阶段

这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。

第三阶段——应用阶段

这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

实践已多次证明,朴素贝叶斯在许多数据集上不逊于甚至优于一些更复杂的分类方法。这个贝叶斯分类方法经常被用来区分SNS社区中的不真实账号,新郎微博大家都知道吧,有时候啊,你经常发现会有一些号主动来粉你,但你跟它说话啊,它又不理你,不理你把,也就算了,还老发广告,非常的烦人,其实这些账号啊,都是不真实账号,都是由程序控制的,我们俗称僵尸粉。

这个僵尸粉问题曾一度将新浪微博啊,拉下了第一社交应用的宝座。所以说,后来者啊,对这个辨别僵尸粉啊,都下了很多功夫,但如果要用人工检测的话需要耗费大量的人力,效率也很低下,所以我们主要还是用这种机器学习的算法,其中一种有效的方法,就是我们今天学的这个贝叶斯朴素分类方法。

我们首先可以找到一些可能会对分类有帮助的属性,比如粉丝数啊,关注数啊,平均微博量等等。然后我们再找一些训练样本,比如我们找一些真人的微博,统计它们的相关数据的概率,然后再找一些僵尸粉,统计这些数据,然后再计算真人和僵尸粉条件下各个特征属性划分的频率最后使用分类器进行鉴别。这就是我们使用朴素贝叶斯方法来区分僵尸粉的一个大致思路。

可以说,这是一场人工智能对人工智能的战斗,其实如果有些机器人账号做得很好的话啊,也能绕过你这种分类器,对不对,所以说,道高一尺,魔高一丈,这个虚假账号问题,还是广泛存在的。

 

 

线性分类和非线性分类

我们今天来讲一个非常技术性的话题,我们叫它分类问题,这个分类问题不像搜索问题,推理问题那么高调地出现在课本上,它很低调,但是你在认真学习了很多算法之后,最后发现它们都是围绕着实质上是某种分类问题在进行研究。我们今天专门抽出一节课来学习分类问题,就是希望同学们不要有这种后知后觉的感觉,而是我们在学习了很多算法或者去看一些文献的时候,很早就能发现这就是一个分类问题。 

从定义上来说啊,分类问题是给出样本所属的类别。我们这里所说的样本可以是任何的事物。比如说人,比如说图片,比如说邮件啊、网站啊什么的。实际上,我们人在日常生活中,无时无刻不在进行着分类。比如你去车站接朋友,你站在出站口的时候,每出来一个人,你就会看看是不是你朋友,这就是一种分类。这个时候你对人流进行了一种搜索和分类,一个是是你朋友的类别,一个是不是朋友的类别。你去餐厅里面吃饭的时候你要先点菜,点菜的时候你拿着菜单,你也会进行一次分类,分类出有一些菜是你喜欢的,或者想点的菜,一种是你不喜欢的菜。这种例子还非常多,还有一些时候,你必须得好好分类,比如说我们以前打仗的时候,军队打仗的时候,特别是打这种近身战,我们也叫白刃战的时候,你就特别需要分类,就比如得认清敌我, 你的分得出分出谁是敌人,谁是友军。这个还不能随便分错。所以,我们一般打仗的时候的军服就很重要,这种军服啊,就是我们所说的特征,中国人跟八国联军打仗的时候,人长得不太一样,所以说这个就不太重要,你像当时打日本人的时候,这个军服就很重要。所以我们说每个战士军服就是一个样本。

 今天我们的课基本上就围绕,分类,特征,样本 这三个关键词来进行的。我们在生活中还有很多需要被分类的事物,比如说,垃圾分类,现在这个环境问题很严重,所以就在大面积推广这个垃圾分类。这就需要我们人自己把自己家的垃圾分类好了再扔出去。还有我们说电影,也经常会分类成,动作片,喜剧片,恐怖片等等。还有歌曲,有民歌,流行歌曲等等。我们对不用的问题,有不同的标准。这种标准在我们在计算机里面就叫做分类器。

分类器这个概念也很重要。有很多很多种算法都是去解决一个分类问题,我们换一种说法,我们很多算法其实就是去设计一个分类器。我们脑子里面每认识一个问题,其实在人类的脑子里面就会生成一个分类器。比如说我们有一个择友标准,或者择偶标准,其实那就是一种分类器,哪一类人我能够接受,或者哪一类人我比较喜欢。这种都是比较复杂的分类器。还有更简单的,比如我们认识到狗这种生物类型的时候,我们就可以说我们大脑里面有一个关于狗的分类器,关于狗的分类器它就很简单它做的事情它能够帮我们人去区别一个事物,它是不是狗。这就是我们这要讲清楚的,关于分类和分类器的问题。

我们之前讲过这个搜索技术,我们用搜索引擎去搜一部电影,比如说我们搜一个动作片,那么一堆动作片就出来了,这些分类都是我们人自己去分的,而不是电脑事先分好,都是我们人给的标签。我们看了一部片子就给它一个标签,这是个动作片。 如果说我们让电脑去做这样的事情的话,它能不能做呢?就是我把这部电影让电脑看一遍,让它告诉我这是一部什么类型的电影,这个事情电脑做起来还是挺难的。为什么呢?

因为我们没有办法很好的把这个动作片定义给电脑,就是告诉电脑到底什么样的片子是一个动作片。或者像其他的爱情片,恐怖片等。你都要把也正定义好告诉电脑。问我这里说很好的定义,不是说我们人能够理解的这种定义,而是要定义到电脑能够理解的这个数据结构的层面上,这样的话电脑才能明白,什么样数据结构的影片属于什么样的类别。

 一类事物, 如果我们能够很好的去定义它的某类特征,那么我们就能够很好的进行分类。 

我们再说一个例子,比如说,我们说酒驾,醉驾,我们开车的时候喝了酒这不对对不对?这也是一种分类,如果说没有这个酒精测试仪没有这个血液酒精含量这个具体的特征的话,我们是不是很难真正做到准确分类一个人到底喝到什么程度了,我不能让他走走看他走得直不直,这些特征其实都不准确,但是我们就是要强调有一个非常精准的这样一个特征,就能够来区分他的酒精含量大于一个值就是醉驾,小于一个值就是酒驾,就是这样。

回过头来,我们再说电脑怎么去做这个电影的分类的,电脑可以做这样一件,如果说我们非得要电脑去这样做的话,我们叫它是比较tricky(取巧)的事情,比较取巧的事情,我们可以让它找一部片子,然后去搜所有人对这个片子的评论。如果这些评论里面有这种像打斗,有动作,或者有成龙之类的关键字,我们就可以把这些作为它的一个特征,我们就可以把这个片子归给一个动作片的分类。但是这个呢还是从另外一个角度去进行分类,而不是从这个电脑的本质,像视频的这些特征来进行分类的,所以说这是一种比较tricky的做法,但是我们现在很多网站上可能会用这种方法来进行一些影片,包括一些歌曲的分类。

 

有些事情,我们通过很少的特征就能进行分类,比如说这个超速,一个行驶的汽车,怎么样算超速呢?进行这个超速或者不超速的分类我们仅仅需要一个特征,那就是这个汽车当时的速度就可以进行判断了。这个时候我们的分类器,就是一个点,那么我们只需要在一个一维空间,也就是关于速度的一个坐标轴上,也就是这条直线上找到一个点,那么我们所有的速度都分布在这条直线上的时候呢,只要在点左边的那就是没有超速,在点右边的那就是超速了。这就是关于超速不超速的分类。我们看一下这幅图

这幅图中,我们看到只有一个关于车辆速度的坐标,分类器就是中间那个蓝色的点,大概在80码的地方,那些叉叉就是我们的样本,这个分类器把5个样本分成了两类,图中用不同的颜色标记了出来。但是实际上很少有问题像超速不超速这么简单,用一个特征就能描述得很清楚,一般来说都需要两个以上的特征,我们再来看一下,如果有两个以上的特征的话,应该怎么处理。刚才我们一个特征的时候,是一条线,那么两个特征的时候,就是两条线,两条线就确定了一个平面。而我们的样本,就是由这两个特征决定的平面上的点。

比如图上,我们看到圆圈和十字,这是两种类别,分别在左上和右下,这种二维平面的分类非常简单,我们从中间画一条直线就很好解决了。这条直线,也可以把它看成是一个分类器,我们把这种分类称为线性分类,我们看一个线性分类的例子。

这是一个高低收入的分类的例子。如果我们认为这是一个高低收入分类的例子,如果我们认为这个基本工资加奖金每月收入在8000以上,我们认为是高收入人群,那么我们就有这么一个分类器。

这个分类问题的横坐标是基本工资,x,纵坐标是奖金, y, 分别是X和Y,这个分类器,就是一条直线,这条直线用我们数学方程表示

方程:x+y=8000. 

中间那条蓝色的直线它把整个平面分成了两个部分,一边是低收入的,在这个直线的左边,想这个绿色的叉叉,另一边是高收入的,在这个直线的右边,比如这些红色的叉叉。

这是一个线性划分,我们说这个x+y=8000也是一个线性函数。线性分类都是相对来说比较简单的,他说明我们的分类的原则,比较容易构造,通过一条直线,也就是一个线性函数就可以构造一个线性分类器。

然后,我们再思考这样一个问题,如果说,我们只有这幅图中的5个样本,然后我用不同的颜色把它们区分开来,再通过这5个样本啊, 如表所示

 

来推测说这个判断是否为高收入的标准,我们就可以推测出这么一条直线。在很多实际中的问题,我们都不知道我们推测出来的这条直线是否是正确的,而且实际中的情况还可以推测出很多种不同的分类器,都能够将这些样本正确的分类。

比如说,我们这幅图中,如果我们事先不知道这条蓝色的曲线,我们可能觉得,紫色的,和黄色的直线也都也能够正确的分类这组数据。但我们通常会选择蓝色线来作为这样一个分类器, 因为这样一个分类器在两组数据的更加偏中间的位置,这样的话我们觉得这样的分类器 更有可能是最为正确的分类。我们在预测或者说是学习到的这样一种分类器的时候,它主要是用来区分,一些新的样本。也就是我们在这种训练的过程中没有见过的这些样本,它并不在我们学习过的样本集中。

分类器都包括训练和测试两个步骤,首先通过一部分数据来训练这个分类器,然后再用一部分的数据来测试分类器,来测试这个分类器它是不是正确。

如果用来训练的这部分数据我们知道它们的类型并且告诉电脑的话,那么我们这种叫分类方式叫做基于监督学习的分类。如果我们的分类数据,我们自己都不知道这部分数据的类型,我们就直接给电脑去训练的话,那么我们就把这种学习方式叫做无监督学习。关于有监督学习和无监督学习,我们在接下来的课程中还会有具体的讲解,这节课我们主要还是讲分类的问题,所以这个这个有监督学习和无监督学习就点到为止。

 

刚才我们讲了线性分类,就是说我们能用一条直线来实现分类,但是对于有些数据分布是不能够通过一条直线来完成分类的。

像这幅图,这里的圈圈和十字啊,我们不管用一条直线怎么摆,都无法保证直线的一边是圈圈,另一边是十字。但这种时候我们可以用一个圈来实现这种分类,这个圈它就不是一条直线了。所以我们称这种分类叫非线性分类。可以很容易想到,非线性分类比线性分类要复杂。而且在很多领域研究的分类问题,大部分都是不能用线性分类来解决的,所以它们大部分都是非线性分类。这是我们讲的这个关于分类问题。

 

 

线性回归和非线性回归

 

下面我们再来谈这个回归问题,这个回归是对英文单词 regression 的翻译。这是一个数理统计中的概念。但是在我们人工智能中,特别是机器学习领域它还是一个非常重要的基础学习内容。在我们处理数据时,最经常做的两件事情,其中一件就是分类,另一件就是我们现在讲的回归分析。这个翻译可能对于回归这个事情描述得不是特别准确,我们先来看一幅图,我们来简单的理解一下回归的概念。

我们看到下面这幅图中,有很多的圆圈。首先不看这条直线,我们就会思考,这些圆圈的分布,有什么样的规律?我们通过两个变量,比如说横坐标和纵坐标来确定这些数据点的位置的话,那么我们希望知道这些变量间存在着怎样的因果关系。

接下来可以发现,我们如果用一条直线来拟合这些圆圈,叫做拟合这些圆圈,会让我们觉得这些圆圈都是分布在这条直线周围。就好比说我们在追踪一个人或者是一些东西的时候,发现地上有几个零散的脚印,看到这几个脚印,我们就能够大致推断出我们追踪的这样一个目标它有一个去向,去的方向就是一条直线。所以说回归,其实就是指的在数据中寻找一种近似关系来描述这些数据。

和我们之前所学习的分类问题一样,我们的这个回归问题也有线性和非线性的区别。这个线性分类就是在二元空间中用一条直线来分类数据。线性回归也是一样的,就是用一条直线来描述一组二元数据。

线性回归经常用来进行预测。就好比说,我们统计了每年的这个经济总量以后,就能预测明年的这个经济发展趋势,新闻中我们经常可以碰到。

误差:简单来说, 就是每个数据到这条用来描述它的直线的距离,点到直线的距离的和。

但是有些时候,我们这个数据用一条直线来描述得时候,误差太大。如果这些数据点都刚好落在这条直线上,那么误差就为0。误差太大的时候啊,我们就觉得用一条直线来拟合这些数据不太靠谱,根本就没办法拟合,这种时候我们就会想到我们就通过一条曲线来拟合这些数据,比如这幅图所示。

这些数据, 很明显,如果说我们 用一条直线啊,没办法很贴切去描述它,所以我们用一条曲线,就能够很好的来拟合这组数据了。

简单来说, 比如线性回归, 我们有一组坐标,(x1,y1)(x2,y2)…..我们可以假设一条直线是y=ax+b来拟合这组坐标,现在的关键,就是通过(x1,y1)(x2,y2)….. 来计算出a和b的值。我们知道当我们只有两个坐标时,这条直线很容易确定,这个确定方法我们在高中甚至初中的时候就学过了。但当我们有三个坐标时,这些坐标又不共线的时候,我们就需要来计算这么一条直线,它到这组数据的距离是最短的。至于如何来通过这些数据来计算出这些直线和曲线,这个问题讲起来还相对比较复杂,我们大家可以去学习专门的机器学习课程来丰富这方面的内容。这节课我们就讲到这里。

 

 

支持向量机的基础知识

现在有一个很火的职业,叫数据科学家。现在不少的互联网企业都有相关的职位需求,比如数据分析,数据挖掘,现在这个大数据的概念也非常的火,今天我们来讲一种非常主流的数据分析的方法,叫做支持向量机, 英文名叫 supportvectormachine

由于要完全透彻的理解这个支持向量机啊, 可能还需要一些数学基础, 但老师会尽量把它的主要思想描述给大家,这样一来,大家以后如果有希望从事数据工程师方向工作的同学,可以在面试的时候,不至于对这个算法一无所知,但这个算法要理解得非常清楚的话,用短短一节课的时间是远远不够的,这个后面的修行。 老师在课后会在讨论区分享一些资料,希望感兴趣的同学能够通过后续的学习来完善。这节课的任务,主要是让大家能够了解这个算法,且对其产生兴趣。这节课优先保证的是绝大多数同学都能听懂,如果听懂以后觉得内容还不够多,非常好,你们可以通过自己的努力,来完善。 如果你问,有没有完善的必要,老师想这样告诉你,非常透彻的了解这个算法技术的人现在的月薪都在15K以上。

 我们上节课上,已经介绍了什么叫做分类问题,大家可以回忆一下。看这幅图,我们想象在这个二维空间上,有一些点,红色的和蓝色的,我们要把这两组数据区分开来,我们可以通过一条如图所示的直线对不对。我们上节课管这种数据分布叫做线性可分。但我们也说过,有很多数据是线性不可分的,对这些线性不可分的数据我们可以通过一条曲线对这些数据进行可分,这种分类叫做非线性分类。

理论上来说,任何数据都是可以用曲线分类的。但是这个线性分类器相对于非线性分类器,更加简洁,也更加可能是接近这个数据的真实模型。什么叫真实模型? 就是说,我们看到的这些数据是有限的,比如一个经典的例子就是这个邮件分类,什么是垃圾邮件,什么是普通邮件,我们人啊,有一个正确的分类的想法,但我们给计算机很多垃圾邮件和普通邮件的实例,这个计算机他通过这些实例也能学到一个模型,但这个模型啊,它只是尽可能的符合我们给它的数据特征的一个模型,它和我们需要学的这个人脑真实模型之间,还是有一定的差距的。

机器学习的本质,就是一种对问题真实模型的逼近。以前有很多分类器很擅长被训练,就是它们能够狠好的学习人类给它们的样本,然后产生一个非常复杂的分类函数,这些分类器在给定的训练集上很多都能达到很好的效果,但是对训练集以外的样本的效果却一塌糊涂,这即是我们所说的泛化能力差,推广能力不行,就好比一支部队,在演习的时候表现非常好,所向披靡,但是一到实战就虚掉了。这是为什么呢?因为这种分类器的复杂度很高,这个高复杂度就可能精准地记住每一个样本,但是我们给机器的样本数相对于我们现实世界的样本数简直是九牛一毛,所以这种分类的思路,现在已经渐渐落伍了。这种高复杂度的分类器他会把没有见过的样本,很多都直接分为是反例,因为他就说他不认识,泛化能力太差。

所以SVM支持向量机它的一个特点,就是这个分类的方法尽量的不要太复杂,这是它设计的一个宗旨。什么样的分类方法最简单呢?那就是线性分类方法。

我用一条直线来分类数据,这种方法绝对是最简单的。这个分类器也是最简单的,然而有很多数据,是线性不可分的。那么线性不可分的数据,虽然要追求简单,我们SVM又是怎么对它们进行分类的呢?我们今天就来讲这样一个问题。我们SVM有两个绝活,第一个叫松弛变量。 

比如这个图, 圆形和方形的点各有成千上万个(毕竟,这就是我们训练集中文档的数量嘛,当然很大了)。现在想象我们有另一个训练集,只比原先这个训练集多了一篇文章,映射到高维空间以后(当然,也使用了相同的核函数),也就多了一个样本点,但是这个样本的位置是这样的

就是图中黄色那个点,它是方形的,因而它是负类的一个样本,这单独的一个样本,使得原本线性可分的问题变成了线性不可分的。这样类似的问题(仅有少数点线性不可分)叫做“近似线性可分”的问题。

以我们人类的常识来判断,说有一万个点都符合某种规律(因而线性可分),有一个点不符合,那这一个点是否就代表了分类规则中我们没有考虑到的方面呢(因而规则应该为它而做出修改)?我们人自己在分类的时候是不是也会忽略一些东西呢?所以说我们的这个规则是不是也要因为这一个点来做出一些修改呢?

其实我们会觉得,更有可能的是,这个样本点压根就是错误,我们就可以把它看成是一种噪声,是提供训练集的同学人工分类时一打瞌睡错放进去的。所以我们会简单的忽略这个样本点,仍然使用原来的分类器,其效果丝毫不受影响。

但这种对噪声的容错性是人的思维带来的,对于我们的程序计算机是一个非常严谨的同志,对计算机来说,它没有这样的想法。由于我们原本的优化问题的表达式中,确实要考虑所有的样本点,我们给它的所有训练集对他来说都是有意义的,(不能忽略某一个,因为程序它怎么知道该忽略哪一个呢?),因为我们告诉计算机的训练集都确定是正例还是反例的。但是通过这个松弛变量啊,我们就是说我们告诉计算机训练集里面也是有错误的,这就是我们在这个SVM也就是说支持向量机一直要用到的叫做松弛变量这样一个方法。

 

 

低维向量高维化

这个支持向量机另外一个看家法宝就是它善于将低维线性不可分的数据映射到高维, 然后来实现线性可分。

我们首先来介绍一下, 什么叫低维和高维? 我们这里说的维度,叫VC维所谓VC维是对函数类的一种度量,可以简单的理解为问题的复杂程度,VC维越高,一个问题就越复杂。正是因为SVM关注的是VC维,后面我们可以看到,SVM解决问题的时候,和样本的维数是无关的(甚至样本是上万维的都可以,这使得SVM很适合用来解决邮件的一些分类就是文本分类的问题,它里面的特征非常多,很多很多文字组成。

人在进行分类的时候,通常就偏向于线性划分。你在家整理东西的时候,通常就是会把一类东西放在一边,另一类东西放在另一边对不对,它们之间通常是摆的比较整齐的一条直线对不对,我们不会故意放成一个曲线的分布来整理物体,这就会很不自然。

 然后我们说维数,低维和高维这个问题

 当你和朋友都买了同一款手机的时候, 我们有天碰面的时候,两个人的手机放在一起,款式都是一样的,怎么区分呢?我们就看颜色,其实就是增加了一个这个对手机描述的维度,颜色也是一样的,就看手机壳,又增加一个维度,发现都没有手机壳,我们就打开手机,看桌面图片,反正我们就是在在不停的增加维度的过程中,我们总能够将两个物体按照一定的标准区分开来,这个标准我们通常用语言来描述的时候,就是一种线性的一种分类标准。

分类器的维度高,会带来很多的好处。比如我们在分类男女的时候,我们人使用的分类器的维度其实是蛮高的,比如这种生理特征,比如发型,比如这个穿着,比如生理特征,比如胡须等但是这些维度都是通过我们学习来得到的,因为我们对于性别的分类已经经过了很多次的训练。      在很多事情上, 我们也并不是希望维度越高越好,这些维度我们希望它们是有用的,我们不希望通过,说话的口音,瞳孔的颜色来判断性别。如果我们这个性别的分类器非常非常复杂,我们跟一个人要通过说话以后才能判断出男女,这个维度太高呢也会带来一定的不便,那么说我们处理的时间会太长。所以这里的一个观点就是,要找到能够描述对象的正确属性,就是分类的关键。而将低维的线性不可分的问题,如果说我们有办法把它扩展成一个高维的问题的时候,它有可能就变成线性可分的。至于怎么做,我们下下面这个例子。

我们看下面这幅图,它有两边的数据。左边的数据分布在一个二维平面上,很明显它们是线性不可分的,即不能被一条直线分割。我们通过一个高斯核函数, 将这些数据转换到一个三维空间里面去的时候就可以发现, 这些数据是线性可分的了。 三维空间的线性可分就是指数据可以被一个二维的平面分开。

 

之前我们一直在讨论的线性分类器,器如其名,只能对线性可分的样本做处理。如果提供的样本线性不可分,结果很简单,线性分类器的求解程序会无限循环,不停地调整参数,导致线性分类器永远也解不出来。这必然使得它的适用范围大大缩小,但是我们也实在觉得线性分类器确实也很简单,而它的很多优点我们实在不原意放弃,怎么办呢?是否有某种方法,让线性不可分的数据变得线性可分呢?

有!其实说来也简单,来用一个二维平面中的分类问题作例子,再来仔细的讲解一下,你一看就会明白。事先声明,下面这个例子是网络早就有的,我们这节课在这里是借用一下,但这个例子非常地经典,我一时找不到原作者的正确信息,在此借用,并加进了我自己的解说而已。

我们把横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类。试问能找到一个线性函数把两类正确分开么?答案是不能的,因为二维空间里的线性函数就是指直线,其实这是个二维空间,它的分类器应该是一个点,但是不能找到一个点,所以说不能把它线性可分,显然找不到符合条件的直线。

但我们可以找到一条曲线,例如下面这一条: 

显然通过点在这条曲线的上方还是下方就可以判断点所属的类别(你在横轴上随便找一点,算算这一点的函数值,会发现负类的点函数值一定比0大,而正类的一定比0小)。这条曲线就是我们熟知的二次曲线,它的函数表达式可以写为:

 

 

问题只是它不是一个线性函数,但是,下面要注意看了,我们如果新建一个向量y和a

 

 

这样g(x)就可以转化为f(y)=<a,y>,你可以把y和a分别回带一下,看看等不等于原来的g(x)。用内积的形式写你可能看不太清楚,实际上f(y)的形式就是:

g(x)=f(y)=ay

在任意维度的空间中,这种形式的函数都是一个线性函数,就是一条直线(只不过其中的a和y都是多维向量罢了),因为自变量y的次数不大于1。

看出妙在哪了么?就是说在这样一种情况下,原来在二维空间中一个线性不可分的问题,映射到四维空间后,变成了线性可分的!因此这也形成了我们最初想解决线性不可分问题的基本思路——向高维空间转化,使其变得线性可分。

而转化最关键的部分就在于找到x到y的映射方法。遗憾的是如何找到这个映射,并没有系统性的方法(也就是说,纯靠猜和凑)。具体到我们的文本分类问题,文本被表示为上千维的向量,就是说他可能有上千个特征来把它描述出来,因为它是一个文本,它是一段文字,即使维数已经如此之高,也常常是线性不可分的,还要向更高的空间转化。其中的难度可想而知。这是我们刚来说的一个例子

为什么说f(y)=ay是四维空间里的函数?回想一下我们二维空间里的函数定义

  g(x)=ax+b

变量x是一维的,为什么说它是二维空间里的函数呢?因为还有一个变量我们没写出来,它的完整形式其实是

  y=g(x)=ax+b

  y=ax+b

看看,有几个变量?两个。那是几维空间的函数?

再看看我们刚才说四维空间的函数

f(y)=ay

里面的y是三维的变量,那f(y)是几维空间里的函数? 那f(y)我们把它写成是z的话,那z=ay,z又是一个变量对不对,加起来这三个变量加上一个变量等于4个变量。

y为什么是三维的呢?因为里面我们把1、x和x2都看成是一个变量。所以一共是四个变量。

这就是一个简单的这个实用支持向量机技术来处理分类问题的例子。

如果有很多的核函数,我们该如何选择呢?也就是说,我们有很多种方法把低维的数据, 映射到高维空间上去,但是不同的核函数得到的映射结果却不同。那么我们到底如何选择核函数呢?这也是支持向量机技术中经常会讨论的一个问题。但是非常不幸的是,对核函数的选择,现在还众说纷纭,还缺乏指导原则!

各种实验的观察结果(不光是文本分类)的确表明,某些问题用某些核函数效果很好,用另一些就很差,但是一般来讲,径向基核函数是不会出太大偏差的一种,所以大家就一般都是试着用从低维向量向高维向量转化。

SVN听起来似乎不是很靠谱,但实际上SVM是少有的实用效果相当好的分类算法,有很多算法,在可科研杂质上的效果很高,但是拿到实际应用中却一塌糊涂。

但是SVN是非常值得让大家学习的,不管你是进行科研还是进行工程类的这些人员的话,都是非常有帮助的,所以老师希望大家能够深入了解甚至掌握这门技术。

 

 

遗传算法基本概念

在这个通向终极计算机智能的漫长实践中,逐渐分化出了两条道路。一种是从高深的理论研究出发,在神经认知学、生物科学、物理学和计算机科学等领域取得成熟的研究成果后再通过技术加以实现,从而直接开发出一种模拟人类甚至超越人类的智能工具。欧盟、美国和瑞士的人脑计划就属于此类型。另一种是从基础技术、具体应用和实际功能出发,再借助于群体协作和不断融合,最后历经漫长的进化过程后使机器真正“觉醒”,成为超越人类的智能实体。这种群里协作和不断融合的一种结果,就是迭代。

对于机器来说,迭代就是版本的更新,就是我们这节课的一个关键字,在生物中我们叫做进化。我们现在看到很多产品,比如苹果手机,从苹果1到苹果6,越来越智能,越来越多的功能,还有很多软件,从beta版到1.0, 2.0,各种功能不断完善,也越来越人性化的满足人类使用的要求。这不禁让人想象,这些产品的版本更新到比如说苹果20的时候,它会不会就变成一个精灵一样的人工智能呢?

然而,这些产品和软件的迭代,都是我们软件和硬件的工程师给它设计的,有人就不禁发问,我们能不能让计算机和软件自己更新换代,让它像自然生物一样,能够通过自己的进化,来得到更加优秀的这种产品呢?在我们自然界就叫能够得到更加优秀的个体呢?这个答案是肯定的,在我们计算机和人工智能领域,甚至有一门专门研究这种可能性的学科,叫做EvolutionaryComputation,中文叫做进化计算。今天,我们就来介绍进化计算中,进化计算它有很多很多种算法,我们就来介绍进化计算中的一种非常经典的算法,我们把它叫做进化遗传算法。

说起这个进化和遗传,都非常像生物学上的事情,我们知道进化这个概念,是因为19世纪,达尔文在物种起源中,提出了进化论,说人类,包括智能,都是进化的结果。那究竟什么是进化呢?,在生物学中是指种群里的遗传性状在世代之间的变化。可以看到进化是一种变化,那么我们在这里为什么不说是好的变化呢?因为进化论中一个核心的观念就是,生物的进化都是为了更好的适应环境。



自然界中一个典型的进化的例子,就是长颈鹿,这幅图中啊,我们可以看到,一开始啊,脖子长脖子短的鹿都有,但是这篇区域啊,多是这种比较高的树,那些脖子短的鹿啊,因为吃不到树上的叶子,就饿死了。慢慢的慢慢的,就只剩下了那些脖子长的鹿,这个过程,可能是几百代,几千年的一个时间。并不是突然一天,长颈鹿的脖子就变长了,这种现象,达尔文把它叫做自然选择。也就是说,一个生物种群中,能够存活下去的是由大自然选择出来的,什么叫做选择呢?通过什么选择呢?通过环境,包括食物,气候,以及天敌等等。



自然选择的例子还有很多,相传以前的爱斯基摩人,对刚生下来的小孩子,就会让他们在冰上光着身子在冰天雪地里待上一段时间,如果小孩子冻死了就冻死了,听上去很残忍,但他们觉得,这种小孩就算长大也不适合在北极生活。包括,我们有时候的传染病出现变种,也是因为,我们人类通过很多抗生素把大部分的病毒杀死,但是有些时候,有一些抗药性特别强的变异种群会存活下来。站在细菌和病毒的角度来说,我们人类对它们的消灭也可以说是一种自然选择。所以说,自然选择(Natural selection )就是指生物在生存斗争中适者生存、不适者被淘汰的现象

这一点放在我们人工智能里面来说,就是好比说,老师举一个稍微好玩一点的例子啊,就好比说我们要造一个战斗力最强的机器人,我们让一百个机器人进行战斗,非常惨烈的那种你死我活的战斗,只有最后活下来的那几个机器人,我们让它们进行“繁殖”。这种繁殖,不像生物界,可能就是把不同的零件重新组合,比如说机器人A,用的是能够克服地形困难的坦克履带,它有一个进程武器叫冲锋枪,它有一个远程武器我们把它叫做反装甲导弹。而机器人B它的驱动装置用的是机动灵活的双排轮,进程武器用的事铁拳,就是能够这个直接进行物理性打击的东西,远程武器用重机枪。如果我们让这样两个机器人进行“繁殖”,就是说交换他们的武器或者装甲,或者机动装置等等,就能得到他们的“后代”,比如机器人C,它搭载了机器人A的的这个坦克履带,它的进程武器也是机器人A的,它是冲锋枪,但它的远程武器,却搭载的是机器人B的重机枪。全是机枪。这个机器人C,就可以说,在算法模型上,看成是这个机器人A和机器人B的繁衍产物。

因为有些时候,我们给这些机器人状态武器等,是因为我们有些时候并不知道,这些机器人到底怎么组合这些装备它的性能会更强,不像我们玩游戏的时候,我们会发现游戏中对这种装备、属性、都有一种非常具体的这种设定,我们对每个装备的战斗力什么的,都了如指掌,然而现实生活中啊,我们可能需要实际的去搭配这些装备才能知道它们的效果,因为有很多种装备,有很多种部位可能要做几万个不同的机器人,因为可能有很多很多种不同装备的部位比如说进程武器,远程武器,格斗武器,遥感装置等。就是让它们去竞争,并且,如果我们把每一种不同的装备,都试一遍,可能,像这个例子,要做几万个不同的机器人,因为可能有很多不同的装备的部位,比如说进程武器,远程武器,格斗武器,遥感装置,等等,每个部分可能还有繁多的装备种类,所以可能的不同的机器人是非常多的,如果我们要把这些机器人全部做出来,让他们竞争,这非常的耗费成本,而且在很多情况下,这也是不现实的,所以,我们通过数代的这种迭代,比如我们首先从个100个机器人里面决出前10,然后让这10个机器人,进行“繁殖”,就是我刚才说的交换零件,然后又做出100个机器人,当然,这里我们没有寿命这一说,上一代的10个机器人,加上90个新的机器人,成为第二场比赛的阵容,然后迭代这么几代,就是说我们举行很多次这种比赛以后到最后,我们可能发现啊,剩下来的机器人都是差不多的装备,为什么呢,因为大家可能会发现啊,某个部位上面啊,就是用这种装备比较好,或者某几个装配搭配起来就是比较无敌,到这种时候啊,我们差不多就找到一个最强的机器人了。

 

 

遗传算法举例

我们在计算机中经常会使用向机器人大战这样的方法来处理一些问题,这就是我们所说的遗传算法,我们这里就具体来讲一讲这个遗传算法。我们谈到遗传,就不得不提我们生物学上的两个概念,一个叫染色体,一个叫基因。



在生物学上,基因,是遗传信息的最小单位。染色体,是细胞中载有遗传信息,也就是基因的一种物质。在我们遗传算法中,也使用了生物学上的这两个概念。在生物学上,染色体和基因都有着颇为复杂的组织结构,但我们在使用计算机来模拟一些生物学上的原理时,通常会进行一些简化。比如刚才那个战斗机器人的例子,大家想想如果我们把这个找到最强的战斗机器人看成是一个遗传进化的问题,这些机器人的基因和染色体它分别是什么呢?这里就要讲到一个染色体表征的问题。首先我们在讨论遗传和进化的问题的时候,我们就不会讨论种群中某个个体的表型,也就是看起来的样子,我们只在乎它内在的基因和染色体,所以我们要使用染色体来表征一个人的话,那就是一系列的基因序列。



比如我们人身上有控制头发颜色的基因,有控制肤色的基因,有控制身高的基因,如果我们把这三个基因看成一个染色体的话,我们就可以把一个人,比如说姚明,通过染色体表征为黑发,黄皮肤, 2米3。那我们这个战斗机器人,也可以有很多的“基因”,比如说这个战斗它的高度,它的材质,它的颜色等等但是我们要研究的这个问题啊,是什么样的机器人战斗力比较强,所以,我们不能把这些机器人通过染色体表征为多高、什么颜色、用的什么材质,可能材质还有点影响,但是我们的染色体表征,主要要描述那些影响机器人战斗力的“基因”,比如我们刚才说的它的驱动装置,比如坦克履带,比如说他的遥感装置,比如说它的远程武器,比如说它的防御,比如说它有 4厘米厚钢板,等等。这样以来,我们就可以把这些机器人表征为一组染色体,作为一个种群,这就是我们遗传算法中非常重要的一步,也可以说是非常重要的第一步,它就是进行染色体表征。通过染色体表征,我们就可以得到一个能够进行遗传算法操作的种群。



然后这个种群上,就可以进行迭代(也就是我们之前说的,进行多次的机器人比赛,然后它们自相残杀剩下少数,然后再“繁殖”),然后让优胜的一些机器人进行重新组合,至于我们让哪些机器人来进行重新组合,我们在这个遗传算法中,有一个专门的操作,名字叫“选择操作”。英文名叫selection选择操作主要就是如何挑选具有优秀基因的个体来培育下一代的过程。

在我们自然界中,优秀的个体更容易繁育下一代。放在我们人类身上,这又是一个比较深刻的话题。但在遗传算法中,我们通常是怎么做的呢?我们通常也是让最优秀的个体,也就是说让最好的那些,战斗力最高的那些机器人,拥有最高的概率来繁育下一代,就好比刚才我们这个战斗机器人的例子,我们假定有10个机器人,他们的战斗力分别是, 10,9,8,7,6,5,4,3,2,1 我们每次选出两个机器人来进行重新组合,生成下一代机器人的时候啊,我们战斗力最高的那个机器人被选出来的概率,就与它的战斗力成正比,这个概率就是10/(1+2+3+4….+10) ,就是10/55,其他机器人被选出来的概率就依次是55分之9,55分之8......55分之1。这就是关于选择操作。

接下来我们看,这里我们说的繁殖,其实也是我们遗传算法中的一种基本操作,我们称之为交叉操作,英文叫crossover。我们生物的繁殖其实也就是父亲和母亲,分别给出一半的基因遗传到后代。



所以,我们这里的交叉操作,也是遵循这样一种原理,不同的,我们有可能只交换一部分基因来形成下一代,这个交换的量,是我们可以自己设置的,另外一点很重要的是,我们这里繁殖,都是由父母两个进行交换,然后生成的新的个体也是两个,就是说,在遗传算法中繁殖都是双胞胎,非常的幸福。我们看这幅图中,就是我们刚才说的这个战斗机器人的例子,我们对刚才那两个战斗机器人的装配进行重新组合的。可以看到,机器人A和机器人B,如果我们使用遗传算法对它们进行交叉操作,可以得到机器人C和机器人D,这两个后代,机器人C主要遗传了机器人A的基因,它的远程武器遗传了机器人B的,同样的,机器人D主要遗传了机器人B的基因,它的远程武器遗传了机器人A的。



 

  刚才我们举了这个战斗机器人的例子,这是在科技界,其实在体育界也能够看到很多这样的例子,很多竞技项目,在一开始的时候都是百花齐放,百家争鸣的。比如说足球运动,大家可能不知道足球运动的历史非常悠久,那个时候可能大家都还很陌生。



在19世界末期,那个时候还有一些球队,打的是1-0-9,0-0-10这样的阵容,也就是几乎说全部都是前锋。当时主流的球队的阵容都是这么打的,就是跟橄榄球一样,一大群人啊,追着一个球跑,后来啊,有个教练觉得全是前锋不行啊,于是派两个前锋留在对方的门前,迫使对方的前锋不得不兼顾防守,不敢贸然出击,然后再用了3个前卫,前卫就是负责前场的,他的位置比前锋稍微靠后一点,专门用来防守,这种2-3-5的阵容,让对方的前锋非常难突破中场,在当时达到了出奇制胜的效果,这样一个阵型这就像导致了一场足球战术的革命,后来很多球队都开始效仿,这才结束了那种都是全是前锋的打法的时代,到近代才慢慢稳定在, 442,451,343等主要阵型上。这说明啊,这种迭代进步的现象,是广泛存在的。但当时我们可以看到这个2-3-5阵容,其实不是从109,00-10阵容改良来的,它们的差别其实是挺大的,这种新的战术,可能就是某个教练它是某天在战术讨论上,突然想到的。

就像长颈鹿那个例子,它从短脖子的鹿中间,突然生出一个脖子特别长的,这个在生物中啊,叫做基因变异,我们在遗传算法中,叫变异操作。变异操作可能会有可能导致个体发生比较大的变化。与现实的情况不一样,我们在算法中,变异的方向通常是随机的,很有可能发生很大的变化,在选择变异的个体的时候,我们还是倾向于使那些相对不那么优秀的个体被给予更高的这个变异概率。这个想法很自然,因为我们有些个体也许是在一个正确进化方向上,如果我们使这些个体进行变异的话,我们也许就会更加远离这个进化方向,而偏向别的方向。

还有一点,这个变异操作,通常很多情况下很高的概率都是会往不好的方向上走的,也就是说变异后的个体,也许还没有它的父辈优秀,但是在很小的概率下,有可能得到更好的个体,这时候啊,就是说我们有可能从原有的进化方向上脱离出来一个好的个体,它找到了一个更好的进化方向。我们看军事上也是一样的,武器的发展,一开始都是冷兵器时代,大家都在捉摸怎么样做出更加锋利的剑,和更加坚固的盾,但后来出现了火器,一下子,整个武器的发展,就慢慢开始转到了往这个枪械这个发展方向上了。火器它并不是从冷兵器直接发展而来的,它是突然有一天我们把这个火器造出来以后就找到了这个武器更好的发展方向,所以说道理都是大同小异的。

 

 

 

遗传算法基本操作

交叉操作,是为了在现有的方向上进行不断的优化,而变异操作,则是为了寻求更好的方向。就像这个机器人大战,就是为了寻求战斗力最强的机器人,我们说了很多次这个个体的战斗力。



其实在遗传算法中,我们有一种专门衡量这个个体优劣的设计,叫适应度。我们觉得一个个体它的优劣由它所生存的环境决定,就像我们并不觉得,长脖子的鹿就比短脖子的鹿在更加优秀,这只是在特定的环境下才能有这样的影响,像机器人作战的时候,它的环境就是一个这种互相战斗的一个环境,所以说这个机器人有优秀是由对手决定的,所以在这种环境下,战斗力高的机器人就越能适应这种环境,所以这里的战斗力就是适应度。

通常情况下,我们在设计一个遗传算法的时候,就会设计一个函数来计算具体的适应度值,这个值啊,是我们希望它越高越好。这个函数,我们就叫做适应度函数。这个适应度函数的设计非常关键,它直接决定了,我们到底是往什么方向上进化,比如我们适应度函数,主要考虑的是机器人的武器是否够先进,那么显然这个方向上,我们是要选出更加强大,更加具有战斗能力的机器人,如果我们主要考虑的是机器人的造型是否帅气,颜色是否好看,那我们这个进化的方向就会出现问题。可能就会找到很多中看不中用的机器人。这个适应度函数的设计,也是遗传算法中非常关键的一点。就是说我们如何衡量一个个体它适应环境的能力,这是我们在进行这种搜索任务之前,需要对这个问题有一定的了解,其实这个我们之前介绍的启发式搜索有很大的相似之处,所以遗传算法我们这里要强调一下,其实本质也是为了解决一种搜索问题,只不过它使用的是我们自然界这种进化的逻辑,但我们认为我们也是在搜索一种基因的最优组合,但是如果我们的目的是找到最优的那个组合的话,遗传算法的搜索效率,其实并不比随机的搜索强,但有时候,对于很多问题,我们并不需要找到最优的那个,我们只需要找到比较好的一个组合就行了,这就是一个较优的解决方案,我们把它叫做较优解。 这种时候啊,遗传算法就非常适用。



比如说我们接下来要介绍的旅行商问题,就是之前在搜索技术那节课中说过的,我一个人要去很多个地方旅行一周,然后回来,我怎么走得路程比较短这样的问题啊,我们实际情况下不需要找到最短的那个,我们通常会有个概念,比如说只要是在3天之内能够走完就行了,我们只要一个满足这种条件的方案能够被找到,就可以满意了,对不对。就是说这种搜索较优解的问题,在现实世界中,经常会遇到,所以遗传算法,还是具有很好的实用价值的。

我们通过这个机器人大战的例子,介绍了遗传算法中的染色体表征,三种遗传操作,选择,交叉和变异,以及适应度函数。我们看一下我们这个遗传算法的流程图。



这个流程图里面有几个地方我们要注意一下,首先我们看到一开始以后,第一步就是初始化种群,就是说我们一开始的这个个体,是要我们生成的,当然我们一般情况下,都是随机的,假如一个个体有N个属性,每个属性的取值,都是随机的,这个时候我们通常不会去限制这种初始化个体的种类,希望生成的个体他分布在整个搜索空间里面是比较均匀的,而不是偏执地集中在某一块,这也有利于我们能够更好地找到比较好的那块区域。因为在一开始的时候,我们并不知道这个最好的个体,它到底有哪些特征,如果我们知道的话,那我们就不需要搜索了是不是,有可能我们知道一部分,但是我们通常,不把这部分知识用在初始化这些个体上面,因为我们一开始了解的这一部分知识可能会误导我们就觉得哪些个体好,哪些个体不好,但这些想法是非常片面的,有可能就是错的,这是我们要强调的一个随机初始化种群的过程。初始化种群以后,我们要开始计算每个个体的适应度值,通过我们刚才说的适应度函数,我们适应度函数,通常通过fitness(x)来表示, x就是这个个体, fitness(x)就是它的适应度值。在计算出适应度函数以后,我们就要开始进行第一轮的选择,通常在选择的时候,我们通过刚才我们介绍的那种选择机制,按照个体的适应度值,在种群中所有适应度值,也就是它们的和中所占的比例。来确定这个个体被选择的概率,它有这个公式

这里的Pj就是第j个个体它被选择成为交叉对象的概率。这种方法,我们也叫它这个赌轮选择法。这个赌轮,解释起来还不如看这幅图,去过赌场的,看过电影里面的也应该很熟悉, 反正就是把这个东西转一下,停在哪,就指在哪。比如说,我们有100个个体,那么我们就把这一百个个体化成一个圈,每一个个体占一个格子,如果说它的适应度值越高,它这个格子就越宽,我们要选下一代的100个个体,我们就转100次。所以说,这一代的同一个个体啊,可能被转到多次,所以下一代中,可能有多个完全一样的上一代的个体。这一点大家也可以注意一下。

 

选择以后,我们就进入交叉环节,也就是我们的繁殖环节,这个时候,除了我之前所说的,还有一点要注意,那就是,不是所有的被选择的个体都会被用来交换,我们通常,只会让70%的个体进行交换,剩下的就保持原样。这个70%我们称之为,交换概率,交换的概率通常都会设置为70%左右,因为如果这个交换的概率太低,我们在一个进化方向上的优化速度,就会太慢,交换的概率太高就会导致本来的优秀的个体,可能会被它们产生的并没有它自己更加优秀的后代所代替。

这个说起来挺拗口,就像如果我们有克隆技术的话,像爱因斯坦这种人类中绝对杰出的人才的话,我们可能会让他跟其他优秀的女人进行繁殖对吧,但我们也可以直接把它的基因100%的复制下来,克隆成一个新的小爱因斯坦对不对。因为我们不能保证他的后代比他优秀对不对,也许他自己可能就是一个够好的个体了。所以我们人类的进化,是没有选择这个操作的,因为我们现在还不允许克隆人。所以如果说,以后啊,这个科技发达,伦理又允许克隆的话,这个人类基因的进化,也许会有一个促进作用。因为那个时候,我们很多的宝宝,就不定是通过繁殖得到的,还有一些事通过克隆得到的。

 这里是我们说的选择和交叉,完了以后,我们再进入这个变异的环节。刚才我们说了这个交叉的概率,我们让70%的个体通常交叉,变成新的个体,但这个变异,通常发生的概率会被设置的很小,一般都大约在1%左右,不会超过10%。同样的,老师也要来讲一下,自然界中,变异的概率本来就是很低的,那远远低于1%,变异的概率要是高了不得了啊,两个白人要是变异生了个黑人宝宝对不对,这个事情就大了,这种概率通常非常非常非常低的。

在遗传算法里面,太高的这个变异概率会使得这个搜索不会在一个方向上进行收敛,就是它会跳来跳去,一会儿觉得这边好,一会又觉得那边好,太低的话,又不容易跳出当前的搜索方向。所以这个概率的设置也是很有研究的。这是我们讲的变异,变异以后,我们最后到了这个终止条件,也就是说,我们是否完成了我们的搜索目标,完成了的话,我们就退出,终止这个算法,没有完成,我们就再往下走一代,一直走到完成这个目标为止。当然,我们的终止条件,也有可能是设置一个最高的代数,比如机器人大战中,我们进行10次这种生存大战,最后活下来的机器人我们就认为它们已经够强了。也有通过适应度函数来停止的,就是只要找到足够优秀的个体,或者说解,就停止算法,像我们那个旅行商问题,找到3天能够把这些城市走完,我们就觉得可以了,不用再找了。在算法终结的时候,我们会得到一个种群的个体,也就是最后一代,这些个体种可能也还是有优有劣,我们把其中最好的一个拿出来,作为我们找到的解。这样我们就学习完整个遗传算法的流程了。

 

 

遗传算法求解旅行商问题

在这节课的最后我们现在来看一个具体的例子,这就是我们刚才说的旅行商的问题,这个例子在经典的教科书上,非常常见,就是这个旅行商问题用遗传算法来求解。我们再稍微看一下这个旅行商问题,我们要求我们游历N个位置(城市),且我们要求时间越短越好(最短)。

这个问题之前老师也介绍过,如果我们要遍历所有的可能性的话,这个耗时非常的大。所以,我们这里用遗产算法来求解。首先是这个染色体表征。如果有8个城市,代号分别为1至8,则路径可表示为:R={City-No | City-No不重复}NN=8,其中的一条路径为:3→1→5→7→8→4→2→6。

这表示,我们游历这些城市的顺序。如果我们使用二进制编码,则我们讲这个31578426的序列转化为二进制。011001101110111100010110它就是这样一串0, 1串。这就是染色体表征,然后我们讲适应度函数,  这个问题的适应度函数很好设计,简单的就看这个游历顺序的城市城市之间的距离和,越小的,越好,也就是说越小适应度越高。然后我们看这个交叉,就是经典的二进制上的交叉操作。可以看到,我们选择一个交叉点,然后将交叉点后的基因相互交换。

同样的,变异操作也是基于二进制编码的。

我们选择一个变异点,然后如果变异点是0的,置为1,是1的,置为0. 非常的简单,但是非常的高效,这样的一种简单设计下的遗传算法,在求解旅行商问题这种时间复杂度非常高的问题上,效果都是不错的,它能够在很短的时间内找到一个较为优秀的解决方案。 

这就是我们这节课的内容,希望大家能够对遗传算法有一个基本的了解。

 

 

神经元

最近有一件事情一直困扰着老师,那就是当今社会,到底什么样的男人,最受女性欢迎。为了科学的解开这个困扰, 老师特地设计了一个人工智能的系统, 来帮助老师寻找答案。

大家来看这张图,这张图的 左边有6个圆圈, 这些圆圈是老师想到的一些男人受欢迎的可能的一些原因,比如有钱,高大,长得帅,个性,有肌肉,有才华等等。我们在这些属性旁边加上一个数字,来表示这个属性的一个重要程度,最开始,因为我们也不知道哪个属性比较重要,所以老师就把每个属性的数字都设置成一样的。然后这个中间我们设计了一个判别器,上面写的是女人的判断,最后我们得到一个结论,就是这个是否受欢迎?为了使得我们这个系统更加准确,也更有说服力,老师还特地在网上搜集了一些非常受女性欢迎的男性的例子,作为训练的样本,来训练这个系统。那么,我们现在来看看这些实例,下面是我们第一个样本。

吴彦祖, 我们把这个帅哥实例用来训练这个系统以后发现,所有的这些属性的值,都发生了变化,都上升了,但是这样的样本, 其实对我们的系统没有多少影响,这些属性还是同样重要的,这说明 男神女神,对我们的择偶标准其实影响不大,人家什么都好,有谁不喜欢呢?

 我们  再来看第二个实例, 哇, 又是一个男神, 好, 我们再给一个男神给系统,说他也是非常受女性欢迎的,但是这个系统的各个属性的重要程度没有任何的改变,结果系统表示,无动于衷,也就是说,这个每个属性的重要程度,没有任何的改变,你给再多的特别完美男神给这个系统来训练,它都不会有啥改变了,所以我们又重新找了一些比较有特点的案例,我们看这位。

我们暂时不对他做出评价,大家应该都很熟悉, 他的人气也很高, 我们把他介绍给我们的系统以后啊, 系统终于又发生了变化, 我们看到, 在长相和身材两个属性, 出现了一些降低, 然后在这个财力,个性,才华方面, 出现了进一步的上升。

接下来这位大家也非常熟悉,几乎算是我们中国的首富,也非常的有才干,虽然不能说是帅哥,但是其实拥有非常多的女性拥护者,我们再用他来训练我们这个系统,发现系统认为这个金钱和才华的重要性又再次增加了。我们接下来,把最后一个训练样本请出来。

这位可不得了,人称国民老公,其受欢迎程度可见一斑,我们把他介绍给我们的系统以后啊,发现金钱这个属性,进一步发生了增长。所以,最后,我们通过这5个样本,学习到的这个系统啊,就得到了这样的一个重要性的分布,可以看到财力对于受欢迎程度的影响最大,其次啊, 是这个个人的才华,所以说这就是我们学习到得一个训练过程,这个系统啊, 就是我们今天这节课要介绍的主题, 它的名字叫做神经网络

我们下面就来介绍这个神经网络,神经这个词在中文中有很多种意思,但是这里是指神经元的意思,神经网络在英文中叫做neruonnetwork 也就是神经元网络的意思。那么什么是神经元呢,它又称神经细胞,是构成我们神经系统的基本单位。在我们人脑中, 大概有10个G的神经细胞,也就是说大约有100亿个。 可以想象一下这个数量级是非常非常大的。

所以神经网络啊,其实是生物学中的概念,而我们人工智能中通常所说的神经网络,是人工神经网络,它并不是指的生物学的那个神经网络。也就是我们模拟人脑的神经网络而构建的系统。

想当年生物解刨学家发现了神经细胞以后,整个学术界欢兴雀跃,觉得这个大脑的谜团的终于要解开了,我们这个对大脑的了解的突破也是指日可待,但是到今天为止,这个是事情已经发生了将近快100多年了,科学界的很多领域都出现了突飞猛进的发展,唯独这个人脑的秘密还是没有被完全揭开,但是在这个过程中,我们也得到了非常多的证据,所以计算机的专家特别是人工智能领域的专家按捺不住了,它们觉得既然已经知道了这个大脑的组织结构,那么能不能模仿大脑来设计一个人工的神经系统呢?于是就有了这个人工神经网络的研究。

我们看一下在生物学中神经元是一个什么样的结构,可以看到这幅图中,有着各种各样的组成神经元细胞的成分,看上去还有点复杂,我们再看看在人工神经网络中,神经元的结构,是不是感觉清爽了很多,所以说, 我们的人工神经网络可以说是大脑的一个模型。模型大家都懂的,真的车子是可以开的,但模型车你推他他都不一定走。

老师这样说, 其实也没有贬低这个人工神经网络的意思, 是因为大脑过于复杂,而且是生物组织结构,我们要模拟这个大脑,其实主要还是要模拟它的这种网络结构。 

 

 

输入层,输出层和阶跃函数

我们来看一下, 我们模拟的神经元, 其实它主要由三部分组成。输入,输出和这个激励函数。我们一个个来看。

首先这个输入, 在图中, 我们通常会在圆圈的左边画上一些线段,在生物神经网络中,这些被称为树突,用来接收生物电刺激。这些刺激是是从其他神经细胞的输出来的。最开始这些刺激是从我们人的感官器官获取的,比如听觉,视觉,触觉等等。而在人工神经网络中,它们通常代表着一些更加抽象化的属性。比如我们刚才说的那些吸引女性的特质,所以说我们就把这些特质当做是一种刺激,输入到我们这个人工神经网络中去,这些属性通常会有一些权值,也就是刚才我们用的那些用来表现属性重要程度的数值,我们在人工神经网络中就把它叫做权值,这些权值在生物神经网络中,在我们脑子里面,就代表了这一条连接的兴奋程度。这个神经元接收到这些输入以后,神经元会将输入的值与它对应的权值相乘,然后得到一个总的输入,其实它就是一个我们把它称之为激励值,最后会根据自己的激励函数来进行判断并给出一个输出,这个输出就可以是一个结论。那么什么是激励函数呢,因为我们输入的参数值可能很多,但得到的结果的种类,就是那个结论的种类可能很少,所以激励函数其实就是这个输入参数值到结果的一个映射。

我们来看一下激励函数到底是什么样子的,我们这里有三种激励函数,可以看到横坐标,就是我们得到的输入,纵坐标,就是我们通过激励函数来得到的输出,我们可以看到下面有一些关于不同的函数的不同的公式,看上去非常的复杂。我们先简单地看一下这个激励函数,我们就可以把它理解成这个神经网络一种个性,就像我们人一样,看到同样的事情,也就是碰到同样的信息输入,不同的人会有不同的反应,这种反应我们就可以看成也就是不同的输出。这就是由人的个性决定的,有些人很灵敏,就像这个激励函数一样,它随着输入的增加,上升非常快,有些人很迟钝,它就像这个激励函数一样,上升非常缓慢,还有些人,要么就没反应,一有反应就非常大,就像这个函数一样。

激励函数是我们今天要着重介绍的,它是一个阶跃函数,当它的输入小于某个值时,这个输出是一样的,都是为0 没有变化,一旦输入大于一个值,就会得到一个固定的输出。这个值,这个大于的这个值,我们通常称之为阈值,在我们生物大脑中的神经细胞,通常都是通过类似这种阶跃的激励函数,所以说生物的这个神经细胞它通常只有两种状态,第一种叫做兴奋状态,第二种叫做不兴奋的状态

两种状态:兴奋(fire)和不兴奋(即抑制)。 神经细胞利用一种我们还不知道的方法,把所有从树突突触上进来的信号进行相加,如果全部信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。



所以说这个激励函数在我们神经网络中,可以设置起来非常简单,但是其对整个系统的性能的影响是非常巨大的。这往往也是我们在设计神经网络中,需要重点考虑的一个部分。

 

 

感知机举例

到这里啊,我们就已经介绍完了这个神经网络的几个主要组成部分,接下来,我们来讲讲,神经网络到底是怎么工作的。刚才我们讲到输入,一个人工的神经细胞,我们接下来只讲人工神经网络,所以我们讲这个神经细胞,也就是指人工神经细胞,一个人工的神经细胞,它可以有任意n个输入,就是我们刚才说的那些属性就可以看成神经细胞的一个输入,我们用数学表达式来表示所有的输入。

     x1,x2,x3, x4, x5, ..., xn

同样有n个输入就有   n个权重权值,权值在英文里面叫Weight

同样 n 个权重可表达为:

        w1, w2, w3,w4, w5 ...,wn

我们要记住,激励值就是所有输入与它们对应权重的之乘积之总和,因此,现在就可以写为:

        a = w1x1 + w2x2 + w3x3 +w4x4 + w5x5 +...+ wnxn     

这里的这个a就是我们所求得的激励值,然后我们来看一个例子,这里我们使用的用来作为激励函数的,这是刚才介绍的阶跃函数,这个阶跃函数的阈值,这个阈值可以我们设计系统的人自己来设计的,这里设为1,看这个表格,我们一共有5个输入。这里的输入只有两种,要么是1,要么是0,就是要么这条输入是激活的,要么就是没有激活的。然后是权重,我们这里说神经网络种里面的权重基本都设定为-1到1之间的一个随机的小数,这是这个表的前两列,然后是这个第三列和第四列,这里就用到了刚才我们使用的那个求和公式,我们看到先把第一列的输入和第二列的权值相乘,然后再把每一行的这个乘积相加,随后就得到了一个运行后的总和,是1.1. 这个1.1 是大于我们设定的这个阈值的,所以说输出是1,我们把阈值可以设置为零点几……,输出有两种,要么就是1,要么就是0,如果我们得到的这个总和是小于1的,那么我们的输出是0。                                            

 

输入

 

 

 权重

 

 

 输入与权重的乘积

 

 

 运行后总和  

 

 

0

 

 

 0.6

 

 

 0

 

 

0

 

 

1

 

 

-0.1

 

 

-0.1

 

 

-0.1

 

 

 

 

 0.8 

 

 

0.8 

 

 

 0.7

 

 

 

 

0.2

 

 

0.2

 

 

0.7

 

 

1

 

 

0.4

 

 

 0.4

 

 

 1.1 

 

 

这节课最后我们再来解释一下,最开始那个例子,我们如何通过样本来调节输入属性的权值的。我们一开始介绍的这个例子,其实是一个单层的神经网络,这是一种最简单的神经网络,这种单层神经网络,是我们人工神经网络的一个雏形,我们现在的很多非常复杂的神经网络它都是在简单的结构上面发展而来的,所以说我们这节课就从这个最简单的神经网络的雏形来开始学习,叫做又被称之为感知机,感知机其实就是我们人工神经网络的雏形,我们现在的很多复杂的神经网络,都是从这个简单的结构上发展而来的。

我们现在用一个更加经典的例子来说明这个感知机是怎么学习的。  这个例子也经常出现在很多经典的人工智能教材中,那就是哪些物体是可以飞的。

同样的老师啊,也找了一些属性啊,这些属性也是我们觉得跟飞行有可能相关的属性,这个因为我们也要用到一些反例,所以说这里面可能有一些属性是大家觉得没什么太大关系的,这些属性分别是,有翅膀,是动物,在空中,有四条腿,体型大。老师就选了这简单的5个属性,在选属性的时候,老师要强调一点,大家在做一个模型的时候,做一个人工智能系统的时候,可能第一感觉是去找一些容易支持这个结论的属性,比如之前那个例子,我们要找到的是那些最受女人欢迎的特征,这种情况下我们找的属性也可能是比较正面的。但很多情况下,我们其实会找一些反面的属性,也就是说,当我们要学一个判断物体是否能飞行的分类器的时候可能不单单想到,如果满足了某条属性,这个物体就会飞,我们还有可能会考虑,有些属性一旦满足, 这个物体就不会飞。这也是我们考虑的一些因素

我们这里这个例子因为大家对于飞行这个概念还是很大程度上了解的,所以我们在选取属性的时候,心里是有数的, 但如果我们在实际的工作中, 要真正学一个分类器,我们对它的了解其实是非常少的,就是在很多时候我们在用这个人工神经网络在做一些事情的时候,我们就不单单要设计正面的属性,还要考虑一些负面的属性。好,这是老师刚刚说关于一些考虑的属性的选取的一些地方。

 我们再来看这个例子, 我们同样的, 把初始的权值都设置为0.2,其实这个权重值, 我们可以让它们随机生成,因为通常情况下,我们没有这么多的先验知识。然后看第一个样本, 一直丹顶鹤,显然它是会飞的,所以我们在这管它叫正例。在最开始那个例子中,我们的几个训练样本啊,全部都是正例,但实际上,我们经常会需要一个样本集,它既有正例也有反例,那些支持这个结论的就是正例,不支持就是反例。

所以丹顶鹤是一个正例,它是会飞的,它会飞,它有翅膀,它是动物,它没有四条腿,而且它在空中,且体型小,我们管丹顶鹤的体型算小的, 那么我们建立一个向量,也就是刚刚我们所说的关于5个属性的值S={s1,s2,s3,s4,s5},来对应我们刚才那五个属性,符合的, 我们把这个向量中的对应属性置为1,不符合的,我们就把它置为0,那么这个向量S=[1,1,1,0,0] 为什么是11100呢?刚才说了,它前面3个属性都符合,所以说它是111,它后面两个属性不符合,所以它是00。然后呢,我们假设我们的激励函数,是一个阈值,阈值为0.7的阶跃函数。我们来看一下阶跃函数啊,就是这个样子的。

这个时候,我们就来讲权值调整,我们首先,我们是知道这个样本的实际的分类结果的,就是它是可以飞的,因为它是训练样本嘛,训练样本我们对它是有一定的了解的,所以它的期望的输出值是1。但是我们通过我们目前的这个权值来计算,它在前面三个的属性的取值都是1,那么我们通过权值求和得到的结果是1*0.2+1*0.2+1*0.2+0*0.2+0*0.2=0.6 这里的5个乘积的左边都是属性的取值,11100,乘积的右边是权值的值都是0.2,这个乘积的和,也就是我们的激励值,只有0.6,也就是在当前的神经网络下给它一个正例,它会判断成反例,这说明我们的系统有问题,有问题我们要怎么办呢?

这说明我们的神经网络需要调整,那么具体怎么调整?我们看到现在的激励值太低,是因为权值的分布低导致的,至于提升多少, 由之前设置好的一个参数决定,这个参数我们将其称为学习因子。这个学习因子太大,会导致权值增一次又太高减一次又太低,处于震荡状态,永远找不到理想的大小;学习因子太小,又会使得学习速度太慢,可能需要太多的训练样本,来进行训练,很多时候训练样本都是人工选出来的,非常耗费时间成本。我们这个学习因子通常设置为0.1,我们认为是比较合适的。那么这个样本,丹顶鹤的这三个属性的权值,我们觉得它太低了,我们就都把它加上一个学习因子,就从0.2+0.1升到了0.3.。这就是我们学习的第一个样本,然后我们再来看下一个例子。

下个例子是一个飞机,很明显, 这也是一个正例, 这个样本的向量对应这五个属性可以看成[1,0,1,0,1]因为它有翅膀是1,不是动物是0,在空中是1,没有四条腿是0,且体型大是1 。当我们输入这个样本以后,系统会怎样变化呢? 

我们看现在我们5个属性的权值分别为0.3, 0.3 , 0.3, 0.2,0.2,这样一个权值分布,得到的激励值对应我们现在分析的这个样本是0.3*1+0.3*0+0.3*1+0.2*0+0.2*1=0.8 这个激励值是大于我们的阶跃函数的阈值0.7的。 这个时候我们现在这个神经网络就会把它当成是正例,也就是说现在的神经网络已经做出了正确的判断,于是在这种情况下,我们觉得这个网络是没有问题的,我们认为权值不需要调整。所以,我们继续保持原来的权值,看到这里,大家应该就明白,感知机仅仅在样本的实际输出,也就是系统判断它能不能飞,与它的期望输出,也就是我们知道的她本身是不是能飞这件事实冲突的时候才来进行权值调整,即是说也就是只有系统判断出错的时候,我们才会来调整它,这也是非常合理的一种设置。

然后我们再看下一个样本,这是一个海豚, 它腾空跃起, 这个是个反例。那么我们再看海豚的样本它对应的是一个什么样的向量值, 首先它没有翅膀, 是动物, 也在空中, 没有腿,体型就算大吧, 向量应该是[0,1,1,0,1],我们再计算它这个激励值,我们就直接给出这个公式,那么这个时候, 我们计算它的激励值是0*0.3+1*0.3+1*0.3+0*0.2+1*0.2=0.8它大于我们的阈值0.7,所以我们这个系统对海豚的实际输出也是是正例,而实际上它是反例,那么这个时候,实际的输出又与期望的输出是相悖的, 所以我们认为系统做出了错误的判断,就是它把一个不能飞的东西判断成能飞了,于是,我们要对其的权值进行调整。同样的,我们认为它之所以被判断为正例是因为它所具有的属性的权值太而高导致的,之前我们认为权值太低的时候导致判断错误,所以我们把这些权值调高了,但是这里我们发现有些权值它因为太高而导致我们又判断失误,所以我们应该要把它调低,所以我们应该要降低这些属性的权值,根据刚才我们说过的学习因子0.1,我们将海豚的三个属性,分别从原来的基础上减掉0.1,那么现在的权值就变成了, 0.3,0.2,0.2,0.2,0.1。我们到现在为止,就已经看到了我们训练样本多碰到的的三种情况:

当样本是正例时,如果系统判断出错,我们就提高这个样本所具备的属性的权值。

当样本是反例时,如果系统判断出错,我们就降低这个样本所具备的属性的权值。

当样本是正例时,如果系统判断正确,我们维持所有属性的权值不变。

还有最后一种情况,还有一种情况就是当系统是反例时,我们如果判断也正确,那么我们同样也维持所有属性不变。 

我们看这个表格,是我们训练这个系统以及权值调整的过程。                                              

 

样本

 

 

有翅膀  是动物 在空中 四条腿 体型大

 

 

正反例

 

 

权值

 

 

初始值

 

 

0.2 ,0.2, 0.2 ,0.2, 0.2

 

 

丹顶鹤

 

 

1       1      1      0       0

 

 

 

 

0.3 ,0.3, 0.3 ,0.2, 0.2

 

 

飞机

 

 

1       0      1      0       1

 

 

 

 

0.3 ,0.3, 0.3 ,0.2, 0.2

 

 

海豚

 

 

0       1      1      0       1

 

 

 

 

0.3 ,0.2, 0.2 ,0.2, 0.1

 

 

骆驼

 

 

0       1      0      0       1

 

 

 

 

0.3 ,0.2, 0.2 ,0.2, 0.1

 

 

这个表格就是我们刚才所说的丹顶鹤、飞机、海豚,以及最后我们还加了一个骆驼。大家看一下它所对应的这个向量值,最后它也是一个反例,它对应的我们刚刚说的第四种情况,就是我们把骆驼这个样本告诉系统以后,通过我们刚刚说的那种求权值求和的方法,发现它比它的阈值还是要小,所以这种情况下,它即时一个反例,我们判断的也是一个反例,所以说我们还是维持它的这个权值分布是不变的。

 

 

 

BP神经网络

上节课啊,老师介绍了神经网络,准确的来说, 我们介绍的是我们的单层感知机, 这是我们神经网络的最初的,原型机, 上节课,我们还没讲单层这个概念,就是我们为什么说它是单层感知机呢?这节课我们来介绍更加复杂的神经网络。这个更加复杂的神经网络首先体现在这个层数上,我们说,感知机是单层的,因为它从输入直接就到输出了,我们今天就来看一下多层感知机。

首先,我们要问一个问题,为什么需要多层感知机,如果单层感知机没有什么缺陷的话,那么我们干嘛要设计更加复杂的感知机对不对,那么单层感知机有什么缺陷呢?

回忆一下上节课所学到的感知机的训练机制,那就是每碰到一个样本,如果系统的输出和这个样本的期望输出不相符,那么我就要调整权值,使得这个系统与之相符,或者向着与之相符的方向发展,但是我们最后训练得到的系统,他到底是不是能够将我们的训练样本正确的分类呢?

这个问题的答案,我们还要回想一下之前所说的那个分类问题,我们的这个神经网络中的感知机啊,就好比是在一个二维空间的一条直线,假如我们只有两个输入,就可以看成是一个二维的空间。一开始,没有正反例子的时候,我就随机生成一条直线,认为一边是正例,一边是反例,当我们进行训练的时候,我们的正例如果丢在了正例那边,或者反例丢在反例那边,那我们就不用进行调整,如果我们正例丢在反例那边或者反例落在正例那边,我们就调整这个直线的斜率,使其向这个错误的例子靠拢,所以说,如果我们的正例都落在一边,反例都落在另一边的话,我们这条直线就会被慢慢的调整到正例和反例之间的分界线上去,但如果我们这个训练的例子是非常零散的分布,也就是如果这些训练的例子是线性不可分的,也就是不能用一条直线来分开的,我们的训练过程就会像只一个震荡的过程,而不能慢慢趋于稳定,这说明我们这个单层的感知机啊,它是一个线性分类器。那么我们如果把这个感知机的层数增加一层的话,会出现什么样的结果呢?增加一层的话它是不是就能解决一些非线性的一些分类问题呢?

我们两层的这个感知机啊,是不是就特别强大了呢?其实也不是, 双层的感知机也不能实现非常复杂的分类, 比如但是却可以处理某些相对来说更加复杂一些的分类, 比如说与或或异或问题。这是我们在讨论单层感知机的时候经常会讨论的一个问题,因为我们之前这个单层感知机刚刚出来的时候,那些发明它的学者就说过,这个感知机它不能处理像异或这种问题。什么是异或问题?

异或问题大家学过一点点逻辑学的应该都知道,异或呢就像我们之前说的与、或、它都是逻辑学上的一些概念,就是相同为0,不同为1,我们可以看到这个的真值表,就可以看出来, 左边是从00,01, 10, 11,那么00对应的是0 ,10和01对应的是1,因为它是相同的为0,不同的为1,那么11它又是相同的,所以它就是0。 右边是0110。

然后我们回忆一下, 与操作, 和或操作的真值表, 右边是0111, 和0001, 它们比起这个异或的0110或者说我们说与或的1001的输出来说啊, 我们说与和或的分类啊,它们是可以被线性可分的, 从这个真值表, 我们也能看出来这个0111和0001这样的输出,我们要把这个0和1分开, 是不是从中间第一位和第三位把它们分开就行了啊, 用一条线就能把他们分开,但是我们刚才说的与或或者异或的 但0110和1001的输出, 是不是就需要两条线才能分开啊,这就是所谓的线性不可分的分类, 从真值表上也能够看出来。

然后呢,为了更好地说明这个问题,我们再从另外一个角度来看这个与,和或 以及异或的分布, 我们用一个图来表示就是这样的,我们来看X轴和Y轴,X值和Y值都是0的时候和都是1的时候,都是一个X,就表示它的输出是0. 当其中一个是0另外一个是1是,都是一个圈, 即是说(1,1)(0,0)是一个类, 而(1,0)(0,1)是另外一个类。 这是我们的异或用二维空间图来表示是这样子的,我们发现在这种情况下啊,我们要使用一条直线的画,不管我们怎么分,我们都没有办法使得,圈圈在一边, 而叉叉在另一边, 这个时候我们发现,其实要分类这组数据也很简单,我们使用两条直线来分就可以了,比如这个图。

 

对吧,这样我们就实现了这两条直线之间我们分为一个类,这两条直线两边我们分为另外一个类。当然我们说异或的问题有可能这个取值会很多,不仅仅说它只有四种情况,我们在看看,与分类,和或分类,这种可以用一条直线分开的分布图。

 

这种数据分布啊,我们都能用一条直线将他们分开对不对,所以说这种数据分布啊我们就会想, 是不是我们利用与,和或两个线性分类器来进行组合,就能够得到一个非线性分类器呢?我们还是从真值表来出发。

        与    非或     或

00    0      1          0

01    1      1         1

10    1      1          1

11    1      0         0

 

真值表的左边,我们的输入就只有四种,因为我们只有两个输入,都是00, 01, 10, 11,然后, 如果我们使用一个与操作, 就得到了0111的输出, 我们再用一个或操作的和非操作的结合操作, 我们这里知道我们使用或操作, 会不会得到0001的输出啊,再加一个非操作, 是不是就是1110的操作, (那么我们把这个与的输出和这个或非的输出组合起来我们就得到了)这样我们得到的输出就是01,11,11,10了对不对,然后我们再把这组输出当做输入,将它们再输入到一个或操作中去,因为01的或等于0,11的或是等于1,11的或也是等于1,10的或也是等于0,是不是就得到了,0110的输出了,对不对, 因为或操作的10和01都得0, 只有11得1,这样一来, 我们使用3个线性分类器进行组合是不是就得到了一个非线性分类器的输出了啊?我们看这幅图,左边是0001101,这是四种输入情况,我们通过与操作以后我们得到了0111,这是其中的一个输出,通过或非这样一个操作以后就得到1110这样一个输出,最后我们把这两个输出当做一个输入,再输入到一个或操作里面去,就得到了0110这样一个输出。所以说我们把中间这块影藏以来的话,就看到了我们通过左边的输出得到了最右边的这个线性不可分的输出。

 

 

隐藏层

我们从这个多层感知机的结构上来看,就是这样子的,再来看多层感知机的这样一个结构图

首先我们看到左边的两个输入,然后我们这两个输入分别输入到了两个中间的圆圈节点,然后他们的输出再作为输入,传递到下一个节点,也就是我们的输出节点。我们之前学习感知机时,学习到了输入层和输出层,这里左边两个方框是输入层,右边的一个圆圈是输出层,中间这两个圆圈啊,我们将它们称之为隐层,隐藏的隐, 顾名思义, 就是被隐藏起来的一个处理层。有了这个隐层, 输入信号, 就被转化成表征层。就像刚才我们刚才只有两个输入的情况就是00, 01, 10, 11被隐层的两个线性分类器, 转化成了01, 11,11,10这样的一个输出。然后这个输出再做为一个输入,传到我们最后的那个输出的节点上面去。

 这样的系统啊,我们就把它称之为多层感知机,所以多层感知机和单层感知机最重要的一个区别就是它有一个隐层,这样的一个系统从结构上来说和这个单层感知机一样,也是有权值的,而且每一个隐层,都有自己的激励函数,隐层中的每一个节点都有自己的一个激励函数,然后这个激励函数产生输出以后,这个输出又有自己的权值,所以说这个图里面有4个权值和三个激励函数,如果我们将他们编号的话,这里1,2, 3,4号节点都是由权值的,3,4,5号节点都是由自己的激励函数的,所有3,4号节点,它们既是作为前一层的输出,又是作为后一层的输入。

我们发现如果我们在训练的过程中,得到的输出,与样本的期待输出不一致的时候,也就是我们需要调整权值的时候,我们在多层感知机的情况下,我们有两层的权值需要调整,因为我们不但这个输入层有权值,隐层它也有权值。

 

 

BP神经网络举例

这个时候, 问题就来了, 我们有两种策略, 一种是先调整输入层的权值,然后调整,隐层的权值,另外一种就是先调整隐层的权值,再调整输入层的权值,这是两种不同的调整策略。在这种带隐层的神经网络刚刚出来的时候,我们首先使用的是这种第一种策略,我们把它叫做误差从前往后传递的神经网络,先调整输入层权值的策略,我们称这种神经网络叫做前馈神经网络。因为在这个神经网络的研究初期啊,我们的激励函数都是阶跃函数,就是大于某个阈值就有输出,小于某个阈值就没有输出的就为0,这种激励函数, 在做权值调整的时候不管在做就比较适合前馈神经网络,也就是我们调整系统时,先调整输入层的权值,再调整隐层的权值,这里的前, 是指的输入层,这种前馈网络曾经风靡一段时间,后来,当我们觉得这种阶跃的激励函数,似乎过于武断了,人们就开始广泛的使用另外一种相对来说更加温和的激励函数,我们介绍其中的一种,叫做sigmoid函数,可以看它的函数表达式:

,这个值永远是小于一的,它的函数曲线是这样的, 这是应用最为广泛的阶跃函数之一。

这个时候啊, 我们发现, 当一个训练样本的输出值,与我们对它了解的其期待的输出值不同的时候,我们通过这个sigmoid函数就能知道,因为它输出的不是一个恒定的值,它是一个变化的值,它这个输出到底是错了多少,以前我们用阶跃函数,只知道它错了,不知道错了多少,用了这个sigmoid函数以后,我们就不但知道它错了,而且还知道,这个输出到底是错了多少,这个时候我们再进行权值调整的时候,就会去考虑这个错的程度,我们管它叫误差,根据这个误差来调整权值,在这种情况下我们发现这个误差的传递,也就是我们对系统的调整,应该是要从后往前来调整是比较合适的,也就是说我们这个误差就是形成了这种误差从后往前调整的这种神经网络于是就有了非常著名的BP神经网络其实就是Back Propagation,也就是一种误差从后往前传播的神经网络,简单的说,我们会先调整这个隐层的权值,然后再调整这个输入层的权值。这个具体的训练过程比较程式化,大体的训练思想与单层感知机是一样的,网上或者教科书上有很多的训练的例子和公式,大家可以多多参考一下,我们这节课就不一一阐述了, 这是这节课我们关于神经网络的所有内容。

 

 

机器视觉的重要性和应用领域

 

今天我们来讲计算机视觉,本来在传统的人工智能课程中计算机视觉是不会单独作为一个章节来讲的,但是这门技术这些年发展十分迅猛,迅猛到了一个什么程度呢?可以说, 现在做人工智能的学者和专家,大概有30%以上都在做跟图像和视觉相关的工作。可见这是炙手可热的一个领域。现在有很多学校专门开设了关于计算机视觉的课程,每年也有很多相关的学术会议在如火如荼的进行中。我们可以期待这个领域在近期内能取得更加具有突破性的研究成果。这也可以看成是科研界的一次战略转移,什么叫战略转移呢?我们可能暂时攻不下人类的大脑,那么我们是否就能先攻下人类的眼睛呢?

这门学科的飞速发展,是有原因的。首先呢,如果能让计算机拥有人类一样的视觉系统,有着非常广泛的应用场景。比如说这个自动驾驶技术,很多年前, 就被提出来了, 但一直没有实现, 最近随着这个计算机视觉技术的日渐成熟,有很多的国际上的汽车企业都开始着手研制搭载了自动驾驶技术的新型汽车,包括通用,宝马,日产,还有最近兴起的特斯拉等等。

我们可以预计在未来的10年内啊,可以看到能够投入使用的自动驾驶汽车。又比如说,这个智能监控系统,我们的商场,银行,电梯等公共场所都安装了很多摄像头来进行保安和监控,有些地方为了进行实时监控,就必须有人守在这多显示屏前面,一动不动的观察。如果我们能设计一套计算机视觉的程序来分析这些摄像头采集的图像,一旦发现任何情况,就能及时的报告给工作人员的话,是不是它就可以极大的减少人工监测的工作量。

之前美国有家公司自称可以提供智能的视频分析系统,只要发现问题啊,就自动的报告给系统,说的好像真的有技术上有非常大的突破,其实这件事情不是大家想的那样啊,这家公司啊,把美国的监控视频内容, 通过光纤实时传到印度, 再以非常低廉的人力成本在印度找人24小时提供监控。这样就号称是智能监控系统。其实这个智能监控技术, 到目前为止还是存在很多的技术难点的。

比如我们想要监测ATM机的这个取款安全,这个事情大家都觉得很有必要对不对,取钱的时候如果后面有个人想要袭击你,这个概率还是有的,我们人看到一个在后面排队的人,去打另外一个人的话,这肯定是一起恶性抢劫事件,但是我们要告诉电脑这件事情就非常不容易, 你要告诉电脑, 什么样的一个图像分布, 是一个人, 然后再告诉电脑这个分布是一个什么样的变化, 说明他在做打人这样一个动作。

这一系列的事情,在我们人类看来,都是非常简单的,但是你要在计算机中把这件事情定义清楚, 确实异常的困难。 有时候你觉得你已经定义得很清楚了,确实人在打人的时候,你的系统能识别出这个动作,但是问题又来了,这个系统有可能在人做别的动作的时候,比如说伸手,踢腿等等,并没有危险性的动作时,你的系统也会把它识别为一个打人的动作,那这样的系统有什么用呢? 那这样的系统又会不停的报警,这样也不行对不对。所以说,我们还有区分各个动作之间的区别。涉及这一些列的问题,我们有一个专门的领域叫做计算机视觉,今天我们具体来介绍一下,计算机视觉中的主要研究问题。

 

 

物体识别

首先,我们说一张图片,对我们人来说, 它是一系列的视觉上的刺激信号,通过我们眼睛的感官摄入,最后再我们大脑皮层上,形成输入信号。这是一个非常复杂的处理过程,其中具体的内容呢,大家可以在很多神经生物学的课堂上进行学习。

但是,这给了我们人工智能的学者一个提示,我们人工只能学者其实很多提示,包括我们之前说的神经网络都是从神经生物学上得到的,那就是对图像的理解和处理,在我们生物系统中啊,都是分好多步来处理的,那么我们在设计这个计算机理解图像的过程中,是不是也要考虑先对图像进行一些预处理呢?

可以说基本上所有的图像识别算法也好,图像理解算法也好,这种处理我们都可以理解为我们之前学习的我们叫做知识表征的一种,即是说我们将一副图片要表征成,计算机能够理解的一种数据结构。那么我们在这里还要强调的一点是,一副图像,其实本来就是存储在计算机硬盘上的数据,所以理论上来说计算机对它们并不陌生,它本来就是储存在计算机里面,所以从数据层面来说计算机是理解这些图片的,但是它却不知道图片里面到底有什么内容,所以,这里的图像预处理的主要目的,是为了让计算机更好的认识这些数据。例如我们说一张图片通常都有几个兆字节的大小,也就是几百万个字节的存储内容,而如果我们要理解这张图片的信息,是否需要这么多字节的信息量呢?比如说我们人类的眼睛有几亿的像素, 但我们人看到的这些景象,我们大脑是不是把这几亿个像素一个像素一个像素去处理呢?答案肯定是否定的。如果真是这样的,即便是人类的大脑,也得累死。

所以说, 我们在计算机中设计这种图像理解的系统的时候,我们要把它进行这个图像预处理,我们图像预处理的一个主要目的,说白了也是像我们人一样先要把这些图像进行一定的简化,即是说, 我们还是希望系统给我们最终进行处理进行理解的输入是一个图像中的一些相对来说要保留主要的有用的信息。因为一张图片中肯定有很多很多冗余的信息,把这些冗余的信息给略掉。这个简化的方法,有很多种,我们这里先介绍一种,这种方法叫做量化

这个很好理解,就跟我们在电脑中有很多图片,有可能像我们从单反机中把一副图片导出来的时候啊,我们会嫌这副图片太大,因为它可能有几十兆的分辨率,要降低它的大小的时候就会选择降低这个图片的分辨率。

比如我们这幅图,这个图中的美女只要是搞计算机视觉的人都不陌生,这幅图也被无数的文献引用过。如果是这个专业的同学会慢慢对这幅图片熟悉,为什么呢?因为最开始研究图像的一帮人, 特别喜欢拿这幅图做例子。这个图就是一个量化的过程,这里左上是原始图像,第二幅图示分辨率降到一半, 感觉还行, 没什么太大差别, 第三幅图讲到原来的四分之一,这时候图像就明显的模糊了很多,大家就基本只能看出来是个女士,长什么样子好像就看得不是特别清楚了,第四幅图讲到原来的八分之一的时候,我们就发现这图像基本上就不能看了。所以,我们在预处理图像的时候, 怎么掌握一个度,也是我们需要考虑的一个问题。当然, 还有非常非常多的图像预处理的方法, 比如处理图像的颜色, 灰度, 平滑度等等, 有很多不同的做这个事情的角度, 我们在这里就不一一详细的展开了。

这是我们说的第一个问题,图像预处理。 我们把这个图像 处理到了一个计算机很容易接受的一个数据层面以后,它还是缺乏一个结构性,比如我们看一副图,它是很有结构的,比如这幅图,这是一个复联2的宣传图,人在看到这幅宣传图的时候我们是有结构性的。

后面有一部分是背景, 然后每个英雄有以自己的轮廓,我们可以把这幅图,如果我们要把这个图分为几个部分去理解。肯定是将每个英雄按照各自的轮廓拆开,雷神是雷神,绿巨人是绿巨人对不对,我们不会把那个黑寡妇的一半和那个鹰眼的一半放到一起去。这里我们输入给电脑的图片啊,如果我们也能够告诉电脑它可以将这个图片分为几个部分去理解的话,是不是就能够大大的促进这个图像理解的过程呢?

这里就牵扯到我们所要讲的第二个计算机视觉的关键技术,我们叫它图像分割。图像分割顾名思义就是我们要把图像分割成几个部分,图像分割的技术很多种,基本分为三种,

1、基于像素灰度值的:就是把一副图像处理成黑白图像以后,它就全部由一个灰度值来表示的

2、一种是基于区域的 

3、还有一种是基于边界的

这是分割图像用到的三种原理。这个基于灰度值的和基于区域的,都很好理解, 我们在这节课着重讲讲什么是基于边界的。

首先我要告诉大家的是什么叫边界?

 

我们看一副图, 这幅图是由像素组成的, 但这幅图中有一些特殊的像素, 这些像素它们能够比较明显的勾绘出图中主要物体的轮廓, 我们把这些像素称为边界。

可以看出如果只有这个边界信息,其实我们也是可以理解这个图像的内容的,这说明啊这部分像素的信息含量很大,但这部分像素在整个图像中所占的比例其实是非常非常的。我们人类开始记录图像的时候,在最开始的时候,也是通过这个物体的轮廓来进行的, 这是一张公元前700年前的壁画, 大家可以看出这是什么吗?

这是古人画的一只狗啊,虽然画的不是那么逼真,这却可以告诉我们, 我们对物体外形的理解,最开始,最基本,也是最原始的形态,就是这个物体的轮廓。我们的中文也是一种象形文字,这些字也是从我们对物体轮廓的认知上发展而来的。

这些轮廓,在图像上把它们称之为物体的边缘。所以在图像识别领域,有一个特别的研究内容,叫边缘检测。边缘检测, 也是我们图像处理和计算机视觉中的基本问题,它旨在标识出数字图像中亮度变化明显的点,在图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括:

1、深度上的不连续

2、表面方向不连续

3、物质属性变化和

4、场景照明变化。



我们再来看另外一副美女的图片,左边是原图,大家可以看到,这位是我们非常熟悉的一位昔日的好莱坞大美女,奥黛丽赫本,右边是我们的边缘检测的结果,这是一个非常理想的结果。通常我们的边缘检测结果都没有这么好,我们可以看到,检测结果中,通常都只有一种颜色的像素,通常都是黑白的像素,这个原图中,由于深度、方向、材质和光照造成的亮度不连续的位置,我们都用像素点将他们标记出来,就形成了我们这个边缘检测的结果。这个边缘检测的基本原理大家应该有所了解了,实现边缘检测的算法很多,大家可以在课后自己去了解一下,有一个最为成熟的,也就是说大家经常拿来用的算法,基于Canny算子。Canny算子可以通过不同的参数,来获取不同的检测结果,我们主要可以通过调节算法对于这种亮度变化的敏感度来进行检测,这是我们之前那副美女图的这个通过Canny算子来进行边缘检测的结果。

从上到下,从左到右,我们也可以叫做算法的阈值,也可以说这个敏感度越来越低,可以看到敏感度越高,阈值越高的,检测到的边缘越琐碎,主要的轮廓都能被检测出来,但是还是有很多无用的轮廓片段,但敏感度很低的时候,检测到的边缘轮廓就非常少,很简洁,但也有可能忽略掉主要轮廓,为什么老师要讲这个图呢?这是我们在边缘检测中,就是我们在处理这个图像轮廓的时候啊,经常要应对的一个取舍问题。有些时候我们检测的东西太多了,就检测到了非常多没用的信息,但是我们想要这个结果很简洁的话,我们又怕漏掉一些信息。

所以,我们认为边缘是这个图像一个非常重要的特征在我们的物体识别中,有一部分的科学家,他们在进行图像理解研究时,他们认为单单只用这个边缘特征,就能够充分的理解这个图像中的各种内容了。这可以说是图像算法研究中的一个流派了。这个流派在进行图像理解和物体识别前啊,都会讲图像处理成简单的边缘轮廓,然后通过这些轮廓的几何特征,来确定物体的形状,从而达到图像理解和物体识别的目的。什么叫做几何特征呢?就是像这种直线的长度、倾斜度和这种转角等,非常简单的这些特征。

这里我们说了不少次物体识别,但老师还没有正式的介绍这个技术,物体识别其实最简单的说,就是讲视频或者图像中的物体识别到它所属的类别中的技术,这是现在的一个图像中研究得比较多的也是比较前沿的一个领域,我们这门课里面说到了很多前沿的技术,比如支持向量机,物体识别,还有之后要讲的深度学习等等,这些知识,都是培养大家兴趣的,我们在考试中,基本上不会涉及到这些前沿技术的知识点,有兴趣的同学可以在这些领域深入的进行学习。

 回到我们现在讲的这个物体识别,我们怎么样,来进行物体识别,比如我们之前看到的那张奥黛丽赫本的图片,如果我们不是来进行边缘检测,而是进行物体识别的话,我们就希望计算机给这张图片,它就知道这是一个人的图片对不对,然后计算机给一个人像照的标签对不对,这里我们就要设法告诉计算机,为了做这件事情我们首先要告诉计算机,什么样的图像中的物体是一个人,如果我们是使用边缘轮廓的特征的话,我们就要告诉电脑,什么样的轮廓是一个人对不对,也就是说,什么样的几何特征的曲线是一个人的轮廓,这是我们说识别任务的第一层,电脑知道这些知识的时候,它也许看到这些头像,它能够告诉我们这是一张人像照,然后我们继续往下,我们还想知道,这是一个男人还是一个女人,虽然我们的求知欲只增加了一点点,或者说我们对电脑的要求只往前了一层,但物体识别这个技术上对计算机的要求就又到达了另外一个层次,那我们还要在这个图像层面来告诉电脑,什么样的特征的人的图像它是一个男人的图像,什么样的人的图像她是个女人的图像,可能我们要考虑脸型啊,头发啊,穿着啊,形体之类的特征,最重要的是,我们要把这种特征上的区别定义好,定义成一种电脑比较好理解一些的数据结构告诉给电脑。这样是不是我们的要求只多了一点,就是说判断出这是一个男人还是一个女人,比判断出人好像只难了一点点,但在图像识别的难度上却上了大大的一个台阶。

到这里计算机也许可以识别出这是一个女人了,但是对我们人来说,我们人可以看得出这是奥黛丽赫本,但是我们人如果说,我们还要进一步台阶,要让电脑识别出这个人是谁,这就更难了,这还设计到另外一个图像识别领域的分支,这个分支也非常有名,它叫做人脸识别技术,我们经常看到很多科幻片当中就是解锁一个门的时候,它把你脸照一下,或者说很多那种超级电脑,它看到你的时候它扫一扫你的脸就知道你是谁。这还需要我们给电脑很多不同人的训练图片,让电脑认识这些人,就是我们之前要让电脑看过很多奥黛丽赫本的图片,当然这张图片肯定是它没有看过的,当它看到这张图片以后,它就能把奥黛丽赫本认出来。这就需要电脑去将这张图片中人脸的生理特征,比如眼睛,鼻子,脸型等等,与它数据库中,也就是它训练过的那些图片进行比较,最后来计算得到一个这张图片最有可能是哪一个人的结果。所以,综上所述,我们人在几十毫秒就能做到的一个简单的识别任务,对电脑来说,就有着无数问题需要解决,这就是我们说的物体识别问题。

这节课我们讲了一些关于图像领域和计算机视觉相关的话题,希望大家能够喜欢。

 

有监督学习和无监督学习

 

我们这门课介绍了很多人工智能的技术,比如,推理,识别,语言理解等等。但大家都觉得啊,其实好像这些技术也都没有完全解决这些问题,或者说没有获得令我们满意的结果。

就拿这个自然语言理解来说吧,我们人类好像永远没有办法找到一种合理的方法,将语言概念组织成一种机器能够处理的数据结构。同样的事情在图像处理和图像识别上也碰到了同样的困境,我们没有办法准确的设计一种能够很好的描述物体形状的特征,然后让计算机能够利用这些特征来识别物体。

科学家们通过非常多年的努力发现我们要自己把这些特征也好,数据结构也好的设计出来,好像不太现实了,于是科学家们觉得我们干脆让电脑自己来学相对来说比较实际一点,但是让电脑自己学的时候又出现问题了,因为学习需要样本来训练,也就是说我们要告诉电脑什么是对的,什么是错的,我们小时候不管学习汉字也好,学习认识事物也好,都是有人教的,电脑也需要。但是教给电脑一件事情,通常都是需要大量的训练数据。这些训练数据大多数都是要给它一个标签的。

什么叫标签呢?简单的说就是告诉计算机这个样本是对的样本还是错的样本,或者告诉它分别是哪种种类的,也就是我们通常所说的监督学习,所以如果说每个样本都要我们人工去加上标签的话,那有些事情啊,我们光在加标签上,花费的精力还不如我们自己去解决这个问题花的精力少。所以现在的问题又变成了另外一个问题了,那就是如何有效、高效的去训练计算机。

那么人们自然而然就想到了, 如果我们不给这些训练的样本加标签,是不是这些数据就没用了呢,是不是我们把这些没有标签的数据给电脑,电脑就什么都学不到呢?因为我们人啊,在学习的时候,并不是每个学习的例子,我们都知道它是正确的,还是错误的,但是在处理这些例子的时候,总能学习到一些东西。

虽然这个学习的效率没有人教好,但是这没关系,因为没有标签的样本大大的有, 所以我们可以通过海量的这种没有标签的样本也能对计算机进行训练,使得计算机学习到一些事情。这就是我们所说的无监督学习。

那么,我们现在也就是说,无论如何, 要使计算机能够通过无监督的方式,来进行学习。通俗的说, 就是我给计算机一小部分数据,一部分数据是有标签的 我们告诉它, 哪些是对的,哪些是错的, 然后其他的海量数据都是没有对错的,就通过这两部分数据,我们希望计算机能够学到这些数据中我们希望希望它学到的一些事情的本质规律。就跟我们其实很多时候人在学习的过程中也是一样的,我们真正知道这件事情是对的还是错的这种情况其实是比较少,很多情况下我们都是自己挖掘出来。

以上说的, 就是我们今天要讲的一个主题叫做深度学习,这个深度学习的一个在学习成本上的动机。

 

特征表示

 

然后我们这个课主要借助我们之前讲过这个特征和表征两个概念来介绍深度学习的内容,不知道大家还记不记得。我们说过任何机器学习算法其实都离不开这两个概念,包括我们这个深度学习的算法,下面我们来讲讲深度学习算法在特征和表征上的一些基础知识。

我们还是以这个图像识别来举例, 上节课我们讲有些学者,仅仅只用这个图像轮廓或者边缘的几何特征来进行识别。但这种思想其实并不主流,我们今天来看看你其他学者,也就是现在主流的图像识别的方法是什么样的呢?  

我们之前说轮廓是能够很好的表现物体形状的特征,为什么呢?因为这种轮廓它们很简洁,我们甚至可以把轮廓近似为一些直线和一些线段,然后把一些线段,就可以是一些数学概念,我们把这些轮廓从数学层面去理解了。可以把它转化为一些带角度和长度的线段来表示。这种由像素点组成的图片如果离开轮廓的话,要怎么来组织它的表征方式呢?

轮廓是比较原始的想法,现在的科学家和学者们尝试了很多种方法,其中最成功的就是使用一种叫浅层特征表示的方法

什么叫浅层特征呢?简单来说就是, 当我们把图片如果分解为若干个像素大小 的图片碎片后, 我们认为任何这样的图片碎片,都可以用一个固定数量的图片碎片集中的若干个碎片叠加来近似。

刚才老师说的这句话很长,我们来分解一下。也就是首先我们认为这个我们对图片在很小的像素点上的表征并不需要是完全精确的,比如我们把图片切成很多个16乘以16的像素点小方格以后,非常非常小,这样的一个小方格,我们把它表征成类似的一个小方格,其实如果有一点数据的变化的话,是没有多大区别的,所以对于每个小方格,如果可以通过一些其他的16*16的小方格来表示这个小方格,虽然表示出来的可能跟实际的这个小方格有些出入,这并不要紧, 我们参照我们之前进行边缘检测的那种方法,图片中其实很多的像素都被删除了对不对,所以说,我们在进行图片表征时,其实只要我们觉得这种表征方法好,不管这张图被我们处理成什么样子都是没有关系的。这是大家要明白的一点。

这个事情,其实早在上个世纪就被几个学者提出来了,当时是具体怎么样做这个事情的呢?他们利用几百副黑白的风景照片用来提取这些用来表示图片的小碎片(特征),从里面提取64个碎片,可以看到,这些碎片啊,其实也是一些图像边缘的图片对不对,然后只是方向,长度,大小等等有区别,我们看到这幅图右边那些像细菌一样的格子,其实是我们从很多图片中找到的一些经常重复出现的边缘碎片。一共有64个,然后我们希望要做到一件事情就是我们要把不管什么样的切割出来一个小的这样一个碎片,也是跟它同样大小的碎片能够用这64个碎片中的某几个的叠加来(近似)表征图片。然后我们这个叠加就是靠下面这个约等于式。 

然后我们在看下面这个约等于式,它是什么意思呢?左边是一个我们要表征的一个碎片,比如说这是我们图中某一个随便的碎片,右边是我们在64个碎片中的找到的, 能够最好的叠加出这个碎片的三个碎片, 这个参数啊,0.8,0.3 ,0.5可以看成是对右边对于碎片的比例调整,调整到这个程度以后把它叠加上去。这样一来啊,我们可以把任何一个图片,处理成关于这64个碎片的一个矩阵,对不对 这就完成了一个图片的表征。  

但是实际上我们需要来表示图片的话,要用到的碎片,远远不如64个这么少,当我们需要用到成千上万个这样的碎片来表征图像的时候,这个表征的矩阵是不是太大了一点呢?可能有可能长度就不止64,可能几千、几万都有可能。

其实我们人在认识一样陌生的东西的时候,一开始用到的特征都是很浅层的,当看到这种东西的次数越来越多以后,我们就会习惯把这些浅层的东西组合起来,因为我们认为很多浅层的图片它总是一起出现的,那么就把浅层特征组合形成一些较深层的特征,这个感觉大家应该都有,就像我们人去认识一种动物的时候,不可能要记住几千个特征来认识这种动物,所以一般来说都是有若干个基础的特征,就能够将这个物体识别或者是区别出来了。但这并不代表我们大脑里面没有这种底层的,较为琐碎的,较为基础的特征在支撑,我们这些深层特征恰恰就是靠这些底层的特征组合而得到的,我们在看这幅图。

我们看到这里有我们对四钟类型的图片的训练结果,这四种类型分别是脸,车子, 大象和椅子, 可以看到我们对每一个类别的最浅层的特征学习得到的结果都很类似,就是最底下这些特征碎片。我们发现,大多都是一样的,然后我们再来看比它们高层一些的特征,就出现了很大的区别。

比如在人脸这个类别中,深层特征就是例如鼻子,眼睛,嘴巴等面部器官就被作为较深层的特征。而在汽车这个类别中,深层特征就是例如轮胎,车门,引擎盖等等汽车的部件。这就出现了非常大的区别。我们把这些特征就不叫浅层特征,我们把它叫做结构性特征

这种结构性特征我们也可以通过文本来进行理解。就好比我们每篇文章,如果我们把每个字当做特征的话,那么这个文章可能有成千上万个特征,比如说它第一个字是什么字,第二个是什么字,第十万个是什么字,我们来这样来定义一篇文章的话可能我们的向量表征就会特别特别复杂。这就可以算是很浅层的特征,如果我们把主题或者是段落大意来看成特征的话,那就会少很多, 这就是我们从文本上对深层的特征的理解就到这里。

 

 

深度学习的训练过程

 

说了这么久特征,我们深度学习到底是怎么样利用这种结构性的特征的呢?首先我们的深度学习是一种多层的神经网络,关于神经网络的基本知识,我们前面已经说过了,所以我们在这里说深度学习是一种利用多层神经网络来实现的算法,为什么要有很多层呢?这是一个很好的问题。我们之前说浅层特征和深层特征,不是用两层就可以了吗? 实际上这是因为,像人脸,车子这种引擎盖这些,都是我们非常熟知的事物,其实这中间有很多不同层的表征才能得到的,不是我们一下子就从这么小的碎片到这么高的特征,深度的特征,对于一个新的, 我们非常陌生的事物的学习过程中,我们要通过很多次的对浅层特征的抽象,才能得到真正有用的深层的高级特征。

 这里我想到很久以前电视节目上比较流行的一个互动游戏,就是几个人一字排开,最左边的人告诉第一个人一个四字成语,然后这个人开始用动作将这个四字成语传递下去,然后我们要问最右边的人,左边第一个人被告知的是什么成语。这个游戏我们对每一个表演者,就可以看成是对这个成语的一个新的表征对不对,因为他把它用动作表征出来了,我们把这个成语换成一幅图,就能更好的诠释这个深度学习的主旨或者精髓。如果我们最左边一个人,看到了一副图,然后它要用动作把这幅图的内容表达出来,告诉下一个人......然后依次告诉到最后一个人,那么我们这个游戏,到最后往往会发现,在这个信息传递的过程中,会有很多的信息的遗失和错误的表达,所以这个游戏在电视上有意思的地方就在于从最后一个人嘴巴里面说出来答案,可能都偏到十万八千里去了。

所以说,如果真的把这个东西看成是一个系统的话,我们可能希望这样一个系统能够非常好的运作。假如我们最终的目的是,让这几个人能够去区分或者说学习一个种类的图片的概念的话,但是我们一开始要做的一件事情,是不是让他们能够很好的用动作来描述图片? 

我们在这节课一开始的时候说了,我们深度学习的一个动机就是要利用大量的无标签数据来进行学习,也就是进行无监督学习,这个互动游戏的例子中为了训练这几个用动作表达图片的能力,我们在一开始训练他们的图片,就没有必要告诉它们这是正例还是反例。

在我们系统中,我们可以把每一个表演者看成是编码器,就是我们把每一层看成一个表演者,我们有十个表演者就是十层的神经网络,然后我们每次它表演完以后,实际上就是说把这个图片编码了一次,就编码成一组动作。我们再设置一个解码器,这是反的,编码器是把图片表演成动作,而我用解码器就是我们从他的动作中画出一幅图来,然后与这个原来的图片或者说上一级的图片进行比较,看看区别大不大,如果区别很大的话,我们再教教这个人你要怎么去做动作表达比较合适。我们管这个叫解码器。我们希望尽可能的把这个图片惟妙惟肖地表现出来。

如果说经过很多次的训练,这些表演者都能通过动作,惟妙惟肖的,将图片完美的表示出来, 我们又能反着把这些图片画出来的话,我们是不是得到了很多种,关于图片的不同的表征了啊,我们十个人肯定每个人表现的方法不一样,但是我们就得到了十种不同的方法,所以我们第一阶段的非监督学习就是去训练表演者的一个过程。

其实说我们真的在做深度学习的时候,图片被表征成什么样子都可以,这群表演者,如果有本事的话,你甚至可以把这张图唱出来,只要你的表演形式能够反过来讲这幅图解码出来,就OK了。

 至于我们之前说的结构化特征,就是我们希望每个人的表演会越来越抽象,即是说我们希望层数越深,这个特征越“抽象”,这么怎么理解呢?就好比在这个例子中啊,一开始,我们允许这个表演者能够花5分钟来描述这幅图,越到后面,我们希望这个表演者能够越快的描述这个图。 到最后只让那个人花十秒钟就要把图片描述出来,这个最后一个人的表征是不是就是非常抽象的啊?

 然后我们开始进入第二步,我们发现这些人,就我们所有的这些神经网络层都能够非常好地对这个图片进行表征了以后,这时候就用少量带有标签的图片来进行监督学习。就是我们告诉这群表演者,其实你们不是单纯的来学习如何将图片表演成动作的,你们是来做图片分类的。

这个让老师想起一个网上的故事,说一个人去拜大师学武,大师让他天天推水缸,推了四年,实在受不了,就放弃师门跑回去了,结果回家一推门,门飞走了,然后才发现自己这个基本功的重要,然后哭着回去求师傅了。 

所以,我们在经过第一阶段用无监督的样本来大量训练每一层以后就得到了非常多非常好的一个表征,而且它有可能是越来越抽象的表征以后,你给它们看一些有标签的图片,一些正例和反例。这个时候,它们也许就能发现一些规律,因为这个时候,我们之前的训练就起到作用了,也就是说我们能够用到这些动作的表征了。

比如说,这个正例图片肯定会出现某个特定的动作。反例图片肯定会出现另一个特定动作之类的。这些动作就是我们学到的好的一些特征,就像我们之前说的男人受不受欢迎那个事情,像长相、身高、有钱都是一种非常好的特征。但是你如果对这个事情一点都不了解的话你是找不到这些特征的。其实就是说我们将这个目的的问题表征成了若干个属性。当给了他们足够的这个训练例子以后,我们就会再给它们一些没有标签的例子,这个时候就不是让他们提高表演能力了,而是让他们判断到底这个图片是不是刚才训练的那个类别。

 

有些时候我们就会直接让最后一个来做判断,因为我们觉得他只用了很少的特征来表示这个图片,用他来判断可能比较快一点。

如果我们不着急时间的话,我们可能请所有的表演者一起来进行判断,这个更加准确对不对。这个时候其实我们在第二个阶段还是回去调整这种跟我们的单层感知机去调整每一层的特征的权值,但是我们最重要的是我们通过第一阶来找到这些特征。

所以我们发现, 如果我们很好的利用到每一层学习到的这些特征,就能够大大的促进我们的分类准确度。

到这里,我想大家应该充分的明白了,这些特征的重要性了。其实,我们之前说的 一个关于男人受不受欢迎的事情,我们的那些特征,有钱啊,帅啊,有才啊,什么的, 其实就是将一个男人受不受欢迎,转换成了一个男人富不富,帅不帅有没有才的问题对不对?

我们判断一个物体是不是兔子,如果我们没有其他的特征怎么判断呢,我们没办法判断,但是我们知道一些特征比如说,长耳朵, 红眼睛,短尾巴等特征,就是将一个物体是不是兔子,转换为了一个物体,有没有长耳朵,有没有红眼睛,有没有短尾巴的问题对不对。但最关键的是我们找到了这些多的特征,所以我们深度学习也是一样,它用深度去学习的,并不是分类的方法,就是说我们在深度学习中用到的分类器没有什么别的先进的地方,它所先进的地方就是它能够通过这种深度的多层的神经网络结构去学习那些那些能够有效的帮助我们分类的特征,这才是深度学习的核心。

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页