
OpenAI 創始團隊成員:什麼是軟件2.0?
TechFlow Selected深潮精選

OpenAI 創始團隊成員:什麼是軟件2.0?
當我們某天要開發通用人工智能 (AGI) 時,一定是使用軟件2.0。
撰文:Andrej Karpathy(OpenAI 創始團隊成員,原特斯拉 AI 部門負責人)
翻譯:OneFlow社區、ywh1bkansf
Andrej Karpathy是最早解釋清楚為什麼AI浪潮真正重要的人之一。他認為AI是一種新的、強大的編程計算機的方式,如果我們某天要開發通用人工智能(AGI) 時,一定是使用軟件2.0。
以下是 Andrej Karpathy 在 2017 年發佈的文章全文:
我發現,有時候人們會把神經網絡當作“不過是機器學習工具箱中的工具之一而已”。它有優點也有缺點,在某些領域有用,並且可以幫助你打贏Kaggle 比賽。很不幸,這種觀點完全是隻見樹木、不見森林。神經網絡可不只是又一種分類器而已,它代表著一種根本性轉變的開始,這種轉變與我們如何開發軟件有關。它就是軟件2.0。
我們對 軟件 1.0 已經比較熟悉一一它們由計算機造言(如 Python、C++ 等)所開袋。它由程序員寫的給計算機的明確指令組成。通過編寫每一行代碼,程序員確定了程序空問中具有一些理想行為的特定點。

與之對比的,軟件2.0由更抽象、人類更難理解的語言(比如說,神經網絡中的權重)開發。沒人可以直接參與這種代碼的編寫,因為它涉及到大量的權重(往往上百萬數量級),並且(我試過)直接編寫權重某種意義上是很困難的。

取而代之,我們為程序的行為指定目標(比如,“符合數據集中樣本的輸入輸出對”,又或者“贏得圍棋比賽”),並寫好程序的骨架(比如神經網絡的結構),這樣就在整個程序空間中確定了一個可以用於搜索的子集,然後就可以使用我們所有的計算資源在這個空間中搜索可用的程序。
對於神經網絡而言,我們將搜索限制在程序空間的一個連續的子集上,並且,使用反向傳播和隨機梯度下降方法進行搜索,(出人意料地)這種搜索方式挺有效。

