CSDN博客

img sandrowjw

计算机程序的“行为学”(二)——行为的因素和比较

发表于2008/9/27 23:37:00  1713人阅读

再次强调一下:

1、这篇文章不是讨论软件工程学的,也不是传统算法,而是人工智能的一个分支。

2、这篇文章的倾向性非常严重,但是我不想招十字军,我只是想整理一下自己的思路,以作为后面的实验的基础。

3、这篇文章的一些观点和传统算法是背道而驰的,如果你没法接受,就请忽略这篇文章吧。

最后要说的是:请大家有选择地接受文章中的观点。谢谢!


正文开始:


行为分析通常来说是介于哲学和心理学之间的范畴,正如优秀的侦探可以通过排查各种因素来了解罪犯的行为特征及其背后的动机,这里要素分析是很有效的方法。构成行为的要素很多,如直接诱因(或者动机)、环境、背后的思维模式、行为的直接后果及其对个体带来的影响,等等……接下来我们会就一些关键因素做逐一探索,以理解计算机程序和人类行为的异同。

行为的时效性和进化

我要提的第一个因素是行为的时效性,我们很快就会看到为什么要先讨论这点。通常来说,人类的行为可以分为长期行为和短期行为,举个例子:一个小孩用石头砸了邻居的窗,然后当然被他老爹揍了,于是这淘气鬼第一时间很“争气”地哭鼻子了,并且私下里扬言要把邻居的窗全砸了,但是其实很可能第二天他就会记住吃过的苦头,并且不会再犯了。可以认为短期行为通常源于所谓“第一反应”或者感性认识,而长期行为则源于理性思考。

如果我们更深入地探索人类大脑的工作方式,则我们可以把它比喻为一系列相连或重叠的复杂回路,信息以生物电的形式在回路中持续流动但是不会产生所谓“指令”,即个体行为的激发因素;实际上“指令”产生的一个必要条件是某个局部回路达到峰值,并且通常是神经元之间达到一种“共振”状态(有一本书详细地讨论了这一工作过程,但是我忘记名字了,直到的同学可以补充一下)。如果排除脊椎反应(即所谓“条件反射”)的作用,则短期行为和长期行为可以看成不同时期在不同范围的回路中产生的峰值。当然这个说法并不完整,也不科学:首先大脑发布的“指令”显然是低级指令,如肌肉反应,激素分泌等,并不能完全解释高等思维的过程;其次大脑皮层的特殊抑制功能起着一种微妙的调节作用,实际上大部分的回路峰值会被主动忽略(冲动是魔鬼……),并且一些反应之间也存在互相抑制的情况——我们以后还会谈论到这种抑制,针对不同的主体。

现在我们来看计算机程序:实际的情况是,大量的计算机程序并没有被设计拥有可预测的长期行为。注意这里的“可预测”,我们很快就会谈到它,“可预测”和“可计算”有关系但不完全一样,我们接下来还会花大量篇幅讨论它们;我们已经知道可计算性是一个从计算机传奇时代(就是那个纂刻着冯*诺伊曼,阿兰*图灵等名字的时代)就开始讨论的问题,也是传统算法的基础。

看到这里,也许你会问:“垃圾收集”和“记日志”是长期行为吗?答案是:“垃圾收集”是,而“记日志”不是。要正确回答这个问题,我们需要再次观察长期行为的特征,它是通过进行更大范围的和时效性更长的信息的分析来得到更加“理性”的结果(至少在个体看来是更加理性的)。由此可见,虽然两者都是一个健壮的计算机程序可能会长期执行的操作,但是“垃圾收集”符合这个特征,而“记日志”不符合。

让我们来看前一节的例子,有趣的是,孩子们的每次推理所涉及的有效信息量都在增加——所谓有效信息即可以参与推理或计算的信息,玩过侦探游戏的人都知道,有一些原始信息在推理的初步是看起来没有任何作用的。在知识表达中有一种经典的Kripke图说明了这种知识的传递过程和每个个体所拥有的有效信息量的增加,有兴趣地可以去看看《Reasoning About Knowledge》,但是这些东西暂时还不是我们的主题,并且我不想让这篇文章的篇幅过于恐怖。实际上这个例子很好地揭示了长期行为向短期行为的转变过程,但是,我们的计算机程序差了一口气——它只能按部就班地跑完整个推理过程,即使我们重复这个过程一千遍;而一个看过《Reasoning About Knowledge》的学生却会马上告诉你:嘿,我看到过这道题目,所有孩子头上都有泥巴!

