第12章 复杂性的进化

复杂性可以定义吗?

对进化会导致复杂性不断增加的认识深深根植于西方文化。这出于一些很明显的理由,但科学对此的认识则是另一回事,并且依然没有解决。一方面是令人炫目的科技进步,以及生命从简单化学混合物到具有自我意识的人类的发展。这些例子表明有不可抗拒的驱动力使得事物越来越复杂。另一方面则是许多生物谱系在很长时期内复杂性并没有明显增加,实验也表明进化算法可以被设计成既能增加复杂性也能减少复杂性(第6章曾讨论)。在数百万年里都没有表现出明显变化的生物谱系的两个例子是蟑螂和马蹄蟹。寄生虫谱系则在进化中明显表现出形态复杂性的减少。

这些例子都利用了同样的复杂引擎计算策略,但有不同的表现形式,处于不同的环境中,运作不同的选择规则。显然,细节很重要。大量关于进化算法的研究提供了令人信服的证据,运作在计算机中的复杂引擎并不会一边倒地驱动复杂性;决定长期趋势的是系统的细节。有两个显然很重要的细节是变异产生的机制和具体的选择规则。复杂引擎在每一代出现的变体中进行选择,如果选择的范围受限,将来的结果也就会相应受限。极端条件下,如果完全没有变化产生,引擎就会一直维持现状。如果变化来自有限的可能集,引擎就会穷尽所有可能,并停留在可能的最佳组合,但如果变化不受限制,探索就不会有尽头。很小的随机变化就能有效地实现这一点。

选择的规则也很重要。进化算法通常会计算输出的一些属性,并根据最好的成绩选择下一代。这类算法产生的输出的复杂性既可以增加也可以减少,取决于如何度量和选择。简而言之,复杂性可以选择增加或是减少。

生物中的选择是基于繁殖的成功,并不涉及计算。繁殖的成功取决于内部因素、与环境的互动以及机遇。进化生物学家在理解生物复杂性的来源时遇到挑战是在生物特征、环境和复杂性度量之间找到令人信服的关联。如果复杂性能带来优势,进化当然会倾向于它,但难道复杂性就一定会带来优势?在社会的变革中也有类似的问题。更加复杂的社会组织比简单的组织具有哪些优势?就目前的认识水平来说,答案似乎依据文化的视角不同而不同。例如语言的复杂性就没有表现出必然的增加,而技术和经济的复杂性则至少在最近一段时期表现出了增长。抗体的产生则完全不同。当我们受到感染,产生的抗体会越来越适应抗原。复杂性似乎不是刻画这一点的合适方法,亲合力和选择性是更合适的度量。

在讨论中我是以一种非技术性的常识性的方式使用复杂性一词。我们直观上就能感觉到一些事物比另一些更复杂。但如果要深入探索进化与复杂性的关系,我们就需要仔细对这个词加以定义。如果我们认为有什么东西增加了,唯一能确证的方式就是进行度量。很显然人类要比变形虫复杂,苹果电脑也要比算盘复杂,而且不难找到符合这种观察的度量;但又应该如何比较苹果电脑与变形虫的复杂性,或是微生物群落与人类社会的复杂性呢?并不是说还没有发现对复杂性的度量方式。已经提出了很多方式,但还没有哪一种能抓住我们直觉认识到的复杂的全部方面。复杂性自身的意义本来就很复杂。

许多物理学家认为负熵是复杂性的合适度量。负熵是系统的熵与同一个系统处于平衡态时的熵(此时具有最大的可能熵)的差值。由于熵度量的是无序的程度,因此负熵就是对有序的度量。就此来说,一个信息体的负熵就是其携带的某种事物的“信息量”Christoph Adami, Charles Ofria,&Travis C. Collier.“Evolution of Biological Complexity,”in Proceedings of the National Academy of Sciences(2000)。这篇学术论文将复杂性定义等同为信息论的负熵,并证明这个量在特定的进化系统中增加。我反对这样使用复杂性一词,因为这样刻画的是特定系统与最优的距离,与通常的复杂性意义很不一样。。负熵定义的问题在于虽然有序和复杂性看似相似,却并不是同一回事。两个复杂性明显不同的系统可以具有同样的负熵。香农信息量与熵在数学上是等同的,而且就如我们在第1和第2章看到的,这种度量并没有抓住复杂对象的重要特征。用系统的最大熵减去实际熵并不能改变这一点。

