您当前的位置:首页 > 当代文学 > 大图景

第34章 贯穿景观的搜索

第34章
贯穿景观的搜索

在计算机科学中,与人生一样,我们经常面对一项简单任务,就是在一长串的可能性中寻找某项特定的事物。考虑一下旅行推销员问题:给定一个城市以及城市之间距离的列表,访问每个城市恰好一次的最短路径是什么?这个问题可以用如下方式重新叙述。先拿来一张城市以及城市间距离的列表,现在列出另外一个列表,其中包含所有经过每个城市一次的所有可能路径[15](这个列表会无比巨大,但仍然是有限的)。哪条路径最短?

一个搜索算法是一个被精确描述的过程,它的目的就是在物品的列表中找到你在搜寻的东西。当然你可以一步一个脚印地检查列表中的每个元素,然后考虑“是不是就是这个”。这可能很困难,因为听起来挺合理的问题牵涉的列表大小可能不合常理。对于旅行推销员问题,可能路径的数量大概随着城市数量的阶乘增长。自然数n的阶乘等于1乘以2乘以3乘以4……乘以(n-1)再乘以n。对于27个城市来说,要彻底搜索的路径数目大约就是1028。如果每秒处理10亿条路径,这项搜索要花上的时间比可观察宇宙的年龄更长。

所以秘诀在于不要随便找一个烂大街的搜索算法,而是找那些效率高的。通常发生的是,选择的数量太多,我们只要找到不错的解就很高兴了,而不一定要绝对完美。

自然选择可以看成一个搜索算法。演化要解决的问题是:“什么生物可以在这个独特的环境中最有效地存活和繁衍?”但被搜索的并不真的是“生物”,而是基因组,或者说DNA链中特定的核苷酸串。人类基因组包含大约30亿个核苷酸。这个数量跟细菌之类的比起来算是很多,细菌的基因组可能有数百万个核苷酸。但不要太骄傲,有些开花植物的DNA包含超过1000亿对核苷酸。有些生物个体会生存繁衍,而另外一些就做不到。在代代繁衍之中,我们如何找到这样的DNA序列,能产生生存机会最大的生物个体?

从计算资源的角度来说,这算是个困难的问题。我们30亿个核苷酸中,每一个都是4种可能选择之一:A、C、G或者T。人类基因组大小的DNA所有可能排列的总数不是4乘以30亿(这个数字还不算太坏);它是4的30亿次方:43,000,000,000,或者说大概是1后面跟着20亿个零。这个数字大得惊人甚至可笑。这个估计也过高了;有些核苷酸序列与其他序列对功能有着相同的影响,而绝大部分序列根本不会产生生物。我们可以点算基因而不是核苷酸,这会大量削减维度的数目,尽管由于每个基因拥有的可能形式大大多于4种,所以总数仍然巨大,而不同基因功能之间的相互依赖会让任何这类计数的结果变得不太确定。无论如何,通过彻底搜索所有生物个体可能拥有的基因组来寻找“最优”的个体,这是个令人生畏的工作。

演化提供了一个在无比巨大的可能性空间中搜索高适应度基因组的策略。计算机科学家最近证明了,演化的一个简化模型(允许通过有性繁殖的基因混合,但不允许突变)在数学上等价于博弈论学者多年以前设计的一个算法,名为积性权重更新(multiplicative weight update)。好想法经常出现在几个不同的地方。

“搜索算法”这个术语不意味着有什么人写了这个算法,或者有人确定了演化应该搜索的目标。演化没有考虑任何目标;演化就这样发生了,带着拉普拉斯式的沉静,每步都由前一步决定。在诗性自然主义的精神中,“搜索算法”就是演化过程的一种有用的说明方式。在适当的情景下,它们有着等价的数学形式,而这个联系带来了一些不错的形象直觉。不要让语言欺骗你去相信有任何主体在引导演化的路径或者事先设定了目标;同时也不要因为害怕自己听起来好像相信有这么一个主体,而不去利用这种能为整个过程的理解带来重大领悟的语言。

——

