第十五章 人工進化

15.1湯姆·雷的電進化機

湯姆·雷剛把編寫好的小玩意兒放進計算機,它就迅速繁殖起來,直到幾百個副本佔滿了可用的儲存空間。雷的小玩意兒勉強算是個試驗性的計算機病毒,因為一旦離開他的計算機便不能再複製,所以它沒什麼危險。他只是想看看,如果病毒必須在一個有限空間裡互相競爭,會有什麼結果。

雷的世界設計得很巧妙,在病毒老祖宗數以千計的克隆品中,有大約10%在自我複製時發生了微小變異。最初那個傢伙是一個"80"----叫這個名字是因為它的編碼長度為80個位元組。有些80發生了一點隨機的變異,成了79或81。這些新病毒中的一些變種不久就接管了雷的虛擬世界。它們進而再變異出更多種類。病毒80幾乎被這迅速增長的新"物種"大軍逼到瀕臨滅絕的地步。不過,它挺了過來,在79、51和45這些新面孔出現並達到數量峰值一段時間以後,80又死灰復燃了。

不過區區幾個小時,湯姆·雷的電進化機已經進化出了"一鍋培養液",近百種計算機病毒為了在這個與世隔絕的世界中生存而大打出手。在花了幾個月的時間編寫程式碼後,雷在他的首次嘗試中就孕育出了人工進化。

當雷還是個說話細聲細氣、靦腆的哈佛本科生時,就曾為著名的蟻人威爾森在哥斯大黎加收集蟻群。威爾森的劍橋實驗室需要活的切葉蟻群,而雷受僱到中美洲茂密的熱帶叢林尋找並捕獲狀態良好的野外蟻群,然後運到哈佛。他發現自己特別擅長做這個工作。他的竅門是以外科醫生般的靈巧對叢林土壤進行挖掘,搬走蟻群的核心部分。需要搬走的是蟻后的完整內室,包括蟻后自己、她的看護蟻以及一個儲存著足夠食物的微型蟻園,以在運輸中確保蟻群們不會忍飢挨餓。年輕的新生蟻群是最理想的了。這種蟻群的核心部分正好可以裝進一個茶杯裡。而另一個技巧就是找出藏在森林植被下的很小的蟻巢。只需幾年時間,這個巴掌大小的小蟻群就可以填滿一個大房間。

在熱帶雨林採集螞蟻的同時,雷還發現了一種不明種類的蝴蝶,它會尾隨行軍蟻的行軍路線。行軍蟻吞噬其前進道路上所有動物的殘忍習性,會把一群飛蟲趕得慌不擇路。一種鳥逐漸形成了跟隨這個掠食大軍的習慣,愉快地享用那些在空中四散奔逃的蟲兒。而在緊隨行軍蟻大軍的飛鳥身後,蝴蝶又接踵而至。蝴蝶尾隨其後的目的是享用"螞蟻鳥"的糞便"大餐"----那是產卵所急需的氮的來源。螞蟻,"螞蟻鳥","螞蟻鳥蝴蝶",也許還有誰知道什麼玩意兒的東西跟在後面,組成了一支雜牌軍,像一群串聯好了的吉普賽人一樣,浩浩蕩蕩地橫掃這片叢林。

雷被如此精妙的複雜組合折服了。這簡直就是一個游牧社會嘛!在無奇不有的天地萬物面前,大多數企圖瞭解生態關係的嘗試都顯得那麼可笑。在茫茫宇宙之中,這三個種群(一種螞蟻、三種蝴蝶、十幾種鳥)是如何結成這種奇異的相互依賴關係的呢?為什麼會這樣呢?

雷在讀完博士的時候,覺得生態科學暮氣沉沉停滯不前,因為它不能對上面這些重要的問題給出一個滿意的答案。生態學缺少好的理論來概括由每一片荒野的觀察資料所積累起來的財富。它受到大量區域性知識的困擾:沒有一個總體理論,生態學只不過是個充斥著迷人童話的圖書館。藤壺群落的生命週期、毛茛田地的季節性形態變化或山貓家族的行為已是眾所周知的了,但是,是什麼原則(如果有的話)主導了這三者的變化呢?生物學需要一門關於複雜性的科學來解答這個關於形態、歷史和發展的難解之謎----這些都是非常有趣的問題,而且都有野外資料的支援。

和許多生物學家一樣,雷也認為生物學的希望在於將其研究重點從生物時間(森林的千年壽命)轉移到進化時間(樹種的百萬年壽命)。進化起碼還有一個理論。然而,對細節的過分執著也往往糾纏著進化研究。"我很沮喪,"雷對我說,"因為我不想研究進化的產品----爬藤啊、螞蟻啊、蝴蝶啊什麼的。我想研究進化本身。"

湯姆·雷夢寐以求的是製造一臺電進化機。用一個"盛有"進化的黑匣子,他就能夠闡明生態學的歷史法則----雨林是如何由早期森林傳承而來,生態系統到底是如何從產生了各種物種的同一原初力量中湧現出來的。如果他能研製出一臺進化機,他就會有一個試驗檯可以用來做真正的生態實驗。他可以選擇一個群落,以不同的組合一遍又一遍地進行試驗,比如說生成沒有水藻的池塘,沒有白蟻的森林,沒有黃鼠的草地,或者為免以偏概全,生成有黃鼠的叢林和有水藻的草地。他可以從製造病毒開始,看看這一切將把他帶向何處。