上面这个例子的另一个有趣的地方是,它企图模仿大脑对局部回路的连续峰值中的每一个都发出指令的情况(为了简单起见,请允许我使用这些不确切的表达方式)。实际上,我们在这个问题里假设每个孩子都思考得一样快,也就是说他们达到每一个峰值的时间都是一样的。如果一个孩子过于聪明或者过于愚钝,结果就会完全不同了(同样kripke图能很好地揭示出现这种“异状”的时候情况会如何发展)。而这些峰值所引发的行为指令的差异正很好地反映了行为的时效性这一因素。我们可以换一种方法来描述行为的时效性:相同的输入信息在分析过程中会持续存在并且通过和其他因素以及分析的早期结果互相作用,从而在不同时间点上呈现出不同的分析结果,并激发相应的指令。

通常来说,长期行为可以通过“训练”的过程而成为短期行为(或者和已有的短期行为融合),这是长期行为成为短期行为的最“正常”的方法;同时,新的长期行为又会开始孕育,以帮助个体适应变化的环境。这就是所谓的行为进化,我们在下面讨论环境的时候还会详细谈到,在这里只提一点,即所谓“隐性行为特征”(注:绝对不是专业用语)。

所谓“隐性行为特征”,可以看成是被主动抑制的行为,这种主动抑制的原因很多(有些甚至尚不明确),但结果都差不多,即你没有按照自己认为正确或较好的方式去做。这些被抑制的行为有时候会以一种特殊的方式进化为短期行为。举个有趣的例子:你喜欢喝可口可乐,每次喝完可乐你就觉得很爽,但是过了一会儿你也会因为打嗝呕出的气体而觉得恶心。于是有好几次你都想要改喝啤酒,你甚至在超市里拿了一些回家;但是很可惜,每次你都下意识地去拿可乐,因此一肚子二氧化碳的你至今没有碰过那些啤酒。但是在一次同学聚会上,你们迅速地消耗完了冰箱里所有的可乐,于是某人被指派去两公里外的超市买新的,而你们则坐在沙发上干等;此时你想起了那几瓶啤酒,因此你们一起来深的,这种感觉自然前所未有(声明一下:这个少儿不宜,其实黄酒更好喝),而可怜的买可乐的同志刚刚回来就又被你们指派去买啤酒了……

显然一些看似错误的,或者非正常的因素造就了一群啤酒可乐爱好者,这是一种过于快速的进化过程,通常远快于普通的“训练”;但另一方面来说,这类过程产生的短期行为并不是很“牢靠”的,它很可能因为理性的思考或者试图重复这个过程遭到的失败而被放弃。有趣的是,我们会发现,这种“隐性”行为背后的某种长期的思维方式或者“癖好”,例如对刺激性饮料的热衷,往往是决定性的因素。

显而易见,对于现有的大部分计算机程序来说进化过程是完全不存在的,甚至“隐性行为特征”这个概念也完全不适用。然而如果我们把程序员和程序看成一个有机系统的话,则事情变得有些不一样了,程序员通过它的程序来呈现短期行为(或者某些可以预知的长期行为),而他自己则负责对长期行为的思考,并且最重要的,只有程序员的努力才能实现程序行为的进化。

另外一种情况,可以使得计算机程序拥有改变自己行为能力的,是所谓的“机器学习”(当然在我们的反对派看来这种认识是荒谬的)。关于机器学习我们后面会有一个章节专门讨论,并且涉及监督学习与非监督学习,以及各种已知的机器学习方法,现在就让我们留一点悬念吧。

到此,我们花了比较多的篇幅来讨论了第一个因素,即行为的时效性和进化。当然这是绝对值得的,因为这几乎是人类行为和计算机程序行为的最大区别了。接下来的讨论也大部分基于上述的结论。

环境因素和行为的可预测性

我要讨论的第二个因素是环境。所谓“环境”的定义其实非常广泛,其实这个词完全被教育界用滥了。在这里我使用两种定义方式,原因我们很快会看到。首先是一种所谓“自明”的定义,其论述是:能够使得主体本来的行为产生“应激性”转变的外在因素。这里有几点值得讨论的:

1.         主体本来的行为会发生改变,这包括短期行为的改变或者长期行为的改变:某些因素可能混杂在环境里,但是其实并不起任何作用;主题甚至会主动忽视一些因素,诸如此类都不能称为环境。

2.         这种行为的改变必须是“应激”的。这里有一点就是必须和行为的诱因或动机分开:环境的影响不是根本性的,而是在行为的完成过程中外加的刺激。这种刺激可能造成某些行为过程不得不变更或终止(短期行为变化),也可能仅仅是提供主体更多信息以进行进一步分析(长期行为变化)。