将演化的搜索问题形象化的一个方法就是利用适应度景观。想法就是,对于特定环境中的任何一个基因组,我们都可以向它赋予一个被称为“适应度”的数值。这个数值刻画了基于这个基因组的生物个体有多大可能在这个环境中成功繁殖。我们可以将适应度形象化为一个连绵起伏的景观,有山有谷,其中扮演“空间方向”角色的是每个基因可以取的不同形式,而扮演“高度”的是适应度(当我们实际绘画适应度景观的时候,我们往往只同时考虑一两个基因,但在头脑深处你应该记得,实际上我们在考虑的是一个25000维的空间,每个基因一个维度)。高适应性的山峰对应的基因组产生的生物个体很有可能成功繁衍(后代越多越好),而低适应性的山谷就是那些不大可能有下一代的基因组。

我们可以将演化看成将种群一点一点向适应度景观的高处慢慢推动的过程,其中偏向于那些能产生更适应个体的基因。当然这只是简化。不存在某个固定的适应度景观能适用于所有物种在所有时间中的所有情景;我们至多能考虑某个固定环境中的一个特定的种群。景观的形状依赖于环境的所有性质。其他物种来了又去,物理环境同样变迁,所以景观会随着时间变化。但环境中的某些方面可以在足够长的时期保持相当的稳定,使得固定的景观可以成为一个有用的隐喻,用于可视化整个过程。

生物学家对世界的看法与物理学家不同。景观的概念在物理中同样有出现,比如说考虑某个系统在给定的温度和压力下最终会达到的状态。但在头脑深处,物理学家总是在考虑一个在山丘上滚动的球。于是景观中被偏好的点就是被绘制函数(通常是能量)的最小值,因为球会向下滚。生物学家想的是狡猾的雪羊,或者是一群在玩“占山为王”游戏[16]的孩子。对于他们来说,景观中备受偏好的点是那些适应度的最大值。

以下就是演化在适应度景观中进行搜索并寻找更高山峰的方法。我们有一个属于某个物种的种群,于是它们占据了景观中一组相近的点。个体出生,运气好也许能繁衍,然后死亡。它们后代的基因组会稍有不同,所以他们位于景观中的另一个地方——不太远,但与之前的位置也不完全相同。在斜坡上位于较低点的个体比那些位置较高的更不可能繁殖。随着世代更替,种群会发现自身逐渐向高处移动。

我们绘制的是二维的图,但实际上基因的数量的确可能非常大,所以一个种群在景观上爬升可能需要成年累月的时间。物种可能永远不会达到单个山丘的顶端,更不要说附近最高的山峰了,尽管个别性状也许能做到这一点。景观的某些部分可能相对平坦,在那里不同基因组的适应度并没有太大不同,而遗传漂变在那里可能是演化的主要特色。更现实的写照应该是随时间变化的景观,因为环境的物理和生物特征都会持续变化。这种情况下,不可能就那样找到山丘的顶端并待在那里;今天的最大值可能就是明天的山谷。

最后,演化的算法在任何意义上都无法保证能找到可能的最好结果。绝大多数变化都很微小,只能让我们探索景观附近的点。偶尔也会有罕见的突变会让我们能从一个山顶跳到另一个山顶,但也只限于附近的山峰。就像旅游推销员问题那样,寻找到一个足够好的解对于任何实用目的来说用处就已经非常大了。

——

演化采取的搜索过程效率相当不错,以至于在现实中人类程序员也常常使用类似的过程去发展他们自己的策略。这就是被称为遗传算法的技巧。就像基因组那样,至少是在某个固定的计算机语言中,我们可以想象长度一定的所有可能的算法组成的集合。它们数量很多,从原则上来说我们希望知道哪一个能最好地解决某个特定的问题。除了充当适应度景观的函数由程序员指定以外,遗传算法这个方法就像自然选择。在生物学中这会被称为定向演化,这是为了强调它与自然选择的区别,在自然选择中的适应度景观是由自然决定的,没有任何特殊的目的。

从随机选出的算法开始,我们让这些算法去试着处理问题。选出其中做得最好的一部份,然后使它们“突变”,还可以让它们与其他成功的算法混合。将不成功的策略丢弃,然后重复整个过程。我们考虑的算法种群会在相关的适应度景观上逐渐向上爬,适应度的定义是每个策略在寻找问题的优秀解答上做得有多好(这基本等价于巴特尔和绍斯塔克在寻找能作为催化剂的RNA构型时所做的事情)。[17]