雷以前觀察鳥類,收集昆蟲,種植花卉----與計算機狂人完全不沾邊兒,而他卻堅信這樣一臺機器是能夠造出來的。他記得十年前當他向一位麻省理工學院的計算機高手學習日本圍棋時,那個高手曾運用生物隱喻來解釋遊戲規則。雷陳述道:"他對我說,'你知道嗎?編寫一個能夠自行復制的計算機程式是可行的。'在那一刻,我所憧憬的正是我現在所做的。我問他該怎麼做,他說,'噢,小菜一碟,不值一提。'但是我不記得他說了什麼,或者他是否真的懂。當我想起那次談話時,我就把小說扔到一邊,捧起計算機手冊來了。"

雷的電進化機方案是從簡單的複製體開始,給它們一個舒適的棲息地,以及大量能源和有待填補的空間。和這些傢伙最接近的實物是自複製的核糖核酸碎片。這個艱鉅任務看上去是可行的。他打算調變一份計算機病毒的培養液。

當時正值1989年,新聞雜誌上鋪天蓋地都是計算機病毒比瘟疫還糟、是技術所能到達的邪惡之極的封面報道。但雷卻從計算機病毒的簡單程式碼中窺見了一個新科學的誕生:實驗進化與生態學。

為保護外部世界(和保證自己的計算機不會崩潰),雷用一臺虛擬計算機來執行他的實驗。虛擬計算機是一種在真實計算機的潛意識深處模擬特定計算機的智慧軟體。通過將那些可自我複製的小傢伙們限制在這個影子計算機中,雷把它們與外界隔離,使自己在不危及主機的情況下,能夠對計算機記憶體這樣的重要功能胡亂折騰。"看了一年計算機手冊之後,我坐下來寫程式碼。兩個月後,這小玩意兒跑起來了。在程式執行的頭兩分鐘裡,我就已經獲得了可以進化的生物。"

雷在他稱為"地球"的世界裡種下了他編寫的一個小玩意兒----80位元組的程式程式碼,並把它放入他的虛擬計算機的記憶體中。這個小傢伙先是找到一塊80位元組大小的空白記憶體空間,然後用一份自己的複製品佔據這塊地盤,從而實現了自我複製。不消幾分鐘,記憶體裡就滿是80的複製品了。

雷增加了兩個重要功能,將這臺施樂影印機般的複製機改造成一臺進化機:他的程式在複製中偶爾會搞亂幾位程式碼,他還賦予這些"生物"中的劊子手以優先權。簡言之,他引入了變異和死亡。

電腦科學家告訴過他,如果隨意改變計算機程式碼(他的所有生物實際上都是程式碼),改變後的程式可能無法正常執行,甚而使計算機崩潰。他們認為通過向編碼中隨機引入漏洞來獲得可執行的程式的機率太低了,他的方案無異於浪費時間。雷其實也知道,維持計算機執行所需的完美實在是太弱不禁風了----漏洞會殺死程式。不過,由於他的造物程式在他的影子計算機中執行,一旦變異產生一個嚴重"畸形"的東西,他的劊子手程式----他將其命名為"收割機"----就會將它殺死,而他的"地球"的其餘部分則繼續運轉。"地球"實際上是找出不能複製的漏洞程式,將其從虛擬計算機中拖將出去。

然而"收割機"會放過極少數有效變種,也就是說,那些碰巧形成一個真正的替代程式的變種。這些合法的變種能夠複製併產生其他變種。如果你像雷那樣將"地球"執行10億個計算機週期,在這10億次的機會中,將出現數量驚人的隨機產生的東西。為了讓系統更有活力,雷還為造出來的小東西們打上了年齡戳記,這樣一來,老一些的傢伙就會死亡。"收割機既殺死最老的傢伙,也殺死最搗蛋的傢伙。"雷笑著說。

在"地球"的首輪執行中,隨機變異、死亡和自然選擇都起了作用。沒幾分鐘,雷就見證了一個生態系統的誕生----這個系統由那些新的生物組成,它們為搶奪計算機週期而競爭。競爭獎勵個頭小的傢伙,因為它們需要的週期更少,而殘酷的達爾文進化論淘汰的則是貪婪的消耗者、體弱多病的物種和老傢伙。物種79(比80少一個位元組)是幸運的。它的工作卓有成效,很快就超過了80。

雷還發現了非常奇怪的東西----一種只有45個位元組的變種。它的程式碼效率極高,數量上也超過了所有其他變種。"這個系統自我最佳化的速度之快令我震驚,"雷回憶說,"系統中的存活者有著越來越短的基因,我可以用圖把這個速度描繪出來。"

在對45的程式碼做進一步考察時,雷驚奇地發現它是一隻寄生蟲。它只包含了生存所需的程式碼。為了繁殖,它"借用"了80的繁殖程式碼來複制自己。只要周圍有足夠的80宿主,45就會興盛起來。但是,如果在有限的範圍內45太多了,就不會有足夠的80提供複製源。隨著80的減少,45也減少了。這對舞伴跳著共同進化的探戈,進進退退,就像北部森林中的狐狸和兔子一樣。

"所有成功的系統都會吸引寄生蟲,這似乎是生命的普遍屬性。"雷提醒我說。在自然界寄生蟲如此常見,以至於宿主很快就共同進化出針對它們的免疫力。寄生蟲隨之進化出騙過那種免疫力的策略。結果宿主再共同進化出抵制它們的防禦能力。實際上這些行動並不是交替出現的,而是兩股持續相互作用的力量。

雷學會了用寄生蟲在"地球"中進行生態實驗。他把79裝到他的"培養液"裡,因為他覺得79可能對寄生蟲45免疫。的確如此。不過隨著79的興旺,第二種能夠捕食它們的寄生蟲進化出來。這一種有51位元組長。當雷為它的基因排序時,他發現,45之所以能變成51,正是由一個"基因事件"所引起的:"7個出處已無從考究的指令取代了45中間段某處的一個指令,"把一個喪失能力的寄生蟲變成了強有力的新物種。但這還不算完----一個對51具有免疫力的新物種進化了出來,而這樣的過程還在繼續。

