不是我不明白,這世界變化快 ——《不是我不明白》崔健
IT系統的困境
IT技術是用來管理和處理信息的技術,IT系統是使用IT技術構建的系統。經過幾十年的發展,IT系統越來越復雜,動輒幾百萬上千萬行代碼。然而,現代IT系統依然非常脆弱,一個業務上的變化,就可能導致一個子系統的重新設計;而一個顛覆性業務模式的出現,可能會導致整個IT系統被替換。
當我們在觀察或了解昆蟲以及其他低等生物時,會產生一種毛骨悚然的感覺:活動熱鬧非凡,可家里一個人都沒有!——丹尼爾·丹尼特
設計實現IT系統的最大挑戰來自于需求的變化。各種編程語言、設計模式,以及軟件工程實踐等,都在試圖解決這個挑戰。當前,用效率最高的軟件開發方式——使用具有高級抽象能力的編程語言,采用響應式編程(Reactive Programming)范式和微服務架構,引入DevOps和持續交付等工程實踐等開發一個新需求,也要以天為單位;如果要開發一個新的組件,可能需要以周為單位;而如果要開發一個全新的業務模式,至少要以月為單位。
對大部分程序員來說,各種新技術層出不窮,每一項都打著提高開發效率的旗號,然而事實是:程序員的工作并沒有因為技術的進步而減少,相反,我們感覺自己越來越累,不僅要學習新技術,同時還要應對越來越頻繁的需求變化。
于2000年左右出現的電子商務顛覆傳統零售行業大概用了10年時間,2006年左右出現的社交網絡顛覆門戶網站大概用了五六年的時間,2012年左右出現的共享經濟顛覆傳統商業模式大概用了3年時間。一個合理但未經驗證的猜想是:顛覆性業務模式的出現頻率以及顛覆速度似符合摩爾定律,即每18個月,顛覆性業務模式的出現頻率和顛覆速度會提高一倍。
不管我們使用什么樣的編程語言,采用什么樣的架構,引入什么樣的工程實踐,一個業務需求的生命周期都要包含產品規劃、業務分析、方案設計、開發、測試、上線。這樣的研發周期,在不遠的未來,將無法跟上業務需求變化的速度。
自然的啟示
《自私的基因》一書提到,基因為了將自己的遺傳信息傳遞下去,進化出各種載體——即生物體——以應對環境的變化,讓基因得以生存并傳遞下去。對于一些早期的生物載體,基因通過硬編碼的方式,將一些復雜功能固化到生物體的遺傳信息中。比如有一種名為“掘地蜂”的昆蟲,在產卵時會嚴格遵照預定的程序:
- 用自己的刺麻痹一只蟋蟀;
- 將蟋蟀拖到挖好的洞口;
- 進洞查看,確保安全;
- 回到洞口,把麻痹的蟋蟀拖進洞;
- 產卵;
- 密封洞口,走人。
這套程序看起來非常復雜,我們不禁要感嘆,一個簡單的生物體,竟然可以完成這么復雜的事情。然而,當掘地蜂進入洞穴查看時,實驗人員將麻痹的蟋蟀移動幾英寸,等掘地蜂從洞口出來,并不會直接將移動過的蟋蟀拖進洞,而是將其拖到洞口,然后再一次進洞檢查。如果期間蟋蟀又一次被移動,哪怕只是一英寸,掘地蜂也會重復前面的過程。正如丹尼特所說:看起來“活動熱鬧非凡,可家里一個人都沒有!”
《機器人叛亂》對這一觀點提出了進一步的擴展。為了讓生物載體能夠更好地適應快速變化的環境,基因發展出了弱約束目標。相比硬編碼復雜行為,基因只是給其載體下達要完成的目標,而不再是具體的操作計劃,由載體針對當時的環境做出符合目標的最佳選擇。如果基因會說話,基因會給我們的大腦發出類似的指令:“事情發展太快,沒辦法一一詳述,大腦,你只需在考慮我們的通用目標(生存和繁殖)前提下,做你認為最好的選擇。”
生物體適應能力越來越強,同時也導致環境變化越來越快,反過來迫使我們不得不發展出更強的適應能力,就像進入正反饋的自動控制系統,系統開始進入不穩定狀態,直到崩潰,然后重新尋找平衡。
IT系統的轉折點
程序員之于IT系統,就如同基因之于載體。基因在生物進化早期也遇到過這樣的困難,盡管進化出了非常復雜的生物載體,但是對于顛覆性的環境變化(比如火山爆發、地殼運動、彗星撞地球等),這些載體依然表現的不堪一擊。
5億年前的寒武紀大爆發,大量生物出現在地球上,基因像是想通過這樣的方式,發展出復雜的載體,來應對變化的環境,然而,復雜并沒有帶來期望的適應能力。結果大家都知道了,6500萬年前,基因進化出來的最復雜、最具有統治力的載體——恐龍——滅絕了。今天我們發明了新語言、新框架、新實踐,期望通過這樣的方式可以更快的開發出更復雜的系統。然而,再復雜的系統,面對不停變化的混沌世界,依然不堪一擊。
是時候換個思路了。
我們也該考慮類似基因的弱約束目標,讓IT系統具備一定的自主性,可以根據人類制定的目標,做出它認為最優的決策。具備自主性的IT系統,能夠根據人類制定的目標,針對復雜業務變化,做出認為的最優選擇。 這就是未來的IT系統。
DITS - Differentiable IT System
目前最有希望能夠讓IT系統具備自主性的技術,來自深度學習。深度學習通過建立層級化表征的方式,讓計算機可以從經驗中學習并理解這個世界。
[^1]深度學習和經典機器學習方法的最大區別在于,深度學習不需要某個領域的專家來設計特征提取規則,可以在輸入數據和業務目標之間實現端到端的模型訓練。對于深度學習的使用者來說,只需要準備好訓練數據,設定好訓練目標(即設定Loss Function,損失函數),確定深度神經網絡的結構,然后進行訓練,就可以得到滿足目標的神經網絡模型。
這其中的魔法發生在訓練過程中。我們可以將復雜的神經網絡用計算圖的方式表達出來。在神經網絡的末端,也就是輸出層,通過損失函數計算出實際值和目標值之間的差別。得益于微積分中的鏈式法則,損失函數的結果誤差可以在計算圖中反向傳播(Back Propagation),一層一層的調整神經網絡參數,讓神經網絡在下一次的計算中距離目標更近一步。[^2]
在反向傳播的過程中,每一層網絡參數的修正值是通過計算誤差和參數之間的梯度得到的。一個函數在某個點存在梯度,需要在這一點保證函數可微分,也就是本文題目中的Differentiable。所以,深度神經網絡的學習能力,來自神經網絡的可微分性(Differentiable)。
如果我們能夠讓IT系統具備可微分性,IT系統就可以基于人類指定的業務目標,從歷史數據中學習,并不斷更新自己,從而具備自主性。當變化來臨,系統可以在沒有人類參與的情況下自主學習并調整,最終適應變化。寫出具有可微分性程序的編程方式,叫做可微分編程(Differentiable Programming)。[^3]這樣的IT系統,稱之為“可微分IT系統”,即DITS,Differentiable IT System。
當前,大部分AI技術只是作為獨立的服務存在,用來輔助傳統IT系統,比如圖像識別、語音識別、自然語言處理等。而DITS本身就是一個AI系統,或者說,是一個內建AI能力的IT系統。
現在,我們經常使用A/B測試來改進程序,然而開發A/B測試代碼、設計策略、收集反饋、分析、修改代碼,一系列過程下來我們發現,用戶點擊紅色按鈕的比例比藍色按鈕多出30%,于是我們決定按鈕使用紅色。這就是所謂數據驅動的產品運營。
而對于DITS來說,我們可以設定弱約束目標為提高用戶點擊按鈕的比例。每當用戶執行一次操作,DITS就會計算這次操作和期望目標之間的差別,調整內部神經網絡參數,從而自主地改進用戶體驗。更進一步,DITS甚至還可以對不同的用戶展示不同的顏色,比如對于喜歡點紅色按鈕的用戶展示紅色,對于喜歡點藍色按鈕的用戶展示藍色。
這還只是一個具備自我學習能力的IT系統所做事情的一個簡單例子,對于更復雜的業務場景,DITS所能做的,會超出我們的想象。
實現DITS
基于可微分性構造計算機程序,讓計算機具備學習能力,目前是深度學習領域的熱點。早期的嘗試來自于DeepMind在2014年發表的神經圖靈機(Neural Turing Machine,NTM)[^4],2016年DeepMind在Nature上發表了NTM的更新版本,可微分神經計算機(Differentiable Neural Computer,DNC)[^5]。DNC已經可以根據一些零散的路線信息,推測出地圖上個點之間的連接情況,并計算最短路徑。
另外一些基于記憶網絡(Memory Network)的嘗試也已經取得一些突破,比如Facebook在ICLR 2017上發表的遞歸實體網絡(Recurrent Entity Network)[^6]可以通過所有Facebook提出的bAbI測試。
倫敦大學學院(University College London,UCL)的研究人員實現了一種具有可微分性的Forth語言解釋器[^7],程序員編寫Forth程序時,可以留下一些空白(slot),這些空白會被解釋器在運行時填充,并且在運行過程中,解釋器會根據程序的輸入和輸出調整這些空白部分的邏輯。
在工程領域,這一編程方式還處于早期階段,尚不成熟,但已經有很多人在這一方向上做出嘗試[^8],以及ThoughtWorks的開源項目DeepLearning.scala和DeepDarkFantasy。
要想完整的實現DITS,還需要很多努力,尤其是要想用DITS替代目前已有的復雜IT系統,還需要很長的一段路。不過,變革已然在醞釀之中。
在計算機被建造出來的早期,大部分人認為那只是學術領域的玩具,是只有書呆子模樣的黑客們才能掌握的黑科技。然而,不過幾十年的時間,計算機就完全改變了我們的生活。
今天的AI技術,包括Differentiable Programming和DITS,就像50年前的編程技術一樣,還處于黑科技的范疇。然而,我們也許不用再等50年,就會看到今天的黑科技,將再一次改變世界。
One More Thing
《機器人叛亂》一書提到,“某些行為服務于載體的目標,它們未必有助于實現基因的目標”。那么,作為人類未來的信息載體——DITS——也會出現目標沖突的情況,到時候,我們人類要何去何從呢?