遗传算法很好地阐明了演化作为策略发明者的一些有趣特点。其中一个例子是计算机科学家梅拉妮·米切尔(Melanie Mitchell)提出的。她让我们考虑一个名为罗比(Robby)的虚拟机器人,它生活在一个简单的世界中,就是一个十乘十的网格。罗比昨天晚上举办了一场聚会,现在网格四处散落着空罐。罗比想尽快把它们打扫干净,效率越高越好,因为可用的时间有限。我们的任务就是发明一个策略——一套说明在每一步应该做什么的明确指示——能让机器人罗比捡起网格上的所有空罐。

你可能会认为罗比可以就这样从一个空罐走到另一个,而挑战在于找到最短的路径。但罗比担负着两个明显的障碍,可能是因为昨天晚上玩得有点太过火了。首先,它看不到很远的地方。站在任何一个方格上,罗比可以看到它自己所处方格上有没有空罐,也能看到在东南西北四个方向紧挨的方格上有没有空罐。但这就是它能看到的全部东西了,它看不到斜对角上有没有空罐,更不要说更远的方格了。

图左为机器人罗比的世界:一个方形网格,有些格子是空的,有些上面有空罐。阴影代表罗比的视野。图右是罗比位于一个有空罐的格子上的情况,附近还有数个空罐

你的下一个想法就是罗比应该进行某种有规律的行走,系统性地搜索整个网格,捡起看见的每个空罐。但还有第二个障碍:罗比不能保留任何记忆。它不知道它到过什么地方,捡起过什么空罐,也不知道它上一步做了什么。它的策略只能告诉它面对当前的情况下一步必须做什么,其中不能包括任何类似“向东走,然后下一步向南走”的指令,因为这包括了连续两步。

在这些限制下,很容易直接枚举罗比可以遵循的所有可能策略。它只认识5个方格:自己身处的方格,还有四个方向上的相邻方格。每个方格都可能处于3种状态之中:空的、上面有空罐或者在墙的另一面(无法到达)。罗比的“状态”是它所知的5个方格上都有什么的一个列表:一共有35=243种状态。它能采取的可能行动有7种:他可以捡起一个空罐(如果有的话),可以沿着四个方向中的一个移动,可以随机移动,也可以待在那里什么也不干。

罗比的一个策略就是一个清单,其中对于243种状态中的每一个都明确规定7种动作中的一种。可能策略的总数就是7243,或者说大概是10205。你不会单纯为了找到最好的可能性而去尝试每一种策略。

你可以尝试用更聪明的做法,设计一个你觉得会很好地完成工作的策略。米切尔这样做了,选择了一个算得上“不错,即使不一定最好”的策略作为基线策略。方法很简单:如果罗比站在一个有空罐的方格上,那么捡起它。否则,看看相邻的四个方格上有没有空罐。如果有一个空罐的话,就沿着相应的方向移动。如果没有的话,就沿着随机方向移动。如果有多于一个空罐的话,就向预先给定的方向移动。我们把这个策略叫作“基准策略”。与预期相符,基准策略证明了自身可以相当好地完成工作;在大量的测试中,它往往能取得全部分数的69%。

或者我们可以从自然的方法中获得灵感,用定向演化的方法来演化出一个策略。罗比的一个特定策略就像DNA螺旋中核苷酸的特定序列,是一个携带信息的离散序列。我们可以人为地让它进行演化,一开始从数个随机选择的策略出发,让它们运行一段时间,然后挑选出其中做得最好的。然后我们将每个生存者复制几份,通过随机更改每个策略在几个特定状态上的规定动作来使每个复制品“产生突变”,甚至可以通过将不同策略分成几份;然后与其他策略粘贴在一起来模拟有性生殖。这个过程会令人想到生物演化。它能找到罗比的一个策略,比那个设计出来的“不错的”策略更好吗?

它做得到。演化轻易就能找到比设计更好的解答。仅仅在250代之后,计算机做得就跟基准策略一样好了,而在1000代之后,它几乎能得到全部分数的97%。