更具體地對比,軟件1.0是將人工設計的源碼(比如.cpp文件)編譯為可以有效工作的二進制文件。而軟件2.0的源碼通常由兩部分組成:1) 定義了目標行為的數據集;2) 給定代碼大致結構,但是需要填充細節的神經網絡結構。訓練神經網絡的過程,就是將數據集編譯成二進制文件的過程一一得到最終的神經網絡。時至今日,大多數實際應用中,神經網絡的結構及訓練系統。已經日益標準化為一種商品,所以,大部分活躍的“軟件開發”工作某種形式上變成了組織、增加、調整和清理帶標籤的數據集。這從根本上改變了我們迭代軟件的編程範式,將開發團隊分成了兩撥:軟件2.0的程序員(數據標記員) 負責編輯和擴大數據集,而另一小撮人,維護著與訓練有關的基礎設施以及分析、可視化和標註等接口。
事實證明,對於真實世界中的很多問題,採集數據(更泛化地說,確定期待的行為) 比顯式地寫程序要容易得多。由於以上以及以下我將要介紹的軟件2.0的諸多好處,我們正在見證工業界大量代碼從軟件1.0迂移至軟件2.0的重大轉變。軟件1.0吞噬著整個世界,軟件2.0 (AI)在吞噬軟件1.0。
轉變進行時
讓我們來看看這場轉變中的具體領域的例子。我們會發現,在過去幾年,對於這些領域,我們放棄了嘗試通過顯式寫代碼的方式去解決複雜問題,取而代之的,是轉向了軟件2.0。
-
圖像識別:圖像識別之前常常是由特徵工程組成的,只是在最後加入一點點機器學習(比如:SVM)。之後,通過使用更大的數據集(比如 ImageNet)和在卷積神經網絡結構空間中進行搜索,我們發現了更強大的視覺特徵。最近,我們甚至不再相信自己手寫的網絡結構,而開始用類似的方法搜索(最優網絡結構)。
-
語音識別:以前的語音識別工作,涉及到大量的預處理工作、高斯混合模型和隱式馬爾科夫模型,但是現在,幾乎只需要神經網絡。還有一句與之非常相關的搞笑名言,是1985 年 Fred Jelinek 所說:“每當我開除一個語言學家,我的語音識別系統的性能就會提高一點”。
-
語音合成:歷史上,語音合成一直採用各種拼接技術,但是現在,SOTA (State Of TheArt)類型的大型卷積網絡(比如WaveNet)可以直接產生原始音頻信號輸出。
-
機器翻譯:機器翻譯的實現之前常常採用基於短語的統計方法,但是神經網絡正迅速佔領了統治地位。我最喜歡的網絡結構就與多語言訓練有關:一個模型就可以把任意源語言翻譯成任意目標語言,並且只需要很弱的監督(甚至是完全的無監督)。
-
遊戲:很長一段時問裡,人們通過手寫國棋程序來進行遊戲對戰,但如今,AlphaGozero (一種觀察棋盤原始狀態並對戰的卷積網絡)成為了國棋領域最強玩家。我預測在其它領域,如DOTA 2、星際爭霸,也會有類似的結果。
-
數據庫:更多的本處於 AI 領域之外的傳統系統,也顯露出向軟件2.0轉變的早期跡象。比如,“索引|結構學習案例”裡,使用神經網絡替代了原有的數據管理核心組件,其速度最高比做了緩存優化的 B樹快70%,同時還省了一個數量級的內存。
你可能注意到了上面很多鏈接的工作是 Google做的。這是因為目前 Google 就是將大量自己的代碼轉變為軟件2.0的排頭兵。“一個萬能的模型”所描繪的草圖是:將原本散落在各個領域的基於統計的效果,融合成一個整體來理解世界。
軟件2.0的好處
為什麼我們更傾向於把複雜程序移植到軟件2.0?品然,一個簡單的答案是實踐證明它的效果更好。然而,還有很多其它的理由值得我們選擇軟件2.0。讓我們看看軟件2.0(卷積神經網絡為代表)與軟件1.0(生產級別的C++代碼庫為代表)相比的好處,對於軟件2.0:
-
同質化計算:一個典型的神經網絡僅由兩種操作組合而成:矩陣乘法和線性整流函數(ReLu)。傳統軟件裡的指令與之相比,明顯會更加複雜和異構。由於只要用軟件1.0的方法實現非常少部分的核心代碼(比如矩陣乘法),正確性/性能驗證都會容易很多。
-
對芯片更友好:因為神經網絡所需要的指令集相對更小,作為推論,在芯片上實現它們將會更容易,比如,使用自定義 ASIC 芯片、neuromorphic chips 等等。當低能耗的智能設備充斥在我們周圍時,這個世界也將為此改變。比如,把預訓練卷積網絡、語音識別、WaveNet 語音合成網絡裝載到便宜又小巧的設備中,這樣你可以用它連接其它東西。
-
常量級的運行時間:一個典型的神經網絡的每次前向迭代,需要的計算量(FLOPs)是高度一致的。在你手寫的複雜 C++ 代碼中會出現的各種執行分支,在軟件 2.0 中是不存在的。當然,你也許會有動態圖的需求,但是執行流通常也是被嚴格限制了。即使在這種情況下,我們幾乎也能保證,不會陷入未預料的無限循環之中。
-
常量級的內存消耗:和上面一點相關,因為沒有動態分配內存的需要,所以幾乎沒有可能需要與硬盈進行 swap,代碼中也沒內存洩漏的可能。
-
高度可移植:同傳統的二進制文件或腳本相比,一連串的矩陣乘法操作要更容易運行在各種計算機環境下。
-
敏捷開發:如果你在寫C++,並且有人希望你開發速度提高2倍(可以犧牲性能的前提下),那麼為適配新要求而調整系統可不是一件小事。然而,在軟件2.0中,我們只需要移除掉(計算圖中) 一半的路徑,然後重新訓練,就能得到精確度差一點點,但訓練快兩倍的結果。這很神奇。反過來說,只要你得到了更多的數據和算力,你可以馬上通過擴大計算圖和重訓練的方法,得到更好的實際效果。
-
融合模塊以求最優:普通軟件通常被分解成多個模塊,各個模塊中間通過共有函數、API 或者端到端的方式通信。然而,對於軟件2.0,如果一開始2個相交互的模塊是獨立訓練的,我們之後也很容易在整個系統中進行反向傳播。想想看,如果你的瀏覽器可以自動設計底層指令,從而提高加載頁面的速度;或者說你導入的計算機視覺庫(比如openCV)可以根據你的特定數據,自動調整行為;這將多麼美妙。在軟件2.0中,這些都是基本操作。
-
比你更優秀:最後,也是最重要的一點,在很多垂直領域中,神經網絡產生的代碼要比你或者我寫的代碼好。就目前而言,起碼在圖像、視頻、語音這些領域中是這樣的。
軟件2.0的缺點
軟件2.0也有一些缺點。當優化完成後,我們可以得到實踐中很有效的巨大網絡,但是很難解釋它為什麼有效。在許多領域,我們可以選擇比較好理解但是隻有90%精度的模型;或者選擇不理解,但是有99%精度的模型。
軟件2.0會出現不直觀的、尷尬的錯誤,甚至更糟糕的,還可能“默默出錯”。比如,如果在訓練時默默地採納了具有偏差的數據,當數據數量大到百萬級別時,再想分析和檢查原因,就變得非常困難了。
最後,軟件2.0的奇怪特性也在不斷出現。比如,對抗樣本和攻擊樣本的存在,使得軟件2.0的不可解釋性問題變得更加突出。
軟件2.0編程
軟件1.0的代碼,是我們手寫的代碼。軟件2.0的代碼,是基於評估淮則(比如“把訓練數據正確分類”)優化得來的。對於那些原理不明顯,但是可以反覆評估表現的程序,都適用於這種轉變,因為與人寫的代碼相比,優化方法找到的代碼要好得多。

