萬物算法

THE ALGORITHMS FOR EVERYTHING.

dhew

程序員的終極夢想到底是什麽

dhew,科幻作者,熱血中年。雖出道甚早,但沉迷遊戲以致荒廢十年,不後悔,感謝遊戲。如今在做自己的遊戲(非科幻遊戲),同時寫作,寫科幻小說。代表作《基因戰爭》。

那天我酒喝多了,好奇地問在場的一位程序員哥們兒:“這個社會對程序員有那麽多的誤解,你們是怎麽堅持下來的?”

那哥兒們估計也喝多了,就給我講了那個所有程序員都知道的故事。

一開始,隻是有人想做個預報天氣的軟件。這人當然是個程序員,叫什麽名字不重要。重要的是,他不想做那種給天氣預報配點小清新照片就完事的手機應用。他想從零開始,從氣溫、風向、風速和雲圖入手,推測出接下來二十四小時的天氣變化。他想要做個預報天氣的軟件。

程序員們很像手工匠人,天生喜歡從無到有做點什麽東西出來。這個程序員也不例外。他從氣象學的基本理論開始構建一個算法,我們姑且把它稱為算法A吧。就像所有剛剛通過調試的軟件一樣,算法A出師不利:上線運行那天,氣象局預報下午有雨,而算法A預報天晴。

程序員大多對自己開發的軟件堅信不移,這名程序員也不例外,於是他被雨淋了個透濕。在反複審視自己的作品後,他把問題鎖定在了算法上。並不是算法有問題,而是依據氣象學的數學表達本身就不完備。但他沒能力把這門科學再往前推進一步。他把源代碼上傳到Github ,並開了一個帖子,向其他程序員求助,有人回複說,沒辦法了,上機器學習吧。

和大眾想象的不一樣,程序員們對機器學習抱著一種愛恨交加的複雜感情。愛的是它讓全世界的程序員們都出了次風頭,恨的是它完全不符合程序員們習慣的思考方式。

機器學習的原理和小學生做數學習題的方式頗有共通之處。計算機做一道題,看一下答案,如果錯了,就重做。它可能並無解題思路,甚至對題目想要考驗的知識一無所知,但如此反複幾百萬遍後,計算機會得出一個正確率最高的解題方法,然後用這個方法快刀斬亂麻般解決所有類似問題。但問題在於,計算機無法向你解釋這個方法到底是什麽。它就在那裏,你知道它存在就行了。就像一個魔法師的帽子,程序員們能從裏麵掏出兔子來,卻無法解釋這個帽子到底是連通了異次元還是怎麽的。

引入機器學習後,算法的準確率大幅提升,氣象局預測下雨時,算法預測為下冰雹;氣象局預測天晴時,算法預測為高溫警報。雖然看起來隻是在氣象局的結果上疊加了一個正態分布,但程序員知道這個算法已經踏上了正確的道路。訓練三周後,算法在預測的即時性和準確度上就已經超過了氣象局。程序員欣喜地將軟件放到網上,為所有人免費提供未來二十四小時的天氣預測,並在預測結果上加入了“更精準,更及時”的標題。氣象學家們上電視宣稱這是氣象學理論推動了社會的進步和發展,而程序員隻是適逢其會。

看完節目的程序員憤怒地將算法的代碼開源了。立刻就有同仇敵愾的程序員跟進並重寫了代碼,剔除了依據氣象學理論加入的基本原則和預測方法,直接使用機器學習由零開始構築新的算法。這一次,項目獲得了一個正式的命名:“天氣算法”。

一開始,“天氣算法”給出的結果慘不忍睹。它曾預測在撒哈拉沙漠正中央出現彩虹,或在印度洋的中心出現沙塵暴。但在兩周的訓練後,它就碾壓了自己的前輩,不但準確率更高,而且需要的計算單位還更少。氣象學家們被狠狠地扇了一巴掌,然而比名譽掃地更可怕的是,他們丟了工作。

程序員們隔著屏幕拍手慶賀。

