zhujiang

  自从20世纪30年代以来,图灵机、计算这些重要的概念在科学的天空中就一直闪烁着无限的光彩。尤其是近年来量子计算机、生物计算机、DNA计算等领域的创新工作引起了世人的广泛关注。我们不禁问这样的问题,国外究竟为什么能发明出这些各式各样的计算机呢?这些意味着什么呢?其实这一切的源头都来源于计算理论。国内在介绍计算理论方面的教材虽然有不少,但一般都比较深奥难懂。所以我觉得很有必要对这些内容进行科普。于是尝试写下这么一篇文章,希望我的文章能够让你更加清楚、透彻的理解图灵机、计算等等一些基本而重要的概念,并洞悉到这些概念的本质和深远涵义。


    本篇文章大体上可以分成四部分:首先给大家讲一讲关于图灵、哥德尔等科学家的故事;然后正式引入图灵机的概念,为了对这个概念有比较直观的理解,我采用了一个人工生命:“小虫”的比喻来叙述。接下来,文章介绍了跟图灵机有关的概念:什么是模拟,什么是“万能计算机”等等;最后是关于图灵停机问题的探讨,我个人认为很有可能未来对科学的重大突破都来源于对图灵停机问题的深入理解。在行文过程中,我除了用自己的方式介绍一些现有的基本概念之外(为了尽量表达得清楚明白,我不得不放弃理论论证的严格性),还探讨了很多我认为别人没有探讨的问题,这些问题多是我自己的思考结果,而它们没有经过科学的验证。在这部分内容上我都标上了*号,希望你能有选择的看待这些问题和观点。


一、故事


    任何科学思想、科学概念的诞生都有它的背景,在背景中往往有很多迷人的故事。关于计算理论可以追溯到1900年,当时著名的大数学家希尔伯特在世纪之交的数学家大会上给国际数学界提出了著名的23个数学问题。其中第十问题是这样的:存在不存在一种有限的、机械的步骤能够判断“丢番图方程”是否存在解?这里就提出来了有限的、机械的证明步骤的问题,用今天的话说就是算法。但在当时,人们还不知道“算法”是什么。实际上,当时数学领域中已经有很多问题都是跟“算法”密切相关的,因而,科学的“算法” 定义呼之欲出。之后到了30年代的时候,终于有两个人分别提出了精确定义算法的方法,一个人是图灵,一个人是丘奇。而其中图灵提出来的图灵机模型直观形象,于是很快得到了大家的普遍接受。


    不知道你是否听说过图灵这个名字。可能有些人知道牛顿,知道爱因斯坦,甚至知道冯诺依曼,但不知道图灵。然而图灵的贡献绝对不亚于这些科学大师。图灵最大的贡献就是把算法这样一个基本的、深刻的概念用他的图灵机模型讲清楚了。正是因为图灵奠定的理论基础,人们才有可能发明20世纪以来甚至是人类有史以来最伟大的发明:计算机。因此人们称图灵为:计算机理论之父。


    图灵生活的年代经历了第二次世界大战。在二战期间他曾经为英国政府效力成功破译了德国的密码,因而为英国做出了突出贡献。其实也正是因为二战,英国政府才肯掏钱让图灵制造最原始的计算机,当然这种计算机是专门用来破译密码用的,而不是我们现在用的通用计算机。(有一部片子叫《密码迷情》英文名是《enigma》就是根据图灵当时破译德国密码的故事改编的,大家有兴趣可以去找一找。)


    图灵这个人很古怪,只喜欢自己一个人闷头研究,不喜欢与别人交流。并且据说他还是一个同性恋者。要知道在当时的英国,同性恋行为可是大逆不道的。最后,在他事业刚刚达到顶风的时候,他自杀了。为了纪念这个伟大的学者,计算机界设立了最高荣誉奖:ACM图灵奖。
