这两天的专家系统课,让我越听越郁闷。
我在上这门课之前,对人工智能、专家系统这一块是非常向往的。人工智能是早就有印象,而我现在说起专家系统,最早的印象是凌志军写过一本书《中国人在微软》,里面讲的李开复早年在CMU读研究生的经历。说当时李开复的导师和其他一些人工智能领域的权威,一直深信让计算机听懂人话是要用专家系统,像教小孩说话一样来让计算机慢慢学习。结果李开复独排众议,改用了统计的方法,结果把识别率提升到高达98%。这件事我之前也写过,我一直对这个故事有着深刻的印象,因为隐隐觉得如果真能做到这个底部,或许成就还无法达到CMU那帮人的水平,但这种研究已经很有趣了。所以这学期我发现专家系统课和另一门同样是必修的autometa课有冲突时,我毫不犹豫的选择这个学期先修专家系统。
正因为我之前对专家系统没有一个清晰的认识,总是模模糊糊的感觉非常高深的样子。前几节课听起来确实是这样。第一节课后我感到似乎什么也没听懂,只是把老师的笔记一字不落的记了下来。虽然觉得没怎么听懂,但还是感觉很兴奋,因为真正接触到了高深的内容。下了课后,我在咖啡厅里搜索老师的笔记,并在维基百科上找到了老师笔记上的XCON,DEC在1970年代末期时开发的的一套辅助销售人员为客户搭配VAX计算机的硬件的。当时仔细的把文章看了几遍,又顺便把它翻译成了中文。那时只是从介绍里了解了一下XCON的用途,但不知道它是怎么编写的,因此之后的几节课我都是相当兴奋,十分专注的去听的。
到后来我们接触了Jess,然后课程的内容就是讲Jess的语法,以及一些性质。因此我们可以用Jess来完成一些作业。中间穿插的讲了Rule Based Expert System,我当时一直没有意识到,这就是我一直向往的专家系统。用Jess来写Rule Based的程序非常简单,从表面上看来,Jess其实就是“披着LISP外衣的PROLOG”。Rule Based Expert System的核心部分是facts和rules。在Jess中,就是用deffacts来定义一组facts,并用defrule来定义几条rules。所谓的fact,就是一条像(male jack)这样的语句,表明了一个事实。而一条rule,就像是过程语言中的if语句。比如说一条rule的内容是“如果一个人是男人,他又是另外一个人的parent,那么他就是那个人的父亲。在Jess里面就是如下定义的:
(defrule father
(father ?X)
(parent ?X ?Y)
=>
(assert (father ?X ?Y))
)
可以看到,=>前面是这条规则的前提,=>后面是当满足了这个前提后我们要做什么。assert是在系统的rule base中再加一条rule,?X和?Y是变量,没有什么难的。当我们有了facts和rules之后,Jess的inference engine会根据rules和facts的关系,来计算出rules的运行顺序,然后就执行每一条rule,直到没有rule适用为止。这个时候,fact base被这些rules改变,我们要的结果就包含在里面。基本上这就是rule-base专家系统,就是这么简单。
当然,有的时候rule-base不能满足我们的需求,因为用完全清晰的逻辑语言来描述fact并不是那么容易的,因此我们引入了fuzzy logic,给事实加上了一个数值。比如说形容一个人老还是中年,我们没有严格的定义人几岁之后就是老,所以我们定义中年是30~60岁,老年是55~100+岁。两个定义可以有重叠,因为我们很难说55~60岁的人是老还是不老,因此这个概念是被模糊的定义的,我们应用的时候,通过defuzzy函数来把一个模糊的概念(比如说老)转换成一个数值,然后通过数值来计算。
更有一些时候,我们发现无论怎么样总结,都很难把一件处理事情的方法给总结成一条规则,没有规则,rule-based expert system就无法适用。因此我们又引入了case base reasoning的概念,也就是说,把我们能够找到的问题和处理问题的方法,都用fact表示出来,就像是给专家系统了一些例子。当专家系统遇到了类似的问题时,就用类似的处理方法来解决。这种方法不如rule-based expert system获得正确结果的几率高,但因为专家系统的规则不是编在程序里面的,而是可视的,所以当操作人员获得了结果后,判断结果是否正确,如果正确,就把这个问题和解决方案加进例子库里面去,如果错误,也把问题和结果加入到反例库里去。经过这样不断演进,我们的专家系统解决问题的正确率就上去了。
上面的三种分类(rule-based expert system、fuzzy logic、和case base reasoning),就是我们学的在编程方面的专家系统的大多数知识。在这些结束了之后,我们又在重点讲知识的获取,也就是说如何从专家处获得知识,并把知识转换成相应的规则。这些都是knowledge engineer的工作。
学到现在,我算是对专家系统有认识了。所谓专家系统,实际上就是让计算机来模拟专家的行为,这样我们就可以一来踢掉专家,不用付专家钱;二来可以让机器24小时连续运行,这是人类专家无法做到的。具体实现起来,就是要有专家系统外壳以及知识。Jess就是专家系统外壳,它把知识在计算机上的保存基础,以及用于知识推理的inference engine都实现了。有了这个外壳之后,开发专家系统的工作就是从人类专家处获取知识,总结成规则,保存起来,然后外壳来处理这些规则,就成了专家系统。
而我现在感觉专家系统没有什么前途。我说的前途是指,在将来我能不能在这个领域里有学术性的建树,或者我能不能在相应领域的企业中找到有创新性的工作,结果这两条我都觉得是负面的。在大家使用相同的专家系统外壳的情况下,专家系统的好坏就取决于知识手机的准确度、完整度,以及事实排列顺序的效率,而真正有研究性的工作,我觉得还是在于外壳这一部分。而现在的外壳发展到现在这个地步,能改进的可能性就不多了。除了改进Rete算法之外,我想不到在更上一级还能做什么。
从现在来看这一个学期学的专家系统课程,我有点纯粹是浪费时间的感觉。首先这个领域的内容,尤其是我们学到的内容,有点不值得学;其次就算真的要学,我觉得花两三个小时就能讲的差不多了。我现在比较后悔,就是没有早一点看老师给我们的《Jess in Action》一书。书中有一些专家系统的例子,比如说电脑检测系统之类的。看了这些例子之后才打碎了我过去对于专家系统的幻想。
这门课剩下的内容还有两条:一是在下周三做个10到15分钟的seminar,二是一个项目。我现在还不知道要做真么题目,找到题目后还要去找老师讨论一下,顺便也问问专家系统的发展前途的问题。
《再论专家系统》有1条评论