閱讀213 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Andrej Karpathy:神經網絡是“軟件2.0”,而非機器學習的一種工具

我有時看到人們把神經網絡稱為“機器學習工具箱中的另一種工具”。神經網絡作為一種工具有這樣那樣的優點和缺點,在這個任務或那個任務工作,有時你可以利用它們贏得Kaggle的比賽。不幸的是,這種解釋隻見樹木,不見樹林。神經網絡不隻是另一種分類器,它們代表了我們編寫軟件的根本性轉變的開始。它們是軟件2.0(Software 2.0)。

軟件2.0正在越來越多地接管軟件1.0的任務

軟件1.0(Software 1.0)的“經典堆棧”(classical stack)是我們很熟悉的——它是用Python、C++等語言編寫的,它由程序員編寫的對計算機的明確指令組成。通過編寫每行代碼,程序員可以確定程序空間中的某個特定點。

相比之下,Software 2.0 是用神經網絡權重編寫的。沒有人參與這段代碼的編寫過程,因為權重有很多(典型的網絡可能有數百萬個權重),並且直接用權重進行編碼是很困難的(我嚐試過)。相反,我們對一個理想程序的行為指定一些約束(例如,一個樣本的輸入輸出對數據集),並使用可用的計算資源來搜索程序空間中滿足約束條件的程序。在神經網絡的例子中,我們把搜索限製在程序空間的一個連續的子集,在這個空間中,搜索過程可以利用反向傳播和隨機梯度下降奏效。

事實證明,在現實世界中,大部分的問題具有收集數據要比明確地編寫程序容易得多的性質。未來,大部分程序員不再需要維護複雜的軟件庫,編寫複雜的程序,或者分析程序的運行時間。他們需要收集、整理、操作、標記、分析和可視化提供給神經網絡的數據。

20b2b336a57c9ca2d814b09f911e0920f38e4a7d

Software 2.0不會取代1.0(實際上,需要大量的1.0基礎架構來進行訓練和推斷,以“編譯”2.0代碼),但是它將會越來越多地接管軟件1.0的任務。讓我們來看看一些正在進行的一些過渡的例子:

視覺識別:視覺識別過去是由工程特性組成的,有一點機器學習(例如SVM)在裏麵。後來,我們開發了一個機製來發現更強大的圖像分析程序(ConvNet結構體係),並且最近我們已經開始在架構中搜索(參考論文:Large-Scale Evolution of Image Classifiers)。

語音識別:語音識別過去涉及大量的預處理、高斯混合模型和隱馬爾可夫模型,但今天幾乎完全由神經網絡組成。

語音合成:從曆史上來看,語音合成一直以來用各種各樣的拚接機製來處理,但是現在,最先進的模型是產生原始音頻信號輸出的大型卷積網絡(例如WaveNet)。

