摘 要: 人工智能是一门新兴学科,经常发现所用教材存在诸多缺憾。人工智能所包含的问题思维方式抽象,思路复杂,学生在学习时普遍存在困难,尤其是在其核心,符号主义和图搜索算法上。为了克服这些困难,便于教和学,以多年的教学经验和思考,汇总了该课程难以把握、容易理解错的关键点和难点,揭示了其实质,并进行了深入的解读和说明,为清晰透彻地理解和掌握开辟了通道。
关键词: 人工智能; 符号主义; 图搜索; 教学
中图分类号:TP301 文献标志码:A 文章编号:1006-8228(2018)10-87-04
Abstract: Artificial intelligence is a comparatively new discipline, it is often found that there are some defects in textbooks used. Artificial intelligence is very abstract and complicated that most students will feel difficult in studying, especially in its core parts the symbolism and graph search algorithm. In order to overcome these difficulties and facilitate teaching and learning, with the years of teaching experience and thinking, this paper summarizes the key points and difficult points that are difficult to grasp or easy to misunderstand, reveal their essence, and deeply explains them, so as to develop a clear road for students to understand and grasp them.
Key words: artificial intelligence; symbolism; graph search; teaching
0 引言
當代IT业经历了两次大的浪潮,这两次浪潮都极大地影响和改变了人类的生产和生活。第一次是微软操作系统的出现及由此所导致的个人计算机的普及;第二次是互联网的兴起及其蓬勃发展所带来的生产规模和对人类工作生活的影响。可以预料,即将到来的下一次浪潮其影响力将更加空前,这就是人工智能的发展及其无边的前景。
人工智能的学习和教学,显得尤为重要。
由于该课程为新兴学科,其教材或是直接翻译外文[1],或由编者编辑整理而成[2],往往存在错愕之处,而且表达方式也不太符合中国学生的学习习惯,不利于中国学生理解和掌握。
本文以张仰森、黄改娟所著“人工智能教程”[3]为例来说明人工智能这门课的教学。本科生教学主要内容是这本书的前六章,也就是其原理篇。笔者认为,这六章的内容,有两章是核心,即第三章符号主义和第五章搜索算法。
按该书的观点,人工智能发展至今,有三大主要流派:符号主义、联结主义和行为主义。其中最主要的是符号主义,人工智能的大部分研究成果都集中在符号主义领域。人工智能的发展依赖于两大方面,一是思维方式的不断改进和更新,二是搜索算法。搜索算法与人工智能可以说是如影随形。
人工智能这门课有难度,如符号主义和Herbrand定理,有相当的难度。一整套符号主义的方法相当于一个算法,这是一个比较大的算法,难度大而复杂。就其原理、定理方法而论,符号主义的思维方式高度抽象,显然有别于其他课程,其思路复杂,学生普遍感觉难以掌握。
一个复杂的算法之所以难学,关键是它包含有一长串复杂的思路。要掌握一个复杂算法,需要具备沿着一长串思维脉络深入下去的思维能力[4]。这一长串思维彼此关联,必须将它们同时印在脑海里并关联起来。并且这一长串思路往往还包含一些关键步骤和关键点,理解难度大。问题是仅仅孤立地理解这些关键步骤和关键点还远远不够,还必须将其与其他许多地方关联起来,综合理解。一般说来,复杂算法的原创者需要具备强大的想象力和掌控深入的复杂思路的能力,而学习者至少必须具备后者。
为了教好和让学生学好该门课,笔者总结多年的教学经验。
要让学生的思维动起来、活跃起来,让学生自己进入思路,在课堂教学中安排提问和讨论,针对关键点/要点向学生提问,并给机会让学生提问,这种提问讨论环节能活跃课堂气氛,有助于学生真正学进去。
对于复杂的算法问题,教师进行思维引导很重要,通过提出问题,讲解概念、原理和步骤,引导学生进入思考,然后通过提问讨论环节,让学生自己弄清算法思路,达到能真正透彻掌握之目的。
思维方式和思维能力这两点推动着计算机科学不断向前发展[5],人工智能作为一个新兴的专业领域,恰恰站在思维方式不断变革更新的前沿。同时人工智能的深入研究,都伴随着复杂的算法能力也就是思维能力。正是因为这一点,人工智能这门课学习难度大,有别于其他课程。本文试图针对其学科特点,剖析高效有力的人工智能教学方法。
本文对符号主义的一些关键点/难点和容易理解错的地方进行深入剖析,以简明的方式揭示其实质,为学生高效正确地掌握该门知识提供引导。
1 深入解析符号主义的本质和学习过程
符号主义有五大步骤:第一大步,写谓词;第二大步,将谓词化为标准范式和子句集;第三大步,置换合一;第四大步,匹配规则和推理算法;第五大步,那就是透彻理解其完备性,主要是理解和掌握Herbrand定理。
学习符号主义有两个层面:一是掌握其方法,能正确任用,也就是知道怎么做;二是透彻理解其原理定理,即理解为什么这样做。就学生而论,第一个层面是最基本要求,必须达到。
其中前四步属于第一层面,而第五大步是第二层面,也是难度最大的一步。即使第五大步没有达到,只要很好地掌握了前四大步,就能运用好符号主义。
第一大步,写谓词应该是比较容易的,但初学者亦感到困难。对此笔者总结出三条经验:一是清晰区分蕴含语句和与语句。关于量词表达的书写,属普通知识,一般无大问题。但要注意全称量词与存在量词的不同对待,不要模糊概念。如,男人都喜歡足球,谓词是:?x man(x)->like(x,football)。又如,有的男人喜欢足球,谓词是:?x man(x)like(x,football)。
一般说来,对“只要……就”、“所有的如何如何”这样的语句,就用蕴含;而对于“存在什么什么”、“有部分如何如何”这样的句型,就用与语句。有同学提出,从语义的角度,既然对全称用蕴含,存在时也可用蕴含。这样说确实有道理,但这个语义是模糊的。在谓词推理中,A蕴含B有确切清晰的逻辑含义,那就是非A或B。若是用这个含义来考察,存在时用蕴含导致的是逻辑混乱。
然后是大胆设计谓词,初学者往往觉得困难就是因为不敢大胆设计谓词。谓词不过是判定是和否的布尔函数而已,若问题需要,就大胆设谓词及其参数,完全无必要有畏难情绪,就像C语言编程中若需要就设一个新的变量一样。接着针对各种不同句型多练习,这个确实没有什么深奥之处,多练习,自然就会。
笔者举两个具有趣味性和启发性的例子,以此来说明著名的数学难题都可用符号主义来解决。
例1,哥德巴赫猜想:?x E(x)->?y?z D(x,y,z)S(y)S(z),任何一个大于2的偶数都可以表示为两个素数之和。
例2,费马大定理:~?x?y?z?u D(f(x,u),f(y,u),f(z,u))I(x)I(y)I(z)GE(u)。
第二大步,化标准范式及子句集[3]。这一大步没有包含难点和深奥的因素,多练习就能掌握。笔者总是强调两点。第一点是各步骤的顺序非常重要,绝不能将顺序搞错,比如,第1步必须是去蕴含符,第2步是内移否定符。若是反过来先内移否定符,再去蕴含符,就会导致大错。第3步是去存在量词,同样,这一步只有在前两步完成后才能做。第二点是强调第3步改变量名非常重要。每一个量词必须有自己惟一的变量名,其作用范围的所有变量都必须用这个同样的名字。同时不同子句之间的变量名不能重复。这一点非常重要,因为以后的置换合一,变量名的异同具有决定性影响。必须在这一步完成变量的改名,以后的置换合一和推理中不允许再改名,否则可能导致混淆和错误。教材中这一点没有讲清楚,可能导致混乱。
第三大步,置换合一。这个有难度,学生普遍反映较难。笔者使用过多个不同教材,对此都没能透彻讲解清楚。一些地方容易产生歧义,导致误读。其实置换合一,关键是必须透彻理解:两个同名谓词合一,本质上是找它们参数也就是自变量定义域或者个体域的公共部分。能从逻辑上透彻理解这个,置换合一问题也就好解决了。讲这个问题时,笔者总是提这个问题:最一般合一置换与普通的合一置换,哪个公共部分大?不少学生回答不上。答案是最一般合一置换公共部分大。最一般合一置换就是找两者的最大公共部分。从公式θ=σ*λ可知,普通合一置换在经过了最一般合一置换之后,还要经过λ再置换一次,而每次置换,公共部分只可能减少(或不变)。
求最一般合一置换的算法见[3]:
其中第5步是关键步骤,关键点有两个:一是对不一致集的两个项xk、tk,至少有一个必须是变量;二是这句话非常关键:xk不在tk中出现。因为只有满足这两个条件,才能保证它们的个体域有公共部分。下面举两个例子来说明:谓词P(x,y)与P(y,x),如何合一?若是认为两者的变元x, y均是不受约束的,它们合一的结果就应该是P(x,y)。按教材中例题的做法,先将p(y,x)改名为p(u,v),然后再合一,结果为p(x,y)。若这两个谓词分属于不同的子句,那当然可以先改名再合一,问题是置换合一既可以在不同子句之间进行,也可能在同一子句之中进行。若是后者,改名就会出错。故统一规定:在化标准子句时改名,在置换合一阶段不允许再改名。从而,p(x,y)和p(y,x)合一,结果是p(x,x),因为我们假定,改名的工作以前都做过了,此时两者的x, y是互相约束的(不能排除此情况发生的可能),故正确的合一结果是P(x,x)。
我们再来看另一个合一的例子:P(x,f(x))与P(y,y)。
第1步,找出不一致集(x,y)。由x置换y我们得到:P(x,f(x)), P(x,x)。
第2步,不一致集为:(f(x),x)。许多同学在此容易出错,他们用f(x)取代x,最后得到的合一结果是P(f(x),f(x))。教科书上求最一般合一的算法,不一致集tk,xk,其中前者是项,后者是变元。用项tk置换xk,前提是xk不在tk中出现。请注意教科书上并没有解释为什么xk不在tk中出现,若出现了又该如何处理。这里是,若出现了,就不能合一,算法终止。所以这两个谓词是不能合一的。
如前所述,合一的实质是:找出两个谓词相应参量的公共部分,若无公共部分,就不能合一。而最一般合一的实质是,找出两个谓词相应参量的最大公共部分,类似于最大公约数。
项有三类:变元x,函数f(x),常量a。只有变元x才可能与其他项有肯定的公共部分,因为变元的取值范围是全体个体域,函数则取其中的部分值,而常量只取其某个特定值。故常量与变元有公共部分,那就是常量本身。函数f(y)与变元x也有公共部分,就是f(y)。而函数f(x)与变元x是没有公共部分的,从而不能合一。当然,f(x)与常量a也没有公共部分。
讲解完这个算法之后,给学生时间,让他们自己读通算法,并解答他们的疑问。最后问学生一个问题,若能清楚回答,基本已掌握好。笔者的问题是:第5步在什么条件下转到步骤6?为什么?答案是在两种情况下:一种是:不一致集中没有变元,没有变元,从而也就没有公共部分。第二种是:不一致集为f(x)和x,尽管有变元,但x在f(x)中出现,同样不能合一。
第四大步,冲突处理和算法设计。这不是教材的重点,关于冲突处理也就是推理的优先级排序,教科书上给出了若干条匹配策略[3]。这些策略只具有启发性意义,而不具备系统的实质性价值。正是在这个优先级别的确定上,产生了符号主义最难以逾越的瓶颈。若是能高效解决这个问题,则符号主义能快速推理出任何高难度的问题。故匹配策略的教学意义在于:告诉学生这些策略并非系统性知识,不具备决定意义,学生要在领会的基础上灵活任用,并能根据工作实际加以发挥。这里必须理解的概念是,归结策略具有完备性。
笔者主要给学生讲清楚这几点:①符号主义的推理方法是完备的,只要谓词写正确,前提条件表达充分,就必能推出正确的结果;②该问题属NP难问题,在最坏情况下,推理算法所需时间呈指数型递增,迄今没有普适的好算法使之高效。这也是符号主义的瓶颈;③随着量子计算机也就是并行计算机的问世,符号主义的前景极其广阔。
下面谈第五大步,也是难度最大最深奥的一步,如何理解Herbrand定理。
第五大步,必须将一个解释和不可满足这两个概念非常清晰地印在脑海里。这一点非常重要。然后必须清晰透彻理解H域、原子集、基例,以及H域上的一个解释。这几个概念尽管不能说多复杂,但初学者依然容易模糊。笔者讲完这些概念之后,总是提一个问题:假设原子集里面的成员个数为n,那么在H域上共有多少个不同的解释?若能回答是2n,表明已经完全理解了H域上的一个解释。
然后就是理解定理了。
必须说明的是,教材中的证明[3]是有问题的,从而也是不成立的。这个证明涉及到的思路相当复杂深邃,而绝不是那么简单。若学生自己能发现证明中的这些问题,那就意味着已经深入理解了,且算法功力强大。多年还没有遇到这样的学生。作为老师,笔者总是给学生点拨如下要点:
逻辑上,证明必须全面关联考虑谓词的结构形式、基例、H域、原子集这些概念的严格定义,才可能得证。教材中的证明基本没有做这样的考虑。
定理3.4仅证明了它所说的必要性,而它的充分性证明等于什么也没有说。必须理解H域是一个特殊的域,而并非普通个体域集的一个子集。很明显,即使将H域去掉一部分,必要性也成立,而按照教材的证明逻辑,充分性是当然成立的。这就意味着H域去掉一部分也行,这当然是荒谬的。
定理3.5的充分性证明只谈一个解释是概念错误,而必要性谈到至少有一个基例为假同样也是概念错误。多个基例不能同时为真与至少有一个基例为假是不同的。并且,既然你说至少有一个基例为假,后面又加一句证明不可满足的基例集有限,不是自我矛盾吗?因为这个证明完全没必要。
总而言之,要理解和证明Herbrand定理,必须清晰严格理解前述各个概念,这些概念的内涵外延,并将它们与证明思路严格关联起来。具体证明可查阅有关资料,此处不赘述。
此外,笔者在讲解符号主义这一章时,总是举个小例子来引导学生自己进入到推理逻辑中去。举例:已知f(x),求证f(a)。很明显,此时将结论取反,然后与f(x)归结,得到空子句nil,得证。问题是:已知f(a),求证f(x)。此时将结论取反得到~f(x),然后与f(a)归结,同样得到空子句nil,得证。很明显,结论是错的。那么,证明过程问题出在哪里?刚开始学生往往回答不上。因为f(x)实际上是?xf(x),取反后为?x~f(x),用常量置换得~f(b),请注意此时的常量名必须是新的,不能与已有的a相同。经解释理解后,就是收获。
2 搜索算法教学要点
搜索算法这一章含多个算法,其中最基本最关键的是“状态空间图的一般搜索算法”。其他算法均是以此算法为基础,只有完全掌握好这个算法,这一章的其他算法也就迎刃而解了。应该说,该算法是一个小算法,有一定难度,但难度不太大。笔者教学人工智能这一算法时,学生都是大三年级,已经在算法课程里学过这一算法,对其有了大致初步的掌握。但若对他们提深一些的问题,往往回答不上来。真正透彻理解该算法的标志是:能将算法的正确性证明出来。或者退一步,能清晰地读懂算法的证明。该算法详见文献[3]第五章。
此算法的关键步骤是第⑹⑺步,其中三类不同的节点是关键点,必须通过举例讲透彻。第⑹步中“生成不是自己祖先的子节点”也非常重要,必须理解透彻。
笔者讲解完了各步之后,给学生以时间,要求学生自己看懂,将它们串起来形成一个整体思路。然后请学生提问,就还有什么疑难点或在哪里思路走不通提问,并予以解答。最后对学生提问:既然你们没问题了,也就是认为自己已经掌握了,那现在我对你们提问:①第⑹步为何要强调“不是n的祖先”,n的祖先以后是否还有可能成为它的后继节点;②第⑹步,closed 表中的节点是否还有可能再回到open表中,若可能,会否产生死循环?若能清楚回答这几个问题,就基本透彻理解了该算法。最后,若是能不依赖书中定理,独立完整证明单调启发策略是可采纳的,就意味着具有彻底掌握该搜索算法的功力,达到这一步的学生极少见。
3 结束语
人工智能课程抽象深奥,教学难度大,通常灌输式的讲课方式难以满足要求。本文提出了一种提问-互动-讨论模式的教学法。其核心是:给学生时间,让学生自己进入思考和形成思路;让学生提问,解答学生在形成思路时遇到的障碍;针对关键点/要点向学生提问,学生若能清晰作答,则意味着已经掌握了。逻辑和经验表明,对于难度大的概念原理算法,这是使学生能真正掌握的有效途径。运用本文所论述的方法能显著提高教与学的效率。
参考文献(References):
[1] (美)Nils J. Nilsson,郑扣根,庄越挺译.人工智能[M].机械工业出版社,2003.
[2] 高济,朱淼良,何钦铭.人工智能基础[M].高等教育出版社,2002.
[3] 张仰森,黄改娟.人工智能教程[M].高等教育出版社,20116.
[4] Sara Baase etc. Computer Algorithms: Introduction to Design and Analysis[M]. New York: Addison Wesley Publishing Company,2000.
[5] 杜立智.論如何考核和提高大学教师的授课水平[J].计算机时代,2012.6.