在執行了很長時間的"培養液"中,雷發現了以其他寄生蟲為宿主的超寄生蟲:"超寄生蟲就像是從你家的電線上偷電的鄰居。他們用你的電,你付電費,而你還矇在鼓裡。"在"地球"裡,像45這樣的有機體發現自己無需"攜帶"大量程式碼來複制自己,因為它們周圍有足夠的程式碼。雷俏皮地說:"這就像我們利用其他動物的氨基酸一樣(在我們吃它們的時候)。"在進一步檢查中,雷發現超-超寄生蟲興旺起來,寄生升級到了第三重。他發現了"社交騙子"----這種生物利用兩個合作的超寄生蟲的程式碼("合作"的超寄生蟲彼此還相互偷竊!)。社會騙子需要相當發達的生態環境。至於超-超-超寄生蟲,雖然還沒看到,不過也許已經有了。在他的世界裡,這種不勞而獲的遊戲也許永無止境。

15.2你力所不逮的,進化能行

雷所發現的"生物"是人類程式設計師無法編寫出來的。

"我從編寫80位元組的東西開始,"雷回憶說,"因為那是我能拿出來的最佳設計了。我猜想或許進化能把它降到75位元組左右,於是就讓程式執行了一整夜。結果第二天早上就出現了一個新東西----不是寄生蟲,而是某種能完全自我複製的東西----它只有22位元組!令我大惑不解的是,在沒有像寄生蟲那樣盜用別人指令的情況下,一個電腦病毒是怎樣僅通過22個指令就做到自行復制的呢?為了和他人分享這個新發現,我把它的基本演算法發到網上。麻省理工學院一位計算機專業的學生看到了我的解釋,但不知怎麼卻沒有得到病毒22的程式碼。他試圖手工重新創造它,但是他的最好成績也需要31條指令。當他得知我是在睡覺時得到22條指令的時候,他沮喪極了。"

人類力所不逮的,進化卻能做到。雷在一臺顯示器上展示了22在培養液中繁殖倍增的蹤跡,以作為他的陳述的最佳詮釋:"想想看,隨機地改動程式竟然能勝過精雕細琢的手工程式設計,這聽上去挺荒謬的,可這就是一個活生生的例子。"這位旁觀者突然明瞭了,這些"沒腦子"的駭客具有的創造力是永無止境的。

因為病毒要消耗計算機週期,所以較小(指令集更短)的病毒就有一定的優勢。雷重寫了"地球"的程式碼,使系統根據病毒大小按比例為其分配計算機資源,大病毒得到更多週期。在這種模式下,雷的病毒們所棲息的是一個不偏不倚的世界。正因為這個世界對大小病毒一視同仁,因此長期執行也許會更有意義些。有一次雷將它執行了150億個計算機週期。在大約第110億個週期左右,誕生了一種長度為36位元組的病毒,它可是聰明得近乎狡詐了。它計算自己的真實尺寸,然後在"尾部"(我們姑且用這樣的稱謂吧)將長度值向左移了一位,在二進位制中,這就相當於翻倍。靠著謊報自己的尺寸,病毒36神不知鬼不覺地竊取了病毒72的資源,這就意味著它得到了兩倍於實際所需的中央處理器時間。這個變種自然橫掃了整個系統。

也許湯姆·雷的電進化機最驚人的事情是它創造了性。沒人告訴它什麼是性,然而它還是發現了它。在一次實驗中,為了看看關閉變異功能會產生什麼結果,雷讓"培養液"在沒有外加錯誤的情況下執行。結果讓他大吃一驚,即便沒有程式變異,進化仍然發生了。

在真實的自然生活中,性是遠比變異更重要的變化來源。性,從概念上講,是遺傳重組----一些來自父親的基因和一些來自母親的基因結合成為後代的全新基因組。在"地球"中,寄生蟲有時會在無性繁殖中"借用"其他病毒的複製功能,而"收割機"有可能在這個過程中碰巧殺死了宿主,宿主原有的空間被新病毒佔用。發生這種情況的時候,寄生蟲就會使用新病毒的部分程式碼,以及"死去"病毒被打斷了的部分複製功能。由此產生的後代是個未經刻意變異而產生的天然的新組合。(雷還說這種古怪的繁殖"相當於和死人發生性關係!")在雷的"培養液"裡,這種中斷式交配其實一直都在發生,但只有當他關閉變異功能時,他才注意到這點。原來,不經意的重組本身就足以推動進化。死亡時生物所棲息的記憶體空間中就會有足夠的不規則性,而這種複雜性提供了進化所需的多樣性。從某種意義上說,系統進化出了變異。

對科學家而言,雷的人造進化機最令人欣喜之處在於,他的小世界展示的似乎是間斷平衡。在相對較長的時期裡,種群比例保持著一個相對穩定的局面,只是偶爾有物種滅絕或新物種誕生。接著,幾乎是一眨眼功夫,這種平衡就立刻被一陣翻江倒海般的新老物種交替給打斷了。對一個較短的時間來說,變化是狂暴而不受約束的。接著事情解決了,靜止和平衡再次成為主宰。化石研究顯示,這種形式在地球上的自然界中佔壓倒優勢。靜止是常態;而變化總是突如其來。在進化的其他計算機模型中也能看到同樣的間斷平衡方式,比如克里斯蒂安·林格倫的囚徒困境式的共同進化世界。如果人為進化反映了生物進化,你肯定想知道,如果雷讓他的世界永遠執行下去,會出現什麼狀況?他的病毒怪物會創造出多細胞嗎?