機器翻譯:機器翻譯通常是采用基於短語的統計技術的方法,但神經網絡正在迅速成為主導。我最喜歡的架構是在多語言環境中進行訓練的(Google's Multilingual Neural Machine Translation System: Enabling Zero-Shot Translation),其中一個模型可以將任何源語言轉換為任何目標語言,並且在弱監督(或完全無監督)的環境中進行。

機器人:機器人技術長久以來是將問題分解為感知、姿態估計、規劃、控製、不確定性建模等,使用顯式表示和算法來進行中間表示。我們還沒有完全做到這一點,但UC Berkeley和穀歌最近的一些研究表明,Software 2.0或許能更好地表示所有這些代碼。

遊戲:圍棋程序已經存在了很長一段時間,但AlphaGo Zero(一個觀察棋盤的原始狀態並決定落子位置的ConvNet)現在已經成為圍棋遊戲最強大的玩家。我希望我們在其他領域也能看到類似的結果,例如DOTA 2或星際爭霸。

你可能注意到我前麵提到的許多工作都是穀歌公司做的,這是因為穀歌現在處於將自己的大部分代碼重新編寫成Software 2.0代碼的最前沿。《一個模型解決所有問題》(One model to rule them all)這篇論文提出了一個草圖,在這個模型中,單個領域的統計強度被合並為一個對世界的一致理解。

Software 2.0的優勢

為什麼我們更喜歡將複雜的程序移植到軟件2.0中呢?一個簡單的答案是它們在實踐中表現得更好。但是,還有很多其他的方便的理由讓我們選擇這個堆棧。讓我們來看看Software 2.0(例如,一個 ConvNet)的相比Software1.0(例如,一個生產級的C ++代碼庫)的好處。

Software 2.0是:

計算均勻的。一個典型的神經網絡由一個隻有兩個操作的層組成:矩陣乘法(matrix multiplication)和在零點的閾值(ReLU)。將其與經典軟件的指令集進行比較,後者明顯更具有異質性和複雜性。因為你隻需為少量的核心計算原語(例如矩陣乘法)提供Software 1.0實現,你可以更容易地進行各種正確性/性能保證。

很容易燒成芯片。作為一個推論,由於神經網絡的指令集相對較小,因此更容易實現這些網絡,例如使用定製asic,神經形態芯片,等等。當低耗能的智能變得無處不在時,世界就將會改變。例如,小而便宜的芯片可以使用預訓練的卷積神經網絡、語音識別器和WaveNet語音合成網絡,它們都集成在一個小的原腦(protobrain)中,你可以把它連接到任何東西上。

持續的運行時間。典型的神經網絡正向傳遞的每一次迭代都需要完全相同的FLOPS量。基於不同的執行路徑,你的代碼可能會通過一些龐大的C ++代碼庫來實現。當然,你可以有動態計算圖,但執行流程通常仍然受到很大的限製。這樣,我們幾乎可以保證永遠不會發現自己處於無意的無限循環中。

持續的內存使用。與上一點相關的是,任何地方都沒有動態分配的內存,因此交換磁盤的可能性也很小,或者必須在你的代碼中搜索的內存泄漏也很少。

它非常便攜。與經典的二進製文件或腳本相比,在任意計算配置上運行一個矩陣乘法序列要容易得多。

它非常敏捷。如果你有一個c++代碼,有人希望你將速度加快2倍(需要的話,可以付出性能上的代價),這需要為新的規範重新調優係統。但是,在Software 2.0,我們可以在網絡中刪除一半的通道,重新訓練,然後就滿足要走了——速度提升2倍,性能降低一點。相反地,如果你碰巧得到了更多的數據/計算資源,你可以通過增加更多的通道和重新訓練來讓你的程序更好地工作。

模塊可以融合為一個最優的整體。我們的軟件經常被分解為通過公共功能、api或端點進行通信的模塊。但是,如果兩個最初被分別訓練的Software 2.0模塊相互作用,我們可以很容易地在整個過程中進行反向傳播。想想看,如果你的web瀏覽器能夠自動重新設計底層係統指令10個堆棧,從而在加載web頁麵時獲得更高的效率,那該多好。對於Software 2.0,這是默認行為。

它很容易掌握。我喜歡開玩笑說,深度學習是淺顯的。它不是核物理學,在你可以做任何有用的事情之前,得需要完成一個博士學位。深度學習中,基本的概念需要掌握基本的線性代數、微積分、Python和CS231n的一些課程。當然,隨著時間的推移,你可以獲得大量的專業知識和直覺,因此,更準確的說法是,Software 2.0堆棧很容易入門,但並不容易掌握。

它比你厲害。最後,也是最重要的一點,在很大一部分有價值的垂直領域中,神經網絡比你或我所能編寫的代碼塊更好,目前這至少涉及圖像/視頻、聲音/語音和文本。

Software 2.0的局限

2.0堆棧也有自身的一些缺點。在優化結束後,得到的大型網絡運行得很好,但是我們很難知道它是如何運作的。在許多應用領域,我們會麵臨選擇,是使用我們所理解的精確度90%的模型,還是我們不理解的精確度99%的模型。

2.0堆棧可能會以不直觀和令人尷尬的方式失敗,或者更糟的是,它們可能會“無聲地失敗”,例如,通過在它們的訓練數據中無聲地采用偏見,由於訓練數據在大多數情況下都非常大,很難正確地進行分析和檢查。

最後,我們還發現了這個堆棧的一些特殊屬性。例如,對抗樣本(adversarial examples)和攻擊(attacks)的存在突顯了這個堆棧不直觀的本質。

Software 2.0的未來是光明的

如果將神經網絡看作是一個軟件堆棧,而不僅僅是一個很好的分類器,那麼很顯然,它們擁有大量的優勢和很大的潛力來改造軟件。

從長遠來看, Software 2.0的未來是光明的,因為越來越多的人清楚,當我們開發AGI(通用人工智能)時,肯定會寫成Software 2.0。

Software 3.0?那就需要到AGI的時代了。


原文發布時間為:2017-11-12

本文作者:Andrej Karpathy

本文來自雲棲社區合作夥伴新智元,了解相關信息可以關注“AI_era”微信公眾號

原文鏈接:Andrej Karpathy:神經網絡是“軟件2.0”,而非機器學習的一種工具

最後更新:2017-11-13 10:34:14

  上一篇:go  編程語言-幸運28高手群8887209
  下一篇:go  斯坦福“黑盒學習”研究:使用神經變分推理的無向圖模型,可替代“采樣”