第三章 知识就是力量
我们不能低估20世纪70年代中期人工智能发展遇到的重挫,许多学者将人工智能视为一门伪科学——直到最近这一领域才算是恢复了名誉。不过,就在莱特希尔报告广为流传并且造成严重后果之时,一种新的研究方法开始引起人们的注意,它宣称可以解决人工智能受人诟病的问题。20世纪70年代末到80年代初,不少研究人员都突然决定朝这个方向进行研究,他们认为人工智能领域此前存在的问题是过度关注搜索和解决问题这种通用法则。有人提出,这些“弱”方法缺少一个关键的要素,而这一要素才是在所有智能行为中起决定性作用的组成部分:知识。Scientia potentia est(知识就是力量),17世纪哲学家弗朗西斯·培根(Francis Bacon)如是说。人工智能研究者从字面上理解培根的名言,他们支持以知识为基础的人工智能研究,确信捕捉和使用人类现有的知识才是人工智能进步的关键。
一种基于知识的人工智能系统——专家系统开始出现,它能利用人类专业的知识来解决特定的、狭义领域的问题。专家系统提供的证据证明,人工智能在完成某些特定领域的任务方面远胜人类,更重要的是,它们首次向人们证明,人工智能可以应用于商业领域。基于知识的人工智能系统可以向广大受众传授相关的技术,这一代的人工智能研究毕业生决心把他们的知识应用在此领域。
专家系统与通用人工智能不同,它的目标是解决非常狭义、非常具体的问题,解决这类问题通常需要相当专业的知识。通常,能够解决这类专业问题的人类专家都需要花费极长的时间来学习相关知识,而这类专家相当稀少。
在接下来的10年里,基于知识的专家系统是人工智能研究的主要焦点,工业界的巨额投资流入了这一领域。20世纪80年代开始,人工智能的冬天趋于结束,另一股更狂热的人工智能浪潮悄然到来。
在本章中,我们将了解从20世纪70年代末期到80年代末期蓬勃发展的专家系统,我会从如何获取人类专家的知识并将其输入计算机开始,为你讲述MYCIN [5]的故事——它是当年最著名的专家系统之一。我们将看到研究人员如何利用数学逻辑的强大和精准性,试图建立更丰富的获取知识的方法,以及为何这个目标最终也落空了。接下来,我们将听到有关Cyc工程的故事,这是人工智能历史上最雄心勃勃,也是最臭名昭著的失败项目之一。它试图利用人类专家的知识来解决有史以来最大的难题:通用人工智能。
使用规则获取人类专家知识
在人工智能系统中加入知识不是什么新鲜想法,正如我们在前一章所看到的,启发式方法作为一种将解决问题的重点放在有希望的方向上的方法,在黄金年代被广泛应用。启发式方法可以理解为包含能够解决问题的知识,但是启发式方法并没有直接去获取知识。而基于知识的人工智能体系拥有一个全新的思想:人工智能系统应该明确地获取和展示人类解决某类问题的专业知识。
最常见的方案是基于规则的,被称为知识表述。人工智能环境下,一条规则以“如果……那么……”的形式获取离散的知识块。实际上规则相当简单,我们来举个例子说明。以下是一些规则(用自然文字编写,而不是代码),它们是人工智能民间传说的一部分[31]。下面是为了帮助人们对动物进行分类而设计的人工智能专家系统,看看它是如何获取知识的(有关如何应用规则的细节,请参见附录A):
如果该动物产奶,那么它是哺乳动物。
如果该动物有羽毛,那么它是鸟类。
如果该动物能飞并且能产卵,那么它是鸟类。
如果该动物吃肉,那么它是肉食动物。
我们对这些规则作出如下解释:每一条规则都有前因条件(即“如果”之后的部分)和后果结论(即“那么”之后的部分)。例如以下规则:
如果该动物能飞并且能产卵,那么它是鸟类。
该规则中的条件是“该动物能飞,该动物能产卵”,结论就是“它是鸟类”。如果我们当前所掌握的信息与条件项相匹配,那么规则就会被触发,我们就能根据这条规则得出结论。因此,要使这条规则生效,需要两个条件:我们试图分类的那个动物能飞,而且能产卵。如果我们确实掌握了这两条信息,那么规则成立,我们就能得出结论,该动物是鸟类。这个结论为我们提供了更多的信息,这些信息又可以用在后续的规则中,用以获取更多的信息,如此层层推进。通常,专家系统以咨询的形式与用户交互,用户负责向系统提供信息,并且回答系统提出的问题。
图5所示的就是一个典型的专家系统结构,其中,知识库包含系统所拥有的知识——那些规则。工作存储器则包含了系统拥有的,有关当前正在解决的问题信息(例如“该动物有毛发”)。最后,推理机则是专家系统的一个重要组成部分,它负责在解决问题的时候应用系统内存储的知识。
图5 经典专家系统结构
只要给定知识库,比如上文举例的动物分类知识,推理机就能够以两种方式运行:第一种,用户向系统提供他们所知道的有关问题的信息(以动物分类为例,用户向系统描述该动物是否有条纹、是否食肉等),推理机会根据用户提供的信息,应用规则去获取尽可能多的新信息,这个过程叫作规则触发。然后,推理机将触发规则以后获得的新信息添加到工作存储器中,继续查看是否有新的规则被触发,然后不断重复这个过程,直到彻底无法通过已知信息应用更多规则得出更多新信息为止。这种方法被称为正向推理:从数据推理到结论。
另一种方式是反向推理,即我们从想建立的结论开始,反向推理出数据。例如,我们想确定这个需要被分类的动物是否为肉食动物,规则告诉我们,如果动物吃肉,就是肉食动物,因此,我们可以尝试确定动物是否吃肉。因为没有任何规则的结论是动物是否吃肉,系统只能向用户直接询问这个问题。
MYCIN:一个经典的专家系统
在20世纪70年代出现的第一代专家系统中,最具代表性的可能就是MYCIN系统了(这个系统名称来源于抗生素的英文词后缀“mycin”)[32]。MYCIN系统首次证明,人工智能在某些重要的领域表现可以优于人类专家,它为后来无数的专家系统提供了模板。
MYCIN本来是用于辅助医疗的系统,为人类血液疾病的诊断提供专业建议。它是由斯坦福大学的一个研究小组开发的,包括布鲁斯·布坎南(Bruce Buchanan)领导的人工智能实验室专家组和特德·肖特利夫(Ted Shortliffe)领导的斯坦福医学院专家组。事实上,这个项目成功的一大要素就在于,专家系统是由真正的人类专家参与建设的。后来有许多专家系统都宣告失败,因为它们缺乏了相关领域人类专家的必要支持。
跟我们在前文提到的动物分类规则相比,MYCIN关于血液疾病的知识则是用稍微丰富一些的规则来表示的。典型的MYCIN规则(用自然语言表述)如下:
如果:
·该有机体不会被革兰氏染色法染色,并且
·该有机体的形态是杆状,并且
·该有机体是厌氧的
那么:
有可能(60%)该有机体是类杆菌
这是用实际的人工智能语言表述的MYCIN规则:
RULE036:
PREMISE: ($AND (SAME CNTXT GRAM GRAMNEG)
(SAME CNTXTM MORPH ROD)
(SAME CNTXT AIR ANAEROBIC))
ACTION: (CONCLUDE CNTXT IDENTITY
BACTEROIDES TALLY 0.6)
研究人员大概用了5年的时间对MYCIN的知识库进行编码和补充,在它的最终版本里,知识库已经包含了数百条规则。
MYCIN之所以被称为最具代表性的专家系统,是因为它包含了后来的专家系统必不可少的所有关键特性。
首先,MYCIN的系统操作和人类专家进行交互类似——向用户提出一系列问题,并且记录用户的响应。这成为专家系统的标准模型,而MYCIN的主要功能——诊断——则成为专家系统的标准任务。
其次,MYCIN的推理是可以还原和解释的。推理透明度的问题在人工智能应用方面有时极其重要。如果一个人工智能系统被应用在一些生死攸关的决策中(以MYCIN而言,比如治疗方案事关病人的生死),要想让人们遵从它的建议,就需要人们信任这个系统。因此,解释和证明人工智能建议的合理性是非常有必要的。经验表明,作为“黑盒”运行的系统,如果没有能力证明其建议的合理性,就会受到用户的严重质疑。
MYCIN至关重要的能力是它可以明确给出得出这一结论的原因,它是通过一系列推理链来得出最终结论的,即那些被触发的规则和触发规则的信息,都是有迹可寻的。在实践中,大多数专家系统的解释能力最终都归结为类似的东西。虽然不是特别理想,但这样的解释很容易追根溯源,并且有助于理解系统运作的机制。
最后一点,MYCIN能够应对不确定性:有些时候用户向系统提供的信息并不是完全真实和准确的。应对和处理不确定性是对专家系统及人工智能系统的一个普遍要求,在MYCIN这样的系统中,极少根据某个单一的特性就得出明确结论的规则。例如,用户的血液检测结果呈阳性,这就为系统判断提供了一个有力的证据。但是,总有出现检测错误的概率(比如“假阳性”或者“假阴性”之类);或者,患者表现出的某些症状可能是某种特定疾病的征兆,但是不能确定它一定就是某种特定疾病(例如咳嗽是拉沙热的典型症状之一,但病人有咳嗽的症状不能够直接判定他患了拉沙热)。为了能够做出准确的判断,专家系统需要以某种更保险的方式来考虑症状信息。
为了处理不确定性,MYCIN引入了确定性因素的技术——某种表示对某一特定信息的信任或者不信任程度的数值。确定性因素技术是处理不确定性问题的一个相当特别的解决方案,但也因此招来了大量的批评。不确定性处理问题和推理问题成为人工智能研究的一个重要课题,至今仍然如此。我们将在第四章深入讨论。
1979年,MYCIN参与了10个实际病例的评估实验,在血液疾病诊断方面,MYCIN的表现与人类专家相当,并且高于普通医生的平均水平。这是人工智能系统首次在具有实际意义的任务中展示出人类专家级或以上的能力。
繁荣再起
20世纪70年代涌现的专家系统绝不止MYCIN,同样来自斯坦福大学,由爱德·费根鲍姆(Ed Feigenbaum)领衔的项目DENDRAL才是世界上第一例成功的专家系统,它也使费根鲍姆成为知识型系统最著名的倡导者之一,并被人们尊称为“专家系统之父”。DENDRAL的开发目的是帮助化学家根据质谱仪提供的信息来确定化合物的成分及结构。在20世纪80年代中期,每天有成百上千的人在使用DENDRAL。
美国数字设备公司(DEC)开发的R1/XCON系统,旨在帮助他们配置VAX系列计算机。在20世纪80年代,DEC公司声称该系统已经处理了超过8万份订单,当时系统有3000多条规则,涉及5500个不同的系统组件。到了80年代末,R1/XCON系统的规则数量已经扩展至17 500多条,开发者声称该系统为公司节省了超过4000万美元。
DENDRAL项目证明专家系统是可用的,MYCIN证明它可以在专业领域胜过人类专家,R1/XCON证明了它有商用价值。这些成功的故事引起了许多人的兴趣:人工智能似乎已经为商业化做好了准备。这是一个激动人心的故事,毫无疑问,海量的研发资金纷纷流入这个领域。一批初创公司忙不迭地从再度繁荣中获利,典型案例就是用于构建专家系统的软件平台,以及开发和部署专家系统的支持服务。不过你也可以购买专门设计用来快速执行LISP——构建专家系统的首选编程语言——的计算机,这些LISP专用机器一直到90年代早期还在使用。后来,普通个人计算机价格日益便宜,功能也日益强大,那时候再花费7万美元买一台只能运行LISP的计算机就是毫无意义的了。
不仅仅是软件行业,其他行业也争先恐后地乘着这场人工智能再度繁荣的东风飞速发展。20世纪80年代,工业界开始意识到,知识体系,尤其是专业知识,是可以培育和发展的重要资产,可以带来高额利润。专家系统似乎使这种无形的资产变为有形,知识体系的概念与当时西方经济进入后工业时代的观点相呼应——在这一时期,经济发展的新机遇主要来自所谓的知识型产业和服务业,而不是制造业或其他传统产业。
回顾一下专家系统发展的经历,我们可以看到,人工智能的再次繁荣不仅仅是MYCIN、DENDRAL等案例成功的故事,更重要的是,专家系统赋予了人工智能另一种可能性。你不需要相关知识领域的博士学位,就能构建一个专家系统(我敢打赌,你可以轻而易举理解前文所述的动物分类规则)。任何熟悉编程的人都可以明白专家系统的原理,事实上,构建一个专家系统似乎比传统编程还容易一些。一个全新的职业出现了:知识工程师。
具有讽刺意味的是,1983年,英国政府发起了一场雄心勃勃的计算机技术研究资助计划,名叫“阿尔维计划”,计划的核心就是发展人工智能。但鉴于莱特希尔10年前的报告几乎让英国的人工智能产业陷入死局,考虑到该领域的负面名声,似乎所有参与阿尔维计划的人都不愿意将之称为人工智能。相反,他们称之为“基于知识的智能系统”。人工智能的未来似乎一片光明——只要你不把它叫作人工智能。
基于逻辑的人工智能
虽然规则成为专家系统获取人类知识的主要方法,但也有大量其他方案存在。例如,图6就展示了一种名为脚本的知识展示方案(简化)版本,由心理学家罗杰·尚克(Roger Schank)和罗伯特·亚伯森(Robert P. Abelson)开发。该方案基于一种关于人类理解能力的心理学理论建立,理论指出,我们的行为部分受刻板印象模式(即“脚本”)支配,我们也用这些模式来理解世界。他们认为同样的模式可以应用在人工智能中。以图6所示脚本为例:这是一个典型的餐厅场景,脚本(用自然语言)描述了参与者的各种角色(顾客、服务员、厨师、收银员)、启动脚本所需要的条件(客户饿了)、脚本需要操作的各种物理项(食物、桌子、钱、菜单、小费),并且,最重要的是与脚本相关的常规事件序列,在图6中,这些事项的编号为1—10。尚克和亚伯森推测这样的脚本可以用在人工智能程序中,用于理解故事。他们认为,当故事中的事件与常规剧本不同的时候,故事就会变得有意思(有趣、可怕、令人惊讶)。例如,一个有意思的故事可能包含这样的情况:在第4步以后脚本就停止运行了,即顾客点了餐,但是没有上菜。一个违法故事可能省略第9步:顾客点餐并吃东西,但没有付钱就离开了餐馆。他们尝试了几次以脚本为基础构建能够理解故事的系统,但成功率有限[33]。
图6 描述典型的餐馆就餐经历的脚本
另一个引起广泛关注的方案是语义网[34],它非常直观、自然,在当今社会,也经常被重新定义——事实上,如果让你去发明一个知识表述方案,我认为你很有可能做出类似的产品。图7展示了一个简单的语义网,它代表了有关我的一些知识(我的出生日期、居住地、性别和下一代)以及一些世界性常识(比如:女人首先是人,大教堂既是一座建筑又是一个礼拜场所等)。
图7 一个简单的语义网,包含我的个人信息、子女信息和居住信息
在以知识为基础的人工智能兴起时,似乎每一个人都有自己的知识表述方案,而且跟其他人的不兼容。
虽然专家系统事实上的知识表述方式是基于规则的,但在知识表述方面,研究人员仍然有不少困扰。其中之一就是规则太简单,无法获取复杂环境下的相关知识。比如MYCIN系统的规则就不适用于会随时间变化的环境,也不适用于多个用户(不管是人类还是人工智能)的环境,或者实际状态存在各种不确定性的环境。另一个问题是,用于专家系统获取知识的各种方案似乎都有些武断,研究人员希望能了解专家系统中的知识实际上意味着什么,并确保系统进行的推理是可靠的。简而言之,他们想为基于知识的专家系统提供合适的数学基础。人工智能研究人员德鲁·麦克德莫特(Drew McDermott)在1978年撰写的一篇文章中总结了这些问题,并称之为“无意指不表达”[35],“对一个系统而言,正确性固然是重中之重,”他写道,“让人能理解它,也是十分关键的。”
20世纪70年代末就开始出现相关的解决方案,即使用逻辑作为知识表述的统一方案。为了理解逻辑在基于知识的系统中所扮演的角色,我们有必要了解一些逻辑的知识,以及它如何作用于系统。逻辑学的发展是为了理解推理,特别是区分好的(完备的)推理和坏的(不完备的)推理。让我们看一些推理方面的例子,包括完备和不完备的。
凡人终有一死;
艾玛是凡人;
所以,艾玛终有一死。
这就是典型的三段论逻辑推理的模式,我想你会同意这里的逻辑推理是完全合乎情理的:如果所有的人类都是凡人,终有一死,而艾玛是人类之一,所以她也是凡人,也终有一死。
我们继续看下一个例子:
所有的教授颜值都高;
迈克尔是一名教授;
所以迈克尔是位帅哥。
很显然,教授们倒是很乐意相信这个结论。然而,从逻辑的角度来看,这个推论也是没有什么错误的:事实上,从推论本身来看,它完全正确。如果真的所有教授颜值都很高的话,迈克尔是一名教授,那么得出他是帅哥的结论就完全合乎情理。逻辑并不关心你一开始的陈述是否真实(即前提是否真实),只关心你使用的模式和得出的结论是否合理。当然,那是在承认这个前提的基础上。
接下来我们看一个不完备的推理:
所有学生都努力学习;
索菲是一名学生;
所以索菲很有钱。
这个推理就是错误的,因为仅仅依靠前两个前提就得出索菲有钱的结论是不合理的。索菲有可能很富有,但这不是重点,重点在于你不能从给定的前提得出这个结论。
所以,逻辑是有关推理模式的,上述的例子所示的三段论也许是最简单有用的逻辑推理案例。逻辑告诉我们怎样正确地从前提中得出结论,这个过程被称为演绎。
三段论是古希腊哲学家亚里士多德(Aristotle)提出的,1000多年以来,三段论为逻辑分析提供了主要框架。然而,它能展示的逻辑推理形式十分有限,不适合许多复杂形式的论证。从很早开始,数学家就对理解推理的通用原理有着浓厚兴趣,因为数学的根本性问题都是有关推理的:数学家的工作就是从现有的知识中获取新的知识,换句话说,就是进行推理和演绎。到了19世纪,数学家们普遍对他们的工作原理感到困惑。他们想知道,到底什么是真实的?我们怎样证明数学论证是合理的推论呢?我们怎么确定1 + 1 = 2是正确的?
大约始于19世纪中叶,数学家们开始认真研究这些问题。德国的戈特洛布·弗雷格(Gottlob Frege)发展了普通的逻辑演算,为世人第一次展现了类似现代数理逻辑框架的东西。伦敦的奥古斯都·德·摩根(Augustus de Morgan)和来自爱尔兰科克城市的乔治·布尔(George Boole)展示了如何将应用于代数问题的相同计算方式应用于逻辑推理(1854年,布尔发表了相关论文,并起了个傲慢的题名:思想法则)。
到了20世纪初,现代逻辑的基本框架已经大致建立起来,当时确立的逻辑运算系统,直至如今仍然能够支撑数学家几乎所有的逻辑推理工作。这个系统被称为一阶逻辑,一阶逻辑是数学和推理的通用语言。这个框架涵盖了亚里士多德、弗雷格、德·摩根、布尔和其他人的所有类型的推理。在人工智能领域,一阶逻辑似乎以同样的方式提供了统一框架,为当时世界各地各式各样、不成体系的知识表述方案提供了统一框架。
基于逻辑的人工智能范式由此诞生,其最早和最具影响力的倡导者之一,就是约翰·麦卡锡——正是那位在1956年主持了达特茅斯暑期学校,并为人工智能命名的麦卡锡。他描述了自己对基于逻辑的人工智能系统的构想[36]:
我的观点是,智能体能够使用逻辑语句来表达其对世界、目标和当前状况的了解,并通过(推断)某个行为或者行动过程是否符合它的目标,来决定它自己的行为。
这里的“智能体”指的就是人工智能,麦卡锡提出的“逻辑语句”正是我们前文所述的类似“凡人皆有一死”或者“所有教授颜值都高”等陈述。一阶逻辑提供了丰富的、数学上能够精准表达的语言,可以用来表述逻辑语句。
图8 麦卡锡对人工智能的构想
麦卡锡设想的基于逻辑的人工智能,一个基于逻辑的人工智能系统能通过逻辑语句明确地表示其对环境的信念,智能决策则被分解为逻辑推理的过程。
图8展示了麦卡锡对逻辑人工智能的构想(相当程序化)。我们看到一个机器人在类似积木世界的环境中工作,它配有机械臂和用于获取环境信息的感应系统。在机器人内部,有关于环境的逻辑描述,包括On(A, Table), On(C, A)等语句。这些语句实际上是一阶逻辑的表达式。对于图8所示场景,它们的含义非常明显:
·On(x, y)表示对象x位于对象y的上方
·Clear(x)表示对象x上没有对象
·Empty(x)表示x是空的
在基于逻辑的人工智能系统中,关键任务之一是定义表达式词汇表。比如On(x, y)、Clear(x)等等,用来表示所处的场景。
机器人内部的逻辑推理系统用于判断它从所处环境中获取的所有信息,这种认知通常被称为信念。机器人的信念系统包含了“On(A, Table)”就意味着“机器人相信对象A在桌面上”。不过,我们需要谨慎地对待这些术语。虽然使用我们熟悉的词汇来做术语有助于我们理解机器人的“信念”〔对人类而言,“On(A,Table)”是一种非常容易理解的表述〕,但对机器人而言,只有它的知识库里存储了这个表达式的意义,才能和机器人本身的行为产生关联。只有机器人的知识库中有了这一条认知以后,才真正算作一项“信念”。另外,选择“On”作为术语也没什么神奇之处,其实设计者完全可以使用诸如“Qwerty(x, y)”之类的语言来表述物体x位于物体y之上,对机器人而言,其执行结果并没有什么不同。人工智能开发中一个常见的误区,就在于开发者为系统所选择的术语对人类而言太容易理解了,反而增加了许多不必要的误解,这让我们以为机器人也能轻而易举读懂语言本身,而事实并非如此。
机器人的感应系统负责将感应器所提供的原始信息转化成机器人能使用的内部逻辑形式,如图8所示。正如前面我们提到过的,这不是一件容易的事情,我们稍后会详细讨论。
最后,通过机器人的逻辑推理系统(推理机)来决定机器人的实际行为。逻辑人工智能的核心思想就在于机器人的行为是基于逻辑推理的结果:它必须推断出自己接下来应该做什么。
总的来说,我们可以设想机器人的行为模式:在一个周期内不断地通过传感器观察周围环境,更新对环境的认知,推断出下一步该做什么,执行这个动作,然后重新开始整个过程。
基于逻辑的人工智能为什么会有相当的影响力?我想我们有必要理解这一点。或许最重要的原因是它让一切变得单纯:构建智能系统的整体问题被简化成对机器人应该做什么的逻辑描述。而这样一个系统是透明的:要理解机器人为什么这么做,只需要看到它的信念和推理过程就行了。
当然,我认为还有一些不那么明显的原因。首先,想象一下,我们做决定的依据来源于推理,这个想法本身就很吸引人。当我们思考的时候,似乎也是这么做的:我们考虑各种行动方案的优劣,可能会和自己来一场心灵对话,厘清每种方案的利弊。而基于逻辑的人工智能似乎遵循了这一过程。
逻辑编程
从20世纪70年代末到80年代中期,基于逻辑的人工智能范式开始逐步拥有影响力,到了80年代初,它已经成为人工智能的主流。研究人员开始推测,它不仅在人工智能领域有用,甚至可以推广至整个计算机领域。逻辑编程开始广为人知,从根本上改变了人们的编程模式。长期以来,编程是一项烦琐、耗时且容易出错的工作,因为它迫使人们思考计算机程序操作的每一个步骤,并且不能出一丁点儿错,人应付起来相当艰难。而逻辑编程把程序员从这样的诅咒里解脱出来,这是它的最大卖点。在逻辑编程中,你可以利用逻辑的力量来表达你对问题的了解——剩下的事情,交给逻辑推理即可。你没必要详细写出每一个步骤,一个逻辑程序会推断出它实际上需要做什么。
逻辑编程使用的是一种非常有名的语言:PROLOG[37],它可能算是逻辑人工智能时代最卓越的遗产了——这种语言至今仍在广泛使用和传授。PROLOG主要是由美籍英国研究员鲍勃·科瓦尔斯基(Bob Kowalski),以及两名来自法国马赛的研究员,阿兰·科尔默劳尔(Alain Colmerauer)和菲利普·罗塞尔(Philippe Roussel)发明的。在20世纪70年代早期,科瓦尔斯基就意识到可以使用一阶逻辑规则来构建编程语言的基础,虽然他有了这个新想法,但是并没有落实细节——这项工作是在1972年科瓦尔斯基拜访之后,由科尔默劳尔和罗塞尔完成的。
PROLOG是一门非常直观的语言,我们来看一个例子。下面是如何用PROLOG表示前文举的“凡人皆有一死”的例子:
human (emma).
mortal (X): - human (X).
第一行程序是PROLOG中定义的“事实”,即艾玛是凡人。第二行是PROLOG中的“规则”,表示若是X是凡人,X终有一死。
在实际中运用PROLOG,我们需要给它一个目标。在本例中,我们需要确认艾玛是否会死亡,可以这样表示:
mortal (emma).
这句语句的目的是向PROLOG询问“艾玛是否终有一死”,或者用更具体的方式表述,即“你能根据已知的事实和规则推断艾玛是否终有一死吗?”有了这个目标,PROLOG就能使用逻辑推理来证明,该语句为真[38]。(有关PROLOG的深入了解,请参阅附录B。)
上述例子只展示了PROLOG强大功能的冰山一角,对于某些问题,你可以用PROLOG编写出非常简洁优雅的程序。1974年大卫·沃伦(David Warren)编写的战机计划系统可以解决积木世界内的规划问题,只需要100行PROLOG代码[39]。如果要用Python之类的语言编写同样的系统,大概需要数千行代码以及数月的工作。此外,用PROLOG编写的程序不仅仅是程序,还是逻辑公式。因此,PROLOG程序看上去实现了麦卡锡对基于逻辑的人工智能的设想。
在20世纪70年代末到80年代初,PROLOG开始崭露头角,直到它挑战麦卡锡倍加推崇的LISP语言——人工智能黑客首选的编程语言。80年代初,PROLOG成为日本政府大规模投资的对象,被称为第五代计算机项目。当时,与美国和欧洲的经济相比,日本经济呈现蓬勃发展之势,这也让美国和欧洲政府十分担心。但同时,日本政府也有所顾虑,虽然日本工业擅长技术再开发和商业化,但在根本的创新性方面,尤其在计算机领域,它并不十分出色。第五代计算机项目旨在改变这一现状,试图确立日本全球计算机创新中心的地位,而逻辑编程是定向投资的关键技术之一。在后续的十年里,大约4亿美金被投入到第五代计算机项目中。不过,尽管它在建立日本的计算机科学基础方面发挥了重要作用,却并没有让日本的计算机产业超越美国。PROLOG也没有像逻辑编程界人士所期望的那样,成为一种通用计算机语言。
虽然PROLOG没有征服程序员的世界,但不能将它视为失败。毕竟,在世界各地,程序员每天都在愉快地使用PROLOG编写高效的程序,并感激这种语言的强大和优雅。但对我来说,PROLOG最大的贡献却是无形的:逻辑编程为计算机提供了一个全新的思路,就如何解决计算问题而言,它有着跟传统计算机完全不同的观点。一代又一代程序员因此受益匪浅。
Cyc:终极专家系统
Cyc工程可谓知识型人工智能时代最著名的实验了,Cyc工程是天才的人工智能研究员道格·莱纳特(Doug Lenat)的智慧结晶,莱纳特拥有卓越的科学能力、坚定不移的信心以及优秀的说服能力,让旁人能够接受他的愿景。在20世纪70年代,他凭借一系列令人印象深刻的人工智能系统崭露头角,1977年,他荣获计算机与思想奖,这是能够授予年轻人工智能科学家的最具声望的奖项。
在80年代初期,莱纳特确信“知识就是力量”理论的应用应该远远超过大家所关注的、狭义的专家系统。他确信,这个理论可以成为打开通用人工智能——人工智能的宏伟梦想的钥匙。他在1990年写下这样的话〔合著者为拉曼内森·古哈(Ramanathan Guha)〕[40]:
我们不相信任何通往智能的捷径,世界上不存在尚未被发现的麦克斯韦思想方程式之类的通解……任何强大的思维体都无可避免地需要大量知识。我们所说的知识,不是指枯燥的、专业领域内的知识;更确切地说,是现实世界中的各种常识……它们太普通了,所以参考书里面找不到。例如:生命不可永恒,任何实体不可能同时出现在两个不同的地方,动物不喜欢承受痛苦,等等。恐怕人工智能所面临的最艰难的事实——过去34年来人工智能领域一直致力于摆脱的事实——其实是,要获取如此庞大的知识库,没有一种优雅、轻松的方式。相反,大部分工作(至少在初期)必须经过人类判断以后手工输入。
因此,在80年代中期,莱纳特和他的同事给自己立下了艰难的挑战任务,创建“包罗万象的知识库”, Cyc工程应运而生。
Cyc工程的雄心壮志确实令人难以置信,要实现莱纳特的构想,Cyc的知识库需要对“共识现实”,即我们所理解的整个世界进行完整描述。现在让我们暂停阅读,思考一下这个挑战有多难,也就是说,必须有人明确告诉Cyc很多对人类而言理所当然的常识,比如:
在地球上,一个悬在空中的物体会落地,它落到地面
时会停下来;而在太空里面,悬空物体则不会落地。
燃料耗尽的飞机会坠机。
坠机事故会让人丧生。
食用你不认识的蘑菇是危险行为。
红色水龙头往往通的是热水,蓝色的往往是冷水。
……
一个受过良好教育的人在生活中所认知的日常知识,在Cyc系统里面必须由人用特殊的语言明确地写下来,并且输入系统中。
莱纳特预估这个输入的工程需要至少200人经过多年的努力来实现,大部分的时间和人力都会消耗在手动知识录入上,即告诉Cyc我们的世界是怎样的,以及我们是怎么理解它的。莱纳特乐观地认为,用不了多久,Cyc就可以实现自我学习。一个以莱纳特设想的方式自主教育、自我学习的系统,就意味着通用人工智能的设想成为现实。这就是说,莱纳特假设通用人工智能的问题主要是知识储备问题,它可以通过一个合适的基于知识的系统来解决。Cyc假设是一场豪赌,高风险、高收益,如果被证明成功,它就能改变整个世界。
科研界,包括科研投资的悖论之一就是,有时候,宏伟的目标会掩盖其荒谬的本质。事实上,正是某些研究机构不遗余力地支持和鼓励那些雄心勃勃的、步子迈得太超前的科研者,而摒弃了一些安全但是进度缓慢的研究。也许Cyc就是这样一个案例。不管怎么说,1984年,Cyc工程从得克萨斯州奥斯汀市的微电子和计算机联合会那里获取了资金,项目启动了。
当然,它失败了。
首要的问题在于,以前从来没人试图将人类所有的基础常识组织汇编,你到底该从哪里开始?第一步,你得定义将使用到的所有词汇,还有各种术语,它们之间是怎么关联的。定义基本术语和概念,并围绕它们组织整个知识体系,被称为本体工程。而Cyc的本体工程面临的挑战,比此前所有的其他项目都庞大得多。很快,莱纳特和他的同事就发现,他们关于如何构建Cyc的知识体系,以及如何获取知识的想法都太过天真和粗糙。并且,随着项目的推进,时不时还得推翻重来。
尽管经历各种挫折,在项目实施10年后莱纳特仍然保持乐观。1994年4月,他的乐观预期引起了斯坦福大学计算机科学教授沃恩·普拉特[41](Vaughan Pratt)的注意。普拉特是一名颇有威望的计算理论专家,习惯用精准而严谨的数学语言来思考计算机的本质。普拉特对一次Cyc的展示会颇感兴趣,他要求现场观看一次程序演示。莱纳特同意了。
在访问之前,普拉特给莱纳特写了封信,根据公开发表的有关Cyc项目的科学文章,普拉特列举了一个清单,包含他期望Cyc能够实现的功能。普拉特写道:“我认为,如果我的期望和Cyc的能力相匹配,那么这个演示程序将发挥最佳效果。如果我的期望太高了,那肯定会令我失望。但如果我低估了它……我们可能花费太多时间在不公正地质疑这个项目上了。”但他没有收到回复。
1994年4月15日,普拉特见到了Cyc项目的演示。演示从一些很简单的例子开始,展示了Cyc系统看似不够亮眼但真正富有技术含量的成就——识别出数据库中需要Cyc运用推理能力才能识别的细节差别。真是一个良好的开端。然后莱纳特开始演示一些扩展能力,让Cyc识别出用自然语言编写的需求,按照需求检索图片。“放松的某人”的查询结果是三个穿着沙滩服的男人拿着冲浪板的照片——Cyc正确地将冲浪板、冲浪和放松联系起来。普拉特简略书写了一下Cyc推理到这个环节的推理链,它需要运用近20条规则,其中某些规则在我们看来可能挺奇怪的——“所有哺乳动物都是脊椎动物”是完成这个推理链所用到的规则之一(普拉特看到的Cyc版本有50多万条规则)。
到目前为止进展得不错,不过,普拉特想了解Cyc最核心的特征之一:它对世界的实际认知。然后,普拉特询问Cyc是否知道面包是食物。主机将问题翻译成Cyc使用的规则语言。“是的,”Cyc回答说。“那么,Cyc认为面包是一种饮料吗?”普拉特问道。这次Cyc卡住了。他们试图明确地告诉它面包不是饮料。普拉特在报告里写道:“在稍加调整之后,我们放弃了这个问题。”他们继续进行演示,Cyc似乎知道各种活动会导致死亡,但并不知道饥饿也是死亡的一个原因。事实上,Cyc似乎没有“饿死”这个概念。普拉特继续询问有关行星、天空和汽车的问题,但很快就发现,Cyc的知识储备十分粗略和难以捉摸。例如,它不知道天空是蓝色的,也不知道汽车通常有四个轮子。
在观看过莱纳特的演示以后,普拉特拿出了准备好的,包含100多个问题的清单,他希望这些问题能够探索Cyc到底对这个世界的常识了解多少,理解到何种程度。例如:
如果汤姆比迪克高3英寸[6],迪克比哈里高2英寸,那
么汤姆比哈里高多少?
两兄弟可以彼此都比对方更高吗?
陆地和海洋哪个更湿?
汽车能向后开吗?飞机能向后飞吗?
人没有空气能活多久?
这些都是关于这个世界最基础的常识性问题,但Cyc不能对此做出有意义的回答。普拉特回顾了自己的经历,对Cyc项目提出了谨慎的批评。他推测,或许Cyc已经朝着通用人工智能的目标跨出了一步,取得了一定进展,但问题在于,很难弄清楚这个进展有多大,因为Cyc的知识体系非常零碎,分布得相当不均匀。
我们能从Cyc项目中获得哪些有关通用人工智能道路的启示呢?忽略过于乐观的预期,其实在大规模知识工程中,Cyc算是拥有复杂技术的一次实践。它虽然没有给出一条指向通用人工智能的光明大道,但它教会了我们在开发和组织基于大型知识基础的知识系统中的各种方法。从严格精准的意义上来说,Cyc假说——通用人工智能的本质是知识体系问题,可以通过一个合适的基于知识的系统来解决——既没有被证实,也没有被证伪。Cyc不能成为通用人工智能成功案例并不能证明这个理论是错误的,只能证明这种方式没有用而已。可以想象或许存在更合理的基于知识的体系,能够带来更大的进步。
从某种意义上说,Cyc项目是领先于时代的。Cyc项目开始30年以后,谷歌发布了知识图谱,这是一个庞大的知识库,知识图谱里面汇集了大量关于实体世界的信息(地点、人物、电影、书籍、重大事件等),这些信息被用来丰富谷歌搜索引擎的查找结果。当你使用谷歌搜索引擎时,你所查找的东西通常会涉及一些实体的名称或者其他术语之类。举个例子,如果你搜索“麦当娜”,简单的网络搜索结果会返回包含“麦当娜”这个关键词的网页。但是,如果搜索引擎知道麦当娜是一名流行歌手,以及她的全名是麦当娜·路易斯·西科尼(Madonna Louise Ciccone),就会返回一些更有价值的东西。所以,你在谷歌上搜索“麦当娜”就会发现,你的搜索结果包含了这位歌手的一系列信息,这些信息会回答人们有关她的常见问题(比如出生年月、孩子状况、最受欢迎的专辑等)。Cyc和谷歌知识图谱最关键的区别在于,知识图谱中的知识并非手工编码的,而是自动从维基百科等网页中提取出来的。到2017年,据称维基百科包含700亿条名词,涉及大约5亿个实体。当然,知识图谱并没有以通用人工智能为目标,目前也不清楚它涉及了多少基于知识系统的至关重要的世界观推理。不过,不管怎么说,我认为,知识图谱多多少少还是携带了Cyc的基因。
然而,不管我们回顾历史时如何尽力客观评价Cyc项目,可悲的事实总是无法改变。Cyc项目在人工智能发展史中之所以留下浓墨重彩的一笔,源于它是一个人工智能被过度炒作的极端案例,它完全辜负了人们寄予的不切实际的厚望。莱纳特的名字也被编入了计算机科学的民间笑料里。有个笑话说,“微莱纳特”应该作为一个科学计量单位,用来衡量某件事情的虚假程度。为什么要在莱纳特前面加上“微”?因为你找不到比一个“整莱纳特”更虚假的东西了。
破灭出现
就像许多理论上很美好的人工智能一样,基于知识的人工智能被证明实际应用非常有限。这种方式在一些我们认为荒谬琐碎的推理任务中,也遇到了困难。考虑一下常识推理任务,下面的场景给出一个典型例子[42]:
你得知翠迪是一只鸟,所以你得出一个结论:翠迪会飞。然而,翠迪是一只企鹅。所以你收回了之前的结论。
乍一看,这个问题在逻辑上应该很容易理解。看上去跟我们之前讨论的逻辑三段论没什么差别——我们的人工智能系统存在知识“如果x是一只鸟,那么x会飞”,那么,给出“x是一只鸟”的信息,它理所当然能推理出“x能飞”的结论。好吧,到目前为止没有任何问题。但我们现在得知,翠迪是一只企鹅,接下来会发生什么呢?我们需要撤销之前得出的“翠迪会飞”的结论。问题来了,逻辑无法处理这样的问题。在逻辑上,增加更多的信息永远不会消除你之前得到的任何结论。但是增加的信息(即“翠迪是一只企鹅”)确确实实使我们需要撤销之前的结论(即“翠迪会飞”)。
常识推理还有另外一个问题,在我们遇到矛盾的时候就会凸显。以下是文献中的标准示例[43]:
贵格会教徒是和平主义者;
共和党人不是和平主义者;
尼克松是一名共和党人,也是一名和平主义者。
试着从逻辑上解释上述文字,你就会陷入理解困境,因为最终我们会得出结论:尼克松既是和平主义者,又不是和平主义者——这是一个矛盾。在这样的矛盾面前,逻辑完全失效:它不能应对这样的场景,也无法告知我们任何有意义的结论。然而,矛盾是我们每天都会遇见的现实。我们被告知纳税是有益处的,我们也被告知纳税是一种损失;我们被告知葡萄酒有益,我们也被告知葡萄酒有害;等等。矛盾在生活中无处不在。问题在于,我们试图用逻辑去处理它不该处理的领域——在数学中,如果遇见矛盾,就意味着你犯了错。
这些问题看似微不足道,但在20世纪80年代末,它们是基于知识的人工智能研究最主要的挑战,吸引了该领域最聪明的一群人,但从来没得到过真正意义上的解决。
事实证明,构建和部署专家系统比最初想象的困难得多。最主要的难题是后来被称为知识获取的问题,简单地说,就是如何从人类专家那里提取知识并以规则形式编码。人类专家通常也很难表达他们所拥有的专业知识——他们擅长处理某种事情并不意味着他们可以讲清楚实际上是怎么做到的。另外,专家们也并非那么渴望分享自己的专业知识。毕竟,如果你的公司能够用程序来代替你工作,他们还要你干什么?何况人工智能会取代人类的担忧一直存在。
到了20世纪80年代末,专家系统的繁荣已经结束。基于知识的系统技术倒不能说是失败了,毕竟许多成功的专家系统也在这一时期内建立起来,此后也逐步有更多的专家系统出现。但是,看样子,又一次证明,人工智能的实际产出没有达到被鼓吹炒作的高度。