专家系统是早期人工智能研究的重要成果,它解决了知识表示和存储问题,具有数据(知识库或规则库)和算法(通用推理引擎)分离的思想。
在专家系统之前,人们尝试用计算机程序代码直接编写各种智能逻辑。这需要编写代码的人既是计算机专家,又是相关领域的专家,这是很不现实的。专家系统解决了如何把领域知识和计算机推理逻辑分离开来的问题。计算机专家可以专注于构建具有自动推理能力的专家系统引擎,而把抽取领域知识的工作交给更具专业性的领域专家。这也使得专家系统可以迅速地应用于不同的领域,人们只需要根据领域知识构建出若干规则,一个适用于新领域的专家系统就有雏形了。这使得专家系统被迅速推广开来。这种数据和算法分离的思想贯穿于后续的统计学习方法中,算法通常是普遍适用的,与领域无关,领域知识蕴含在数据和模型的参数之中。
在实际应用中,专家系统也面临着各种困难。其中一个主要困难是建立规则库的效率比较低,完全依赖于知识工程师和领域专家人工发现和建立规则。实际的情况是,专家都是在其所擅长的领域里具有重要价值的人,他们的时间非常宝贵。他们通常需要处理很多实际问题,难于抽身出来帮助知识工程师构建计算机软件系统。在专家系统发展的中后期,人们致力于构造更加方便的知识获取工具,辅助专家来设计、调试和验证规则系统。然而,随着规则库越来越大,越来越复杂,人们又发现了更多问题。
规模巨大的规则库,和其他任何规模巨大的系统一样,会面临规模变大带来的全新问题。量变引起质变,大规模系统的首要问题是可扩展性问题。在有上百万条规则的系统中,显然有很多在只有数百条规则的系统中没有遇到过的问题。首当其冲就是推理的性能明显下降,这对当时的计算机性能来说是个严峻的挑战。
而在另一方面,人们发现有些问题甚至无法简单依靠提高计算机的算力来解决。最为显著的就是如何保持规则系统内在的一致性的问题。由于规则是人工建立的,哪怕是专家,也不可避免地在构造规则的时候会出现考虑不周的问题。也许漏掉了一些占比重较小的特例,从而制定了不够严密的规则;也许从不同角度出发来处理同一个问题,造成了规则冗余;甚至不同规则之间有不可调和的差异等。这些问题对于人类来说不可避免,也不会影响我们的思维推理,但是对于死板的计算机来说,就造成了规则系统内在的不一致问题,在某些情况下,可能会导致规则之间产生冲突。
解决这个问题的方法是在加入新规则时验证规则库的一致性。这种验证可以抽象为布尔可满足问题(Boolean Satisfiability Problem,SAT)。布尔可满足问题是指给定一组含有变量的布尔表达式,判断能否找到一组变量的赋值,使得表达式成立。比如,“a且非b”在a为真、b为假的时候可以成立,它就是可满足的;而“a且非a”无论a怎样取值都无法成立,它就是不可满足的。似乎枚举所有变量可能的组合,就可以确定布尔表达式是否可满足,但是组合的数量跟变量的数量是指数关系,如果有n个变量,就会有2n种组合。当变量数量增加时,需要验证的情况数量会呈指数增长。这就如同国王在棋盘格上放入数量依次倍增的米粒的故事,结果会迅速超出我们实际能够接受的计算时间的极限。遗憾的是,这个问题被证明没有更加优化的求解方法。在计算理论中,这被称作NP完全问题,是最难解决的那一类问题。
由于这些困难的存在,人们逐渐转入了基于统计学习方法的智能模型,不再依赖于人工制定的硬性规则,而是试图发现实际数据的统计分布规律。虽然在有些时候,我们仍然要对数据进行标注以便将“知识”注入其中供模型利用,但是,这些标注比起请专家制定规则来说要廉价得多。而且统计方法能够帮助我们自动过滤掉一些不够准确的标注,去信赖那些在统计上更占优势的信息,从而自动调和数据中的矛盾,过滤数据中的噪声。