我们可以看到这种分析是基于对行为本身有利(或者有效)的原则的,具体来说就是我在使用行为的定义来定义环境,然后又用环境的定义去补充不完整的行为定义。然而这种“旧方法”的确可以很好地解释环境对行为的作用。

在论述第二种定义之前,让我们先引进一个概念:即所谓“状态空间”。对于熟悉状态机理论,或者谓词推演的读者来说这个概念并不陌生。状态空间可以看成行为作用的一系列因素的综合,但是通常在哲学范畴里我们又会区分内因和外因,这些区分方法并不矛盾,只是着眼点不同罢了。关于状态空间,由于我们很快还会详细讨论,所以现在请允许我卖个关子。

好,接下来我们尝试将行为看成是主体状态的转换,这个转换受到一些环境因素的约束(在谓词推演中同样有约束/绑定这个概念),又会对环境产生一些副作用(改变一些环境状态),而环境本身在行为过程中也不是一成不变的。因此我们会有输入(一系列约束条件、规则和初始状态)和输出(终止状态和新的规则);考虑长期行为的话则主体内在参与计算的一些状态变量也要列入状态空间的维度,并且我们会有不止一个输出。注意这里我仍然在打比方,我们以后还会详细讨论并且精确定义这种状态转换。

所以现在我们发觉状态空间里至少有如下一些东西:作为输入的那部分(外部)状态,不作为输入的那部分(外部)状态,主体内在的状态,等。再回顾第一个定义中环境和行为的关系,就可以得到第二个定义了:所谓环境是不作为行为过程输入,但仍然对行为过程有效,并且可能受到行为过程影响的状态子集(空间)。我知道这个看上去很像数学定义的东西也许会让人害怕,但是恰恰是这个描述揭示了计算机程序和人类行为在面对环境影响时的最大区别。现在抛开枯燥的论述,让我们看看之前的泥孩子例子吧。

显然我们假想的泥孩子问题是一种近乎完美的情况,即所有孩子的思考速度一样快,并且他们都同样聪明。让我们保持这个假设(虽然不是很合理),但是考虑几种可能:假设在孩子们思考的时候,一个熟人从路边走过,然后说了一句“xx你的额头上有泥巴。”(xx是其中一个孩子);或者,假设一个孩子身上正好带着一面镜子;再或者,在孩子们思考的时候,突然下雨了;诸如此类,我们可以举出很多……首先考量前两种情况,可以发现有些孩子的对整个问题的认识发生了突然的增长,于是他们的行为也提前了其他孩子,这种所谓的“知识蔓延”产生的连锁反应会改变整个故事的结局;第三种情况比较特殊,因为孩子们会突然发觉自己之前用于判断的状态空间被改变了,因此进一步的判断被强行中止了,这样我们可以想象两种情况:孩子们放弃判断四散躲雨去了;孩子们开始互相讨论(请注意之前的游戏中得到结果之前孩子们都不会说话),由于整体来说知识仍然是完整的(参见《Reasoning About Knowledge》),所以讨论仍然可以得到一样的结果。

考虑前面两种情况中孩子们的反应,由于某些孩子已经(以非正常的方式)得到了他们需要的结果,因此他们可以将这个结果直接共享给其他孩子,从而帮助其他孩子更快得到结果。然而如果这里工作的是计算机程序,则结果可能就不一样了;实际上依赖于计算机程序设计的完善性,它可能或者不能正确应对这种改变。这里曾经万能的计算机面对一种窘境,我们在下文很快还会遇到,即其往往无法正确应对类似的突发状态(空间)变化,而且甚至根本就不“知道”这种突发状态的存在。

第三种情况则更有趣,如果计算机程序一直都按照一开始的输入状态进行计算,则计算结果仍然会是正确的(注意这里计算机不存在交流上的问题);但是如果计算机程序每次“思考”都要判断当前状态的话,则其推理的结果又变得不可预测了。关于可预测性,我们接下来会讨论,但是可以确认的一点是计算机程序对于环境变化完全缺乏“免疫”能力,其行为会受到严重的“误导”。实际上有时候人的行为也会受到误导,这种误导往往在主体忽视某些状态变量的情况下发生,或者我们可以成为信息不全。如果在第三种情况中孩子们完全无视下雨的状况,而只是根据别人的额头突然莫名其妙地变得干净了来继续判断,则他们也会陷入迷惑中。