图灵机的产生一方面奠定了现代数字计算机的基础(要知道后来冯诺依曼就是根据图灵的设想才设计出第一台计算机的)。另一方面,根据图灵机这一基本简洁的概念,我们还可以看到可计算的极限是什么。也就是说实际上计算机的本领从原则上讲是有限制的。请注意,这里说到计算机的极限并不是说它不能吃饭、扫地等硬件方面的极限,而是仅仅就从信息处理这个角度,计算机也仍然存在着极限。这就是图灵机的停机问题。这个问题在图灵看来更加重要,在他当年的论文中,其实他是为了论证图灵停机问题才“捎带手”提出了图灵机模型的。


    提到了图灵停机问题,我不禁又要提一提哥德尔定理、罗素悖论、康托尔的集合论等等一系列大事儿。早在19世纪末的时候,康托尔为集合论做了奠基性的研究。要知道,数学虽然五花八门,但是人们发现,运用集合这个概念可以概括所有的数学,也就是说集合是一切数学的基础。因而如果为集合论奠定了公理化的基础,也就等于为数学奠定了基础。康托尔就是做了这方面的贡献。另外,他为了证明实数的个数比自然数多这个结论,发明了一种被称为“对角线删除”的证明方法。没想到的是,这个方法影响非常深广,直到后来的图灵停机问题、哥德尔定理其实都是该方法的不同延伸。


    19世纪末的人们忙于为基于集合论的数学建立公理体系大厦。然而就当这座大厦即将完工的时候,一件可怕的事情发生了,罗素提出来的罗素悖论粉碎了数学家的梦想。关于罗素悖论的一个通俗化版本是:“村子里有一个理发师,他给自己定了一条规矩:‘不给那些所有给自己理发的人理发’。现在就要问,这个理发师该不该给自己理发?”。如果你尝试回答这个问题就会发现奇怪的事情:这个问题本身似乎是不可能的!正是因为这种奇怪的逻辑,哲学家罗素才颠覆了整个数学大厦的基础!


    因为集合论中存在着矛盾,所以整个数学体系存在着根本性的矛盾,然而具有讽刺意味的是,数学一直以严格著称!这种感觉就好像正当你得意洋洋的时候有人突然闪了你一个耳光!人们在一阵慌乱之后开始逐渐稳下阵角寻找避免罗素悖论产生的方法,并总希望通过细心的选择数学公理能够将类似罗素悖论这样的怪物一劳永逸的排除精确数学体系之外。这就是后来希尔伯特提出来一套数学纲领的原因,他希望找到一套公理体系能够排除悖论,并挽救纯粹而美丽无暇的数学。虽然希尔伯特没能完成他的梦想,但他坚信梦想是对的。


    然而,没过多少年,一个名不见经传的年轻逻辑学家哥德尔提出来的定理却彻底粉碎了希尔伯特的梦。这就是后来著名的哥德尔定理!该定理大致上说:任何一个数学的公理化体系都不是“完美的”。换个角度说,任何数学公理化系统都是死的,它总需要人为地从外界注入新的公理进去才能让它日趋完善,而它自己并不能完全自动避免矛盾产生。哥德尔定理可以说整个扭转了人们的世界观。因为被认为最“完美”最“纯粹”的数学都是不完全的,那么纯粹完美的世界也应该不存在。哥德尔定理还指出了“理性”和“分析”方法的极限。这才是后来人们步入到了“综合”时代的部分原因。更有趣的是,哥德尔用来证明他定理的方法正和康托尔证明实数比自然数多、图灵停机问题以及罗素悖论的方法是一脉相承的。


    所有这些都是20世纪上半个世纪发生的大事,后来发生了什么?计算机出现了、信息时代来临了,似乎科学技术是万能的,它们总会改善我们的生活,满足我们的欲望。渐渐的,人们似乎淡忘了图灵、歌德尔、康托尔等等大师们的思想了。然而近年来随着复杂性科学的研究,人们却又有了重拾这些相对古老而根本问题的迹象了!


二、图灵机


    下面言归正传,我们开始讲图灵机的概念。我先把图灵机的模型给你,虽然有些无趣,不过请坚持看下去,我会在下面运用大家比较好理解的形式重新解释的。在这里你仅仅需要认识它的轮廓。一个图灵机是形如下面的一个装置:



    这个装置由下面几个部分组成:一个无限长的纸带,一个读写头。(中间那个大盒子),内部状态(盒子上的方块,比如A,B,E,H),另外,还有一个程序对这个盒子进行控制。这个装置就是根据程序的命令以及它的内部状态进行磁带的读写、移动。


    它工作的时候是这样的:从读写头在纸带上读出一个方格的信息,并且根据它当前的内部状态开始对程序进行查表,然后得出一个输出动作,也就是是否往纸带上写信息,还是移动读写头到下一个方格。程序也会告诉它下一时刻内部状态转移到哪一个。

    具体的程序就是一个列表,也叫做规则表,是这样的:


    当前内部状态s    输入数值i    输出动作o 下一时刻的内部状态s\'
      B                  1           前移               C   
      A                  0         往纸带上写1          B
      C                  0           后移               A
      …                 …           …                …


    因此,图灵机只要根据每一时刻读写头读到的信息和当前的内部状态进行查表就可以确定它下一时刻的内部状态和输出动作了。


    图灵机就是这么简单!不可思议吧?而只要你变化它的程序(也就是上面的规则表),那么它就可能为你做任何计算机能够完成的工作。因此可以说,图灵机就是一个最简单的计算机模型!


    也许,你会觉得图灵机模型太简单,怎么可能完成计算机的复杂任务呢?问题的关键是如何理解这个模型。


