第六篇
专家系统是如何实现的
(三)
清华大学计算机系 马少平
第三节:
一个简单的专家系统
艾博士:下面我们通过一个简单的实例,说明一下专家系统是如何构建和工作的。
我们再来看看本篇开始时我俩之间有关动物识别的一段对话:
艾博士:你看到的动物有羽毛吗?
小明:有羽毛。
艾博士:会飞吗?
小明:(经观察后)不会飞。
艾博士:有长腿吗?
小明:没有。
艾博士:会游泳吗?
小明:(看到该动物在水中)会。
艾博士:颜色是黑白的吗?
小明:是。
艾博士:这个动物是企鹅。
在以上对话中,当小明告诉我动物有羽毛后,依据所掌握的知识,我就知道了该动物是个鸟类,于是我就向小明提问该动物是否会飞,当小明回答说不会飞后,我最先猜到的是这个动物可能是鸵鸟,于是再次问小明该动物是否有长腿,因为如果有长腿的话,很大可能就是鸵鸟了。在得到小明的否定回答后,我马上意识到鸵鸟这个猜测是错的,于是就想到了可能是企鹅。就接着询问小明动物是否会游泳,在得到小明的肯定答复后,我已经感觉到这个动物大概率是企鹅了。为了进一步确认是否是企鹅,又继续问小明动物的颜色是否是黑白的。小明回答是黑白颜色后,我马上就确认了该动物是企鹅。
在我和小明的这个对话过程中,我首先提问是否有羽毛,目的是先区分出是否鸟类。是否有羽毛这个问题既容易观察,又可以比较大规模地缩小猜测范围,因为无论小明回答是否有羽毛,都可以排除掉很多不相关的动物。如果一上来就提问是否是长腿,就很难达到这样的效果。然后再一步步地,根据小明已有的回答,猜测可能是什么动物,再逐一确认或者否定。这个过程就是一个“猜测-提问-回答-再猜测-再回答”的循环过程。
一个动物识别专家系统,我们也希望能像上面的对话一样,系统通过与用户的交互,回答用户有关动物的问题。
小明:如何实现这样的专家系统呢?
艾博士:为了实现这样的专家系统,我们首先要把有关识别动物的知识总结出来,并以计算机可以使用的方式存放在计算机中。这些知识包括我们自己掌握的、书本上学来的以及向动物专家请教来的等。我们可以用规则表示这些知识,为此,我们设计一些表达式,以便方便地表达知识。
小明不解地问到:表达式?这是什么意思呢?
艾博士:为了方便表达规则的前提和结论而设计的一些表达式,一般具有如下三元组的形式:
(<名称> <属性> <值>)
在实际表达规则时,其中的“<>”部分要用具体的内容代替。下面给出几个表达式的例子就容易明白了。
首先是same,表示动物具有某种属性,比如,可以用(same 羽毛 有)表示是否具有羽毛,当动物有羽毛时为真,否则为假。而notsame与same相反,当动物不具有某种属性时为真,比如(notsame 飞翔 会),当动物不会飞翔时为真。
一条规则,一般表达为如下形式:
(rule <规则名>
(if <前提>)
(then <结论>))
其中的<前提>、<结论>均可以用表达式表示。
比如“如果有羽毛则是鸟类”,可以表示为:
(rule r3
(if (same 羽毛 有))
(then (动物 类别 鸟类)))
其中r3是规则名,(same 羽毛 有)是规则的前提,(动物 类别 鸟类)是规则的结论。这里用到的“same”、“动物”等是表达式的名称,“羽毛”、“类别”等是表达式的属性,而“有”、“鸟类”等则是属性的值。
如果前提有多个条件,则可以通过多个表达式的逻辑组合表示。
比如“如果是鸟类且不会飞且会游泳且是黑白色则是企鹅”,可以表示为:
(rule r12
(if (same 类别 鸟类)
(notsame 飞翔 会)
(same 游泳 会)
(same 黑白色 是))
(then (动物 是 企鹅)))
也可以用(or <表达式> <表达式>)表示“或”的关系,比如:
(rule r6
(if (same 类别 哺乳类)
(or (same 蹄 有) (same 反刍 是)))
(then (动物 子类 偶蹄类)))
表示“如果是哺乳类且(有蹄或者反刍)则属于偶蹄子类”。
小明:那么需要多少个表达式呢?
艾博士:需要多少个表达式依据求解的任务确定,包括其中的属性、值等,都是根据需要由专家系统建造者确定,并没有统一的定义。
为了建造一个专家系统,首先要确定知识的表达形式,然后就是收集知识。由于知识收集的复杂性,在开始阶段,可以先收集少量的比较典型的知识,先把专家系统建造出来,然后再逐步完善知识。对于动物识别专家系统,我们可以先总结出如下规则组成知识库,当然这里为了举例,简化了一些知识的表达。
(rule r1
(if (same 毛发 有))
(then (动物 类别 哺乳类)))
(rule r2
(if (same 乳房 有))
(then (动物 类别 哺乳类)))
(rule r3
(if (same 羽毛 有))
(then (动物 类别 鸟类)))
(rule r4
(if (same 飞翔 会)
(same 下蛋 是))
(then (动物 类别 鸟类)))
(rule r5
(if (same 类别 哺乳类)
(or (same 吃肉 是) (same 犬齿 有))
(same 眼睛前视 是)
(same 爪子 有))
(then (动物 子类 食肉类)))
(rule r6
(if (same 类别 哺乳类)
(or (same 蹄子 有) (same 反刍 是)))
(then (动物 子类 偶蹄类)))
(rule r7
(if (same 子类 食肉类)
(same 黄褐色 是)
(same 暗斑点 有))
(then (动物 是 豹)))
(rule r8
(if (same 子类 食肉类)
(same 黄褐色 是)
(same 黑条纹 有))
(then (动物 是 虎)))
(rule r9
(if (same 子类 偶蹄类)
(same 长腿 是)
(same 长颈 是)
(same 黄褐色 是)
(same 暗斑点 有))
(then (动物 是 长颈鹿)))
(rule r10
(if (same 子类 偶蹄类)
(same 白色 是)
(same 黑条纹 有))
(then (动物 是 斑马)))
(rule r11
(if (same 类别 鸟类)
(notsame 飞翔 会)
(same 长腿 是)
(same 长颈 是)
(same 黑白色 是))
(then (动物 是 鸵鸟)))
(rule r12
(if (same 类别 鸟类)
(notsame 飞翔 会)
(same 游泳 会)
(same 黑白色 是))
(then (动物 是 企鹅)))
(rule r13
(if (same 类别 鸟类)
(same 善飞 是))
(then (动物 是 信天翁)))
小明:有了知识库,推理机如何利用这些知识进行推理呢?
艾博士:推理机有多种工作方式,我们假设采用逆向推理进行求解。
在逆向推理中,首先要提出假设,因为我们的目的是识别出一个具体的动物,所以需要先假设是某个动物。由于一开始我们并没有任何信息,系统只能把规则的结论部分含有(动物 是 x)的内容作为假设,按照一定的顺序进行验证。在验证的过程中,如果一个事实是已知的,比如已经在动态数据库中有记录,则直接使用该事实。动态数据库中的事实是在推理的过程中,用户输入的或者是某个规则得出的结论。如果动态数据库中对该事实没有记录,则查看是否是某个规则的结论,如果是某个规则的结论,则检验该规则的前提是否成立,实际上就是把该规则的前提当作子假设进行验证,是一个递归调用的过程。如果不是某个规则的结论,则向用户询问,由用户通过人机交互接口获得。在以上过程中,一旦某个结论得到了验证——由用户输入或者是规则的前提成立推出——就将该结果加入到动态数据库中,直到在动态数据库中得到最终的结果动物是什么结束,或者推导不出任何结果结束。
假定系统首先提出的假设是“(动物 是 鸵鸟)”,图6.4给出了验证该假设的推理过程,下面我们详细说一下这个过程。
图6.4 假定“动物 是 鸵鸟”时的推理过程
规则r11的结论是“(动物 是 鸵鸟)”,为了验证该假设是否成立,需要对规则r11的前提做验证。规则r11为:
(rule r11
(if (same 类别 鸟类)
(notsame 飞翔 会)
(same 长腿 是)
(same 长颈 是)
(same 黑白色 是))
(then (动物 是 鸵鸟)))
首先验证“(same 类别 鸟类)”,即该动物是否为鸟类。动态数据库中还没有相关信息,所以查找结论含有“(动物 类别 鸟类)”的规则,找到规则r3:
(rule r3
(if (same 羽毛 有))
(then (动物 类别 鸟类)))
规则r3的其前提是“(same 羽毛 有)”,即该动物是否有羽毛。该结果在动态数据库中还没有相关信息,也没有哪个规则的结论含有该结果,所以向用户提出询问该动物是否有羽毛,用户回答“有”,得到该动物有羽毛的结论,“(same 羽毛 有)”为真。由于规则r3的前提只有这一个条件,所以由规则r3得出“(动物 类别 鸟类)”,说明该动物属于鸟类,并将“(动物 类别 鸟类)”这个结果加入到动态数据库中。至此规则r11前提的第一条件得到满足,再验证第二个条件“(notsame 飞翔 会)”,也就是是否会飞翔。同样,动态数据库中没有记载,也没有哪个规则可以得到该结论,向用户询问该动物是否会飞翔,得到回答“不会”后,将“(notsame 飞翔 会)”加入到动态数据库中,规则r11的第二个条件被满足,再验证规则r11的第三个条件“(same 长腿 是)”,也就是是否是长腿。这时由于用户回答的是“否”,“(same 长腿 是)”为假,表示该动物不是长腿,“(same 长腿 是)”为假的结果也被放入动态数据库中。由于“(same 长腿 是)”得到了否定回答,不被满足,所以规则r11的前提不被满足,故假设“(动物 是 鸵鸟)”不成立。
由于没有得到结果,系统再次提出新的假设“(动物 是 企鹅)”,得到如图6.5所示的推理过程。我们再看一下对该假设的推理过程。
图6.5 假定“企鹅”时的推理过程
规则r12的结论是“(动物 是 企鹅)”,为了验证该假设是否成立,需要对规则r12的前提做验证。规则r12为:
(rule r12
(if (same 类别 鸟类)
(notsame 飞翔 会)
(same 游泳 会)
(same 黑白色 是))
(then (动物 是 企鹅)))
由于在前面的推理中,动态数据库中已经记录了“(动物 类别 鸟类)”、“(notsame 飞翔 会)”两个条件成立,所以规则r12的前两个条件成立,直接验证第三个条件“(same 游泳 会)”和第四个条件“(same 黑白色 是)”,这两个条件都需要用户回答,在得到肯定的答案后,规则r12的前提条件全部被满足,故系统得出结论:“(动物 是 企鹅)”,也就是这个动物是企鹅。
至此系统推理结束,并得到了动物是企鹅的结论。
小明:艾博士,通过这个简单的动物识别专家系统我了解了专家系统是如何实现的,以及专家系统的推理过程,那么专家系统如何进行解释呢?
艾博士:由于专家系统的结论是通过规则一步步推导出来的,如果在推理过程中记录下其推导过程,则专家系统的解释器就可以根据推理过程对结果进行解释。比如用户可能会问为什么这个动物不是“鸵鸟”?解释器根据规则和推理过程可以回答:根据规则r11,鸵鸟具有长腿,而你回答该动物没有长腿,所以不是鸵鸟。如果问为什么是“企鹅”?解释器可以回答:根据你的回答,该动物有羽毛,根据规则r3可以得出该动物属于鸟类,根据你的回答该动物不会飞、会游泳、黑白色,则根据规则r12,可以得出该动物是个企鹅。还可以在解释的过程中给出规则的具体内容,让用户更容易理解这个解释以及为什么会得到这样的结果。
讲到这里艾博士总结说:以上我们给出了一个简单的专家系统示例,以及它是如何工作的。实际的系统中,为了提高效率,可能要比这复杂得多,如何提高匹配速度以提高系统的工作效率?如何提出假设,以便系统尽快地得出答案?这都是需要解决的问题。还有一点是更重要的,现实的问题和知识往往是不确定的,如何解决非确定性推理问题,将在下一节介绍。
小明读书笔记
以动物识别为例介绍了一个简单的专家系统是如何实现的。
规则的表示格式如下:
(rule <规则名>
(if <前提>)
(then <结论>))
比如“如果是鸟类且不会飞且会游泳且是黑白色则是企鹅”,可以表示为:
(rule r12
(if (same 类别 鸟类)
(notsame 飞翔 会)
(same 游泳 会)
(same 黑白色 是))
(then (动物 是 企鹅)))
该系统使用逆向推理的方法,对提出的假设逐一进行验证,直到得到某个结论,或者假设得不到验证,推不出结论。
未完待续
扫码关注我们
微信号|airadiance
(点击“阅读原文”,查看勘误表、获取PPT)