原文出处:Knowledge Representation and Expert Systems 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
对人工智能的追求,本质上是对知识的搜寻,目的是像人一样理解这个世界。那么,这件事具体要怎么做?
课前测验
在 AI 研究的早期,自上而下(top-down)创建智能系统的方法非常流行(上一课讲过)。思路是把知识从人身上提取出来,写成机器能读的形式,再用它自动解决问题。这条路建立在两个核心概念之上:
- 知识表示(knowledge representation)
- 推理(reasoning)
知识表示
符号主义 AI(Symbolic AI)里有一个核心概念是知识。知识要跟信息(information)、数据(data)区分开。举个例子:我们可以说书里有知识,因为人读书能成为专家。可书里实际装的东西叫数据;只有通过阅读,把这些数据整合进我们的世界模型,数据才转化成知识。
知识是存在于我们头脑中的东西,代表我们对世界的理解。它来自一个主动的学习过程:把接收到的一条条信息,整合进我们活跃的世界模型。
多数时候我们并不严格定义知识,而是借 DIKW 金字塔 把它和几个相关概念放在一起讲。它包含以下概念:
- 数据(Data) 是用物理载体记录下来的东西,比如写下的文字、说出的话。数据独立于人存在,可以在人之间传递。
- 信息(Information) 是数据在我们头脑中被解读后的样子。比如听到"计算机"这个词,我们对它是什么有一些理解。
- 知识(Knowledge) 是被整合进世界模型的信息。比如弄懂计算机是什么之后,我们开始知道它怎么工作、大概多少钱、能拿来干什么。这张由相互关联的概念织成的网络,就是我们的知识。
- 智慧(Wisdom) 是对世界理解的再上一层,涉及元知识(meta-knowledge),比如知道知识该怎么用、什么时候用。
原文此处有一张 DIKW 金字塔图,从下往上依次是数据、信息、知识、智慧四层(图来自维基百科,作者 Longlivetheux,CC BY-SA 4.0 许可)。
这样,知识表示的问题就是:找到某种有效的办法,把知识以数据的形式表示到计算机里,让它能被自动使用。这可以看成一条谱系:
原文此处有一张图,画的是知识表示方法的谱系(作者 Dmitry Soshnikov),左端是计算机可直接使用的简单表示,右端是自然语言文本。
- 谱系左端是一系列很简单的知识表示类型,计算机能用得很高效。最简单的是算法式:知识直接写成一个计算机程序。但这不是好办法,因为它不灵活,而我们头脑里的知识往往不是算法式的。
- 谱系右端是自然文本这样的表示。它表达能力最强,却没法用来做自动推理。
想一分钟:你在脑子里是怎么存知识、又怎么把它们变成笔记的?有没有某种格式特别适合你记住内容?
计算机知识表示方法的分类
我们可以把计算机的知识表示方法分成下面几类:
- 网络表示基于一个事实:我们头脑里有一张概念互相连接的网络。可以把同样的网络在计算机里复现成一张图,也就是所谓的语义网络(semantic network)。
- 对象-属性-值三元组(object-attribute-value triplet),或者属性-值对。图在计算机里可以表示成节点表和边表,所以语义网络可以用一串三元组来表示,每组含一个对象、一个属性、一个值。比如用三元组描述编程语言:
| 对象 | 属性 | 值 |
|---|---|---|
| Python | 是 | 无类型语言 |
| Python | 发明者是 | Guido van Rossum |
| Python | 代码块语法 | 缩进 |
| 无类型语言 | 没有 | 类型定义 |
想一想:三元组还能用来表示哪些知识?
- 层次表示强调一个事实:我们头脑里的对象常常是分层的。比如我们知道金丝雀是一种鸟,而鸟都有翅膀;我们还知道金丝雀通常什么颜色、飞得多快。
- 框架表示(frame representation)把每个对象或每类对象表示成一个框架(frame),框架里有一组槽(slot)。每个槽可以有默认值、取值限制,或者一个用来取值的存储过程。所有框架组成的层次,跟面向对象编程语言里的类层次很像。
- 场景(scenario)是一类特殊的框架,用来表示能随时间展开的复杂情况。
Python 这个框架长这样:
| 槽 | 值 | 默认值 | 取值区间 |
|---|---|---|---|
| 名称 | Python | ||
| 是一种 | 无类型语言 | ||
| 变量命名 | 驼峰式 | ||
| 程序长度 | 5-5000 行 | ||
| 代码块语法 | 缩进 |
-
过程式表示用一串动作来表达知识,条件满足时就执行。 - 产生式规则(production rule)是 IF-THEN 语句,让我们能推出结论。比如医生可以有这样一条规则:如果病人高烧,或者血液化验中 C-反应蛋白偏高,那么他有炎症。一旦碰到其中某个条件,我们就能下"有炎症"的结论,再把它用到后续推理里。 - 算法也可以算过程式表示的另一种形式,不过基于知识的系统几乎从不直接使用它。
-
逻辑:早在亚里士多德那里,逻辑就被当作表达人类普遍知识的方法。 - 谓词逻辑作为数学理论太强了,没法完全计算,所以实际用的多是它的子集,比如 Prolog 语言使用的 Horn 子句(Horn clauses)。 - 描述逻辑(descriptive logic)是一族逻辑系统,用来表示对象层次并对它们做推理,适合语义网这种分布式知识表示。
专家系统
符号主义 AI 早期的成功代表是所谓的专家系统(expert system):一类计算机系统,设计目标是在某个有限的问题领域里充当专家。它的基础是从一个或多个人类专家那里提取出来的知识库(knowledge base),再配一个在知识库上做推理的推理引擎(inference engine)。
原文此处有两张并排的图:左边画的是一种简化的人类神经系统结构,右边画的是基于知识的系统的架构,用来说明两者构造上的对照。
专家系统是照着人类推理系统来搭的。人类推理系统里有短时记忆和长时记忆;同样,基于知识的系统里可以区分出这几个部件:
- 问题记忆(problem memory):存当前正在解决的问题的知识,比如病人的体温、血压、有没有发炎。这部分知识也叫静态知识,因为它是"我们此刻对问题知道多少"的一张快照,也就是所谓的问题状态(problem state)。
- 知识库:存关于问题领域的长时知识。它由人工从人类专家那里提取,一次次咨询之间不会变。它能带着我们从一个问题状态走到另一个问题状态,所以也叫动态知识。
- 推理引擎:统筹在问题状态空间里搜索的全过程,必要时向用户提问,还负责找出每个状态下该应用哪条规则。
来看一个例子:一个根据身体特征判断是什么动物的专家系统。
原文此处有一张图,画的就是这个专家系统。
这类图叫 AND-OR 树(与或树),是一组产生式规则的图形化表达。从专家那里提取知识的初期,画图很有用;到了要在计算机里表示知识的时候,用规则写更合适:
IF the animal eats meat
OR (animal has sharp teeth
AND animal has claws
AND animal has forward-looking eyes
)
THEN the animal is a carnivore
可以注意到,规则左边每个条件和动作本身,都是对象-属性-值(OAV)三元组。工作记忆(working memory)里存着与当前问题对应的一组 OAV 三元组。规则引擎(rules engine)找出条件得到满足的规则并应用它们,往工作记忆里再加一组三元组。
动手试试:挑一个你感兴趣的主题,画一棵你自己的 AND-OR 树!
前向推理与后向推理
上面描述的过程叫前向推理(forward inference)。它从工作记忆里已有的问题初始数据出发,循环执行下面的推理步骤:
- 目标属性已经在工作记忆里:停下,给出结果。
- 找出所有当前条件得到满足的规则,得到规则的冲突集(conflict set)。
- 做冲突消解(conflict resolution),选出这一步要执行的那一条规则。消解策略可以有多种: - 取知识库里第一条能应用的规则 - 随机选一条规则 - 选更具体的规则,也就是"左侧"(LHS)满足条件最多的那条
- 应用选中的规则,把新知识插入问题状态。
- 回到第 1 步,重复。
但有些情况下,我们宁愿从对问题一无所知开始,靠提问一步步走到结论。做医学诊断就是这样:通常不会先把所有化验做完再开始诊断,而是到了要做判断的时候,再去做对应的检查。
这个过程可以用后向推理(backward inference)来建模。它由目标(goal)驱动,就是我们要找的那个属性值:
- 找出所有能给出目标取值的规则(即目标出现在规则"右侧"(RHS)的规则),得到冲突集。
- 如果这个属性没有对应规则,或者某条规则说该向用户问这个值,那就直接问用户;否则:
- 用冲突消解策略选一条规则当作假设,我们试着证明它。
- 对这条规则左侧的每个属性,递归地重复同样的过程,把它们逐个当作目标来证明。
- 任何一步失败,就回到第 3 步换另一条规则。
想一想:什么场景更适合前向推理?什么场景适合后向推理?
实现专家系统
实现专家系统可以用不同的工具:
- 直接用某门高级编程语言编写。这不是最好的主意,因为基于知识的系统的一个主要优势是知识与推理分离:理想状态下,问题领域的专家应该能不碰推理过程的细节就把规则写出来。
- 使用专家系统外壳(expert systems shell):一类专门设计的系统,用某种知识表示语言往里填知识。
练习:动物推理
见 Animals.ipynb,那是一个实现前向与后向推理专家系统的例子。
注意:这个例子相当简单,只让你看到专家系统大概长什么样。真正动手搭建时,规则数得积累到一定量级(200 条往上),你才会开始看到系统有些智能的表现。到了那个阶段,规则复杂到人记不全,你会开始好奇系统为什么做出某个决定。不过基于知识的系统有个重要特性:任何一个决定,你随时可以解释出它是怎样做出的。
本体与语义网
20 世纪末,有人推动用知识表示来标注互联网资源,让按非常具体的查询找到对应资源成为可能。这场运动叫语义网(semantic web),建立在几个概念之上:
- 一种基于描述逻辑(DL)的特殊知识表示。它像框架表示一样,构建带属性的对象层次,但多了形式化的逻辑语义和推理能力。描述逻辑有一整个家族,在表达能力和推理的算法复杂度之间做权衡。
- 分布式知识表示:所有概念都用全局 URI 标识,于是一张知识层次网络可以横跨互联网搭建。
- 一族基于 XML 的知识描述语言:RDF(资源描述框架,Resource Description Framework)、RDFS(RDF Schema)、OWL(本体网页语言,Ontology Web Language)。
语义网的核心概念是本体(ontology):用某种形式化的知识表示,对一个领域做出明确的规格说明。最简单的本体可以只是领域内对象的层次结构;更复杂的本体会包含可用于推理的规则。
语义网里所有的表示都基于三元组。每个对象、每种关系都由一个 URI 唯一标识。比如要陈述"这套 AI 课程由 Dmitry Soshnikov 于 2022 年 1 月 1 日开发完成"这个事实,可以用下面的三元组:
原文此处有一张图,画的就是这组三元组构成的示意。
http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date “Jan 1, 2022”
http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com
这里
http://www.example.com/terms/creation-date和http://purl.org/dc/elements/1.1/creator是两个公认通用、被广泛接受的 URI,分别表示创建日期和创作者这两个概念。
更复杂的情形,比如要定义一个创作者列表,可以用 RDF 里定义的某些数据结构。原文此处有一张对应的三元组结构图(图均由 Dmitry Soshnikov 绘制)。
语义网的建设进展慢了下来,一部分原因是搜索引擎和自然语言处理技术的成功:它们已经能从文本中提取结构化数据。不过在有些领域,维持本体和知识库的投入依然很大。几个值得关注的项目:
- WikiData:与维基百科配套的机器可读知识库集合。大部分数据是从维基百科页面的 InfoBox(页内的结构化内容块)里挖掘出来的。你可以用 SPARQL(语义网的专用查询语言)查询 WikiData。下面这条示例查询统计的是人类中最常见的眼睛颜色:
```sparql
defaultView:BubbleChart
SELECT ?eyeColorLabel (COUNT(?human) AS ?count) WHERE { ?human wdt:P31 wd:Q5. # 这个人属于智人物种 ?human wdt:P1340 ?eyeColor. # 这个人的眼睛颜色是 ?eyeColor SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } } GROUP BY ?eyeColorLabel ```
- DBpedia:另一个跟 WikiData 类似的项目。
如果你想动手建自己的本体,或者打开现成的本体看看,推荐一个很好用的可视化本体编辑器 Protégé。可以下载,也可以在线用。
原文此处有一张截图:网页版 Protégé 编辑器打开了一个罗马诺夫家族的本体(截图由 Dmitry Soshnikov 提供)。
练习:家庭本体
见 FamilyOntology.ipynb,那是一个用语义网技术推理家庭关系的例子。练习会拿一棵用通用 GEDCOM 格式表示的家谱,加上一个家庭关系的本体,为给定的一组人构建出全部家庭关系的图。
微软概念图谱
多数本体是人工精心整理的。不过本体也可以从非结构化数据里挖掘出来,比如自然语言文本。
微软亚洲研究院做过这样的尝试,成果是 Microsoft Concept Graph(微软概念图谱)。
它是一大集合实体,按 is-a 继承关系分组。有了它就能回答"Microsoft 是什么?"这类问题,答案大概是这样:"是一家公司的概率 0.87,是一个品牌的概率 0.75"。
这个图谱有两种用法:调用 REST API,或者下载一个列出所有实体对的大文本文件。
练习:概念图谱
试试 MSConceptGraph.ipynb 这个 notebook,看怎么用微软概念图谱把新闻文章归成几类。
小结
如今人们说起 AI,常把它当作机器学习或神经网络的同义词。但人还会做显式推理,这恰恰是神经网络目前做不到的。在真实项目里,显式推理仍然被用于那些需要解释、或者需要可控地修改系统行为的任务。
挑战
本课配套的 Family Ontology notebook 里留了空间,可以试试其他家庭关系。去家谱里发现人与人之间新的连接吧。
课后测验
回顾与自学
上网查一查,看看人们在哪些领域尝试过把知识量化、条理化。了解一下布鲁姆分类学(Bloom's Taxonomy),再往回看历史,看人类是怎么试图把自己的世界讲清楚的。研究林奈(Linnaeus)给生物建立分类体系的工作,观察德米特里·门捷列夫描述和归类化学元素的方法。你还能找到哪些有意思的例子?