三、如何理解图灵机?


1、小虫的比喻
    我们不妨考虑这样一个问题。假设一个小虫在地上爬,那么我们应该怎样从小虫信息处理的角度来建立它的模型?


    首先,我们需要对小虫所在的环境进行建模。我们不妨就假设小虫所处的世界是一个无限长的纸带,这个纸带上被分成了若干小的方格,而每个方格都仅仅只有黑和白两种颜色。很显然,这个小虫要有眼睛或者鼻子或者耳朵等等感觉器官来获得世界的信息,我们不妨把模型简化,假设它仅仅具有一个感觉器官:眼睛,而且它的视力短得可怜,也就是说它仅仅能够感受到它所处的方格的颜色。因而这个方格所在的位置的黑色或者白色的信息就是小虫的输入信息。


    另外,我们当然还需要为小虫建立输出装置,也就是说它能够动起来。我们仍然考虑最简单的情况:小虫的输出动作就是往纸带上前爬一个方格或者后退一个方格。


    仅仅有了输入装置以及输出装置,小虫还不能动起来,原因很简单,它并不知道该怎样在各种情况下选择它的输出动作。于是我们就需要给它指定行动的规则,这就是程序!假设我们记小虫的输入信息集合为I={黑色,白色},它的输出可能行动的集合就是:O={前移,后移},那么程序就是要告诉它在给定了输入比如黑色情况下,它应该选择什么输出。因而,一个程序就是一个从I集合到O集合的映射。我们也可以用列表的方式来表示程序,比如:

程序1:
         输入        输出


          黑色        前移
         白色        后移


    这个程序非常简单,它告诉小虫当读到一个黑色方格的时候就往前走一个方格,当读到一个白色方格的时候就后退一个格。


    我们不妨假设,小虫所处的世界的一个片断是:黑黑黑白白黑白……,小虫从左端开始。
那么小虫读到这个片断会怎样行动呢?它先读到黑色,然后根据程序前移一个方格,于是就会得到另外一个黑色信息,这个时候它会根据程序再次前移一个方格,仍然是黑色,再前移,这个时候就读到白色方格了,根据程序它应该后退一个格,这个时候输入就是黑色了,前移,白色,后移……,可以预见小虫会无限的循环下去。


    然而,现实世界中的小虫肯定不会这样傻的在那里无限循环下去。我们还需要改进这个最简单的模型。首先,我们知道小虫除了可以机械地在世界上移动以外,还会对世界本身造成影响,因而改变这个世界。

    比如虫子看到旁边有食物,它就会把那个东西吃掉了。

    在我们这个模型中,也就相当于我们必须假设小虫可以改写纸带上的信息。因而,小虫可能的输出动作集合就变成了:O={前移,后移,涂黑,涂白}。这个时候,我们可以把程序1改为比如:

