0%
第十七章 開放的宇宙 17.3 無心插柳柳成蔭

第十七章 開放的宇宙

17.3 無心插柳柳成蔭

與「藝術家」西姆斯不同,柯扎並不滿足於單純地探索可能之方程的空間,他想進化出能夠解決特定問題的最佳方程。舉個牽強一點的例子,假設在所有可能的圖像中有一幅圖會吸引奶牛凝視它,並由此提高產奶量。柯扎的方法就可以進化出能繪製這一特定圖像的方程。在這個例子中,柯扎會對那些所繪圖像哪怕只是輕微增加產奶量的方程給予賞獎,直至牛奶產量無法再得到提高。當然,柯扎所選的問題要比這實際得多,譬如,找出一個能操縱機器人移動的方程。
(SIN (IFLTE (IFLTE (+ Y Y) (+ X Y) (- X Y) (+ Y Y)) (* X X) (SIN (IFLTE (% Y Y) (% (SIN (SIN (% Y 0.30400002))) X) (% Y 0.30400002) (IFLTE (IFLTE (% (SIN (% (% Y (+ X Y)) 0.30400002)) (+ X Y)) (% X 0.10399997) (- X Y) (* (+ -0.12499994 -0.15999997) (- X Y))) 0.30400002 (SIN (SIN (IFLTE (% (SIN (% (% Y 0.30400002) 0.30400002)) (+ X Y)) (% (SIN Y) Y) (SIN (SIN (SIN (% (SIN X) (+ -0.12499994 -0.15999997))))) (% (+ (+ X Y) (+ Y Y)) 0.30400002)))) (+ (+ X Y) 九*九*藏*書(+ Y Y))))) (SIN (IFLTE (IFLTE Y (+ X Y) (- X Y) (+ Y Y)) (* X X) (SIN (IFLTE (% Y Y) (% (SIN (SIN (% Y 0.30400002))) X) (% Y 0.30400002) (SIN (SIN (IFLTE (IFLTE (SIN (% (SIN X) (+ -0.12499994 -0.15999997))) (% X -0.10399997) (- X Y) (+ X Y)) (SIN (% (SIN X) (+ -0.12499994 -0.15999997))) (SIN (SIN (% (SIN X) (+ -0.12499994 -0.15999997)))) (+ (+ X Y) (+ Y Y))))))) (% Y 0.30400002))))).
通過方程進化能解決形形色|色的古怪問題。柯扎用它來解決的一個經典難題是如何讓一根掃把立在滑板上。滑板必須在馬達的推動下來回移動,使倒立的掃帚在板中央保持直立。馬達控制的計算量驚人,但在控制電路上與操縱機器人手臂的電路並無多大區別。柯扎發現,他可以進化出一個程序來實現這種控制。
樹與樹之間交換分枝迫使它們產生變種。有時嫁接的是一根長樹枝,有時僅僅是一根細枝或枝頭的「葉子」。每根樹枝都可以被看作是由更小的分枝構成的完整無缺的邏輯子程序。通過分枝交換,一小段方程(一根樹枝),或一個有用的小程序,可以得到保存甚至傳播。
但從某種意義上來說,他的搜索方式與西姆斯以及其他研究者的相似。他也在由可能存在的計算機程序組成的博爾赫斯圖書館內搜尋——只不過不是毫無目的地東瞧瞧西看看,而是去尋找解決特定實際問題的最佳方程。柯扎在《遺傳編程》一書中寫道:「這些問題的求解過程可以重新表述為在可能存在的計算機程序中搜索最合適的單個計算機程序。」九九藏書
真正開始將邏輯程序的進化從理論付諸實踐的是約翰·柯扎。他是斯坦福大學計算機科學系的教授,約翰·霍蘭德的學生。他和霍蘭德的另外幾個學生一起使六、七十年代一度被冷落的霍蘭德遺傳演算法重放光芒,進入到八十年代末并行演算法的復興時期。
柯扎的方法基於一種直觀判斷,即如果兩個數學方程在解決一個問題時多少有些效果,那麼它們的某些部分就是有價值的。如果這兩者有價值的部分能被重新整合成一個新程序,其結果可能比兩個母程序中的任何一個都更有效。柯扎數千次地隨機重組兩個母程序的各個部分,希望從概率上講,這些組合中能包含一個程序,對母程序中有價值的部分做了最優安排,因而能更好地解決問題。
儘管方程進化能得出有效的解決方案,可這些方案卻往往要多難看有多難看。當柯扎拿起他那些高度進化的寶貝開始查看細節時,他和西姆斯以及雷一樣感到震驚:解決方案簡直是一團亂麻!進化要麼繞上一個大彎,要麼鑽個七里拐彎的邏輯漏洞抄近道。它塞滿冗餘,毫不雅緻。出了錯時,寧願添加一節糾錯程序,或者讓主流程改道繞過出錯的區域,也不願銷去錯誤的部分。最後的公式頗有幾分神奇的魯賓·戈德堡連動裝置的樣子,依靠某些巧合才能運作。當然,它實際上就是架戈德堡神奇連動機。read.99csw.com
柯扎的方法和西姆斯的有很多相似之處。柯扎的「數據培養液」也含有大約一打用LISP語言表達的數學基元,諸如加、乘、餘弦。這些基元隨機串在一起形成一棵棵邏輯「樹」——一種形似計算機流程圖的層次結構。柯扎的系統像繁殖人口一樣創建了500到10000個不同的獨立邏輯樹。「數據培養液」通常在繁衍了大約50代之後收斂到某個合適的後代身上。
進化得出的答案看起來很奇怪,因為幾乎任何一個高中生都能在一行內寫出一條非常簡潔優雅的方程式來描述這兩條螺旋線。
然而,人工進化的研究成果出乎意料地表明,傳統觀點大錯特錯了。西姆斯、雷和柯扎都有絕妙的證據來證明,邏輯程序是可以通過漸進式改良進化的。
這就是軟體編程的未來!定義一個問題,機器就能在程序員打高爾夫球的時候找到解決方案。但是,柯扎的機器找到的解決方案讓我們得以https://read•99csw•com一睹進化的手藝。這是它得出的公式:
但柯扎堅信簡約的重要性被過分高估了。他說,簡約不過是「人類的審美標準」。大自然本身並不特別簡約。舉個例子:時為斯坦福大學科學家的戴維·斯托克分析了小龍蝦尾部肌肉中的神經迴路。當小龍蝦想逃走的時候,其神經網路會引發一個奇怪的後空翻動作。對人類來說,那種迴路看起來如巴洛克建築那般繁複,取消幾個多餘的循環指令馬上就可以使它簡化一些。但那堆亂七八糟的東西卻很管用。大自然並不會只為了優雅而簡化。
在柯扎的世界里沒有要求方案簡潔的進化壓力。他的實驗不可能找到那種精鍊的方程式,因為它並不是為此構建的。柯扎試著在運行過程中添加點簡約性因素,卻發現在運行開始就加入簡約性因素會降低解決方案的效率。得到的方案雖然簡單卻只有中下水平。他有證據表明,在進化過程末期加入簡約性因素——也就是說,先讓系統找到一個管用的解決方案,再開始對其進行簡化——這是進化出簡潔方程更好的方法。
拿柯扎曾經給他的進化機器玩過的一個問題為例。那是一個由兩條互相纏繞的螺旋線構成的圖形,大致類似於紙風車上的雙重螺旋線。柯扎要求進化方程機器進化出一個最佳方程式,來判定約200個數據點各在互繞雙螺旋的哪一條線上。
柯扎通過繁衍「找到」方程的想法之所以被認為有悖常理,和計算機專家對雷的進化方案嗤之以鼻的理由是一樣的。過去,人人都「知道」邏輯程序是脆弱的,不能容忍任何變動。計算機科學理論中,程序只有兩種狀態:(1)無故障運行;(2)修改後運行失敗。第三種狀態——隨機修改後還能運行——是不可能的。程序輕度出軌被稱為程序漏洞,這是人們耗費大量財力試九九藏書圖避免的。專家們過去認為,如果計算機方程漸進式改良(進化)真有可能的話,也肯定只會出現在少數罕見領域或專門類型的程序中。
被他用來測試方程進化的問題還有:走出迷宮的策略;二次方程的求解方法;優化連接眾多城市最短路徑的方法(又稱為旅行商問題);在tic-tac-toe一類簡單遊戲中勝出的策略。在每個例子中,柯扎的系統每次都會去尋找解決問題的一般公式,而不是尋找每一個測試實例的具體答案。一個公式經受不同實例的測試越多,這個公式就會進化得越完善。
這公式不但樣子難看,而且還令人費解。即使對一個數學家或一個計算機程序員來說,這個進化出來的公式也是一團亂麻。湯姆·雷說,進化寫的代碼只有喝醉酒的人類程序設計員才寫得出來的。依我看,說進化生成的是只有外星人才寫得出來的代碼恐怕才更確切些。這絕非人類所為。對這個方程追本溯源,柯扎終於找到了這個程序處理問題的方式。完全是憑著百折不撓和不擇手段,它才打通了一條艱難曲折又令人費解的解決之道。但這確實管用。
柯扎將10000個隨機產生的計算機公式載入到他的數據培養液里。他放任它們進化,而他的機器則挑選出最有可能獲得正確公式的方程。柯扎睡覺的時候,程序樹交換分枝,偶爾產生一個運行更好的程序。在他度假期間,機器照常運行。待他度假歸來,系統已經進化出能完美劃分雙螺旋線的答案了。