就在這時,糧食公司找了上來。

古希臘的哲學家曾預測當年風調雨順,橄欖豐收,於是事先租下了所有的榨油機,並在橄欖收獲季大賺一筆。而當代的糧食公司做著差不多同樣的事,隻是規模和賭注都大了許多。他們希望這個預測軟件能夠提供未來三個月的天氣變化,好讓糧食公司可以決定在什麽時間用什麽價格下注。

新手程序員樂觀地認為這隻是對現有軟件的再應用,而老程序員則意識到事情沒那麽簡單。要預測二十四小時後的天氣,隻需要就特定區域的氣象數據進行建模,但要預測三個月後的天氣,就需要將全球氣候變化都納入模型中統一考量。“天氣算法”是局部的、片麵的、不完整的,要預測長期變化,就必須換成整體化的思考方式。

為了說明這一點,一個擅長3D建模的程序員用糧食公司提供的天氣數據做了一個全球的氣候模型,隻要戴上VR頭盔,就能看到一個巨大的地球,這裏風起雲湧,那裏電閃雷鳴。冰島的火山爆發讓整個歐洲上空籠罩著一片淡淡陰雲並經久不散;上升的氣溫讓北極的冰山融化,冰架斷裂,冰山一路向南飄移;低溫洋流形成的恢宏暗影橫跨整個太平洋;洋流的末端,颶風成形進而橫掃整個美國東部。

部分構成整體,而整體涵蓋部分。現在是未來的縮影,而未來是現在的延伸。

論壇沉默了整整兩個星期,然後一名程序員上傳了自己的算法。這個注定被載入史冊的算法開始平淡無奇,那名程序員簡單地將其命名為“氣候算法”。他聲稱使用了糧食公司提供的曆史數據進行了訓練,氣候算法已經能夠預測未來三個月的天氣數據。然而,立刻就有好事者發現,這個算法居然預測一周後紐市會下一場鱒魚雨。

物理學家們不相信算法能從混沌中找到精確,隨即撰寫了大量論文嘲笑程序員們的愚癡。但還沒等論文刊載出來,鱒魚就已從天而降,躺在曼哈頓的馬路上奄奄一息。於是他們也丟了工作。

人們並不關心有物理學家丟了工作,因為絕大多數人一輩子也沒見過一個活生生的物理學家。但揮舞著天氣算法的大棒,在全球糧食市場興風作浪的糧食公司,則是另一回事了。物理學家開始和氣象學家爭搶登上媒體平台的機會,控訴糧食公司為非作歹、程序員們助紂為虐。

這當然引起了絕大多數程序員的反感。於是在很短的一段時間裏,氣象學家和物理學家們使用的任何軟件,從大型機裏的數據處理軟件到手機上運行的小遊戲都極容易崩潰。

糧食公司們並沒有開心多久。氣候算法的設計理論很快發表在IEEE 的會刊上,甚至連用來訓練算法的天氣數據集都被人放到了Github上——畢竟,程序員是這個世界上最缺乏理解、又最需要理解的群體。

各家軟件公司紛紛搶入風口。在幾個月的封閉開發後,各種大同小異的氣候算法如雨後春筍般冒了出來。天氣不再是無法解釋的謎團,它變成了可以購買的訂閱服務;變成了被免費推送的信息流;變成了直擊眼球的垃圾短信。跟所有那些很重要,但泛濫到似乎沒那麽重要的東西一樣,氣候算法失去了人們的關注。風停了。一些公司破產,一些硬件設備被拋售,一些被逼著加班的程序員重獲自由。

幸運的是,人類對算法的需求是無止境的。這一次輪到了大型倉儲式超市。

超市經營者一直對市場占有率、商品流轉率等數據斤斤計較,他們想知道顧客們到底想買什麽、為什麽買、怎麽買,以便向顧客們推銷更多商品,減少乏人問津卻不得不設置的貨架麵積。他們向程序員們提供了某家超市三十萬注冊會員的全部信息,這些信息包括顧客訪問商店的頻次、購買的物品清單、使用信用卡還是現金付賬、是否兌換了免費的停車券、是否在超市內的快餐店進餐等;而後又提供了通過非法途徑獲得的顧客的社保號、駕照編號、家庭住址。