在遗传算法进行演化之后,我们可以回过头看看它干了些什么,试着搞明白是什么让它如此高效。这一点麻烦的逆向工程在现实世界中越来越有挑战性。许多有用的计算机程序是依据遗传算法构筑的算法来运转的,“没有人类程序员真正理解它们”的这个想法很可怕。幸而罗比在选择上的限制足够多,我们可以尝试搞清楚到底发生了什么。

罗比的最优策略比起基准策略在数个方面有着巧妙的改进。考虑这样的情况,罗比站在包含空罐的方格上,而东面和西面的方格都包含空罐。基准策略很自然会让罗比捡起空罐。但想一下接下来会发生什么:罗比会向东面或者西面移动,这样就会失去对另一个方向空罐的记忆。遗传算法尽管仅仅由随机变化和选择组成,却“理解了这一点”,得到了更好的策略。当罗比处于一行3个空罐的中间时,它不会捡起身处方格上的空罐;它会向东或者向西移动,直到到达这堆空罐的边沿,只有这时它才开始捡起空罐。然后,它很自然地返回空罐堆中,收集起路上的空罐。这一点与别的巧妙设计结合起来,最终效率要比设计出来的“显然的”基准策略高出许多。

演化不总比设计好。一个全知的设计者可以每一次都找到最好的策略。要点在于自然选择,或者这个案例中的定向演化,是一个相当好的搜索策略。它不一定能找到最好的解答,但经常能找到令人折服的巧妙解答。

——

尽管演化能出色地搜索复杂高维的适应度景观,但也有些它搜索不到的地方。考虑这样的景观,它拥有一个非常高的山峰,而与之相隔一个辽阔平原的则是一组起伏不平的山丘。现在想想有一个种群,它的基因组都在山丘之中。微小变化和自然选择的过程会让这个物种探索山丘的周边,寻找能够达到的最高点。但只要种群基因组中的变化一直很微小,所有这些个体都会留在山丘群中。所有个体都没有理由走上悠长而没有奖赏的跋涉,穿过平原去到达偏远的山峰。演化无法通过观察基因组空间的全局来找出更好的答案;它的行动是局部的,先进行随机的改变,然后(通过繁衍)评估相应的改变在目前情况下的优劣。

一个适应度景观,其中有一个自然选择难以找到的孤立山峰

无法在某个问题冗长的可能选项列表中找到孤立的解答,这并不是演化独有的问题。几乎所有有效的搜索策略都尝试利用可能选项列表中的结构——比如说在适应度景观上相近的点也拥有相仿的适应度这个事实——而不是盲目去扫描每个选项。然而,这有可能成为自然选择作为正确的物种演化理论在经验上的一道障碍。如果有人能证明某个特定个体的基因组在身处环境定义的景观中拥有很高的适应度,但却不能被演化所用的策略“找到”的话,这就会降低我们对达尔文理论的置信度。

给定任一特定的基因组,我们怎么知道它是不是适应度景观中的一个孤峰?这样的孤峰几乎必然存在,尽管可能没有第一印象中那么多。当我们绘制二维的景观时,孤峰几乎不可避免,但如果背景空间的维度非常高(就像人类大约有25000个基因那样),从一个山峰到另一个山峰的路径可能会多得多。

迈克尔·比希(Michael Behe)提出了一个疑似标准,用于判定不能在演化中产生的基因组,他是自然选择的批评者,也是智能设计的辩护者。在证明某些组织不可能通过传统的达尔文演化而出现的尝试中,比希提出了“不可约化复杂度”这个概念。在比希的定义中,一个不可约化复杂系统的运作包含着数个互相影响的部分,它们拥有一个性质,就是每个部分对于系统的运作来说都是不可或缺的。他的想法就是,某些系统由一些紧密勾连的部分组成,它们不可能逐渐形成,而是必须在同一时间一起出现。这不是我们会预期在演化中看到的事情。