遺憾的是,雷從來沒有將他的世界以馬拉松的方式執行過,去看看幾個月或者幾年之後會發生些什麼。他還在不停地擺弄著他的程式,對其進行改進,以使之能夠收集長期執行所產生的海量資料(每天50兆位元組)。他承認:"有時,我們就像一群有一輛車的男孩子。我們總是在車庫裡開啟發動機罩,把引擎零件拿出來擺弄,但是我們幾乎從不開車,因為我們太執著於加大馬力了。"

事實上,雷正專注於開發一種新硬體,那應該是一種新技術。雷認為他可以將虛擬計算機和為它編寫的基本語言"燒製"進一塊計算機晶片----一塊進化用的矽片。這個現成的達爾文進化晶片就成了可以插進任何計算機的模組,它會為你迅速繁殖東西。你可以演化出程式碼,或子程式,或許甚至可能是整個軟體程式。"我發現這相當奇怪,"雷吐露道,"作為一個熱帶植物生態學家,我竟然搞起了計算機設計。"

達爾文進化晶片可能帶來的前景是美妙的。設想在你的個人計算機中就有一塊,而在你的計算機中使用的文書處理軟體是微軟的word。由於達爾文進化論常駐作業系統,word會隨著你的工作而進化。它會利用處理器的空閒週期,以緩慢的進化方式自我改善和學習,使自己適應你的工作習慣。只有那些提高了速度和準確性的改變會保留下來。不過,雷深信應該將雜亂無章的進化與工作分割開。"你應該把進化與終端使用者分開,"他說。他設想在後臺離線進行"數字耕牧",這樣一來,進化中不可或缺的錯誤和失敗就不會為使用者所見;在使用者的使用過程中,進化也處於"休眠"狀態。

進化在市面上也算不上天方夜譚了。今天你就能買到類似功能的電子表格模組。它的名字就叫作"進化者"。"進化者"是蘋果電腦上的電子表格模板----非常複雜,密密麻麻有數百個變數和"假設"函式。工程師和資料庫專家們都使用它。

比如說,你有三萬名病人的醫療記錄。你可能很想了解一個典型患者的症狀。資料庫越大,想看到你存在特定位置的資料就越困難。大多數軟體都能計算平均值,但是憑這並不能抽取出一個"典型"患者。你想了解的是,在收集到的幾千種類別的資料中,哪一套量測值對最多數人群來說具有相似的意義。這是一個對海量互動變數進行最佳化的問題。對任何生物來說,這都是一個再熟悉不過的問題:如何將成千上萬個變數所輸出的結果最大化呢?浣熊必須確保自己的生存,但是有上千種變數(腳的大小,夜視能力,心率,皮膚顏色等)可以隨時間推移而發生變化,且一個引數的改變會引起另一個引數的改變。要想穿過這片包含各種可能結果的廣闊空間,並且還留有些許登頂的希望,唯一的方法就是進化。

"進化者"軟體對最大多數患者的最寬泛的病歷進行最佳化。它嘗試給出一名典型患者的基本描述,然後檢查有多少患者符合這份描述,再對病歷進行多緯度改進,看看是否有更多患者與之相符,然後修改、選擇、再修改,直至最大數量的患者符合這份描述。這項工作特別適合進化。

電腦科學家把這個過程叫作"爬山法"。進化程式試圖在包含最優解的形式庫中向頂峰攀升。通過持續不斷地向更好的解決方案推進,程式一直向上攀登,直到不能爬得更高。在那一點上,它們就到達了峰頂----一個極大值。然而始終有個問題:這個峰頂是周圍最高的嗎?或者,程式是否被困在一個區域性高點,與旁邊高得多的峰頂只有一條峽谷之隔,卻又無從回退?

找到登上一處高點的路徑並不難。自然界中的進化和計算機中的進化程式所擅長的,是在山巒起伏、一山更比一山高的地形中,爬到全域性意義上的至高點----主峰。

15.3並行實施的盲目行為

從外表看很難判斷約翰·霍蘭德的真實年齡。他曾經擺弄過世界上最早的計算機,現在則任教於密歇根大學。他首次提出了一種數學方法,用以描述進化所具備的最佳化能力,並且該方法可以輕鬆地在計算機上程式設計實現。因其數學形式在某種程度上類似於遺傳資訊,霍蘭德把它們稱為遺傳演算法。

和湯姆·雷不同,霍蘭德從性開始入手。霍蘭德的遺傳演算法選取兩組類似於dna的計算機程式碼,這兩組程式碼在問題求解上都有不錯的效果,然後以交配互換的方式將它們隨機重組,看看新的程式碼會不會表現得更好一點。在設計系統時,和雷一樣,霍蘭德必須克服一個懸而未決的問題:對於任何隨機生成的計算機程式來說,往往都談不上什麼好壞,而是根本就不靠譜。從統計學的意義上說,對可用程式碼做隨機變異,結局註定是屢戰屢敗。

早在20世紀60年代初理論生物學家就發現,與突變相比,交配所產生的實用個體比例更高,因而以其為基礎的計算機進化也更穩定和有生命力。但是,單靠有性交配,其結果很受侷限。20世紀60年代中期,霍蘭德發明了遺傳演算法;遺傳演算法中起主要作用的是交配,但突變也是幕後策劃者之一。通過將交配與突變結合在一起,系統變得靈活且寬泛。

和其他具有系統觀念的人一樣,霍蘭德認為大自然的工作和計算機的任務是相似的。"生物體是高明的問題解決者,"霍蘭德在他的工作總結中寫道,"它們所展示出來的多才多藝使最好的計算機程式都為之汗顏。"這個論斷尤其令電腦科學家們感到難堪。他們可能經年累月地在某個演算法上絞盡腦汁,而生物體卻通過無目標的進化和自然選擇獲得了它們的能力。