我们在以后的文章中还会针对这个问题作更深入的分析,而现在我们来看一个很有趣的概念:即所谓的“熵”。这里的熵基本上就是信息论中的熵(学过通信原理的读者应该很了解IH的概念,以及香农定理吧),代表了信息系统的不确定性;这个概念最早的出处是热力学定律,用来表征物质/能量的无序度,无序度越高则熵值越高,反之亦然。在信息论中熵用来度量系统中的有效信息,当系统处于高度不确定的状态中时,观察系统的个体了解的信息越少,相应的熵值就越高。值得注意的是,推理过程本身不会改变系统的熵值,但是系统中发生的某些变化或者外界对系统的影响都会增加或者减少系统的熵值。我们之前讨论的环境变化既是一个例子,行为主体作为系统观察者注意到了这种变化,如果他对系统的情况足够了解,则可以明白这种变化如何影响系统熵值,从而利用起这种影响(如果熵减)或者克服它(如果熵增)。在某些情况下,当个体无法理解或者无法感知系统变化及其对熵值的影响时,他们就会被误导了,并因而呈现奇怪的难以预测的行为。

关于信息论和熵我们以后会做更详细的讨论,这里我们只是希望从不同的角度去审视环境变化的作用和意义。

关于行为的可预测性(或可计算性),前文已经提到了,这是另一个重要的因素。我们都知道,可计算性是计算机程序的一个重要的特性,这个从“传奇时代”就被讨论烂了的特性,因为图灵机的提出而看上去板上钉钉了。相比计算机的“可靠”来说,人类行为和人类历史一样充满了偶然性和无数的错误,借鉴计算机的力量,人类现在可以涉足一些高精密的领域了,关于宇宙和量子力学的理论从假想走向实证也多拜计算机所赐。但是,计算机程序做得真的比人类更好吗?答案是:错。计算机在大部分情况下的确比人类可靠的多也精确的多,但是就整体来说,计算机做得远比人类差,在某些情况下计算机甚至被明确定义为不可预测的。

实际上我们应该很清楚,对计算机程序来说,所谓可预测性或者完备性都是在限定状态空间的先决条件下才能够成立的。且不论“永恒”存在于大部分计算机程序中的bug,即使我们能够保证某个算法能够处理所有可能的输入,但是如果执行算法的解释器出错了呢?如果算法请求资源的操作系统出错了呢?如果算法运行的硬件出错了呢?如果地球毁灭了呢……计算机程序运行的环境其实并不比人类的生存环境更单纯,但是计算机程序大部分情况下无法应付环境中的突变,由此而衍生的大量技术名次就是一个证明,诸如:集簇,热备,数据同步,闪回,高可用性,灾难恢复……人类有时候也需要依靠外界干预来应对突发状况,正如我们不可能完全靠自己在金融风暴里拯救所买的股票,但是人类的应变能力,正如上文讨论的,是人类和计算机以及其他任何生物都不同的生存秘籍。

关于可预测性的另外一个值得讨论的地方是,我曾经见过很多文章提到过人类的符号思维和计算机的二进制逻辑思维(或者其他类似的称法)是造成两者行为模式的区别的最大原因。这里涉及到行为的另外一个因素即思维模式,但是我还不想这么快讨论这一点。但是有两点是需要澄清的:首先如果把这句话里结尾,由于计算机的思维是二进制的,因此其行为应该是可预测的,这是大错特错的,这至少忽略了计算机程序的运行环境并非二进制的,或者只能说是近似二进制的(实际上大部分情况下是因为计算机的时钟周期够块而我们可以忽略可能的误差),如果我们把环境影响放大的话就可以发现所谓的二进制思维是值得商榷的。如果读者了解一点蝴蝶效应的话就应该很清楚这种影响会被如何放大了,因此如果不是我们的IC设计师们在硬件架构上下了如此多的功夫,我们今天根本连在这里讨论的机会都没有。第二点和我们之前提到的状态空间有关,既大部分计算机程序从来就不能决定自己的状态空间,所有的状态空间都是人定义的,因此计算机的二进制逻辑思维只不过是人类的符号思维的一个子集。我不知道很多读到过这句话的人是不是理解什么是“符号思维”,这是一个很抽象的概念,我怀疑只有提出这个概念的人知道它是什么意思,就像我上面很多打引号的概念一样,实际上讨论这类概念很容易落到一个经典的哲学陷阱里去而不得不采用苏格拉底的诡辩技巧。

进一步说,二进制语言真的是计算机的语言吗?我们又如何知道计算机应该有怎样的语言呢?