程序員們首先嚐試在這些紛繁蕪雜的信息中建立關聯,而最後得出的結果不過是在尿布邊放啤酒、衛生巾邊上放酵素減肥商品之類的建議。這令超市經理們開始擔心這些投在GPU、內存條和水冷模塊上的費用毫無意義。雖然這些電腦部件的價格因為天氣算法競爭的崩盤而跌了不少,但超市經理可能是全世界最討厭固定資產和折舊的一群人。

程序員們不得不去尋求新的解決方案。

他們在超市門口架設了一台攝像機進行人臉分析。每當有一名顧客來到超市,算法會自動將顧客的信息納入數據庫,或與數據庫中已經存在的用戶信息進行匹配。根據匹配的結果,算法將對他或她將要購買的商品進行預測。每天超市關門後,算法將在比對當天數萬名顧客的預測結果和實際購物情況後,對算法進行修正,並在第二天開門前,按照修正後的算法再次進行預測。如是反複進行了三個月,算法對常客需求的預測準確率達到了百分之九十六,對非常客需求的預測準確率達到了百分之七十六。

但超市經營者需要的不是等顧客到超市就遞過去一袋已經準備好的商品,而是盡可能讓同樣的一批人花更多的錢,買性價比更低的東西,並始終不渝地購買。這讓程序員們感到束手無策,此前的算法隻負責預測,不負責改變。算法不會告訴你掀起風暴的那隻蝴蝶到底在哪裏,到底是一隻巴黎翠鳳蝶還是一隻黛安娜閃蝶;更不會告訴你從蝴蝶翅膀到風暴間到底有多少環節,它們如何一一改變,直至催生颶風。而超市經營者提出的要求則無異於讓算法找出這隻蝴蝶,讓它在合適的時間、合適的地方扇動翅膀,掀起風暴。

一部分程序員更因此退出了項目,他們堅定地認為算法應當受人指揮,而非指揮人。剩下的程序員們撓了撓頭,提出購買更大、更快的計算機。這得到了論壇成員們的一致讚同(就連那些退出項目的程序員都讚同了)——所有工作了十年以上的程序員都明白這麽一個道理:與其絞盡腦汁向代碼要效率,不如坐等硬件升級換代。按照摩爾定律,那些一直困擾著你的性能問題,自然會被更快的CPU和更大的內存解決。而同時,采購硬件是一個漫長的過程,程序員們由此獲得了額外的時間來解決性能之外的問題。

一個大型計算中心在加州的荒蕪海岸邊拔地而起。拔地而起這個形容可能並不準確,因為所有的計算機都位於海底,拔地而起的是為設備供電的太陽能電池板和輸電設備。至此程序員們已沒有理由再推脫了,隻能把算法丟進去,並祈求計算之神保佑。

計算中心運行了整整一個月。算法吞噬了所有用戶信息、貨架調整記錄、定價和銷量的曆史數據,運算排出的大筆熱量,導致這一區域的海水溫度上升了零點一度,甚至部分延緩了季風季節的到來,讓太平洋另一側的安達曼海的漁民們獲得了豐收,也讓天氣算法的預測準確度再次下跌了百分之零點一。

最後,運算得出了一個意義無法辯明的關係鏈。這個被命名為“超市算法”的新玩意兒給出了一條前所未有的複雜建議,從貨架間距、物品的擺放順序,再到價格標簽的變化規律統統包含在內。其煩瑣程度讓超市經營者們無比信服,並立刻推動執行。位於紐約市郊區的一座大型超市進行了全麵改造,引入了全自動的分貨上架設備,以及能夠快速調整價格的電子價簽,超市重新開張後一個月內,淨利潤由原先的百分之零點五上升到了百分之三,並隨著算法的不斷調整和更新,一路朝著百分之五高歌猛進。