霍蘭德寫道,進化的方法"排除了軟體設計中最大的一個障礙:預先規定問題的所有特徵"。如果你有許多相互矛盾而又彼此關聯的變數,而目標定義又很寬泛,可能有無數個解,那麼進化正是解決之道。

正如進化需要大量的個體才能發揮效用一樣,遺傳演算法也要炮製出數量龐大的程式碼群,並且這些程式碼們同時進行處理資料和發生變異。遺傳演算法實際上是一大群略有差別的策略,試圖在崎嶇的地形上同時攀爬不同的峰頂。由於大量程式碼並行作業,因而能同時訪問該地形的多個區域,確保它不會錯過那真正的高峰。

隱含的並行主義是進化過程確保其不單攀上高峰、而且是最高峰的魔力所在。如何找出全域性最優值?通過同時考察整個地貌的每一寸土地。如何在複雜系統中對上千個相互衝突的變數做出最佳平衡?通過同時嘗試上千種組合。如何培養出能在惡劣條件下生存的生物體?通過同時投入一千個略有差異的個體。

在霍蘭德的演算法中,那些"處在最高處"的程式碼們彼此交配。換句話說,"地勢高"的區域,交配率就高。這便將系統的注意力集中到最有前途的區域,同時,對那些沒有希望的地區,系統則剝奪了它們所佔用的計算週期。這樣,並行主義既做到了"天網恢恢,疏而不漏",又減少了尋找頂峰所需要的程式碼數量。

並行是繞過隨機變異所固有的愚蠢和盲目的途徑之一。這是生命的極大諷喻:一個接一個地重複盲目行為只能導致更深層的荒謬,而由一群個體並行執行的盲目行為,在條件適合時,卻能匯出所有我們覺得有趣的東西。

約翰·霍蘭德在20世紀60年代研究適應機制時發明了遺傳演算法。而直到20世紀80年代末,他的成果都沒有引起任何關注,除了12個異想天開的計算機研究生。其他幾個研究者,如工程師勞倫斯·福格爾和漢斯·布雷默曼,在20世紀60年代獨立開展了種群的機械式進化研究;現在密歇根州韋恩州立大學工作的電腦科學家邁克爾·康拉德,在20世紀70年代也從對適應的研究轉向了為種群進化建立計算機模型;他們都受到了同樣的冷落。總之,這項工作在電腦科學領域裡可以說是默默無聞,而生物學界對它更是一無所知。

在霍蘭德關於遺傳演算法和進化的書《自然與人工系統中的適應》(adaptationinnaturalandarticialsystemss)於1975年問世前,只有兩三個學生寫過關於遺傳演算法的論文。直到1992年再版時,這本書只賣出2500本。在1972年至1982年間,整個科學界關於遺傳演算法的文章不超過二十幾篇,更遑論有什麼對計算機進化頂禮膜拜的追隨者了。

生物學界對此缺乏興趣尚情有可原(但也不是什麼光彩的事情);生物學家認為自然界太複雜,難以用當時的計算機來展現其真實全貌。而電腦科學對此興趣寥寥,就莫名其妙了。我在為本書做調研時經常感到困惑,像計算進化這樣重要的方法為什麼竟無人理睬呢?現在我相信,這種視而不見的根源,在於進化所固有的看上去雜亂無章的並行性,以及它與當時盛行的計算機信條----馮·諾依曼序列程式----在根本上的牴觸。

人類的第一臺電子計算機叫作電子數值積分計算器,是1945年為解決美軍的彈道計算問題而研發的。電子數值積分計算器是一個由1.8萬支電子管、7萬個電阻和1萬個電容構成的龐然大物。它需要6000個手動開關來設定指令,然後執行程式;各個數值的計算實際上是以並行方式同時進行的。這對程式設計來說是個負擔。

天才的馮·諾依曼從根本上改變了這種笨拙的程式設計系統。電子數值積分計算器的接替者----離散變數自動電子計算機,是第一臺可執行儲存程式的通用計算機。馮·諾依曼24歲那年(1927年)發表了他的第一篇關於數學邏輯系統和博弈論的學術論文,自那時起,他就一直在考慮系統邏輯問題。在與離散變數自動電子計算機小組共事時,為了應付計算機程式設計在求解多問題時所需的複雜運算,他發明了一種方法來控制這些運算。他建議將問題分成離散的邏輯步驟,類似於長除法的求解步驟,並把求解過程的中間值臨時儲存在計算機中。這樣一來,那些中間值就可以被看成是下一部分問題的輸入值。通過這樣一個共同演化的迴圈(現在稱為子程式)來進行計算,並將程式邏輯儲存在計算機中以使它能與答案互動,馮·諾依曼能將任何一個問題轉化成人腦所能理解的一系列步驟。他還發明瞭描述這種分步線路的標記法:即現在大家所熟悉的流程圖。馮·諾依曼的序列計算架構----一次執行一條指令,其普適性令人驚歎,並且非常適合人類程式設計。1946年馮·諾依曼發表了這個架構的概要,隨後所有的商用計算機都採用了這個架構,無一例外。

1949年,約翰·霍蘭德曾效力於離散變數自動電子計算機的後續專案"旋風計劃"。1950年,他參加了ibm"國防計算機"的邏輯設計團隊,這款機型後來演變成ibm701機,是世界第一部商用計算機。當時的計算機有房間那麼大,耗電量驚人。到了50年代中期,霍蘭德加入了一個帶有傳奇性的圈子,裡面都是些思想深邃之人,他們開始討論人工智慧的可能性。

當赫伯特·西蒙和艾倫·紐厄爾這樣的學界泰斗把學習看作高貴和高等的成就時,霍蘭德卻把它看作光鮮外表下的低端適應。霍蘭德認為,如果我們能理解適應性尤其是進化的適應性,就可能理解甚至模仿有意識的學習。儘管其他人有可能意識到進化與學習之間的相似之處,然而在一個快速發展的領域裡,進化並不太為人所關注。