行为可预测性中很令人头疼的另外一个问题是欺骗。人们一般所谓的欺骗有两种情况,一种是故意制造出不可能出现(或者出现概率很低)的情形来迷惑对方,另一种是利用对方对形势发展的认识不足故意制造出对对方有利(然而发展下去会对己方有利)的情形来迷惑对方。实际上两种情况都是利用了被欺骗者对形势认识的不足,但是第一种方法更难,也更加有效,因为被欺骗者根本无法通过普通的推理得到满意的结果,除非他们获得更多的信息。要做到第一种通常要引入额外的环境变量或考虑额外的状态输入,正如三国演义中的曹操利用冰造城一样,而诸葛亮的“借东风”加上庞统的“连环计”就更是匪夷所思的骗术了。

计算机程序同样不擅长使用这些行为,仅仅有少数的BOSS可以在聪明的设计者的指导下欺骗不了解情况的游戏玩家。从普通推理升级到欺骗是行为上的一个飞跃,特别是个体有意而为之时,这种不同寻常的行为的意义甚至堪比从错误中学习,迄今为止只有少数动物和人类真正拥有这种能力,而本质上来说我们是不会允许计算机“欺骗”我们的。

关于环境和可预测性还存在着很多悖论和有趣的话题,限于篇幅的关系我就不在文中一一赘述了,后文需要的地方会再做讨论。当然文章之外的任何讨论仍然是欢迎的。

行为的社会特性

我们很快地来看一下下一个因素,即所谓的“利己性”。人依循来自动物祖先的本能,其行为总是呈现利己的特性;但是当社会出现后,为了维持社会的正常运作从而使个人利益有保障和最大化,人的行为又会呈现出另外一种特性——“利他性”。当“利己性”和“利他性”不发生冲突时,一切都很正常,我们很容易做出选择。然而一旦发生冲突,我们就不得不放弃一方,而两者又往往分别占据短期行为和长期行为的地位,并且“利己性”通常是短期的。

这两个概念对于大部分计算机程序来说都是陌生的,实际上计算机程序的“利他性”只能体现在服务人类上,并且人类也不能放任计算机自说自话。可能的一个反例是电脑游戏,特别是那些存在就是为了让人类玩家难堪的,比如“深蓝”,但是遗憾的是“深蓝”只能下棋,它连领奖都不会。

计算机程序同样可以通过人机系统来呈现较为正常的“利己性”和“利他性”,这里就不多说了,因为和我们的主题无关。

关于行为的社会特性我还想多说一些,个体行为在社会大环境中会受到“社会思维模式”的限制,从而呈现出奇特的规律。有趣的是,历史上曾经有一种观点盛行一时,其认为社会形态会按照某种既定的规律发展,并且把社会形态的进步看成某种改良。细细思量,这恰巧和我们通常针对计算机程序的态度类似,我们希望不断地修复bug或者重构某个资源分配的算法来改进我们的程序,却忽视了个体的主观能动性,质变的存在,以及局部熵的变化(当然这一点在后来被新进化论涵盖了)。我不想在这里细谈社会学,只是想说明我们经历的计算机程序在行为上之所以大同小异,是因为我们自己认识上的局限,以及计算机硬件的限制(其实这点在现在更主要);但是即使如此也并不会妨碍我们去想象一个更广阔的天空。

再来考虑个人电脑,局域网和广域网,如果我们把这些计算机和计算机的群集(这里不是一般意义上的群集)看成是不同级别的计算机程序载体的话,我们会发现在不同的级别上所能够运行的程序其能力和行为模式是完全不一样的。而旧式的拨号网络和先进的高速宽带所可以承载的程序行为又是完全不同的。这不正恰如经济基础和上层建筑的关系么!

上面的假想并不只是吊各位读者的胃口,我们在很后面会看到这样的想法有多大的意义,这正是如今社区网络和云计算如此盛行的原因之一,然而充斥着这些新概念的虚拟世界也仅仅是十年前我们熟知的那个世界的改良版罢了,要创造一个类似Matrix或者神奇到根本无法想象的明天,就让我们先抛下矜持吧!

小结

在结束这一章的讨论前,我们还留下了一个最重要也最难办的因素:行为背后的思维模式。很遗憾地我不得不卖个关子,因为这个问题是我们的主题之一,我也不指望可以在一个章节里讨论清楚这个问题。并且我们也不会很快地涉及到这个问题,接下来我们将引入一些传统人工智能的概念和方法(当然并不是完全传统),并且讨论其有效性和问题所在,然后再来看几个对我们后面的讨论至关重要的概念。

0 0

相关博文

我的热门文章

img
取 消
img