於是,超市經理們也加入了失業大軍。

政客們終於注意到了這個小小的軟件開發項目(對政客們來說,所有的軟件項目都是小小的)。他們發來詢問,能否在競選領域引入算法。

部分程序員們退出了項目。他們並不介意算法為顧客買什麽東西提出建議(因為大多數人確實需要建議),但非常介意算法為選民如何投票提出建議(選擇哪一種可樂顯然不如選擇哪一個總統候選人重要)。而那些認為投票和買可樂一樣重要,或者一樣不重要的程序員接下了這個活兒。因為隻要稍微研究一下就能發現,這些政客提出的需求隻是對現有算法的簡單複用。畢竟競選與超市管理沒有什麽差別,其目的都是讓顧客花更大的價錢買更廉價的東西,並且越買越多、越買越自信,不過是一種用錢買,一種用選票買。

程序員們開始給算法喂各種各樣的數據,一部分數據,即民眾的經濟狀況、消費情況,在為超市提供支持時已經獲得過了,甚至連去除髒數據 的工序都省了;而另一部分數據,即所有選民的政治立場、投票記錄、犯罪記錄、受教育程度、完整的報稅清單、生育記錄、親緣關係和社會關係則由政客們提供。經過行政機器長達兩個世紀的維護和整理,這些數據已非常精確而完備。導入的步驟並沒有花多少時間,可生成的結果卻出了問題。

競選經理發來一封熱情洋溢的郵件,稱讚算法給出的建議非常明智,幾乎是他們所能想象出來的、能夠滿足絕大多數選民意願的最穩妥選擇。但一個無可辯駁的穩妥選擇卻是毫無意義的。競選者們需要的是在整個競選過程中,能持續不斷地獲得最大關注和最多支持的無數個選擇。

程序員們這才意識到問題所在,競選不同於超市。

當顧客進入超市時,其購物欲望與其麵對的貨架擺放將直接導向結果——放進購物車或不放進購物車,這是個一次性判斷。而競選是一個持續演進的動態過程,是一個信息與反饋不斷交織、直至最後以投票方式得出結論的長期過程。算法需要在這個長期的動態過程中,反複多次向選民提供信息,不斷強化印象,直至選民投出那神聖的一票。

幸好在解決天氣問題時,程序員們已經找到了解決問題的辦法。他們結合了“天氣算法”和“超市算法”,獲得了一個新的、能夠在一個動態係統內主動給出操作建議、從而影響遠期結果的算法,並毫無創意地將這個算法命名為:“競選算法”。

“競選算法”的上線,除了導致大批競選經理失業外(沒人真正喜歡競選經理),還將競選徹底變成了金錢遊戲。那些能夠租用大型計算中心運行算法的競選者天然具有優勢。而當所有參選者都希望租用計算中心以獲得算法支持時,計算中心的租用價格自然水漲船高。於是,很多參選者從算法中獲得的第一條建議,是放棄尋求算法的支持,把省下來的錢拿去投放廣告。這一建議的明智之處立刻獲得了所有人的理解和認同,進一步加強了參選者對政治算法的渴求。

於是,全球所有的互聯網用戶都不得不麵臨這樣的窘境——隻要有大型競選開鑼,用於支持整個互聯網運轉的計算資源,就立刻被“競選算法”剝去一大半;而剩下的計算資源經過垃圾郵件、黃色視頻、在線遊戲和購物網站的盤剝後,隻剩下“指甲蓋”大小的一丁點。幸好絕大部分互聯網用戶隻需要視頻、遊戲和購物,而剩下的那些,沒有互聯網也能生存。

第一位依賴算法競選的政客登上總統寶座後立刻推動立法,禁止在政治領域內應用算法。這一立法雖然獲得了政客們的一致支持,卻隻導致了政治算法的完全地下化。由於資源配置的不公開和不透明,在大選期間租用計算中心的價格如火山爆發般攀升。互聯網能夠使用的計算資源被進一步擠占,差點連那“指甲蓋”大小的一丁點都不複存在。這讓習慣了利用冗餘資源跑一點自己的小項目的程序員們不得不反思這樣一個問題:算法的存在,到底意味著什麽?