复杂的事物必定由许多部分组成,并且各部分之间有许多相互作用,据此一些人提出应当区分“结构复杂性”与“功能复杂性”这里的结构和功能复杂性的区别引自:Francis Heylighen, The Growth of Structural and Functional Complexity During Evolution,收录在The Evolution of Complexity(1999)。海利戈恩对复杂性及其各种定义方式多有论述。。就好比一辆汽车与装着同一辆汽车拆解后的所有零件的大盒子。两者具有相同的结构复杂性,即由相同的部件组成,但部件之间的组合和作用方式不同。显然,组装好的机器在某方面比装着相同零件的盒子更复杂。因为功能正常的汽车能表现出一盒子零件不具有的行为。

结构复杂性的概念中包含了部件的数量、部件种类的数量以及结构尺度。尺度很重要。将圆珠笔拆开可以发现包括墨水在内的8个明显的部件,但笔还含有大量的原子。那么,在分析笔的复杂性时是不是应当考虑所有原子的位置呢?如果从笔上拿掉一个原子有没有问题?一般来说,在确定宏观事物的结构复杂性时,必须说明感兴趣的尺度,否则就会陷入不相关的原子和亚原子细节。

功能复杂性包含行为、对行为的控制以及时间尺度。尺度同样很重要。一些事物发生得太快或太慢,人类无法察觉。这些通常可以忽略,不会有负面效应,完全取决于我们对什么感兴趣。弗朗西斯·海利戈恩就曾强调,复杂性的评估总是相对于观察者同上。。这是因为所有观察者都有一个天然的尺度,而在给定的背景下,只有特定的方面才是重要的。

研究复杂性的另一个方法是考虑其反面,简单性。简单事物的部件更少,也许只有一两种部件,比如二进制字串中的0和1。当我们比较具有相同数量部件的事物,简单的倾向于重复,复杂的则较少这样。结构的组分可以像晶体中的原子那样在1维、2维或3维上重复,也可以像声音的模式一样随时间重复。同样,重复也可以是简单的或是复杂的。

物理学家用对称分析重复。一种很简单的对称是镜像对称:事物的一半就像另一半的镜像。要描述镜像对称,只需描述其中一半,并说明另一半是这一半的镜像。可能的对称的种类是有限的。一些简单的情形包括2重平移(就好像复印)、3重旋转(三角形)、随时间重复(波)。对称对于理解复杂性很重要,因为事物越对称,所需的描述就越少。6重对称比2重对称更容易描述,因为只需要描述1/6的细节。振荡器一遍又一遍重复相同的模式,但要描述这种行为只需要描述一次基本的重复。对称也可以叠加;例如一个事物可以同时表现为2重和5重对称。晶体既有平移对称也有旋转对称。从这个角度看,最复杂的事物表现出的对称也最少。

沿着这条思路推到极端,意味着气体这样的组分随机排列的事物是最复杂的。但气体不具有结构,而结构通常与复杂性相关联。避免这个尴尬局面的办法是认识到随机对称性。气体的任何一部分都与其他部分在统计上是一样的,因此当考虑统计平均特性时,气体高度对称,从而很简单。总结这条思路,复杂事物具有复杂的对称。我不认为这个定义作用很大。

计算理论提供了另一种分析复杂性的方式。在计算理论中的对象是0/1序列,这种对象并不是凭空出现的,它们是计算的结果。计算视角有一个优势是数字输入和输出具有明显的天然尺度。计算机操作0/1符号时底层的电子的行为,或者印在纸上的0/1序列的墨水分子显然与计算的意义无关。重要的是0和1,而不是它们是由什么构成的。数字计算的另一个概念优势在于输入和输出仅由0和1两种简单组分组成,研究这种系统比研究由许多不同种类的复杂组分组成的系统更简单。

计算机科学家有没有刻画0/1对象复杂性的方法呢?我们已经见到了一些。最简单的是数0和1的数量。第1章介绍的香农信息是基于概率,一般用于度量对象整体,但如果对象属于某个整体,而整体各部分又具有相同的概率,香农信息也可以用来刻画单个对象。计算的输入也可以视为输出的描述。从这个角度看,输出一个对象的最短输入的长度就度量了其最短描述。一个对象的完整描述必定需要以某种方式包含其复杂性;因此最短描述的长度必定是其复杂性的一个特征。这就是第2章介绍的算法复杂性也即柯尔莫哥洛夫复杂性背后的思想。没有内部关联,组分随机排列的对象的算法信息量最大。从人类对复杂性的判断来说,这是一个让人失望的结论。