复杂老鼠夹的逐步演化,由约翰·麦克唐纳设计。老鼠夹一开始只是一根被碰到就会突然夹上的铁丝。在一系列步骤中,它加入了如下内容:一个弹簧、某种诱饵、卧倒放置、附加平台、更长的“锤”、一根绊线、扣住绊线的铁环、更短的弹簧线、比之前还短的弹簧线、另一个夹住绊线的扣件、锤和弹簧的分离、最后是用于触发陷阱的另一个更复杂的扣件

问题在于不可约化复杂度这个性质并不能轻易测量。为了阐述这个概念,比希提到了一个普通的老鼠夹,上面有一个弹簧装置、一个擒纵杠杆等装置。他论证道,去掉其中无论任何一部分,整个老鼠夹就没用了;它必须是被设计出来的,而不是通过单独看来都有益的微小改变而逐步构建起来的。

你大概猜到了之后发生的事情。至少有两个不同的人[约翰·麦克唐纳(John McDonald)和亚历克斯·菲代利布斯(Alex Fidelibus)]展示了老鼠夹可能走过的“演化路径”。他们创造了一系列老鼠夹的设计,一开始非常简单,逐渐变得更为复杂。每一步都比前一步做得更好,尽管只相差一个微小的变化,而最后的一步确实是现代的老鼠夹。而在伤口上再撒上一把盐就是约阿希姆·达格(Joachim Dagg),他调查了真实的老鼠夹在长年累月中是如何变化的,证明了(尽管来自设计)它们也是逐渐演化而来,并非一蹴而就。用达格的话来说,“演化的所有先决条件(变化、传递和选择)在老鼠夹种群中无处不在。”

——

不可约化复杂度反映了许多人对演化怀有的一种深切的担心:我们在生物圈中找到的那些特有的生物看起来太像是设计出来的,以至于不可能由“随机运气加选择”产生。

这种确信的其中一个版本可以追溯到创造钟表匠比喻的威廉·佩利。佩利的写作早于达尔文登场,但他花了不少心思去尝试反驳任何像达尔文那样会否认上帝在世界复杂性的解释中占有中心地位的思想者。他最喜爱的例子是眼睛。“眼睛”这个词在佩利的《自然神学:或神性存在和属性的证据,从自然征象收集而来》(Natural Theology:or, Evidences of the Existence and Attributes of the Deity, Collected from the Appearances of Nature)中出现了超过两百次。需要协同工作的众多部件、眼睛完成赋予它的任务时无可争议的有效性、身体尝试保护和维持它眼睛的努力——对于佩利来说,这些事情强烈地诉说了眼睛意味着“智慧创造者的必然性”这个观点。

但眼睛不仅能用自然选择来解释;它们似乎在生命史上独立演化出来了十数次。眼睛的可能发展路径并不难追踪。对光子的吸收是生命个体进行的最基本的活动之一。这项能力可以聚集在对光子敏感的团块中,或者说是“眼点”,甚至在某些单细胞生物中也能找到它们。如果一个生物个体能够感知光线,那么获得对光线来源方位的感知就可能带来好处。得到这个能力的一种简单方法就是将眼点藏在一个杯状凹陷中,就像在某些扁形动物中能看到的那样。将这个杯状凹陷加深到差不多圆形的开口,就会让生物个体能够采用某种原始的透镜,类似于针孔相机。我们在某些现代的软体动物身上也能发现这种眼睛。将这个眼洞用透明的流体填充起来能帮助达到保护和聚焦的功能。这一路上的许多步骤都不会一蹴而就。通常演化可以借用生物个体中其他功能中的机制,这些机制是为了不同的原因而出现的。

你大概懂了——眼睛不仅能够分阶段发展出来,每个阶段有着逐渐增长的复杂度和适应度,而且我们在今天存活的真正生物中能够确实看到这样的发展。而人类的眼睛尽管奇妙,但也有明明白白的缺陷。这些缺陷对于一个有才华的设计者来说不可饶恕,但在演化的角度下却完全合理。将视觉信息传输到大脑的神经纤维无缘无故处于我们的视网膜之前而不是之后。章鱼眼睛的布局更好,视网膜在前,神经在后,于是章鱼不像人类那样有一个盲点。我们的解剖学反映了我们演化历史中的偶然事件。

上一章 封面 书架 下一章