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


告別Python,用神經網絡編寫的軟件走向2.0時代

有時人們把神經網絡稱為“機器學習工具箱中的另一種工具”。有時你可以用它們來贏得Kaggle的比賽。但是,這種解釋完全見木不見林。神經網絡不隻是另一種分類器,它們代表了我們如何編寫軟件的根本性轉變的開始。可以說是軟件的2.0時代。下文簡稱軟件2.0。

我們所熟悉的軟件1.0的“經典堆棧”是用Python、C++等語言編寫的,它包含了程序員編寫的計算機的顯式指令。通過編寫每行代碼,程序員可以通過一些可取的行為來確定程序空間中的某個特定點。

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

事實證明,在現實世界中,收集數據要比明確地編寫程序容易得多。過段時間以後,大部分程序員不會維護複雜的軟件庫,編寫複雜的程序,或者分析它們的運行時間。但他們會收集、整理、操作、標簽、分析和可視化饋送神經網絡的數據。

011bd9c0a8f59dd4f731584f4c7021148f7297ac

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

視覺識別曾經是由一些帶有機器學習的工程特性組成的(例如,SVM)。從那時起,我們開發了機器,以發現更強大的圖像分析程序(在卷積架構中),並且最近我們也已經開始搜索架構。

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

語音合成一直以來都有各種各樣的拚接(stitching)機製,但是現在,藝術模型的狀態是產生原始音頻信號輸出的大的卷積(例如WaveNet)。

機器翻譯通常是采用基於短語的統計技術的方法,但神經網絡很快就會占據主導地位。我最喜歡的架構是在多語言環境中進行訓練的,其中一個模型可以從任何源語言轉換為任何目標語言,並且在弱監督(或完全不受監督的)環境中進行。

機器人技術將問題分解為感知、姿態估計、規劃、控製、不確定性建模等,使用顯式表示和算法多於中間表示。我們還沒有完全做到這一點,但加州大學伯克利分校和穀歌的研究表明,軟件2.0或許能夠更好地代表所有這些代碼。

軟件2.0的好處

為什麼我們更喜歡將複雜的程序移植到軟件2.0中呢? 很明顯,答案是因為它們在實踐操作中表現得更好。但是,還有很多其他的方便的理由來選擇這個堆棧。讓我們來看看軟件2.0(一個卷積神經網絡)與軟件1.0相比(一個生產級別的C++代碼基數)的一些好處。軟件2.0:

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

2.簡單設置為矽:作為一個推論,由於神經網絡的指令集相對較小,因此更容易實現將這些網絡更靠近矽,例如自定義ASIC芯片,神經形態芯片等等。當低動力的智能變得無處不在時,情況又會發生變化。例如,小而便宜的芯片可以使用預先訓練過的卷積神經網絡、語音識別器和WaveNet語音合成網絡,它們都集成在一個小的、可以連接到任何東西上的“原始大腦”中。

3.恒定的運行時間:典型的神經網絡正向傳遞的每一次迭代都采用同樣數量的FLOPS(即“每秒浮點運算次數”,“每秒峰值速度”)。零可變性基於你的代碼的不同的執行路徑,是可以通過一些龐大的C++代碼庫來實現的。當然,你可以擁有動態計算圖,但是執行流通常仍然受到很大的限製。這樣,我們幾乎可以保證永遠不會發現自己的操作在無意地進行無限循環。

4.持續的內存使用:與上麵相關的是,在任何地方都沒有動態分配的內存,因此也不大可能交換到磁盤,或是你必須在你的代碼中追蹤的內存泄漏。

5.它具有高度的可移植性:與經典的二進製文件或腳本相比,在任意計算配置上運行一個矩陣乘法序列要容易得多。

6.它非常敏捷:如果你有一個C++代碼,並且有人想讓你把它以兩倍的速度為代價獲得(如果需要的話),這將是非常重要的調優係統新規範。然而,在軟件2.0中我們可以把我們的網絡刪除一半的通道,然後再次訓練,——它完全是運行速度的兩倍,並且運行的有些糟糕。相反地,如果你恰好得到了更多的數據/計算,你可以通過增加更多的通道和重新訓練來讓你的程序更好地工作。

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

軟件2.0的局限性

2.0堆棧也有一些自身的缺點。在優化的最後,我們剩下的是大型網絡,它們運行得很好,但是我們很難知道它是如何運作的。在許多應用領域,我們將會選擇使用我們所理解的90%的精確模型,或者99%的準確模型。

2.0堆棧可以以不直觀和令人尷尬的方式失敗,例如,通過在訓練數據中默默地采用偏差,當它們的大小在數百萬的大多數情況下,是很難正確地分析和檢查的。

最後,我們還發現了這個堆棧的一些特殊屬性。例如,對抗樣本的存在突出了這個堆棧的不直觀的本質。

如果你把神經網絡看作是一個軟件堆棧,而不僅僅是一個很好的分類器,那麼很快就會發現,它們擁有大量的優勢和很大的潛力來轉換軟件。

從長遠來看,軟件2.0的未來是光明的,因為越來越多的人認為,當我們開發了AGI時,它肯定會寫入軟件2.0中。

本文由AiTechYun編譯,轉載請注明出處。更多內容關注微信公眾號:atyun_com

最後更新:2017-11-13 17:34:27

  上一篇:go  阿裏雲 CDN HTTPS 最佳實踐——OCSP Stapling(四)
  下一篇:go  個人簡曆