1953年,霍蘭德在密歇根大學數學圖書館漫無目的地瀏覽時,偶然發現了一卷由r.a.費希爾寫於1929年的《自然選擇的遺傳理論》(geneticaleoryofnaturalselectionn),頓時大受啟發。達爾文引領了從對生物的個體研究到種群研究的轉向,而把種群思維轉變為定量科學的則是費希爾。費希爾以一個隨時間推移而進化的蝴蝶族群為物件,將其看作是一個將差別資訊並行傳遍整個族群的整體系統。他提出了控制資訊擴散的方程。通過駕馭自然界最強大的力量----進化,以及人類最強有力的工具----數學,費希爾單槍匹馬開創了一個人類知識的新世界。"我第一次意識到能對進化進行有意義的數學運算。"霍蘭德回憶起那次奇妙邂逅時說。"那個想法對我非常有吸引力。"霍蘭德如此醉心於將進化作為一種數學來處理,以至於(在影印機還沒有問世的當時)拼命想搞到絕版的全文。他懇求圖書館把書賣給他,但沒有成功。霍蘭德吸取了費希爾的見解,又將其昇華為自己的構想:一群協處理器,在計算機記憶體的原野上,如蝴蝶一般翩翩起舞。

霍蘭德認為,人工學習其本質上是適應性的一個特例。他相當確定能在計算機上實現適應性。在領悟了費希爾關於進化是一種機率的洞見後,霍蘭德著手嘗試把進化編為程式碼輸入機器。

在嘗試之初,他面臨著一個兩難處境:進化是並行的處理器,而所有可用的電子計算機卻都是馮·諾依曼式的序列處理器。

在把計算機變為進化平臺的迫切願望下,霍蘭德做了唯一合理的決定:設計一臺大規模平行計算機來執行他的實驗。在並行運算中,許多指令同時得到執行,而不是一次只執行一個指令。1959年,他提交了一篇論文,其內容正如其標題所概括,介紹了"能同時執行任意數量子程式的通用計算機",這個機巧裝置後來被稱為"霍蘭德機"。而等了差不多30年,一臺這樣的計算機才終於問世。

在此期間,霍蘭德和其他計算進化論者不得不依賴序列計算機來培育進化。他們使出渾身解數在快速序列處理器上程式設計模擬一個緩慢的並行過程。模擬工作卓有成效,足以揭示出真正並行過程的威力。

15.4計算中的軍備競賽

直到20世紀80年代中期,丹尼·希利斯才開始建造第一臺大規模並行運算計算機。其實早在幾年前,希利斯就已是一個電腦科學專業的神童了。他的那些惡作劇和駭客事蹟即使在麻省理工這個號稱駭客鼻祖的學校中也頗具傳奇性。希利斯以其慣有的清楚明瞭向作家史蒂文·列維總結了馮·諾依曼計算機的瓶頸所在:"你為計算機輸入的知識越多,它執行得越慢。而對人來說,你給他的知識越多,他的頭腦越敏捷。所以說我們處在一種悖論之中,你越想讓計算機聰明,它就變得越愚笨。"

希利斯真正想做的是生物學家,而他理解複雜程式的特長卻將他吸引到麻省理工學院的人工智慧實驗室。在那裡,他最終決定嘗試設計一臺"會成為我的驕傲"的思考型計算機。他把設計一個無法無天、三頭六臂的計算機怪獸的開創性想法歸功於約翰·霍蘭德的啟發。最終希利斯領導的小組發明了第一臺並行處理計算機----"連線機"。1988年,每臺"連線機"可賣得一百萬美元高價,賺得盆滿缽滿。有了機器,希利斯就開始認真地從事計算機生物學研究了。

"我們知道,只有兩種方法能製造出結構極其複雜的東西,"希利斯說,"一個是依靠工程學,另一個是通過進化。而在兩者中,進化能夠製造出更加複雜的東西。"如果靠設計不能製造出令我們驕傲的計算機,那我們就不得不依靠進化。

希利斯的第一臺大規模並行"連線機"能使64000個處理器同時執行。他迫不及待地要啟動進化,於是給計算機注入了64000個非常簡單的程式。和霍蘭德的遺傳演算法或雷的"地球"一樣,每一個個體都是可以發生變異的一串符號。不過,在希利斯的"連線機"中,每個程式都有專門的處理器來對其進行處理。因此,種群能極其迅速地做出反應,而其數量之多,是序列計算機根本不可能做到的。

在他的培養液裡,最初的"小傢伙"都是些隨機的指令序列,但是經過幾萬代進化,它們就變成能將一長串數字進行排序的程式(排序體)。大多數較大型的軟體都會包含這樣的排序例程。多年來,在電腦科學領域有無數的人力花費在設計最有效的排序演算法上。希利斯讓數千個排序體在計算機中增殖,隨機變異,偶爾進行有性基因互換。然後,正如通常的進化策略一樣,他的系統會測試這些程式,終止那些效率低下的,只有最短的(最好的)排序體才有複製的機會。經過上萬代的迴圈後,他的系統培育出一種程式,它幾乎和由人類程式設計師編制的最佳排序程式一樣短。

接著,希利斯重新開始試驗,不過這次有一個很重要的不同:允許在對進化的排序體進行測試時,測試程式(測試體)本身也可以發生變異。用來測試的字串可以變得更復雜,以抵制那些簡單的排序體。排序體必須瞄準一個移動的目標,而測試體則需要躲避一支會轉向的利箭。事實上,希利斯將測試用的數字列表從一個僵化被動的環境轉變成了一個積極主動的有機體。就像狐狸和野兔、黑脈金斑蝶和馬利筋一樣,排序體和測試體也構成了經典的共同進化關係。

