Blow的游戏设计哲学有一个目标:去促成一种超越人类设计能力的、能够让作者自己都感到眼前一亮的前所未有的认知对象的产生和进入视野。
为什么复杂性能够产生新的、不可预测的事物?复杂性究竟是什么?
这是一个非常引人入胜的问题。今天要向对这个问题感兴趣的小伙伴们推荐一本很赞的复杂性理论科普书:由侯世达(GEB的作者)的学生梅拉妮·米歇尔(Melanie Mitchell)所著的《Complexity: A Guided Tour》(中文译名《复杂》)。
这本书以昆虫群落、大脑、免疫系统、经济、万维网等例子引出了“复杂系统‘的概念,以“整体大于部分之和”这个基本的认知为出发点,从动力学、混沌理论、信息论、生物学和计算机科学等学科的角度去刻画复杂系统,最后谈到对复杂系统研究的未来展望,以及这门渗透各个学科的共同现象对人类知识结构意味着什么,过程中提及大量生动有趣的例子,是复杂系统理论的一本非常好的入门书。
这本书已经有湖南科学技术出版社出版的中译本,翻译得已经比较平实易懂,因此我并不打算为它写特别详尽的读书笔记。不过我打算在这篇文章中对它做一个简略的导读,希望能引起大家阅读原文的兴趣。
书中介绍了来自各个不同领域的复杂系统的例子,既包括自然界的、也包括人工的复杂系统。
昆虫群落 是一个在很多关于复杂性和涌现的语境下都会出现的例子,尤其是蚂蚁的例子:每一只蚂蚁都只是在按照本能、被体内和体外的化学物质以及写死在基因中的程序驱动着去行动。如同生物学家弗兰克斯(Nigel Franks)所说的,“单只行军蚁是行为最简单的生物,如果将100只行军蚁放在一个平面上,它们会不断往外绕圈直到体力耗尽死去”。
然而,上百万只行军蚁放到一起成为一个群体之后,却形成了非常惊人的“集体智能(collective intelligence)——它们极其聪明地捕食猎物,修筑了结构巧夺天工的蚁巢,甚至还形成了复杂的社会结构。而没有一只蚂蚁在领导这个群体,也没有任何一只单独的蚂蚁知道这整个蚂蚁群体宏观上在做什么事情。人们甚至将这样的蚂蚁群体称为是一种“超生物(Superorganism)”。
从大量简单的生物结构中似乎涌现出了一个前后一致的“单一意志”的现象,甚至让人联想到意识如何从物质结构中产生出来的问题。
而 大脑 就是这样一个或许孕育出了“意识”的一堆简单结构的集合体。就像一群蚂蚁一样,大脑也由非常简单的个体——神经元——组成。就像单只蚂蚁只能跟它附近的几只蚂蚁通过简单的化学信号进行通讯,每个神经元也只能跟它相联结的神经元通过神经递质进行局部性的通讯,信号的内容也只有简单的激活或者未激活。而这样一些按照很简单的规则运作的神经元,在组成了规模庞大的神经网络之后所能够展现出的那些惊人的丰富多彩的智能行为,相信作为人类的我们都很清楚。
免疫系统 是另一个人体中的例子。免疫系统由几种不同类型的免疫细胞组成,如淋巴细胞、B细胞和T细胞等等。这些细胞分布在身体各处,同样是在没有中央控制的情况下,各自被化学信号(比如抗原和抗体)驱使着按照简单的规则行动。然而我们却能够感觉到免疫系统整体上的行为一致性,让我们可以谈论说身体“知道”环境中存在何种威胁、身体“记住了”一种曾经入侵过的病毒。而不论是“知道”环境中的威胁,还是“记住”曾经入侵过的病毒,都不是能够在单个免疫细胞的层面上找到对应物的概念。
在更大的尺度上,由大量的个人(和公司)所组成的 市场 这个经济系统也是一个复杂系统。经济系统中的个体所能进行的操作也很简单,基本可以归结为购买和出售。然而即使我们知晓一个地区每一个个人和公司的购买和出售行为,我们也很难预测整个市场的行为。整个市场仿佛有一种不存在于任何个体参与者之中的自组织能力——被亚当·斯密称作是“看不见的手”。
有的人可能会怀疑,我们怎么能确定这些系统的复杂行为是在群体的层面“涌现”出来的呢?有没有可能只是因为我们并没有把组成这些系统的个体行为研究透彻呢?这样的质疑尤其可以在有关意识起源的问题中看到。
这样的质疑在一定程度上,可以通过用计算机来构造“人工”复杂系统来回应。我们只需要编写简单的程序来模拟个体的行为,再让大量这样的简单程序相互作用。与自然事物不同,这些个体都是人为设计的程序,因此不存在没有研究透彻的可能。而尽管如此,我们仍然能够在大量这样的个体的相互作用中,看到复杂而不可预测的现象产生。
元胞自动机(Cellular Automata) 是一个非常经典的人工复杂系统的例子。它本质上是一个理想化的数学模型,最初由著名的计算机科学家冯·诺伊曼(John von Neumann)为了解释生命自我繁殖机制而提出。元胞自动机提出具有离散状态(比如生和死等)的“元胞”概念,作为自然界中细胞的抽象。这些元胞分布在同样离散的空间中,各自只跟邻接的其他元胞有相互作用,相互作用的方式遵循非常简单的演化规则(通常几句话就能讲清楚)。
康威的生命游戏(Game of Life)可能是元胞自动机的一个最为人所熟知的例子。其中元胞分布在二维平面上的方格中,每个元胞只有生或死两种状态,演化规则如下:
如果前一回合该细胞为存活状态,且与它临接的细胞少于两个,则该回合该细胞变为死亡状态(模拟个体因为太孤单而死去)
如果前一回合该细胞为存活状态,且与它邻接的细胞多于三个,则该回合该细胞变为死亡状态(模拟个体因为资源匮乏而死去)
如果前一回合该细胞为存活状态,且与它邻接的细胞有两个或三个,则该回合该细胞保持存活状态
如果前一回合该细胞为死亡状态,且与它邻接的细胞有三个,则该回合该细胞变为存活状态(模拟个体的繁殖)
上述几条简单的演化规则演化出了极其复杂、丰富而不可预测的元胞分布形态。
很多博弈论中建立的理论模型也可以是人工复杂系统的例子。比如为了研究经典的 囚徒困境(Prisoner’s Dilemma) 而建立的数学模型中,有两个玩家,每个回合各个玩家可以选择是合作还是背叛,根据两个玩家的选择组合,每个玩家能得到或者失去一定的分数。
在最经典的版本中,如果两个玩家都选择合作,则两个玩家都得到2分;如果一方选择合作另一方选择背叛,则背叛的一方得到3分,合作的一方被扣掉1分;如果双方都选择背叛,双方的分数都保持不变。
尽管规则很简单,但是当我们将这个规则实施数量庞大的回合数,并考虑多轮游戏、多种选择策略时,除非我们一步一步地去模拟某种博弈策略,否则很难预测它的结果,尤其是当我们在经典版本的基础上修改每种情况下双方的具体得分时。比如,仅仅只是将双方都合作时的得分从2分变成3分,就会导致获胜策略完全发生变化。
上面所介绍的这些复杂系统都具有一些共同特征。这些共同特征帮助我们建立起一般意义上的复杂系统的概念。
复杂的集体行为 :大量遵循简单规则的个体在没有任何中央控制的情况下组成的集体,产生出了不断变化且难以预测的行为模式。
信号和信息处理 :这些系统会利用来自内部和外部的信号,也会产生信号。
适应性 :这些系统具有某种“学习”或者“进化”过程,使得它们能够改变自身行为来适应环境。
作者提出一个复杂系统的定义:复杂系统是有大量组分组成的网络,不存在中央控制,通过简单的运作规则产生出复杂的集体行为和复杂的信息处理,并通过学习和进化产生适应性。
由于这样的系统在没有内部或外部的控制者的情况下产生了有组织的行为,我们将之称为自组织系统(Self-organizing System)。由于简单规则以难以预测的方式产生出复杂行为,这种系统的宏观行为有时也成为涌现(Emergent)。
因此复杂系统的另一个定义就是:具有涌现和自组织行为的系统。
自然界存在多种多样的系统,科学研究的一个很重要的目标就是能够对这些系统的行为做出预测。比如说,在物理学领域,从最早的亚里士多德关于物体需要受力才会移动的洞见,到伽利略开始在研究中引入用实验验证假说的方法,再到牛顿真正创建出了一套成系统的描述运动和变化的理论,科学越来越给人们一种预测自然现象的信心。数学家拉普拉斯曾断言,根据牛顿定律,只要知道宇宙中所有粒子的当前位置的速度,原则上就有可能预测宇宙在任何时刻的情况。
然而,20世纪出现的量子力学打破了这个精确预测的梦想。1927年海森堡(Heisenberg)所提出的“测不准原理”,证明了不可能同时准确测量粒子的位置和动量——对位置知道得越精确,关于动量的信息就会越模糊,反之亦然。
之后人们又发现了混沌系统,更彻底地颠覆了人们的决定论认知。人们发现有一些系统,对于其中初始位置和动量的测量只要有一点点的不精确——哪怕是极其微小的不精确——也会导致继而产生的对它的长期预测有巨大的误差。也就是说,对这类系统的预测对初始条件具有极度的敏感性。
作者举了一个逻辑斯蒂映射(Logistic Map)的例子来说明这种对初始条件的极度敏感性。逻辑斯蒂映射是最开始用于模拟生物种群的繁殖,同时也是简单的非线性方程产生混沌现象的一个经典的例子。假设x_t是当前种群的承载率(也就是当前个体数量占最大可承载数量的比率),x_t+1是一步繁殖后种群的承载率,将出生率和死亡率的效应合并成一个常数R,则种群规模的递推式可以简化为
抛开这个式子所表示的那些含义,这个式子本身看起来非常简单,但它却是引领人们通向混沌的一道大门。这个式子最不可思议的地方就在于,单纯修改最初的承载率x_0和常数R,哪怕只是做一个极其微小的修改,就会使得函数的曲线发生彻彻底底的变化。这种对参数的极度敏感性,使得我们几乎不可能去测量和预测遵循这样的式子的系统。
首先,如果R=2,x_t都会随着t的增大而趋近0.5并最后停留在0.5,随着x_0的不同,到达0.5之前的过程会有所不同。
如果修改R成为2.5,我们还是会得到非常类似的现象,只不过最后的不动点(fixed point)从0.5变成了0.6。这让我们猜测是否这个函数的图线一直都是一番震荡后停留在某个不动点的形式,由R的值来控制这个不动点的位置。
然而,如果我们把R变成3.1,我们却发现这条曲线变得完全不一样了:
它不再拥有一个最终停留的不动点,而是开始在两个数字之间无尽地振荡下去。
这种无限振荡的图线一直持续到R约等于3.4的时候,之后再稍微增加R的值,哪怕只是变成3.40000001,图线都会变成是在四个值之间周期振荡。
而当R值大于3.54,小于3.55的时候,振荡的周期又倍增成为8个数值。当R值在3.564和3.565之间时又倍增为16个数值,在3.5687和3.5688之间又倍增为32个数值。我们看到,这个周期倍增的间隔越来越小。
直到R等于约3.569946时,周期振荡的现象消失了,或者换句话说,振荡的周期变成了无穷,x的值“陷入混沌”。在这种混沌状态下,即使我们选择极其相似的两个x0值(比如0.2和0.200000000001),然后使用这条公式演化出后续的xt,这两个x_0值形成的演化轨道都会是截然不同的。而且R值越大,这些轨道之间的差别也越大。
当R=4.0时,这条曲线看起来已经完全没有规律了。x值在很小的时间间隔之间发生突变,以至于看起来根本不像是跟之前的x值有任何关联。简直就是随机的。通过测量x的初始值来预测某一个时间t时的x值,也成为根本不可能的事情。随着R值的增大,随机性越来越明显。
这是一个惊人的现象。因为这条图线来自一条完全没有任何不确定性的递推式,却展现出了随机性。也就是说,表面上的随机可以来自非常简单的确定性系统。而随着R值从小到大,曲线的振动周期不断倍增,最后成为无穷,也被称为是“通往混沌的倍周期之路”。
人们用“混沌”一词来描述具有随机性和不可预测性的系统。而混沌系统的存在向人们展示,即使是没有任何外部随机源的完全确定的系统,也可能产生不可预测的行为。
热力学第二定律表示,在没有外界干扰的情况下,系统的自然倾向应该是向增熵方向发展。我们能够理解外力使得一个系统“被动地”减熵。但复杂系统却能够“主动地”向外界摄取能量来使自己减熵(比如动物会进食),这样的自组织行为是如何可能的?
复杂系统的自组织现象,与“信息”的概念紧密相关。在简单的物理现象中,我们很难找到“信息”概念的对应物,简单系统的行为也很难与“信息处理”相联系。而一旦当系统复杂到了一定程度,信息和信息处理的现象就开始神奇地出现,比如将遗传信息记录在DNA中的生物进化过程、能记忆某种病毒入侵的免疫系统。甚至可以说,复杂系统正是通过信息的处理来实现自组织。
在我们通常的认知中,信息的处理是一个跟传统意义上的物理过程(比如将小球推下斜坡)截然不同的过程,后者实实在在地消耗了能量做了功,而前者呢?信息的处理好像很难跟做功的概念联系起来,也很难去谈论信息处理本身所消耗的能量。
如果我们认为信息的处理本身不需要消耗能量,那么就会出现著名的“麦克斯韦妖(Maxwell’s Demon)”的悖论。“麦克斯韦妖”是挑战热力学第二定律的一个思想实验:假设一个绝热容器被分成相同的两格,中间有一扇门,由一个小妖控制;分子在容器中随机移动,小妖只要看到速度快的分子,就只让它通过到右边的格子,看到速度慢的分子,就只让它通过到左边的格子。这样经过足够长的时间,右边的格子全是速度快的分子,左边的格子全是速度慢的分子。而由于热现象的本质是分子的移动速度,右边的格子就比左边的格子热,形成了温差。这个温差又可以用来做功,这就好像凭空生出了能量。
将信息和做功这两个概念联系起来的关键是“熵(Entropy)”的概念。一方面,熵是对不能转化成功的能量的度量(比如推车过程中不能成功转化为车的动能的推车者体内的能量)。而另一方面,熵也是对一个系统所包含的“信息量”的度量,即数学家香农(Claude Shannon)所提出的“信息熵”的概念。
该如何理解熵作为一种信息量的度量?这里的关键是统计力学。统计力学在大约十九世纪末二十世纪初的时候发展出来,认为宏观尺度上的属性(比如“热”)的是由微观尺度上的属性(比如分子运动的速度)产生出来的。因此宏观尺度上的属性本质上就是一种统计属性。一种宏观状态可以对应很多微观状态。当一种宏观状态对应大量微观状态时(比如房间里的分子基本均匀地分布),相较于对应微观状态较少的那些宏观状态(比如房间里的分子全部集中在一个位置附近),它发生的概率就高得多,这样的宏观状态也就更稳定——换句话说,这样的系统熵值就较高。
而另一方面,从信息的角度来看,当一个宏观状态对应的微观状态非常多时,它能给我们提供的关于微观状态的信息也越少(因为在这个状态下有大量微观状态都无法区分开来),这就像是当我们问一个人:“今天外面天气怎样?”对方只是含糊的回答“一般”——因为能用“一般”来形容的天气可能性实在太多了,我们还是不知道天气怎样;反过来如果一个宏观状态对应的微观状态非常少,那它就提供了关于微观状态的更准确的信息。也就是说,熵值高的系统信息量低,熵值低的系统信息量高。
因此从统计力学的角度,熵的概念又被定义为“一个宏观状态所对应的微观状态的数量”。
于是热力学中的熵和统计力学中的熵的概念,神奇地相通了起来,如果我们接受这样的统一逻辑,那么就不得不得出这样的结论:使得信息熵减小的信息处理过程是要消耗能量的。
充斥在自然界的进化过程,就是一个典型的减熵过程:各种各样的物种在适应环境的过程中进化出愈发精巧而复杂的结构。沿用麦克斯韦妖这个思想实验中的设定,生物的遗传物质交换(Crossover)和DNA的变异(Mutation)就像是分子的随机移动,来提供无穷可能的微观状态;自然选择就像是控制门的小妖,通过杀死那些不能适应环境的生物来减少可能的微观状态的数量,最后在宏观上实现了减熵。
因此,熵的减少是自然选择的结果,该过程需要的能量来自生物从环境中获取的能量。
那么问题来了,我们有没有办法通过模仿自然进化的过程来实现一些能够自动减熵的人工系统?
于是在计算机科学界,人们提出了遗传算法(Genetic Algorithm)来实现这一思路。
遗传算法是面对庞大搜索空间时的一种搜索策略,模仿达尔文进化论所描述的生物进化过程,将搜索空间中的每一个可能的解都看作是一个生物个体,各自有独一无二的基因型(Genotype),在其作用下演化出各种各样的表现型(Phenotype);遗传算法进而引入适应函数(Fitness Function)来模拟生物界的优胜劣汰——适应函数是以个体的表现型为自变量的函数,遗传算法会选择出那些表现型代入适应函数之后取值较高的解,对这些解进行某种形式的“融合”得到下一代的解(模拟生物交配),再用适应函数去评估这些下一代的解,如此重复一定迭代次数之后,将最新一代的解看作是目前计算资源下能找到的近似最优解。
在《复杂》一书中,作者提到一个遗传算法的小实验:一个二维的平面划分成棋盘一样的格子,一个机器人最开始在棋盘最左上角的格子上,它每回合可以移动到一个相邻的格子。棋盘上有些格子上会有易拉罐,机器人要尽可能捡走这些易拉罐,捡的越多得分越高。如果移动中撞到了墙、或者在一个没有易拉罐的格子执行捡易拉罐的动作,就会被扣分。机器人只能看到它周围的4个格子,并且最多行动200个回合。
什么样的行动策略能得到最高分?这不是一个显而易见的问题,关键在于机器人看不到整个棋盘,就可能会对视野之外的情况预测错误而浪费掉回合数。
作者一开始人为设计了一个简单的策略:如果当前格子有易拉罐就捡起来;如果旁边格子有易拉罐就移过去;否则就随便选择一个不会撞墙的方向移动。这个策略在10000次清扫易拉罐任务的模拟测试中平均得分为346(最高分为500)。
接着,作者要使用遗传算法来进化出一个行动策略。一个行动策略的本质是一个表格:每一行对应机器人视野中易拉罐分布的一种情况,以及这种情况下机器人应该采取什么样的行动。
用一串数字来编码这样的一个表格,就成为了一个策略的“基因(Genotype)”,再使用这个策略执行2000次清扫易拉罐任务计算出平均得分,就成为这个策略的适应函数值。接着我们选出适应函数值较高的一批策略进行“交配”,并允许交配过程中子代的基因有一定几率发生局部的随机突变,生成下一代的策略,如此重复下去。
作者以200个随机策略作为第一代,产生了1000代的策略。最年轻的一代策略,在10000次清扫任务中的平均得分竟然能达到483分——远远超过作者人为设计的策略的346分。这是怎么做到的呢?
通过观察这个策略的行为,我们发现很有趣的几点:首先,这个策略会“系统性地”探索整个棋盘,它会首先绕着棋盘移动,一步一步缩小绕圈的大小,就比随机移动的效率高多了。另外还有一个有趣的现象,这个策略在到达一个有易拉罐的格子时,有时候竟然不会去捡这个易拉罐,而是把这个易拉罐当作“路标”,提醒它自己已经知道了这一片是有易拉罐可捡的,方便一次性回收,避免重复探索。
从200个完全随机的策略开始,经过这个人工模拟的进化过程,我们得到了甚至比人为设计的策略还要精巧而更有城府的策略,这无疑是令人震撼的。这也意味着进化的机制本身就可以是我们所看到的种种生命的奇迹的来源,而无关乎进化的对象是碳基还是硅基。
值得注意的另一点是,尽管我们通过观察进化出的策略,从大量清扫任务的实际表现中发现他们平均分很高,这种“有效性”也仍然是统计意义上的——我们没办法看着这些策略的基因编码,即每种可能的视野内容下的行动,去严格地证明它不管面对什么样的棋盘都能比其他策略表现更好。我们也没法对着它们的编码,指出哪部分编码对应着“系统性地探索棋盘”、哪部分编码对应着“使用易拉罐来做标记”。不论是“系统性地探索棋盘”、还是“使用易拉罐来做标记”,都是所有行为规则进行复杂的相互作用后产生的结果,就像是生命游戏中所演化出的“滑翔机”一样,没有办法在基因编码中埋下能看作是“设计蓝图”的信息。
在考察了大量的复杂系统之后,作为科学性地研究复杂系统的第一步,有没有可能建立一种统一的方法,来量化地描述一个系统有多复杂?让我们能够客观的去回答诸如“人类大脑比蚂蚁的大脑更复杂吗”、“人类基因组比酵母的基因组更复杂吗”这类问题,而不是只是凭感觉给出一个似乎显而易见的答案。
这个复杂性的量化指标的建立极其困难,因为它涉及到要在这些横跨大量极其不同的学科的复杂系统中找到共性和本质。直到现在我们都还没有得到一个能得到信服的答案。但从大方向来看,似乎可以从三个方面着手:
描述这个系统有多困难?
产生这个系统有多困难?
系统的组织程度如何?
(来自物理学家劳埃德(Seth Lloyd)2001年发表的文章)
作者也列举了一些尝试,比如用系统的信息熵、用算法的复杂度、用理解这个系统所需要的信息处理量、用构造这个系统所需要的热力源和信息源的总量、用统计上预测这个系统将来的行为所需要的最小信息量等等等等来度量复杂性。这些度量方式都似乎在某些方面存在一些问题。
为复杂性寻找一个统一的度量标准,还需要下一代科学家来完成。
甚至连一个度量标准都还没有找到的“复杂性”的概念,因此似乎就根本还没有成熟到能够被称为是一门科学的程度。连最基本的概念都没有一个清晰的定义,又如何开始着手去进行研究?诸如“复杂系统的共性是涌现”这样的陈述、似乎甚至都没办法去证伪,它又如何能够被看做是一种科学性的结论?
因此人们一度攻击复杂系统研究,比如1995年就有记者在《科学美国人》上发表文章,认为整个复杂系统研究是一种骗局(或者在中文语境下可以说是一种忽悠或者噱头)。
作者不同意这种观点,她认为复杂系统的研究仍然能够给人类对宇宙的理解带来新的启迪——而这才是科学研究真正的目标。至少到目前为止的有关复杂性的研究,让我们发现了许多我们原以为只属于某一个学科的概念,也能推广到其他看起来不相干的领域,比如信息和计算的概念能够被拓展到生命系统和社会系统、适应和进化的概念能够被拓展到生物王国以外、生命和智能的观念能够被拓展到计算机程序。复杂性研究至少给我们提供了一个能够统一地看待这些原本截然不同的领域的全新视角。
通过研究复杂性本身,我们能够提炼出一些跨学科的思想和工具,能够被应用到物理学、生物学、流行病学、社会学、政治学和计算机科学等截然不同的领域。
而另外一个更为基础的、旨在真正拓展人类认知边界的方向,是去寻求复杂性的解释和预测。就像是去寻求复杂性的一个量化度量标准那样,如何用更严格的方法刻画“自组织”和“涌现”这些大量出现在复杂系统语境下的概念?
作者将复杂性研究的现状称之为“等待卡诺”。卡诺是19世纪初的一位提出了一些热力学的关键数学概念的物理学家。同样,复杂性研究也在等待这样一个牛顿式的人物,克服词汇贫乏的现状,去为复杂性研究发现一种像微积分之于数学的革命性的概念体系。
一门新学科之所以为新学科,难道不正因为它没办法放到现有学科的套路和框架下吗?如果它不能推动着新一轮的科学研究分野重新洗牌,它又怎么能算是改变了人们看待和理解事物的视角呢?
复杂性研究还只处于非常初级的阶段,它呼吁着我们去超越主流科学。
上面我试图对《复杂》这本书做了一个简单的导读,主要详细介绍了我个人觉得比较有意思、且介绍起来相对容易的部分。原本只是打算写一篇1、2千字的短文,结果没想到又奔着1万字去了。
即使是这样也还有很多本文没有提到的内容:比如网络和图论、生物代谢的比例之谜、计算机领域的哥德尔不完备性定理和自复制图灵机、以及作者自己在博士论文中设计的类比程序,实际上也都非常有意思,强烈推荐感兴趣的读者阅读这本书。
评论区
共 3 条评论热门最新