程序2:
        输入       输出
         黑        前移
         白        涂黑


    纸带是黑黑白白黑……,小虫会怎样行动呢?

    下面的图表示出了这个例子中每一步小虫的位置(标有圆点的方格就是小虫的当前位置),以及纸带的状况。


    开始:小虫在最左边的方格,根据程序的第一行,读入黑色应该前移。
    第二步:仍然读入黑,根据程序的第一行,前移。
    第三步:这个时候读入的是白色,根据程序的第二行,应该把这个方格涂黑,而没有其他的动作。假设这张图上方格仍然没有涂黑,而在下一时刻才把它表示出来。
    第四步:当前方格已经是黑色的,因此小虫读入黑色方格,前移。
    第五步:读入白色,涂黑方格,原地不动。
    第六步:当前的方格已经被涂黑,继续前移。
    第七步:读入黑色,前移,小虫的动作还会持续下去……。

    我们看到,小虫将会不停的重复上面的动作不断往前走,并会把所有的纸带涂黑。


    显然,你还可以设计出其他的程序来,然而无论你的程序怎么复杂,也无论纸带子的情况如何,小虫的行为都会要么停留在一个方格上,要么朝一个方向永远运动下去,或者就是在几个方格上来回打转。然而,无论怎样,小虫比起真实世界中的虫子来说,还有一个致命的弱点:那就是如果你给它固定的输入信息,它都会给你固定的输出信息!因为我们知道程序是固死的,因此,每当黑色信息输入的时候,无论如何它都仅仅前移一个方格,而不会做出其他的反应。它似乎真的是机械的!


    如果我们进一步更改小虫模型,那么它就会有所改进,至少在给定相同输入的情况下,小虫会有不同的输出情况。这就是加入小虫的内部状态!我们可以作这样的一个比喻:假设黑色方格是食物,虫子可以吃掉它,而当吃到一个食物后,小虫子就会感觉到饱了。当读入的信息是白色方格的时候,虽然没有食物但它仍然吃饱了,只有当再次读入黑色时候它才会感觉到自己饥饿了。因而,我们说小虫具有两个内部状态,并把它内部状态的集合记为:S={饥饿,吃饱}。这样小虫行为的时候就会不仅根据它的输入信息,而且也会根据它当前的内部状态来决定它的输出动作,并且还要更改它的内部状态。而它的这一行动仍然要用程序控制,只不过跟上面的程序比起来,现在的程序就更复杂一些了,比如:


程序3:
       输入    当前内部状态   输出    下时刻的内部状态
        黑          饥饿       涂白         吃饱
        黑          吃饱      后移         饥饿
        白          饥饿      涂黑         饥饿
        白          吃饱      前移         吃饱


    这个程序复杂多了,有四行,原因是你不仅需要指定每一种输入情况下小虫应该采取的动作,而且还要指定在每种输入和内部状态的组合情况下小虫应该怎样行动。看看我们的虫子在读入黑白白黑白……这样的纸带的时候,会怎样?仍然用下面的一系列图来表示,灰色的圆点表示饥饿的小虫,白色的圆点表示它吃饱了。为了清晰,我们把小虫将要变成的状态写到了图的下一行。


    假定它仍然从左端开始,而且开始的时候小虫处于饥饿状态。这样读入黑色,当前饥饿状态,根据程序第一行,把方格涂白,并变成吃饱(这相当于把那个食物吃了,注意吃完后,小虫并没动)。
    第二步:当前的方格变成了白色,因而读入白色,而当前的状态是吃饱状态,那么根据程序中的第四条前移,仍然是吃饱状态;
    第三步:读入白色,当前状态是吃饱,因而会重复第二步的动作。
    ……
    涂白方格,变成吃饱
    ……
    前移,仍然吃饱
    ……
    前移,保持吃饱
    第四步:仍然重复上次的动作。
    第五步:读入黑色,当前状态是吃饱,这时候根据程序的第二行应该后移方格,并转入饥饿状态;
    第六步:读入白色,当前饥饿状态,根据程序第三行应该涂黑,并保持饥饿状态(各位注意,这位小虫似乎自己吐出了食物!);
    第七步,读入黑色,当前饥饿,于是把方格涂白,并转入吃饱状态(呵呵,小虫把刚刚自己吐出来的东西又吃掉了!)。
    第八步,读入白色,当前吃饱,于是前移,保持吃保状态。
    这时候跟第四步的情况完全一样了,因而小虫会完全重复5、6、7、8步的动作,并永远循环下去。似乎最后的黑色方格是一个门槛,小虫无论如何也跨越不过去了。


    小虫的行为比以前的程序复杂了一些。尽管从长期来看,它最后仍然会落入机械的循环或者无休止的重复。然而这从本质上已经与前面的程序完全不同了,因为当你输入给小虫白色信息的时候,它的反应是你不能预测的!它有可能涂黑方格也有可能前移一个。当然前提是你不能打开小虫看到它的内部结构,也不能知道它的程序,那么你所看到的就是一个不能预测的满地乱爬的小虫。如果小虫的内部状态数再增多呢,那么它的行为会更加的不可预测!


    好了,如果你已经彻底搞懂了我们的小虫是怎么工作的,那么你已经明白了图灵机的工作原理了!因为从本质上讲,最后的小虫模型就是一个图灵机!