长度、香农信息和算法信息都没有抓住对象复杂性的一个方面,就是从短输入计算输出对象的难度。复杂对象由许多部分组成,并且部分之间有许多关联;因此如果一个复杂对象是由短的输入计算得到,则组分及其关系就必须在计算过程中创造出来。一个有吸引力的思想是,创造的对象越复杂,所需的计算量也越多。

这自然引出一个问题:“计算量”到底是什么?在计算理论中,关键资源是时间和空间。空间是计算过程所需的内存(存储比特值的位置),时间是操作数据(在各种状态之间变化)以及在内存中存储和提取数据所需的指令周期数量。通常时间和空间(即内存)不可兼得。如果内存有限,计算也许仍然可以进行,但需要更多时间。反过来,经常可以通过增加内存用量来减少计算所需的时间。不过读写内存还是需要时间,因此即便内存空间不受限制,计算输出一个复杂的对象可能仍需花费很长时间。

这种复杂性定义所需的短输入确保了输出的细节没有简单罗列在输入中。通常在计算机科学中需要用短输入长时间计算出来的结构被认为是“深的”,可以用短输入很快计算出的结构则被认为是“浅的”。深度反映了对象中存在的内部关联的复杂性。关联越复杂,从没有包含它们的输入计算出包含它们的输出所需的时间就越长。正是从这个意义上深度提供了对象复杂性的一个特殊度量关于深度最重要的学术论文:Charles Bennett, Logical Depth and Physical Complexity,收录在The Universal Turing Machine:A Half Century Survey, Oxford University Press,1988。

计算理论的一个基本贡献是从数学上证明了存在可以想象,但不能在实践中用比其本身更短的输入计算出的对象。不能的原因有两个。一是所需的计算可能极长,以至于虽然可以写出生成特定长对象的短算法,所需的时间却要超过宇宙的存在时间。另外在考虑所有可能的对象时,长的要比短的多得多。这很容易理解。1比特长的对象只有2个(0和1),2比特长的对象有4个(00、01、10和11),3比特长的对象有8个,4比特长的对象有16个,以此类推。特定长度的字串数量随着长度增加呈指数增长(21,22,23,24,……)。在这个数字序列中,最后一项是前面所有项的总和。因此,可能的长输出的数量总是多于可能的短输入的数量,因此大部分长对象必然只能用至少等长的输入计算得到。

要计算任何特定的事物我们必须从适当的输入开始。问题是:如果能生成所期望输出的最短输入很长,如何才能找到这个输入?通常,在计算机科学中,要寻找某个东西必须进行搜索。可以设计程序搜索可能生成期望输出的输入。如果这样的搜索从很短的输入开始,逐项检验越来越长的输入,则需要检验的输入的数量会随输入长度呈指数增长。这意味着随着检验的输入长度增加,搜索会变慢。如果想逐项检验长输入,所需的搜索时间会很快超过宇宙的存在时间。这是一个坏消息,意味着长输入无法逐项检验;而且穷尽搜索还会引出另一个更基本的问题。一些输入会使得计算永不停止;计算机会一直运行下去。也许一些输入在计算很久后最终的确会产生输出。不幸的是,无法知道任意的一个正在进行的计算最终是会停下来,输出重要的结果,还是会一直计算下去直到永远。这就是所谓的停机问题,意思是即使搜索的时间不受限制,也不可能通过对长输入进行穷尽搜索找出所有能产生预定输出的输入。

总而言之,有一些问题存在最佳答案,但没办法找到。这似乎很怪异,但是可以证明。幸运的是,情形并没有看起来那样糟,因为总是有可能找到能很好完成任务的次优输入生成所期望的输出。这也就是为什么能写出可用的程序。

用深度(以及第2章介绍的算法信息量)刻画对象的一个主要问题是大部分度量这些属性的尝试都受困于停机问题。除了极简单的情形,人们永远无法确定特定输出的最短输入或最短计算能否被找到。在大部分情形中这些度量都只是近似。不过深度和算法信息量的概念对于理解复杂性还是很有用。