您現在的位置是:首頁 > 綜合
機器之心的進化——軟體2.0的崛起
- 由 冰巴克 發表于 綜合
- 2022-12-21
左右心的輸出量相等嗎
轉自 INDIGO 的數字映象
未來的計算機語言將更多地關注目標,而不是由程式設計師來考慮實現的過程。——
Marvin Minsky
Software 2。0 概念的最早提出人是 Andrej Karpathy,這位從小隨家庭從捷克移民來加拿大的天才少年在多倫多大學師從 Geoffrey Hinton,然後在斯坦福李飛飛團隊獲得博士學位,主要研究 NLP 和計算機視覺,同時作為創始團隊成員加入了 OpenAI,Deep Learning 的關鍵人物和歷史節點都被他點亮。在 2017 年被 Elon Musk 挖牆腳到了 Tesla 負責自動駕駛研發,然後就有了重構的 FSD(Full Self-Driving)。
按照 Andrej Karpathy 的定義 - “軟體 2。0 使用更抽象、對人類不友好的語言生成,比如神經網路的權重。沒人參與編寫這些程式碼,一個典型的神經網路可能有數百萬個權重,用權重直接編碼比較困難”。Andrej 說他以前試過,這幾乎不是人類能幹的事兒 。。
配圖09:Andrej Karpathy 和神經網路權重
2.1 正規化轉移
在建立深度神經網路時,程式設計師只寫幾行程式碼,讓神經網路自己學習,計算權重,形成網路連線,而不是手寫程式碼。這種軟體開發的新正規化始於第一個 Machine Learning 語言 TensorFlow,我們也把這種新的編碼方式被稱為軟體 2。0。在 Deep Learning 興起之前,大多數人工智慧程式是用 Python 和 JavaScript 等程式語言手寫的。人類編寫了每一行程式碼,也決定了程式的所有規則。
配圖10:How does Machine Learning work?(TensorFlow)
相比之下,隨著 Deep Learning 技術的出現,程式設計師利用這些新方式,給程式指定目標。如贏得圍棋比賽,或透過提供適當輸入和輸出的資料,如向演算法提供具有 “SPAM” 特徵的郵件和其他沒有”SPAM” 特徵的郵件。編寫一個粗略的程式碼骨架(一個神經網路架構),確定一個程式空間的可搜尋子集,並使用我們所能提供的算力在這個空間中搜索,形成一個有效的程式路徑。在神經網路裡,我們一步步地限制搜尋範圍到連續的子集上,搜尋過程透過反向傳播和隨機梯度下降(Stochastic Gradient Descent)而變得十分高效。
神經網路不僅僅是另一個分類器,它代表著我們開發軟體的 正規化開始轉移,它是 軟體 2。0。
軟體 1。0 人們編寫程式碼,編譯後生成可以執行的二進位制檔案;但在軟體 2。0 中人們提供資料和神經網路框架,透過訓練將資料編譯成二進位制的神經網路。在當今大多數實際應用中,神經網路結構和訓練系統日益標準化為一種商品,因此大多數軟體 2。0 的開發都由模型設計實施和資料清理標記兩部分組成。這從根本上改變了我們在軟體開發迭代上的正規化,團隊也會因此分成了兩個部分: 2。0 程式設計師 負責模型和資料,而那些 1。0 程式設計師 則負責維護和迭代運轉模型和資料的基礎設施、分析工具以及視覺化介面。
Marc Andreessen 的經典文章標題《Why Software Is Eating the World》現在可以改成這樣:“軟體(1。0)正在吞噬世界,而現在人工智慧(2。0)正在吞噬軟體!
2.2 軟體的演化
軟體從 1。0 發展到軟體 2。0,經過了一個叫做“資料產品”的中間態。當頂級軟體公司在瞭解大資料的商業潛力後,並開始使用 Machine Learning 構建資料產品時,這種狀態就出現了。下圖來自 Ahmad Mustapha 的一篇文章《The Rise of Software 2。0》很好地呈現了這個過渡。
配圖11:軟體產品演化的三種狀態
這個中間態也叫 大資料 和 演算法推薦。在現實生活中,這樣的產品可以是 Amazon 的商品推薦,它們可以預測客戶會感興趣什麼,可以是 Facebook 好友推薦,還可以是 Netflix 電影推薦或 Tiktok 的短影片推薦。還有呢?Waze 的路由演算法、Airbnb 背後的排名演算法等等,總之琳琅滿目。
資料產品有幾個重要特點:1、它們都不是軟體的主要功能,通常是為了增加體驗,達成更好的使用者活躍以及銷售目標;2、能夠隨著資料的增加而進化;3、大部分都是基於傳統 ML 實現的,最重要的一點 資料產品是可解釋的。
但有些行業正在改變,Machine Learning 是主體。當我們放棄透過編寫明確的程式碼來解決複雜問題時,這個到 2。0 技術棧 的轉變就發生了,在過去幾年中,很多領域都在突飛猛進。語音識別 曾經涉及大量的預處理、高斯混合模型和隱式 Markov 模型,但今天幾乎完全被神經網路替代了。早在 1985 年,知名資訊理論和語言識別專家 Fred Jelinek 就有一句經常被引用的段子:“
每當我解僱一個語言學家,我們的語音識別系統的效能就會得到提高
”。
配圖12:圖解軟體 2。0 的代表應用
除了大家熟悉的影象語音識別、語音合成、機器翻譯、遊戲挑戰之外,AI 在很多傳統系統也看到了早期的轉型跡象。例如 The Case for Learned Index Structures 用神經網路取代了資料管理系統的核心元件,在速度上比 B-Trees 快取最佳化達快 70%,同時節省了一個數量級的記憶體。
所以,軟體 2。0 的正規化具備了這幾個新特徵:1、Deep Learning 是主體,所有的功能都是圍繞神經網路的輸入輸出構建的,例如語音識別、自動駕駛;2、可解釋性並不重要,一個好的大資料推薦廣告可以告訴客戶使用者看到這條廣告的理由,但你沒法從神經網路中找到規則,至少目前不行;3、高研發投入與低開發投入,現在大量的成功都來自大學和科技公司的研究部門,論文絕對比應用多 。。
2.3 軟體 2.0 的優勢
為什麼我們應該傾向於將複雜的程式移植到軟體 2。0 中?Andrej Karpathy 在《Software 2。0》中給出了一個簡單的答案:它們在實踐中表現得更好!
容易被寫入晶片
由於神經網路的指令集相對較小,主要是矩陣乘法(Matrix Multiplication)和閾值判斷(Thresholding at Zero),因此把它們寫入晶片要容易得多,例如使用定製的 ASIC、神經形態晶片等等(Alan Turing 在設計 ACE 時就這樣考慮了)。例如,小而廉價的晶片可以帶有一個預先訓練好的卷積網路,它們可以識別語音、合成音訊、處理視覺訊號。當我們周圍充斥著低能耗的智慧時,世界將會因此而大不同(好壞皆可)。
非常敏捷
敏捷開發意味著靈活高效。如果你有一段 C++ 程式碼,有人希望你把它的速度提高一倍,那麼你需要系統性的調優甚至是重寫。然而,在軟體 2。0 中,我們在網路中刪除一半的通道,重新訓練,然後就可以了 。。它的執行速度正好提升兩倍,只是輸出更差一些,這就像魔法。相反,如果你有更多的資料或算力,透過新增更多的通道和再次訓練,你的程式就能工作得更好。
模組可以融合成一個最佳的整體
做過軟體開發的同學都知道,程式模組通常利用公共函式、 API 或遠端呼叫來通訊。然而,如果讓兩個原本分開訓練的軟體 2。0 模組進行互動,我們可以很容易地透過整體進行反向傳播來實現。想象一下,如果你的瀏覽器能夠自動整合改進低層次的系統指令,來提升網頁載入效率,這將是一件令人驚奇的事情。但在軟體 2。0 中,這是預設行為。
它做得比你好
最後,也是最重要的一點,神經網路比你能想到的任何有價值的垂直領域的程式碼都要好,目前至少在影象、影片、聲音、語音相關的任何東西上,比你寫的程式碼要好。
2.4 Bug 2.0
對於傳統軟體,即軟體 1。0,大多數程式都透過原始碼儲存,這些程式碼可能少至數千行,多至上億行。據說,谷歌的整個程式碼庫大約有 20 億行程式碼。無論程式碼有多少,傳統的軟體工程實踐表明,使用封裝和模組化設計,有助於建立可維護的程式碼,很容易隔離 Bug 來進行修改。
但在新的正規化中,程式被儲存在記憶體中,作為神經網路架構的權重,程式設計師編寫的程式碼很少。軟體 2。0 帶來了兩個新問題:不可解釋 和 資料汙染。
因為訓練完成的神經網路權重,工程師無法理解(不過現在對理解神經網路的研究有了很多進展,第六章會講到),所以我們無法知道正確的執行是為什麼?錯誤又是因為什麼?這個和大資料演算法有很大的不同,雖然大多數的應用只關心結果,無需解釋;但對於一些安全敏感的領域,比如 自動駕駛 和 醫療應用,這確實很重要。
在 2。0 的堆疊中,資料決定了神經網路的連線,所以不正確的資料集和標籤,都會 混淆神經網路。錯誤的資料可能來自失誤、也可能是人為設計,或者是有針對性的投餵混淆資料(這也是人工智慧領域中新的 程式道德規範 問題)。例如 iOS 系統的自動拼寫功能被意外的資料訓練汙染了,我們在輸入某些字元的時候就永遠得不到正確的結果。訓練模型會認為汙染資料是一個重要的修正,一但完成訓練部署,這個錯誤就像病毒一樣傳播,到達了數百萬部 iPhone 手機。所以在這種 2。0 版的 Bug 中,需要對資料以及程式結果進行良好的測試,確保這些邊緣案例不會使程式失敗。
在短期內,軟體 2。0 將變得越來越普遍,那些沒法透過清晰演算法和軟體邏輯化表述的問題,都會轉入 2。0 的新正規化,現實世界並不適合整齊的封裝。就像明斯基說的,軟體開發應該更多的關心目標而不是過程,這種正規化有機會顛覆整個開發生態,軟體 1。0 將成為服務於軟體 2。0 周邊系統,一同來搭建 面向智慧的架構。有越來越清楚的案例表明,當我們開發通用人工智慧(AGI)時,它一定會寫在軟體 2。0 中。