2、如何理解图灵机模型


    刚才用小虫说明了图灵机的工作原理,相信你的第一个反映就是,这样的模型太简单了!他根本说明不了现实世界中的任何问题!下面,我就要试图说服你,图灵机这个模型是伟大的!
    首先,我想说的是,其实我们每一个会决策、会思考的人就可以被抽象的看成一个图灵机。
    前移,保持吃饱
    涂白,转入吃饱
    ……
    前移,保持吃饱
    ……
    后移,变成饥饿
    ……
    涂黑,保持饥饿
    ……
    ……


    为什么可以做这种抽象呢?首先我们可以考虑扩展刚才说的小虫模型。因为小虫模型是以一切都简化的前提开始的,所以它的确是太太简单了。然而,我们可以把小虫的输入集合、输出行动集合、内部状态集合进行扩大,这个模型就一下子实用多了。首先,小虫完全可以处于一个三维的空间中而不是简简单单的纸带。并且小虫的视力很好,它一下子能读到方圆500米的信息,当然,小虫也可以拥有其他的感觉器官,比如嗅觉、听觉等等,而这些改变都仅仅是扩大了输入集合的维数和范围,并没有其他更本质的改变。同样道理,小虫可能的输出集合也是异常的丰富,它不仅仅能移动自己,还可以尽情的改造它所在的自然界。进一步的,小虫的内部状态可能非常的多,而且控制它行为的程序可能异常复杂,那么小虫会有什么本事呢?这就很难说了,因为随着小虫内部的状态数的增加,随着它所处环境的复杂度的增加,我们正在逐渐失去对小虫行为的预测能力。但是所有这些改变仍然没有逃出图灵机的模型:输入集合、输出集合、内部状态、固定的程序!就是这四样东西抓住了小虫信息处理的根本。


    我们人能不能也被这样的抽象呢?显然,输入状态集合就是你所处的环境中能够看到、听到、闻到、感觉到的所有一起,可能的输出集合就是你的每一言每一行,以及你能够表达出来的所有表情动作。内部状态集合则要复杂得多。因为我们可以把任意一个神经细胞的状态组合看作是一个内部状态,那么所有可能的神经细胞的状态组合将是天文数字!


    似乎你会说,这个模型根本不对,还有很多思维本质的东西没有概括进去。比如记忆问题,人有记忆,图灵机有么?其实,只要图灵机具有了内部状态,它就相应的具有了记忆。比如上面讲到的具有饥饿和吃饱两种状态的小虫就会记住它所经历过的世界:如果吃到食物就用吃饱状态来“记住”吃过的食物。什么是记忆呢?假如你经历了一件事情并记住了它,那么只要你下一次的行动在相同条件下和你记住这件事情之前的行动不一样了,就说明该事情对你造成了影响,也就说明你确实记住了它。


    学习的问题反映在模型中了么?学习是怎么回事儿呢?似乎图灵机模型中不包括学习,因为学习就意味着对程序的改变,而图灵机是不能在运行过程中改变它的程序的。然而,我们不难假设,你实际上并不能打开一个人的脑袋来看,所以它的实际程序规则你是不知道的。很有可能一个图灵机的规则没有改变,只不过激活了它的某些内部状态,因而它的行为发生了本质上的变化,尽管给它相同的输入,它给出了完全不同的输出,因而在我们看来,它似乎会学习了!而实际上,这个图灵机的程序一点都没变。


    还有很多很多现象似乎都能被图灵机包括,什么是人类的情绪、情感?你完全可以把它看作是某种内部状态,因而处于心情好的情绪下,你的输入输出是一套规则,而心情不好的时候则完全是另一套。这仍然没有逃出图灵机的模型范围。


    接下来的问题就是我们人的思维究竟是不是和图灵机一样遵循固定的程序呢?这个问题似乎初看是不可能的,因为人的行为太不固定了!你不可预言它!然而我会争辩道,无论如何神经元传递信息、变化状态的规律都是固定的,可以被程序化的,那么作为神经元的整体:脑的运作必然也要遵循固定的规则也就是程序了。那么,如果是这样,正如图灵相信的,人脑也不会超越图灵机这个模型,所以,人工智能也必然是可能的!然而,我认为针对这个问题的答案很有可能没有这么简单,我们将在最后详细讨论这个问题。


无论如何,我相信你已经能够体会到了,图灵机模型实际上是非常强有力的!

分类:

技术点:

相关文章: