第十五章 人工进化 15.3 并行实施的盲目行为
从外表看很难判断约翰·霍兰德的真实年龄。他曾经摆弄过世界上最早的计算机,现在则任教于密歇根大学。他首次提出了一种数学方法,用以描述进化所具备的优化能力,并且该方法可以轻松地在计算机上编程实现。因其数学形式在某种程度上类似于遗传信息,霍兰德把它们称为遗传算法。
和汤姆·雷不同,霍兰德从性开始入手。霍兰德的遗传算法选取两组类似于DNA的计算机代码,这两组代码在问题求解上都有不错的效果,然后以交配互换的方式将它们随机重组,看看新的代码会不会表现得更好一点。在设计系统时,和雷一样,霍兰德必须克服一个悬而未决的问题:对于任何随机生成的计算机程序来说,往往都谈不上什么好坏,而是根本就不靠谱。从统计学的意义上说,对可用代码做随机变异,结局注定是屡战屡败。
早在二十世纪六十年代初理论生物学家就发现,与突变相比,交配所产生的实用个体比例更高,因而以其为基础的计算机进化也更稳定和有生命力。但是,单靠有性交配其结果很受局限。二十世纪六十年代中期,霍兰德发明了遗传算法;遗传算法中起主要作用的是交配,但突变也是幕后策划者之一。通过将交配与突变结合在一起,系统变得灵活且宽泛。
和其他具有系统观念的人一样,霍兰德认为大自然的工作和计算机的任务是相似的。“生物体是高明的问题解决者。”霍兰德在他的工作总结中写道,“它们所展示出来的多才多艺使最好的计算机程序都为之汗颜。”这个论断尤其令计算机科学家们感到难堪。他们可能经年累月地在某个算法上绞尽脑汁,而生物体却通过无目标的进化和自然选择获得了它们的能力。
霍兰德写道,进化的方法“排除了软件设计中最大的一个障碍:预先规定问题的所有特征。”如果你有许多相互矛盾而又彼此关联的变量,而目标定义又很宽泛,可能有无数个解,那么进化正是解决之道。
正如进化需要大量的个体才能发挥效用一样,遗传算法也要炮制出数量庞大的代码群,并且这些代码们同时进行处理数据和发生变异。遗传算法实际上是一大群略有差别的策略,试图在崎岖的地形上同时攀爬不同的峰顶。由于大量代码并行作业,因而能同时访问该地形的多个区域,确保它不会错过那真正的高峰。
隐含的并行主义是进化过程确保其不单攀上高峰、而且是最高峰的魔力所在。如何找出全局最优值?通过同时考察整个地貌的每一寸土地。如何在复杂系统中对上千个相互冲突的变量做出最佳平衡?通过同时尝试上千种组合。如何培养出能在恶劣条件下生存的生物体?通过同时投入一千个略有差异的个体。
在霍兰德的算法中,那些“处在最高处”的代码们彼此交配。换句话说,“地势高”的区域,交配率就高。这便将系统的注意力集中到最有前途的区域,同时,对那些没有希望的地区,系统则剥夺了它们所占用的计算周期。这样,并行主义既做到了“天网恢恢,疏而不漏”,又减少了寻找顶峰所需要的代码数量。
并行是绕过随机变异所固有的愚蠢和盲目的途径之一。这是生命的极大讽喻:一个接一个地重复盲目行为只能导致更深层的荒谬,而由一群个体并行执行的盲目行为,在条件适合时,却能导出所有我们觉得有趣的东西。
约翰·霍兰德在二十世纪六十年代研究适应机制时发明了遗传算法。而直到二十世纪八十年代末,他的成果都没有引起任何关注,除了十二个异想天开的计算机研究生。其他几个研究者,如工程师劳伦斯·福格尔和汉斯·布雷默曼,在二十世纪六十年代独立开展了种群的机械式进化研究;现在密歇根州韦恩州立大学工作的计算机科学家迈克尔·康拉德,在二十世纪七十年代也从对适应的研究转向了为种群进化建立计算机模型;他们都受到了同样的冷落。总之,这项工作在计算机科学领域里可以说是默默无闻,而生物学界对它更是一无所知。
在霍兰德关于遗传算法和进化的书《自然与人工系统中的适应》于1975年问世前,只有两三个学生写过关于遗传算法的论文。直到1992年再版时,这本书只卖出2500本。在1972年至1982年间,整个科学界关于遗传算法的文章不超过二十几篇,更遑论有什么对计算机进化顶礼膜拜的追随者了。
生物学界对此缺乏兴趣尚情有可原(但也不是什么光彩的事情);生物学家认为自然界太复杂,难以用当时的计算机来展现其真实全貌。而计算机科学对此兴趣寥寥,就莫名其妙了。我在为本书做调研时经常感到困惑,像计算进化这样重要的方法为什么竟无人理睬呢?现在我相信,这种视而不见的根源,在于进化所固有的看上去杂乱无章的并行性,以及它与当时盛行的计算机信条——冯·诺依曼串行程序——在根本上的抵触。
人类的第一台电子计算机叫做电子数值积分计算器,是1945年为解决美军的弹道计算问题而研发的。电子数值积分计算器是一个由1.8万支电子管、7万个电阻和1万个电容构成的庞然大物。它需要6000个手动开关来设置指令,然后运行程序;各个数值的计算实际上是以并行方式同时进行的。这对编程来说是个负担。
天才的冯·诺依曼从根本上改变了这种笨拙的编程系统。电子数值积分计算器的接替者——离散变量自动电子计算机——是第一台可运行存储程序的通用计算机。冯·诺依曼24岁那年(1927年)发表了他的第一篇关于数学逻辑系统和博弈论的学术论文,自那时起,他就一直在考虑系统逻辑问题。在与离散变量自动电子计算机小组共事时,为了应付计算机编程在求解多问题时所需的复杂运算,他发明了一种方法来控制这些运算。他建议将问题分成离散的逻辑步骤,类似于长除法的求解步骤,并把求解过程的中间值临时储存在计算机中。这样一来,那些中间值就可以被看成是下一部分问题的输入值。通过这样一个共同演化的循环(现在称为子程序)来进行计算,并将程序逻辑储存在计算机中以使它能与答案交互,冯·诺依曼能将任何一个问题转化成人脑所能理解的一系列步骤。他还发明了描述这种分步线路的标记法:即现在大家所熟悉的流程图。冯·诺依曼的串行计算架构——一次执行一条指令——其普适性令人惊叹,并且非常适合人类编程。1946年冯·诺依曼发表了这个架构的概要,随后所有的商用计算机都采用了这个架构,无一例外。
1949年,约翰·霍兰德曾效力于离散变量自动电子计算机的后续项目“旋风计划”。1950年,他参加了IBM“国防计算机”的逻辑设计团队,这款机型后来演变成IBM701机,是世界第一部商用计算机。当时的计算机有房间那么大,耗电量惊人。到了五十年代中期,霍兰德加入了一个带有传奇性的圈子,里面都是些思想深邃之人,他们开始讨论人工智能的可能性。
当赫伯特·西蒙和艾伦·纽厄尔这样的学界泰斗把学习看作高贵和高等的成就时,霍兰德却把它看作光鲜外表下的低端适应。霍兰德认为,如果我们能理解适应性尤其是进化的适应性,就可能理解甚至模仿有意识的学习。尽管其他人有可能意识到进化与学习之间的相似之处,然而在一个快速发展的领域里,进化并不太为人所关注。
1953年,霍兰德在密歇根大学数学图书馆漫无目的地浏览时,偶然发现了一卷由R.A.费希尔写于1929年的《自然选择的遗传理论》,顿时大受启发。达尔文引领了从对生物的个体研究到种群研究的转向,而把种群思维转变为定量科学的则是费希尔。费希尔以一个随时间推移而进化的蝴蝶族群为对象,将其看作是一个将差别信息并行传遍整个族群的整体系统。他提出了控制信息扩散的方程。通过驾驭自然界最强大的力量——进化,以及人类最强有力的工具——数学,费希尔单枪匹马开创了一个人类知识的新世界。“我第一次意识到能对进化进行有意义的数学运算。”霍兰德回忆起那次奇妙邂逅时说。“那个想法对我非常有吸引力。”霍兰德如此醉心于将进化作为一种数学来处理,以致于(在复印机还没有问世的当时)拼命想搞到绝版的全文。他恳求图书馆把书卖给他,但没有成功。霍兰德吸取了费希尔的见解,又将其升华为自己的构想:一群协处理器,在计算机内存的原野上,如蝴蝶一般翩翩起舞。
霍兰德认为,人工学习其本质上是适应性的一个特例。他相当确定能在计算机上实现适应性。在领悟了费希尔关于进化是一种概率的洞见后,霍兰德着手尝试把进化编为代码输入机器。
在尝试之初,他面临着一个两难处境:进化是并行的处理器,而所有可用的电子计算机却都是冯·诺依曼式的串行处理器。
在把计算机变为进化平台的迫切愿望下,霍兰德做了唯一合理的决定:设计一台大规模并行计算机来运行他的实验。在并行运算中,许多指令同时得到执行,而不是一次只执行一个指令。1959年,他提交了一篇论文,其内容正如其标题所概括,介绍了“能同时执行任意数量子程序的通用计算机”,这个机巧装置后来被称为“霍兰德机”。而等了差不多三十年,一台这样的计算机才终于问世。
在此期间,霍兰德和其他计算进化论者不得不依赖串行计算机来培育进化。他们使出浑身解数在快速串行处理器上编程模拟一个缓慢的并行过程。模拟工作卓有成效,足以揭示出真正并行过程的威力。