第十五章 人工进化 15.2 你力所不逮的,进化能行
雷所发现的“生物”是人类程序员无法编写出来的。
“我从编写80字节的东西开始,”雷回忆说,“因为那是我能拿出来的最佳设计了。我猜想或许进化能把它降到75字节左右,于是就让程序运行了一整夜。结果第二天早上就出现了一个新东西——不是寄生虫,而是某种能完全自我复制的东西——它只有22字节!令我大惑不解的是,在没有像寄生虫那样盗用别人指令的情况下,一个电脑病毒是怎样仅通过22个指令就做到自行复制的呢?为了和他人分享这个新发现,我把它的基本算法发到网上。麻省理工学院一位计算机专业的学生看到了我的解释,但不知怎么却没有得到病毒22的代码。他试图手工重新创造它,但是他的最好成绩也需要31条指令。当他得知我是在睡觉时得到22条指令的时候,他沮丧极了。”
人类力所不逮的,进化却能做到。雷在一台显示器上展示了22在培养液中繁殖倍增的踪迹,以作为他的陈述的最佳诠释:“想想看,随机地改动程序竟然能胜过精雕细琢的手工编程,这听上去挺荒谬的,可这就是一个活生生的例子。”这位旁观者突然明了了,这些“没脑子”的黑客具有的创造力是永无止境的。
因为病毒要消耗计算机周期,所以较小(指令集更短)的病毒就有一定的优势。雷重写了“地球”的代码,使系统根据病毒大小按比例为其分配计算机资源,大病毒得到更多周期。在这种模式下,雷的病毒们所栖息的是一个不偏不倚的世界。正因为这个世界对大小病毒一视同仁,因此长期运行也许会更有意义些。有一次雷将它运行了150亿个计算机周期。在大约第110亿个周期左右,诞生了一种长度为36字节的病毒,它可是聪明得近乎狡诈了。它计算自己的真实尺寸,然后在“尾部”(我们姑且用这样的称谓吧)将长度值向左移了一位,在二进制中,这就相当于翻倍。靠着谎报自己的尺寸,病毒36神不知鬼不觉地窃取了病毒72的资源,这就意味着它得到了两倍于实际所需的中央处理器时间。这个变种自然横扫了整个系统。
也许汤姆·雷的电进化机最惊人的事情是它创造了性。没人告诉它什么是性,然而它还是发现了它。在一次实验中,为了看看关闭变异功能会产生什么结果,雷让“培养液”在没有外加错误的情况下运行。结果让他大吃一惊,即便没有程序变异,进化仍然发生了。
在真实的自然生活中,性是远比变异更重要的变化来源。性,从概念上讲,是遗传重组——一些来自父亲的基因和一些来自母亲的基因结合成为后代的全新基因组。在“地球”中,寄生虫有时会在无性繁殖中“借用”其他病毒的复制功能,而“收割机”有可能在这个过程中碰巧杀死了宿主,宿主原有的空间被新病毒占用。发生这种情况的时候,寄生虫就会使用新病毒的部分代码,以及“死去”病毒被打断了的部分复制功能。由此产生的后代是个未经刻意变异而产生的天然的新组合。(雷还说这种古怪的繁殖“相当于和死人发生性关系!”)在雷的“培养液”里这种中断式交配其实一直都在发生,但只有当他关闭变异功能时,他才注意到这点。原来,不经意的重组本身就足以推动进化。死亡时生物所栖息的内存空间中就会有足够的不规则性,而这种复杂性提供了进化所需的多样性。从某种意义上说,系统进化出了变异。
对科学家而言,雷的人造进化机最令人欣喜之处在于,他的小世界展示的似乎是间断平衡。在相对较长的时期里,种群比例保持着一个相对稳定局面,只是偶尔有物种灭绝或新物种诞生。接着,几乎是一眨眼功夫,这种平衡就立刻被一阵翻江倒海般的新老物种交替给打断了。对一个较短的时间来说,变化是狂暴而不受约束的。接着事情解决了,静止和平衡再次成为主宰。化石研究显示,这种形式在地球上的自然界中占压倒优势。静止是常态;而变化总是突如其来。在进化的其他计算机模型中也能看到同样的间断平衡方式,比如克里斯蒂安·林格伦的囚徒困境式的共同进化世界。如果人为进化反映了生物进化,你肯定想知道,如果雷让他的世界永远运行下去,会出现什么状况?他的病毒怪物会创造出多细胞吗?
遗憾的是,雷从来没有将他的世界以马拉松的方式运行过,去看看几个月或者几年之后会发生些什么。他还在不停地摆弄着他的程序,对其进行改进,以使之能够收集长期运行所产生的海量数据(每天50兆字节)。他承认,“有时,我们就像一群有一辆车的男孩子。我们总是在车库里打开发动机罩,把引擎零件拿出来摆弄,但是我们几乎从不开车,因为我们太执着于加大马力了。”
事实上,雷正专注于开发一种新硬件,那应该是一种新技术。雷认为他可以将虚拟计算机和为它编写的基本语言“烧制”进一块计算机芯片——一块进化用的硅片。这个现成的达尔文进化芯片就成了可以插进任何计算机的模块,它会为你迅速繁殖东西。你可以演化出代码,或子程序,或许甚至可能是整个软件程序。“我发现这相当奇怪,”雷吐露道,“作为一个热带植物生态学家,我竟然搞起了计算机设计。”
达尔文进化芯片可能带来的前景是美妙的。设想在你的个人计算机中就有一块,而在你的计算机中使用的文字处理软件是微软的Word。由于达尔文进化论常驻操作系统,Word会随着你的工作而进化。它会利用处理器的空闲周期,以缓慢的进化方式自我改善和学习,使自己适应你的工作习惯。只有那些提高了速度和准确性的改变会保留下来。不过,雷深信应该将杂乱无章的进化与工作分割开。“你应该把进化与终端用户分开,”他说。他设想在后台离线进行“数字耕牧”,这样一来,进化中不可或缺的错误和失败就不会为用户所见;在用户的使用过程中,进化也处于“休眠”状态。
进化在市面上也算不上天方夜谭了。今天你就能买到类似功能的电子表格模块。它的名字就叫作“进化者”。“进化者”是苹果电脑上的电子表格模板——非常复杂,密密麻麻有数百个变量和“假设”函数。工程师和数据库专家们都使用它。
比如说,你有三万名病人的医疗记录。你可能很想了解一个典型患者的症状。数据库越大,想看到你存在特定位置的数据就越困难。大多数软件都能计算平均值,但是凭这并不能抽取出一个“典型”患者。你想了解的是,在收集到的几千种类别的数据中,哪一套量测值对最多数人群来说具有相似的意义。这是一个对海量交互变量进行优化的问题。对任何生物来说,这都是一个再熟悉不过的问题:如何将成千上万个变量所输出的结果最大化呢?浣熊必须确保自己的生存,但是有上千种变量(脚的大小,夜视能力,心率,皮肤颜色等等)可以随时间推移而发生变化,且一个参数的改变会引起另一个参数的改变。要想穿过这片包含各种可能结果的广阔空间,并且还留有些许登顶的希望,唯一的方法就是进化。
“进化者”软件对最大多数患者的最宽泛的病历进行优化。它尝试给出一名典型患者的基本描述,然后检查有多少患者符合这份描述,再对病历进行多纬度改进,看看是否有更多患者与之相符,然后修改、选择、再修改,直至最大数量的患者符合这份描述。这项工作特别适合进化。
计算机科学家把这个过程叫作“爬山法”。进化程序试图在包含最优解的形式库中向顶峰攀升。通过持续不断地向更好的解决方案推进,程序一直向上攀登,直到不能爬得更高。在那一点上,它们就到达了峰顶——一个极大值。然而始终有个问题:这个峰顶是周围最高的吗?或者,程序是否被困在一个局部高点,与旁边高得多的峰顶只有一条峡谷之隔,却又无从回退?
找到登上一处高点的路径并不难。自然界中的进化和计算机中的进化程序所擅长的,是在山峦起伏、一山更比一山高的地形中,爬到全局意义上的至高点——主峰。