希利斯骨子裡還是個生物學家,他把不斷變異的測試體看成是一個試圖干擾排序程式的寄生生物,把他的世界看成是一場軍備競賽----寄生蟲進攻,宿主防衛,寄生蟲反攻,宿主防守反擊,如此迴圈。傳統觀念認為,這種膠著的軍備競賽是在愚蠢地浪費時間,或難逃陷入泥潭的厄運。然而希利斯發現,寄生蟲的引入並沒有妨礙排序體的發展,恰恰相反,它加快了進化的速率。寄生蟲式的軍備競賽也許很醜陋,但它們大大加快了進化的速度。

和湯姆·雷一樣,丹尼·希利斯也發現進化能超越通常的人類能力。在"連線機"中發展起來的寄生蟲,刺激了排序體去設計更有效的解決辦法。在共同進化了1萬個週期之後,希利斯的小怪物們進化出一種電腦科學家們前所未見的排序體。最具諷刺性的是,它剛好比人類設計的最短演算法少一步。看似愚鈍的進化設計出了一個獨具匠心又非常有效的軟體程式。

"連線機"中的單個處理器很愚蠢,智力跟一隻螞蟻差不多。不管花上多少年時間,單個處理器都無法獨自想出任何問題的獨創性解決辦法。即使把64000個處理器串到一起也好不了多少。

而當64000個又蠢又笨的螞蟻大腦形成相互聯結的龐大網路時,它們就構成了一個進化的種群,看起來就像大腦裡的一大堆神經元。那些使人類精疲力盡的難題,卻往往在這裡得到絕妙的解法。這種"海量連線中湧現出秩序"的人工智慧方法便被冠以"連線主義"的名號。

早期認為進化與學習緊密相關的直覺又被連線主義重新喚醒了。探索人工學習的連線主義者通過將愚鈍的神經元聯結成巨大的網路而大展拳腳。他們研發了一種基於聯結的並行處理方法----在虛擬或硬體實現的平行計算機上執行----與遺傳演算法相似,它能同時進行大量的運算,不過它的評估機制更加精密(更聰明)。這些大大"開竅"了的網路被稱為神經網路。迄今為止,神經網路在產生"智慧"方面所取得的成就還很有限,儘管它們的模式識別能力非常有用。

然而,一切事物均來自低等連線這一理念著實令人驚詫。網路內部究竟發生了什麼神奇變化,竟使它具有了近乎神的力量,從相互連線的愚鈍節點中孕育出組織,或是從相互連線的愚笨處理器中繁育出程式?當你把所有的一切聯結到一起時,發生了什麼點石成金的變化呢?在上一分鐘,你有的還只是由簡單個體組成的烏合之眾;在下一分鐘,聯結之後,你卻獲得了湧現出來的、有用的秩序。

曾有那麼一瞬間,連線主義者猜想:也許創造理智與意識所需要的一切,不過就是一個夠大的互相連線的神經元網路,理性智慧可以在其中完成自我組裝。甫一嘗試,他們的這個夢就破滅了。

但是人工進化者們仍然在追尋著連線主義的夢想。只是,和著進化的緩慢節奏,他們會更有耐心。而這緩慢的、非常緩慢的進化節奏著實令我不安。我這樣向湯姆·雷表達我的憂慮:"現成的進化晶片和並行進化處理機讓我有些焦慮,因為進化需要的時間多得令人難以置信。這個時間從何而來?看看大自然的執行速度,想一下,在我們談話期間,有多少微小分子被吸附到一起。大自然的並行速度之快、規模之廣之大令人難以置信,而我們卻打算嘗試超越它。在我看來,根本就沒有足夠的時間能做成這件事。"

雷回答道:"哦,我也有同樣的焦慮。但另一方面,讓我驚訝的是,在我的系統裡即使僅靠一個虛擬處理器,進化也能進行得如此之快。再者,時間是相對的。進化的時間尺度是由進化中一代的時間跨度來決定的。對人類來說,一代是30年,但對我的小東西們來說,一代就是幾分之一秒。而且,當我扮演上帝時,我能加快整體的突變率。我不敢肯定,但是也許我可以在計算機上得到更多的進化。"

在計算機上進行進化還有其他的原因。比如,雷能記錄每個"小東西"的基因組序列,儲存完整的人口統計和種群譜系。它生成大量資料,而在現實世界中根本無法收集這些資料。儘管隨著人造世界複雜性的激增,提取資訊的複雜性和成本也會激增,但做起來仍可能比無法掌控的有機世界更容易些。正如雷告訴我的那樣,"即使我的世界變得像真實世界一樣複雜,但我是上帝,我無所不知。我能獲取任何我感興趣的資訊而不打擾它,也不用走來走去踩壞植物。這是一個根本的不同。"

15.5駕馭野性的進化

回到18世紀,本傑明·富蘭克林很難讓朋友們相信,他實驗室裡產生的微弱電流與荒野中發生的雷電本質上是一回事。部分原因是由於他的人造電火花與撕裂天空的巨型閃電相比根本不在一個級別上,但更主要的原因是,那些旁觀者們認為,福蘭克林所聲稱的再現自然有違常理。

今天,湯姆·雷也難以讓他的同事們信服,他在實驗室裡人工合成的進化與塑造自然界動植物的進化本質上是相同的。他的世界裡幾個小時的進化與蠻荒大自然中數十億年的進化在時間尺度上的差別也只是部分原因;最主要的是,懷疑者們也認為,雷所聲稱的再現一個難以明瞭的自然過程是有違常理的。

