thealgorithmsforeverything.
dhew
程式設計師的終極夢想到底是什麼
dhew,科幻作者,熱血中年。雖出道甚早,但沉迷遊戲以致荒廢十年,不後悔,感謝遊戲。如今在做自己的遊戲(非科幻遊戲),同時寫作,寫科幻小說。代表作《基因戰爭》。
那天我酒喝多了,好奇地問在場的一位程式設計師哥們兒:「這個社會對程式設計師有那麼多的誤解,你們是怎麼堅持下來的?」
那哥兒們估計也喝多了,就給我講了那個所有程式設計師都知道的故事。
一開始,只是有人想做個預報天氣的軟體。這人當然是個程式設計師,叫什麼名字不重要。重要的是,他不想做那種給天氣預報配點小清新照片就完事的手機應用。他想從零開始,從氣溫、風向、風速和雲圖入手,推測出接下來二十四小時的天氣變化。他想要做個預報天氣的軟體。
程式設計師們很像手工匠人,天生喜歡從無到有做點什麼東西出來。這個程式設計師也不例外。他從氣象學的基本理論開始構建一個演算法,我們姑且把它稱為演算法a吧。就像所有剛剛通過除錯的軟體一樣,演算法a出師不利:上線執行那天,氣象局預報下午有雨,而演算法a預報天晴。
程式設計師大多對自己開發的軟體堅信不移,這名程式設計師也不例外,於是他被雨淋了個透溼。在反覆審視自己的作品後,他把問題鎖定在了演算法上。並不是演算法有問題,而是依據氣象學的數學表達本身就不完備。但他沒能力把這門科學再往前推進一步。他把原始碼上傳到github,並開了一個帖子,向其他程式設計師求助,有人回覆說,沒辦法了,上機器學習吧。
和大眾想象的不一樣,程式設計師們對機器學習抱著一種愛恨交加的複雜感情。愛的是它讓全世界的程式設計師們都出了次風頭,恨的是它完全不符合程式設計師們習慣的思考方式。
機器學習的原理和小學生做數學習題的方式頗有共通之處。計算機做一道題,看一下答案,如果錯了,就重做。它可能並無解題思路,甚至對題目想要考驗的知識一無所知,但如此反覆幾百萬遍後,計算機會得出一個正確率最高的解題方法,然後用這個方法快刀斬亂麻般解決所有類似問題。但問題在於,計算機無法向你解釋這個方法到底是什麼。它就在那裡,你知道它存在就行了。就像一個魔法師的帽子,程式設計師們能從裡面掏出兔子來,卻無法解釋這個帽子到底是連通了異次元還是怎麼的。
引入機器學習後,演算法的準確率大幅提升,氣象局預測下雨時,演算法預測為下冰雹;氣象局預測天晴時,演算法預測為高溫警報。雖然看起來只是在氣象局的結果上疊加了一個正態分佈,但程式設計師知道這個演算法已經踏上了正確的道路。訓練三週後,演算法在預測的即時性和準確度上就已經超過了氣象局。程式設計師欣喜地將軟體放到網上,為所有人免費提供未來二十四小時的天氣預測,並在預測結果上加入了「更精準,更及時」的標題。氣象學家們上電視宣稱這是氣象學理論推動了社會的進步和發展,而程式設計師只是適逢其會。
看完節目的程式設計師憤怒地將演算法的程式碼開源了。立刻就有同仇敵愾的程式設計師跟進並重寫了程式碼,剔除了依據氣象學理論加入的基本原則和預測方法,直接使用機器學習由零開始構築新的演算法。這一次,專案獲得了一個正式的命名:「天氣演算法」。
一開始,「天氣演算法」給出的結果慘不忍睹。它曾預測在撒哈拉沙漠正中央出現彩虹,或在印度洋的中心出現沙塵暴。但在兩週的訓練後,它就碾壓了自己的前輩,不但準確率更高,而且需要的計算單位還更少。氣象學家們被狠狠地扇了一巴掌,然而比名譽掃地更可怕的是,他們丟了工作。
程式設計師們隔著螢幕拍手慶賀。
就在這時,糧食公司找了上來。
古希臘的哲學家曾預測當年風調雨順,橄欖豐收,於是事先租下了所有的榨油機,並在橄欖收穫季大賺一筆。而當代的糧食公司做著差不多同樣的事,只是規模和賭注都大了許多。他們希望這個預測軟體能夠提供未來三個月的天氣變化,好讓糧食公司可以決定在什麼時間用什麼價格下注。
新手程式設計師樂觀地認為這只是對現有軟體的再應用,而老程式設計師則意識到事情沒那麼簡單。要預測二十四小時後的天氣,只需要就特定區域的氣象資料進行建模,但要預測三個月後的天氣,就需要將全球氣候變化都納入模型中統一考量。「天氣演算法」是區域性的、片面的、不完整的,要預測長期變化,就必須換成整體化的思考方式。
為了說明這一點,一個擅長3d建模的程式設計師用糧食公司提供的天氣資料做了一個全球的氣候模型,只要戴上vr頭盔,就能看到一個巨大的地球,這裡風起雲湧,那裡電閃雷鳴。冰島的火山爆發讓整個歐洲上空籠罩著一片淡淡陰雲並經久不散;上升的氣溫讓北極的冰山融化,冰架斷裂,冰山一路向南飄移;低溫洋流形成的恢宏暗影橫跨整個太平洋;洋流的末端,颶風成形進而橫掃整個美國東部。
部分構成整體,而整體涵蓋部分。現在是未來的縮影,而未來是現在的延伸。
論壇沉默了整整兩個星期,然後一名程式設計師上傳了自己的演算法。這個註定被載入史冊的演算法開始平淡無奇,那名程式設計師簡單地將其命名為「氣候演算法」。他聲稱使用了糧食公司提供的歷史資料進行了訓練,氣候演算法已經能夠預測未來三個月的天氣資料。然而,立刻就有好事者發現,這個演算法居然預測一週後紐市會下一場鱒魚雨。
物理學家們不相信演算法能從混沌中找到精確,隨即撰寫了大量論文嘲笑程式設計師們的愚痴。但還沒等論文刊載出來,鱒魚就已從天而降,躺在曼哈頓的馬路上奄奄一息。於是他們也丟了工作。
人們並不關心有物理學家丟了工作,因為絕大多數人一輩子也沒見過一個活生生的物理學家。但揮舞著天氣演算法的大棒,在全球糧食市場興風作浪的糧食公司,則是另一回事了。物理學家開始和氣象學家爭搶登上媒體平臺的機會,控訴糧食公司為非作歹、程式設計師們助紂為虐。
這當然引起了絕大多數程式設計師的反感。於是在很短的一段時間裡,氣象學家和物理學家們使用的任何軟體,從大型機裡的資料處理軟體到手機上執行的小遊戲都極容易崩潰。
糧食公司們並沒有開心多久。氣候演算法的設計理論很快發表在ieee的會刊上,甚至連用來訓練演算法的天氣資料集都被人放到了github上——畢竟,程式設計師是這個世界上最缺乏理解、又最需要理解的群體。
各家軟體公司紛紛搶入風口。在幾個月的封閉開發後,各種大同小異的氣候演算法如雨後春筍般冒了出來。天氣不再是無法解釋的謎團,它變成了可以購買的訂閱服務;變成了被免費推送的資訊流;變成了直擊眼球的垃圾簡訊。跟所有那些很重要,但氾濫到似乎沒那麼重要的東西一樣,氣候演算法失去了人們的關注。風停了。一些公司破產,一些硬體裝置被拋售,一些被逼著加班的程式設計師重獲自由。
幸運的是,人類對演算法的需求是無止境的。這一次輪到了大型倉儲式超市。
超市經營者一直對市場佔有率、商品流轉率等資料斤斤計較,他們想知道顧客們到底想買什麼、為什麼買、怎麼買,以便向顧客們推銷更多商品,減少乏人問津卻不得不設定的貨架面積。他們向程式設計師們提供了某家超市三十萬註冊會員的全部資訊,這些資訊包括顧客訪問商店的頻次、購買的物品清單、使用信用卡還是現金付賬、是否兌換了免費的停車券、是否在超市內的快餐店進餐等;而後又提供了通過非法途徑獲得的顧客的社保號、駕照編號、家庭住址。
程式設計師們首先嚐試在這些紛繁蕪雜的資訊中建立關聯,而最後得出的結果不過是在尿布邊放啤酒、衛生巾邊上放酵素減肥商品之類的建議。這令超市經理們開始擔心這些投在gpu、記憶體條和水冷模組上的費用毫無意義。雖然這些電腦部件的價格因為天氣演算法競爭的崩盤而跌了不少,但超市經理可能是全世界最討厭固定資產和折舊的一群人。
程式設計師們不得不去尋求新的解決方案。
他們在超市門口架設了一臺攝像機進行人臉分析。每當有一名顧客來到超市,演算法會自動將顧客的資訊納入資料庫,或與資料庫中已經存在的使用者資訊進行匹配。根據匹配的結果,演算法將對他或她將要購買的商品進行預測。每天超市關門後,演算法將在比對當天數萬名顧客的預測結果和實際購物情況後,對演算法進行修正,並在第二天開門前,按照修正後的演算法再次進行預測。如是反覆進行了三個月,演算法對常客需求的預測準確率達到了百分之九十六,對非常客需求的預測準確率達到了百分之七十六。
但超市經營者需要的不是等顧客到超市就遞過去一袋已經準備好的商品,而是儘可能讓同樣的一批人花更多的錢,買價效比更低的東西,並始終不渝地購買。這讓程式設計師們感到束手無策,此前的演算法只負責預測,不負責改變。演算法不會告訴你掀起風暴的那隻蝴蝶到底在哪裡,到底是一隻巴黎翠鳳蝶還是一隻黛安娜閃蝶;更不會告訴你從蝴蝶翅膀到風暴間到底有多少環節,它們如何一一改變,直至催生颶風。而超市經營者提出的要求則無異於讓演算法找出這隻蝴蝶,讓它在合適的時間、合適的地方扇動翅膀,掀起風暴。
一部分程式設計師更因此退出了專案,他們堅定地認為演算法應當受人指揮,而非指揮人。剩下的程式設計師們撓了撓頭,提出購買更大、更快的計算機。這得到了論壇成員們的一致贊同(就連那些退出專案的程式設計師都贊同了)——所有工作了十年以上的程式設計師都明白這麼一個道理:與其絞盡腦汁向程式碼要效率,不如坐等硬體升級換代。按照摩爾定律,那些一直困擾著你的效能問題,自然會被更快的cpu和更大的記憶體解決。而同時,採購硬體是一個漫長的過程,程式設計師們由此獲得了額外的時間來解決效能之外的問題。
一個大型計算中心在加州的荒蕪海岸邊拔地而起。拔地而起這個形容可能並不準確,因為所有的計算機都位於海底,拔地而起的是為裝置供電的太陽能電池板和輸電裝置。至此程式設計師們已沒有理由再推脫了,只能把演算法丟進去,並祈求計算之神保佑。
計算中心執行了整整一個月。演算法吞噬了所有使用者資訊、貨架調整記錄、定價和銷量的歷史資料,運算排出的大筆熱量,導致這一區域的海水溫度上升了零點一度,甚至部分延緩了季風季節的到來,讓太平洋另一側的安達曼海的漁民們獲得了豐收,也讓天氣演算法的預測準確度再次下跌了百分之零點一。
最後,運算得出了一個意義無法辯明的關係鏈。這個被命名為「超市演算法」的新玩意兒給出了一條前所未有的複雜建議,從貨架間距、物品的擺放順序,再到價格標籤的變化規律統統包含在內。其煩瑣程度讓超市經營者們無比信服,並立刻推動執行。位於紐約市郊區的一座大型超市進行了全面改造,引入了全自動的分貨上架裝置,以及能夠快速調整價格的電子價籤,超市重新開張後一個月內,淨利潤由原先的百分之零點五上升到了百分之三,並隨著演算法的不斷調整和更新,一路朝著百分之五高歌猛進。
於是,超市經理們也加入了失業大軍。
政客們終於注意到了這個小小的軟體開發專案(對政客們來說,所有的軟體專案都是小小的)。他們發來詢問,能否在競選領域引入演算法。
部分程式設計師們退出了專案。他們並不介意演算法為顧客買什麼東西提出建議(因為大多數人確實需要建議),但非常介意演算法為選民如何投票提出建議(選擇哪一種可樂顯然不如選擇哪一個總統候選人重要)。而那些認為投票和買可樂一樣重要,或者一樣不重要的程式設計師接下了這個活兒。因為只要稍微研究一下就能發現,這些政客提出的需求只是對現有演算法的簡單複用。畢竟競選與超市管理沒有什麼差別,其目的都是讓顧客花更大的價錢買更廉價的東西,並且越買越多、越買越自信,不過是一種用錢買,一種用選票買。
程式設計師們開始給演算法喂各種各樣的資料,一部分資料,即民眾的經濟狀況、消費情況,在為超市提供支援時已經獲得過了,甚至連去除髒資料的工序都省了;而另一部分資料,即所有選民的政治立場、投票記錄、犯罪記錄、受教育程度、完整的報稅清單、生育記錄、親緣關係和社會關係則由政客們提供。經過行政機器長達兩個世紀的維護和整理,這些資料已非常精確而完備。匯入的步驟並沒有花多少時間,可生成的結果卻出了問題。
競選經理發來一封熱情洋溢的郵件,稱讚演算法給出的建議非常明智,幾乎是他們所能想象出來的、能夠滿足絕大多數選民意願的最穩妥選擇。但一個無可辯駁的穩妥選擇卻是毫無意義的。競選者們需要的是在整個競選過程中,能持續不斷地獲得最大關注和最多支援的無數個選擇。
程式設計師們這才意識到問題所在,競選不同於超市。
當顧客進入超市時,其購物慾望與其面對的貨架擺放將直接導向結果——放進購物車或不放進購物車,這是個一次性判斷。而競選是一個持續演進的動態過程,是一個資訊與反饋不斷交織、直至最後以投票方式得出結論的長期過程。演算法需要在這個長期的動態過程中,反覆多次向選民提供資訊,不斷強化印象,直至選民投出那神聖的一票。
作者「《銀河邊緣》編輯部」的其他小說