萬物演算法
那天我酒喝多了,好奇的問在場的一位程序員哥們。你們是怎麼堅持下來的。這個社會對程序員有那麼多的誤解,你們是怎麼堅持下來的。
那個程序員哥們估計也喝多了。就跟我講了一個所有程序員都知道的故事。
一開始,只是有人想要做一個天氣預報軟體。想做這件事的人是一個程序員,是誰不重要。重要的是他想做的事,他想做的不是那種從氣象局抓一下預測結果,再配一些小清新照片就完事的手機應用。他想從零開始,即從氣溫,風向,風速,雲圖入手,推測出接下來24小時的天氣變化。
程序員們很像手工匠人,天生喜歡從無到有做點什麼東西出來。這個程序員也不例外。他從氣象學的基本理論開始構建了一個演算法,我們姑且把它稱為演算法A吧。軟體通過調試上線運行的那天,氣象局預報下午有雨。而軟體預報天晴。
對自己開發的軟體堅信不移的程序員被雨淋了個透濕,於是回頭來尋找bug。在反覆審視自己的作品後,他把問題鎖定在了演算法上。並不是演算法有問題,而是所依據的氣象學本身的數學表達就不完備。但他沒能力把這門科學再往前推進一步。他把源代碼上傳到github,並開了一個帖子,向其他程序員們求助,有人回復說,沒辦法了,上機器學習吧。
和大眾想像的不一樣,程序員們對機器學習抱持著一種愛恨交加的複雜感情。愛是因為它讓全世界的程序員們都出了次風頭,恨是因為它完全不符合程序員們習慣的思考方式。
機器學習的原理和小學生做數學題很相似。你給一個習題集,再提供一個標準答案。計算機做一道題,對一遍答案,如果錯了,就重做。如此反覆幾百萬遍,直至正確為止。通過這個反覆糾錯的過程,計算機會自然得出一個正確率最高的解題思路,然後如快刀斬亂麻一樣解決所有類似的問題。而你甚至不需要給計算機灌輸一加一等於二之類的基本數學理論。更無從領悟這個最後的解題思路到底是什麼。機器學習就好像一個魔法師的帽子。程序員們只能把手伸進去掏出兔子,卻無法解釋這個帽子到底是連通了異次元還是怎麼的。
引入機器學習後,演算法的準確率大幅提升,氣象局預測下雨時,演算法預測為下冰雹。氣象局預測天晴時,演算法預測為高溫警報。雖然看起來只是在氣象局的結果上疊加了一個正態分布。但程序員知道這個演算法已經踏上了正確的道路。訓練三周後,演算法在預測的即時性和準確度上就已經超過了氣象局。程序員欣喜的將軟體放到網上,為所有人免費提供未來24小時的天氣預測,並在預測結果上加入了「更精準,更及時」的標題。意識到這會讓自己丟了飯碗的氣象學家們開始上電視,宣稱這是氣象學理論推動社會進步發展,而程序員只是適逢其會。
看完節目的程序員憤怒將演算法的代碼開源了。立刻就有同仇敵愾的程序員跟進並重寫了代碼,剔除了依據氣象學理論加入的基本原則和預測方法,直接使用機器學習由零開始構築新的演算法。這一次,項目獲得了一個正式的命名:天氣演算法。
一開始,天氣演算法給出的結果慘不忍睹。例如它曾預測在撒哈拉沙漠正中央出現彩虹,或在印度洋的正中央出現沙塵暴。但在兩周的訓練後,它就碾壓了自己的前任。不但準確率更高,需要的計算單位還更少。氣象學家們被狠狠地扇了一巴掌。比名譽掃地更可怕的是,他們丟了工作。
程序員們隔著屏幕互相拍手慶賀。
然後,糧食公司找了上來。
古希臘的哲學家曾預測當年風調雨順,橄欖豐收,於是事先租下了所有的榨油機,並在橄欖收穫季大賺了一筆。而當代的糧食公司在做的差不多是同樣的事。只是規模和賭注都大了許多。他們希望這個預測軟體能夠提供未來三個月的天氣變化,讓糧食公司得以決定在什麼時間用什麼價格下注。
新手程序員樂觀的認為這只是對現有軟體的再應用。而老程序員則明白事情沒那麼簡單。要預測24小時後的天氣,只需要就特定區域的氣象數據進行建模。但要預測3個月後的天氣,就需要將全球氣候變化都納入模型中統一考量。此前所使用的演算法是局部的。要預測長期變化,就必須換成一個整體化的思考方式。
為了說明這一點,一個擅長3D建模的程序員用糧食公司提供的天氣數據做了一個全球的氣候模型,帶上VR頭盔,就能看到一個巨大的地球,這裡風起雲湧,那裡電閃雷鳴。冰島的火山爆發讓整個歐洲上空籠罩著一片的淡淡陰雲並經久不散;上升的氣溫讓冰山融化,冰架斷裂,冰山一路向下飄移;低溫洋流形成的恢弘暗影橫跨整個太平洋;洋流的末端,颶風成型進而橫掃整個美國東部。
部分構成整體,而整體涵蓋部分。現在是未來的縮影,而未來是現在的延伸。
論壇沉默了整整兩個星期,然後一名程序員上傳了自己的演算法。這個註定被載入史冊的演算法開端平淡無奇,這名程序員簡單的將之命名為「氣候演算法」。聲稱他使用了糧食公司提供的歷史數據進行了訓練,氣候演算法已能預測未來三個月的天氣數據。 而立刻就有好事者發現,演算法預測一周後的紐約市會下一場鱒魚雨。
這一次,混沌物理學家們也加入了等著看笑話的行列。他們不相信演算法可以解決這個困擾了他們近半個世紀的問題。而後他們目瞪口呆的看著鱒魚從天而降,在曼哈頓的馬路上活蹦亂跳。於是他們也丟了工作。
絕大多數人並不關心混沌物理學家有沒有工作。因為絕大多數人一輩子也沒見過一個混沌物理學家。但揮舞著天氣演算法的大棒,在全球的糧食市場興風作浪的糧食公司,立刻受到了媒體的關注。混沌物理學家開始和氣象學家爭搶登上電視屏幕機會,控訴糧食公司為非作歹,程序員們助紂為虐。
這當然引起了絕大多數程序員的反感。於是在很短的一段時間裡,氣象學家和混沌物理學家所使用的任何軟體,從運行在大型機里的數據處理軟體到手機上運行的小遊戲都極容易崩潰。
糧食公司們並沒有開心多久。氣候演算法的設計理論很快發表在IEEE的會刊上。甚至連用來訓練演算法的天氣數據集都被人放到了github上——畢竟,程序員是這個世界上最缺乏理解,又最需要理解的群體。在幾個月的封閉開發後,各種大同小異的氣候演算法,就如雨後春筍般冒了出來。天氣不再是無法解釋的謎團,而是可以購買的訂閱服務。直至最後,一個想要搶奪流量的互聯網公司把預測服務免費開放給了所有人。所有那些為容納並訓練各種天氣演算法而搭建的龐大硬體設備立刻成了資產負債表上的紅字,被無情的財務人員們建議廉價出售以挽回損失。
幸而對演算法的需求是無止境的。只是這一次輪到了大型倉儲式超市。
超市經營者一直對市場佔有率,商品流轉率等數據斤斤計較。他們很想知道顧客們到底買什麼,為什麼買,怎麼買。以便向顧客們推銷更多東西,減少乏人問津卻不得不設置的貨架面積。他們向程序員們提供了在某家超市註冊的三十萬會員的全部信息。從顧客訪問商店的頻次,購買的物品清單,使用信用卡還是現金付帳,一直到是否兌換了免費的停車券,是否在超市內設的快餐店進餐等。而後又提供了通過非法途徑獲得的會員們的社會保險號,駕照編號,家庭住址。
程序員們首先嘗試在這些紛繁蕪雜的信息中建立關聯。而最後得出的結果也不過是在尿布邊放啤酒,衛生巾邊上放酵素減肥商品之類的建議。這令超市經理們開始擔心那些投在GPU,內存條和水冷模塊上的費用毫無意義。雖然這些電腦部件的價格因為天氣預測競爭的崩盤而跌了不少。但超市經理可能是全世界最討厭固定資產和折舊的一群人,幾乎跟程序員們對「加班」的抗拒程度有的一拼。
程序員們則開始尋求新的解決方案。他們在超市門口架設了一個攝像機進行人臉分析。每次有一名顧客來到超市,演算法會自動將顧客的信息納入資料庫,或與資料庫中已經存在的用戶信息進行匹配。根據匹配的結果,演算法將對他或她將要購買的商品進行預測。每天結束運營後,演算法將比對當天數萬名顧客的預測結果和實際購物情況,對演算法進行修正。並在第二天開門前,按照修正後的演算法再次進行預測。如是反覆進行了三個月,演算法對固定客戶需求的預測準確率達到了96%,對非固定用戶需求的預測準確率達到了76%。
但超市經營者需要的不是等顧客到超市就遞過去一袋子已經準備好的商品,讓他趕快付錢並滾蛋。而是儘可能的讓同樣的一批人花更多的錢,買性價比更低的東西,並始終不渝的購買。程序員們第一次感覺有點束手無策。超市演算法已取得了階段性成果,引入新的變數只會推翻原有的成果。正如糧食公司依靠天氣演算法在期貨市場上大筆投資後,一些農民們開始利用人工降雨來改變預測結果。大量的人工降雨,導致對遠期天氣預測的準確率下降了不少。而超市經營者提出的要求則無異於要求演算法主動引發人工降雨,讓遠在萬里之外的沙漠變成綠洲。
一部分程序員更因此退出了項目,他們堅定的認為演算法應當受人指揮,而非指揮人。剩下的程序員們撓了撓頭,提出購買更大、更快的計算機。這得到了論壇成員們的一致贊同(就連那些退出項目的程序員們都贊同了)——所有工作了十年以上的程序員都明白這麼一個道理,與其絞盡腦汁向代碼要效率,不如坐下來等著硬體升級換代。按照摩爾定律,那些一直困擾著你的性能問題,自然會被更快的CPU和更大內存解決。而同時,採購硬體是一個漫長的過程,程序員們由此獲得了額外的時間來排查問題。
一個大型計算中心在加州的荒蕪海岸邊拔地而起。拔地而起這個形容方式並不準確。因為所有的計算機都位於海底,拔地而起的是為設備供電的太陽能電池板和輸電設備。至此程序員們已沒有理由再推脫,只能把演算法丟進去,並祈求計算之神保佑。
計算中心運行了整整一個月。演算法吞噬了所有用戶信息,貨架調整記錄,定價和銷量的歷史數據,並生成了一個意義無法辯明的關係鏈。運算排出的大筆熱量,導致這一區域的海水溫度上升了0.1度,甚至部分延緩了季風季節的到來,讓太平洋另一側,安達曼海的漁民們獲得了豐收,也讓天氣演算法的預測準確度再次下跌了0.1%。
最後,這個被命名為超市演算法的新玩意給出了一條前所未有的複雜建議,從貨架間距,物品的擺放順序到價格標籤的變化規律無所不包。其繁瑣程度讓超市經營者們無比信服,並立刻推動執行。位於紐約市郊區的一座大型超市進行了全面改造,引入了全自動的分貨上架設備,以及可快速調整價格的電子價簽,所有在職人員接受再培訓,整個超市停業三周再重新開張後,凈利潤由原先的0.5%上升到了3%,並隨著演算法的不斷調整和更新,一路朝著5%高歌猛進。於是超市經理們也加入了失業大軍。
政客們終於注意到了這個與人工智慧有關的項目。他們發來詢問,是否能在競選領域內引入演算法。
部分程序員們退出了項目。他們並不介意演算法為顧客買什麼東西提出建議(因為大多數人確實需要建議),但非常介意演算法為選民如何投票提出建議(因為投票似乎比買可樂還是買雪碧更重要)。而那些認為投票和買可樂一樣重要,或者一樣不重要的程序員們接下了這個活。因為只要稍微研究就能發現,這些政客提出的需求只是對現有演算法的簡單復用。畢竟競選與超市管理沒有什麼差別,其目的都是讓顧客花更大的價錢,買更廉價的東西,並且越買越多,越買越自信。不過一者用錢買,一者用選票買。
程序員們開始餵給演算法各種各樣的數據,一部分數據,即民眾的經濟狀況,消費情況,在為超市提供支持時已經獲得過了,甚至連去除臟數據的工序都省了。而另一部分數據,即所有選民的政治立場,投票記錄,犯罪記錄,受教育程度,完整的報稅清單,生育記錄,親緣關係,社會關係,則由政客們提供。經過行政機器長達兩個世紀的維護和整理,這些數據已非常精確而完備。導入的步驟並沒有花多少時間。可生成結果時卻出了問題。
競選經理髮來熱情洋溢的郵件,稱讚演算法給出的建議非常明智,幾乎是他們所能想像出來的,覆蓋絕大多數選民意願的最穩妥的選擇。但一個無可辯駁的穩妥選擇毫無意義。競選者們需要的是在整個競選過程中,持續不斷的,能獲得最大關注和最多支持的無數個選擇。
程序員們這才意識到問題所在,政治不同於超市。當顧客進入超市時,其購物慾望與其面對的貨架擺放將直接導向結果——放進購物車或不放進購物車,這是個一次性的判斷。而競選是一個持續演進的動態過程,是一個信息與反饋不斷交織,直至最後以投票方式得出結論的長期過程。演算法需要在這個長期的動態的過程中,反覆多次向選民提供信息,不斷強化印象,直至選民投出那神聖的一票。
幸好在解決天氣問題時,程序員們已經找到了解決問題的辦法。他們結合了天氣演算法和超市演算法,獲得一個了新的,能夠在一個動態系統內主動給出操作建議,從而影響遠期結果的演算法,並毫無創意的將這個演算法命名為,政治演算法。
政治演算法的上線,除了導致大批競選經理的失業外(沒有人真正喜歡競選經理),還將競選徹底變成了金錢遊戲。能夠租用大型計算中心運行演算法的競選者們天然具有優勢。而當所有參選者們都希望租用計算中心以獲得演算法支持時,計算中心的租用價格自然水漲船高。於是很多參選者從演算法獲得的第一條建議,是放棄尋求演算法的支持,把省下來的錢拿去投放廣告。這一建議的明智之處立刻獲得了所有人的理解和認同,進一步加強了參選者對政治演算法的渴求。
於是,全球所有的互聯網用戶,都不得不面臨這樣的窘境——只要有大型競選開鑼,用於支持整個互聯網運轉的計算資源,就立刻被競選演算法剝去一大半。而剩下的計算資源經過垃圾郵件、黃色視頻、在線遊戲和購物網站的盤剝後,只剩下指甲蓋大小的一丁點。幸好絕大部分互聯網用戶只需要視頻、遊戲和購物。而剩下的那些,沒有互聯網也能生存。
----
第一位依賴演算法競選的政客登上總統寶座後,立刻推動立法,禁止在政治領域內應用演算法。這一立法雖然獲得了政客們的一致支持,卻只導致了政治演算法的完全地下化。由於資源配置的不公開和不透明,在大選期間租用計算中心的價格如火山爆發般飛升。互聯網能夠使用的計算資源被進一步擠占,差點連那指甲蓋大小的一丁點都不復存在。差點連論壇都無法登入的程序員們,展開了對垃圾郵件的復仇之戰。然而哪怕新的郵箱過濾演算法篩掉了90%的垃圾郵件,節省下來的那些計算資源,仍然被政治演算法吞噬殆盡。這讓習慣了利用系統冗餘資源跑一點自己的小項目的程序員們不得不開始反思這樣的一個問題,演算法的存在,到底意味著什麼。
一部分程序員不再相信「演算法是中立的」,因為演算法是一個威力巨大的武器,什麼人會需要威力巨大的武器呢?當然是邪惡之人。那麼為邪惡之人鑄造威力巨大的武器的人,當然也是邪惡的。
另一部分程序員認為前者純粹是日漫看多了。糧食公司可以依靠演算法投資全球糧食市場;農民可以使用演算法對抗天氣災害。政客們可以利用演算法登上權力頂峰,選民可以使用演算法釐清競選資金來源。程序員無法決定什麼人,為什麼使用演算法,但可以決定用演算法來解決什麼問題。
還有一部分程序員發出無情的冷笑,你們真的能決定用演算法來解決什麼問題?
這讓所有人都陷入了沉默中。
說實話,成型的演算法已經不是任何人能夠理解的了。它像一個由無數根小鋼棒構成的黑箱子。上面有一個小孔。從小孔里丟下一個小鋼球。小鋼球一邊朝下墜落,一邊撞擊小鋼棒並改變方向,直至最後落進「大霧」,「鱒魚雨」,「在泡椒鳳爪邊上放啤酒」,「針對亞裔移民投放一個與教育有關的廣告」之類小格子里。程序員們只是設計了這樣的一個黑箱子,然後讓演算法自己去調整鋼棒。他們其實並不知道每一根鋼棒的具體位置,更不知道演算法是如何如何調整這些鋼棒的。從引入機器學習讓計算機自行生成演算法那一刻起,程序員們就已無法理解自己的造物了。
但它畢竟是我們創造出來的。不是嗎?
最後,一小部分程序員們跳了出來,開發一個演算法的真正意義,不在於這個演算法的運營機制到底是什麼,也不在於要用這個演算法去解決什麼問題,而在於這個演算法本身所具有的可能性。這種對可能性的探索,才是這個項目的真正意義所在。就好像一座山在那裡,因為你不知道為什麼會有這座山,不知道登上山頂會怎樣,所以就不去攀登了嗎?
雖然程序員們可能是世界上離山最遠的一群人。但這個觀點卻得到了全體程序員的一致贊同。在一片歡呼中,程序員們提出了一個宏偉的計劃,要開發一個囊括世間萬物的演算法。將物質的流轉,人的取捨,都放入這個巨大的黑箱中。他們不再糾結一個不可知的黑箱是不是對程序員尊嚴的挑戰,也不再考慮是否會有人使用這個黑箱為非作歹。把這個黑箱做出來,剩下的事都可以之後再考慮。
這個「萬物演算法」的項目,開始通過郵件組,博客,論壇在程序員之間傳播。並逐漸變得清晰起來。
當然,這個演算法不應該去預測原子在碰撞五十次之後的位置之類的問題。一方面現有的計算資源的總和都不足以計算出問題的答案,一方面類似的計算毫無意義。程序員們需要的是不可預測之上的可以預測,是基於混沌世事之上的規則和結論。從一開始這個項目就不考慮從微觀態反推宏觀態,而直接向宏觀世界尋求規律。
就連那些從未接觸機器學習的程序員們,也被這個計劃所吸引。拋開職業分野(是的,程序員也是有職業分野的)和知識鴻溝(是的,程序員也不是都會修電腦的),他們單純的對這個項目感到好奇,並寄望於這個項目為程序員們的職業生涯賦予意義。他們相信萬物演算法的開發成功,意味著程序員們終於能坦然面對身邊紛繁蕪雜的現實世界,畢竟除了他們,再也沒有任何人將整個世界握在手中,而又不為人所知。
為了推進這個計劃,程序員們開始攫取一切能弄到手的運算資源。他們用各種項目的名義向全球所有計算中心提交運算任務。在所有色情網站和垃圾頁游上植入木馬以獲得觀看者的本地計算資源。他們甚至違背原則發送了大量的垃圾郵件將許多貿然點開鏈接的用戶的電腦變成了併網計算用的肉雞。只是在是否要擠佔在線遊戲伺服器的問題上,他們爆發了爭論。部分程序員以退出整個計劃作為威脅,才為魔獸世界伺服器留下了50%的運算性能。
於是,幾乎所有的計算機,從埋在水底的超級計算機,到咖啡館裡的蘋果筆記本,從亞馬遜的在線伺服器,到高中生們在課間偷偷打開的手機,都自覺或不自覺的被捲入到了這一宏大而近乎無止盡的運算中。它們所耗費的電能和額外製造的熱量,不但讓一些運行不良的電網走向崩潰,更讓天氣演算法的遠期預測結果出現了接近5%的偏差。
關於計算機運行速度變慢,與伺服器斷開鏈接,看視頻的時候一卡一卡的之類的抱怨充斥著整個互聯網。而所有程序員都對此保持緘默不語,或者以此為由要求建造更多、更大的計算中心。一部分從程序員轉行的產品經理注意到了曾經的同僚們的瘋狂舉動,然而在他們來得及得出結論或發出警報前,就已經被演算法本身滅了口。當然不是物理毀滅。只是他們登入的網站被斷開連接,打電話時會發現不在服務區,發出的郵件被告知收件人不存在。他們在絕望中拍下的「瘋狂程序員想要統治整個世界的」警告視頻,倒是被幾名程序員傳到了網上,作為人畜無害的程序員們屢次被迫害的證明供人嘲笑。
這樣無止境的計算了三個月,全球互聯網在崩潰邊緣擦擦蹭蹭數次之後,計算終於得出了結果。演算法生成了。程序員們按照其不同的宗教信仰,對這一刻進行了描述,從「hello world」到「越過長城,走向世界」,從「我是alpha,也是omega」到「天上地下,唯我獨尊」。從「Armageddon」到「42」,不一而足。然而直至這時,他們才發現一個尷尬的問題。
我們要用這個演算法幹什麼?
當然,它能回答一些,明年的總統會是誰?南美的雨林會不會在接下來的50年內消失。東京的房價在未來10年的走勢如何之類的問題。但程序員們其實並不真正關心這些問題。
經過了爭辯,論戰,不記名投票,刷票,加入防作弊機制並重新投票後,第一個提交演算法的問題是:「什麼是最好的編程語言。」
演算法回答:「請定義好。」
程序員們沉默了。並在長久的爭論後,放棄了這個問題。
第二個提交給演算法的問題是:「哪些編程語言會在二十年後被停止使用。」
演算法回答:「全部。」
程序員們再次沉默。部分程序員建議投票決定是否幹掉這個演算法。而一些不死心的程序員們則提出了第三個問題。
「現存的哪些語言將被使用的最久?」
演算法回答:「彙編語言。」
於是大多數程序員都投票贊成幹掉這個演算法。只有少數經常跟底層打交道的覺得這個演算法仍有存在價值。
第四個問題是:「彙編語言被停用前的使用目的是什麼?」
這個問題,顯而易見,是那些不支持彙編語言是現有編程語言中最長壽語言的程序員們提出的。
演算法回答:「教學。」
在其他程序員的哧哧笑聲中,彙編語言的使用者們也投下了贊成票。
於是這個誕生沒有多久的,關於萬物的演算法,在回答了四個問題後就被關閉。其核心代碼被壓縮成一個大小為32.17T的壓縮包。所有被擠占的計算資源都被還給了計算中心,個人電腦,遊戲機和手機。互聯網鬆了口氣,又開始苟延殘喘。
程序員們又開始響應需求。
絕大部分是一些被重複過無數次的,沒有挑戰的需求。例如電腦藍屏了,網路連不上了,這個頁面要改一下,新的蘋果手機無法適配了什麼的。一小部分是嘗試解決某個特殊領域內已經被解決過但解決方案並沒有被放到網上的問題。只有很小很小很小一部分,是關於效率的提升,資源的最優化配置,關於生產力的解放。
程序員們坦然接受了這一切。
他們從未想過要解開壓縮包。
他們曾登上世界之巔,所以能心平氣和的走在馬路上。
推薦閱讀:
※【數學】數學規劃簡介
※求長度小於 1000 的字元串的最長子序列的思路應該是怎樣的?
※單目視覺ADAS的技術與體驗升級之路|硬創公開課
※知乎在構建話題層(Ontology)方向上是如何考慮的?
※這種粘連字元分割有什麼好的演算法?