我們觀察趨勢的視角很重要。當你意識到神經網絡不僅僅是機器學習工具集中一種好用的分類器,而把軟件2.0當作嶄露頭角的全新編程範式時,那麼推斷就會變得更為明顯,而且很明顯還有更多的工作要做。
具體而言,我們已經發明瞭大量輔助程序員做軟件1.0開發的工具,比如強大的IDE,它可以具備很多功能,像語法高亮、調試器、分析器、符號跳轉、集成git 等等。軟件2.0中,編程是通過累積,整理和清洗數據集來完成的。比如,當某些極端情況下,神經網絡失效了,我們並不會去通過寫代碼來修復問題,而是導入更多這種情況下的數據就可以了。
誰將開發第一款軟件2.0的 IDE?它應該可以在數據集相關的所有工作流中都發揮作用,包括積累數據、可視化、清洗數據、標記數據、生產數據。也許這種 IDE,會根據每個樣本的損失,把網絡懷疑被錯誤標註的圖像給拎出來,或者通過預測提示應該選用的標籤的方式輔助標註數據,再或者依據網絡預測的不確定性,推薦適合標註的樣本。
類似的,Github 是軟件1.0時代非常成功的網站。是否有可能出現軟件2.0時代的 Github?軟件2.0時代,倉庫將是數據集,而 commit 是由增加和編輯數據標籤組成的。傳統的包管理工具和部署手段,比如 pip、conda、docker 等幫助我們更輕鬆地部署和安裝軟件。在軟件2.0時代,如何更有效地部署、分享、導入和運行軟件呢?在神經網絡中,與conda 對等的東西又會是什麼呢?
簡而言之,在可以低成本反覆評估、並且算法難以顯式設計的領域,軟件2.0都將日益流行起來。當我們考慮整個開發生態以及如何適配這種新的編程範式時,會發現很多令人興奮的機會。長遠來看,這種編程範式擁有光明的未來,因為越來越明顯:當我們某天要開發通用人工智能(AGI) 時,一定是使用軟件2.0。
歡迎加入深潮 TechFlow 官方社群
Telegram 訂閱群:https://t.me/TechFlowDaily
Twitter 官方帳號:https://x.com/TechFlowPost
Twitter 英文帳號:https://x.com/BlockFlow_News