在富蘭克林之後200年,人工生成的可駕馭和可度量的閃電通過電線被匯入建築物和工具,成為社會尤其是數字社會中最重要的組織力量。再200年後,可駕馭和可度量的人工適應也將被匯入各種機械裝置,成為我們社會的主要組織力量。

還沒有一個電腦科學家可以合成出符合預期的、無比強大的、能帶來翻天覆地變化的人工智慧。也沒有一個生物化學家能夠創造出人工生命。然而,雷和一些人已經捕捉到了進化的一角,並按照他們各自的需求來再現進化。許多技術人員相信,星星之火必將燎原,我們所夢寐以求的人工生命和人工智慧都將由此而來。與其製造,不如培育。

我們已經運用工程技術造出了儘可能複雜的機器。如今,我們所面對的專案----數千萬行程式碼的軟體程式,覆蓋全球的通訊系統,必須適應迅速變化的全球購買習慣並在幾天內更新裝置的工廠,價廉物美的機器人----其複雜度只有進化才能搞定。

由於進化是緩慢的、無形的和冗長的,因而在這個快節奏的、咄咄逼人的人造機器世界裡,進化恍若一個難以察覺的幽靈。但我更願意相信,進化是一種能被容易地轉化為計算機程式碼的自然而然的技術。正是進化與計算機之間的這種超級相容性,將推動人工進化進入我們的數字生活。

15.6進化聰明分子的愚鈍科學家

不過,人工進化不僅限於矽片。只要是工程方法一籌莫展的地方,都可以匯入進化。生物工程這種尖端領域已經採用了合成進化技術。

這是一個來自真實世界的問題。你需要一種藥物來抗擊剛剛分離出機理的疾病。把這個疾病機理看作是一把鎖。你所需要的是一把正確的鑰匙----一種藥,來開啟這把鎖。

有機分子的構成非常複雜。它們由數千個原子組成,其排列方式多達數十億種。僅僅知道一種蛋白質的化學成分對我們瞭解其結構沒有太大幫助。長長的氨基酸鏈層層疊疊繞成一團,而熱點----蛋白質的活躍部分----恰好處於外側面的合適位置上。這種摺疊蛋白質的方式就好比將一條一英里長、上面用藍色標記了6個點的繩子繞成一團,使6個藍色的點都落在不同的外側面上。纏繞的方式不計其數,但是符合要求的卻沒有幾個。你甚至無從知道一種方式是否接近答案----除非你已經快完成了它。變化是如此之多,縱使窮盡地老天荒也無法一一試遍。

製藥商們通常有兩種手段來對付這種複雜性。過去,藥劑師靠的是碰運氣。他們試遍所有從自然中發現的化學物質,看看哪一個可以解開這把給定的鎖。一般都會有一兩種天然化合物能夠部分地發揮效用----這也算是獲得了鑰匙的一部分。今天,在工程學時代,生物化學家們試圖破譯基因程式碼和蛋白質摺疊之間的路徑,看是否能通過工程方法設計出構建分子所需的步驟。儘管有些許成功的例子,但蛋白質摺疊和基因路徑仍然因過於複雜而難以控制。因而,這種被稱為"合理化藥物設計"的邏輯方法,實際上已經撞上了工程方法所能處理的複雜性的極限。

自20世紀80年代末起,世界各地的生物工程實驗室都開始致力於完善另一種我們用來創造複雜體的工具----進化。

簡單地說,進化系統產生出數十億隨機分子,並用來試著開鎖。在這數十億個平凡的候選者中,也許只有一個分子的一部分與這把鎖的6個點之一相合。這把"親和"鑰匙便被保留下來,其餘的則被無情地淘汰。接著,由倖存下來的"親和"鑰匙又繁育出數十億個新變種,同時與鎖相合的那個點保持不變(稱為繫結),再被用來試那把鎖。也許此時又能發現一把可以匹配兩個點的"親和"鑰匙。這把鑰匙就作為倖存者保留下來,其餘的則死去。倖存者繁育出數十億個變種,最般配的後代將存活下去。這種淘汰-變異-繫結的過程重複幾代後,這個分子繁育程式就會找到一種藥----或許是救命藥,與鎖的所有點都相契合。

幾乎任何一種分子都能被進化。譬如說,生物技術人員能進化出一種改進版的胰島素。他們將胰島素注入兔子體內,兔子的免疫系統會對這種"毒素"產生抗體(抗體是毒素的互補構型)。接下來,將這種抗體提取出來,注入進化系統。在進化系統中,抗體就好比是測試用的鎖。經過幾代進化之後,生物技術人員可以得到抗體的互補構型,實際上也就是胰島素的替代版。這種替代版極具價值。天然藥物的替代品具備諸多優勢:它們可能更小;更容易注入身體;副作用更小;更容易製造;或靶向更精準。

生物進化者們還可以進化出一種對抗肝炎病毒的抗體,然後再進化出一種與抗體相配的仿肝炎病毒。被選中的病毒並非完美的變種,而是缺失了一些可引發致命症狀的活性點。這種有缺陷、無能力的替代品就是所謂的疫苗。因而,疫苗也可以通過非工程的方法進化出來。

所有藥物製造的常規邏輯在進化方法面前都不再適用。進化出來的分子與合理化設計出來的藥物在效果上並無二致。唯一不同的是,我們對其功效的原理和方式一無所知。我們只知道它通過了所有的測試。這些發明出來的藥物已經超出了我們的理解力,它們是"非理性設計"的產物。

藥物進化允許研究人員不明就裡,而進化本身卻慢慢聰明起來。印地安那州立大學的進化生物化學家安德魯·埃林頓(andrewellington)告訴《科學》雜誌,在進化系統中"要讓分子告訴你有關它的事情,因為它比你更瞭解它自己。"