一部分程序員不再相信“算法是中立的”,因為算法是一個威力巨大的武器,什麽人會需要威力巨大的武器呢?當然是邪惡之人。為邪惡之人鑄造武器的人,當然也是邪惡的。

另一部分程序員認為,前者純粹是漫畫看多了。糧食公司利用算法操縱糧食市場,農民也可以借助算法對抗天氣災害;政客們憑借算法登上權力頂峰,選民也可以使用算法厘清競選黑幕。程序員無法決定什麽人、為什麽使用算法,但可以決定用算法來解決什麽問題。

還有一部分程序員發出無情的冷笑——你們真的能決定用算法來解決什麽問題?

這讓所有人都陷入了沉默。

說實話,成形的算法已經不是任何人都能理解的了。它像一個由無數根小鋼棒構成的黑箱子,上麵有一個小孔,從小孔裏丟下一個小鋼球,小鋼球一邊朝下墜落,一邊撞擊小鋼棒並改變方向,直至最後落進“大霧”“鱒魚雨”“在泡椒鳳爪邊上放啤酒”“針對亞裔移民投放一個與教育有關的廣告”之類的小格子裏。程序員們隻是設計了這樣的一個黑箱子,然後讓算法自己去調整鋼棒。他們也不知道每一根鋼棒的具體位置,更不知道算法是如何調整這些鋼棒的。從引入機器學習讓計算機自行生成算法那一刻起,程序員們就已經無法理解自己的造物了。

但它畢竟是我們創造出來的。不是嗎?

最後,一小部分程序員跳了出來。他們認為開發一個算法的真正意義,不在於這個算法的運行機製到底是什麽,也不在於要用這個算法去解決什麽問題,而在於這個算法本身所具有的可能性。這種對可能性的探索,才是這個項目的真正意義所在。

就好像一座山在那裏,難道因為你不知道為什麽會有這座山、不知道登上山頂會怎樣,所以就不去攀登了嗎?

雖然程序員們可能是世界上離登山最遠的一群人。但這個觀點卻得到了全體程序員的一致讚同。在一片歡呼中,程序員們提出了一個宏偉的計劃,要開發一個囊括世間萬物的算法,將物質的流轉、人的取舍都放入這個巨大的黑箱。他們不再糾結於一個不可知的黑箱是不是對程序員尊嚴的挑戰,也不再考慮是否會有人使用這個黑箱為非作歹。他們認為,隻要把這個黑箱做出來,剩下的事都可以之後再考慮。

這個“萬物算法”的項目,開始通過郵件組、博客、論壇在程序員間傳播,並逐漸變得清晰起來。

當然,這個算法不會去預測原子在碰撞五十次之後的位置之類的問題。一方麵,現有計算資源的總和都不足以解答這個問題,另一方麵程序員需要的是在不可預測之上的可以預測,是基於混沌係統之上的規則和結論。

這個項目不考慮從微觀態反推宏觀態,而是直接向宏觀世界尋求規律。

就連那些從未接觸機器學習的程序員,也被這個計劃所吸引。拋開職業分野(是的,程序員也是有職業分野的)和知識鴻溝(是的,程序員並不是都會修電腦),他們單純地對這個項目感到好奇,並寄望於通過這個項目為自己的職業生涯賦予意義。他們相信萬物算法的開發成功,意味著程序員們終於能坦然麵對身邊紛繁蕪雜的現實世界,畢竟除了他們,沒有誰能將整個世界握在手中,而又不為人所知。

為了推進這個計劃,程序員開始攫取一切能弄到手的運算資源。他們以各種名義向全球所有計算中心提交運算任務。在所有色情網站和垃圾頁遊上植入木馬以獲得觀看者的本地計算資源。他們甚至違背原則發送了大量的垃圾郵件,將許多貿然點開鏈接的用戶的電腦變成並網計算用的肉雞 。隻是,在是否擠占在線遊戲服務器的問題上,他們發生了爭論。部分程序員以退出整個計劃作為威脅,才為《魔獸世界》留下了百分之五十的運算性能。

於是,幾乎所有的計算機——埋在水底的超級計算機、咖啡館裏的蘋果筆記本、亞馬遜的在線服務器,甚至連高中生們課間偷偷打開的手機,都被卷進這一宏大而近乎無止境的運算中。它們耗費的電能和額外製造的熱量,不但讓一些運行不良的電網走向崩潰,更讓天氣算法的遠期預測結果出現了接近百分之十五的偏差。

計算機運行速度變慢、總是斷網、視頻瘋狂卡頓之類的抱怨充斥了整個互聯網。而程序員對此緘默不語,或者以此為由要求建造更多更大的計算中心。一部分從程序員轉行的產品經理注意到前同行們的瘋狂舉動,然而在他們得出結論或發出警報前,就已經被滅了口。當然不是物理毀滅,隻是他們登入的網站被斷開連接,發出郵件被告知收件人不存在,打電話總不在服務區。他們在絕望中拍下的“瘋狂程序員想要統治整個世界”的警告視頻,倒是被幾名程序員傳到了網上,作為人畜無害的程序員屢次被迫害的證明供人一笑。

計算似乎永無休止,害得全球互聯網在崩潰邊緣擦擦蹭蹭數次。當程序員們開始懷疑自己是否不小心按下了那個毀滅世界的按鈕時——算法生成了。程序員們按照其不同的宗教信仰,對這一刻進行了描述,從“hello world” 到“越過長城,走向世界” ,從“我是alpha,也是omega” 到“天上地下,唯我獨尊”,從“Armageddon ”到“42” ,不一而足。然而直到這時,他們才發現了一個尷尬的問題:

我們要用這個算法幹什麽?

當然,它能回答一些諸如“明年的總統會是誰”“南美的雨林會不會在五十年內消失”“未來十年東京的房價走勢如何”之類的問題,但程序員們其實並不真正關心這些問題。

經過了爭辯、論戰、不記名投票、刷票、加入防作弊機製並重新投票後,第一個提交算法的問題是:“什麽是最好的編程語言?”

算法回答:“請定義好。”

在長久的爭論後,程序員們放棄了這個問題。

第二個提交給算法的問題是:“現存的哪些編程語言會在二十年內被拋棄?”

算法回答:“全部。”

程序員們再次沉默。部分程序員建議投票決定是否幹掉這個算法,而一些不死心的程序員則提出了第三個問題:

“現存什麽編程語言壽命最長?”

算法回答:“匯編。”

於是,大多數程序員都投票讚成幹掉這個算法。隻有少數經常跟底層打交道的覺得這個算法仍有存在價值。

第四個問題是:“為什麽匯編語言壽命最長?”

這個問題,顯而易見,是那些不使用匯編語言的程序員提出的。

算法回答:“教學。”

在其他程序員的哧哧笑聲中,匯編語言的使用者們也投下了讚成票。

於是,這個誕生沒多久的萬物算法,在回答了四個問題後就被關閉了,其核心代碼被壓縮成一個大小為32.17T的壓縮包,所有被擠占的計算資源都還給了計算中心、個人電腦、遊戲機和手機。互聯網鬆了口氣,又開始苟延殘喘。

程序員們又開始響應需求——絕大部分是一些被重複過無數次的、沒有挑戰的需求,例如電腦藍屏了、網絡連不上了、這個頁麵要改一下、新的蘋果手機無法適配了之類的。一小部分是嚐試解決某個特殊領域內已經被解決過但解決方案並沒有被放到網上的問題。隻有很小一部分,是關於效率的提升、資源的最優化配置,關於生產力的解放。

程序員們坦然接受了這一切。

他們從未想過要解開那個壓縮包。

他們曾登上世界之巔,所以能心平氣和地走在馬路上。

本文為《銀河邊緣》中文版專發篇目。