當前位置:
首頁 > 知識 > Andrej Karpathy談神經網路:這不僅僅是分類器,這是一種新的軟體開發思想

Andrej Karpathy談神經網路:這不僅僅是分類器,這是一種新的軟體開發思想

有越來越多的傳統編程語言(C、C++、Java)等程序員開始學習機器學習/深度學習,而對機器學習/深度學習的研究人員來說,編程也是必備技巧。那麼傳統程序員和深度學習專家對編程的軟體的看法一樣嗎?計算機軟體會在深度學習時代發生什麼新的變化嗎?

近日,計算機視覺領域大牛之一、李飛飛高徒、曾在OpenAI任研究科學家、現任特斯拉AI總監的 Andrej Karpathy 就發表了一篇博客,介紹了他眼中神經網路深度學習帶來的「軟體2.0」的全新開發思維。他相信這不僅是重要的軟體開發變化趨勢,正需要所有人都正視它、仔細思考它的優缺點。

AI研習社把Andrej Karpathy的這篇博客全文翻譯如下。

軟體2.0來了

有時候我會碰到這樣的人,他們把神經網路看作「機器學習工具箱里的一個新工具」。深度學習有優點也有缺點,它們在挺多場景下都能發揮作用,有時候也能用深度學習在Kaggle的比賽中獲勝。

然而不幸的是,這種觀點其實是一葉障目不見泰山。神經網路並不僅僅是一類新的分類器,它們標誌著人類編寫軟體的方式開始發生根本性的改變。這就是「軟體2.0」(Software 2.0)。

「軟體1.0」中經典的一層層結構大家都已經非常熟悉了,編寫它們用的是Python、C++等等語言,包含的也就是程序員顯式地寫下的計算機命令。每寫下一行代碼,程序員就把程序空間中的某個具體的點定義為了一個需要的行為。

「軟體2.0」則截然不同,它的呈現方式是神經網路的權重。人類程序員沒法自己動手編寫這類代碼,因為它們是一大堆權重(典型的神經網路中可能有上百萬個權重),直接把代碼寫成權重很困難(我試過)。實際上的做法是,人們對一個理想的程序的行為設定一些限制(比如通過帶有成對的輸入輸出樣本的數據集),然後用手頭的計算資源在程序空間中搜索,找到一個能符合那些限制的程序。以神經網路為例,我們把搜索過程限定在程序空間的一個連續的子集當中,在這個子集里我們可以用反向傳播和最速梯度下降的方法把搜索過程變得高效(有時候極為高效)。

事實上,真實世界中的很多問題都有這樣一種特性,收集它們的數據要比明確地寫下一行行程序容易得多。未來的程序員里相當大的一部分都不需要做維護複雜的代碼庫、編寫複雜的程序以及分析程序運行時等等工作。他們要做的事情都會圍繞著要餵給神經網路的數據:收集數據、清洗數據、操作數據、給數據加標籤、分析數據、做數據可視化等等。

「軟體2.0」並不會取代1.0(顯而易見,訓練和推理這樣的軟體2.0代碼的「編譯」過程需要很多1.0代碼編寫的基礎架構支持),但是如今的軟體1.0所完成的任務里將會有越來越高的比例被軟體2.0替代。下面我們來看幾個正在發生這種轉換的例子來確認這個觀點。

視覺識別:以前的做法是做特徵工程,然後在最後面、最頂層用了一點點機器學習(比如SVM)。後來,我們(在卷積網路架構家族中)開發出了新的識別原理,找到了強大得多的圖像分析程序;近期我們也已經開始探索更多的網路架構。

語音識別以前需要很多的預處理、高斯混合模型以及隱馬爾可夫模型,但今天幾乎全都是由神經網路搞定的。

語音生成:歷史上人們用過各種各樣的音素拼接方式,而現在的頂級模型都是大規模卷積神經網路(比如WaveNet),它們可以直接生成原始的音頻信號輸出。

機器翻譯:以往的通常做法是用一些基於短語的統計學技巧,但神經網路的方法很快就成為了主流。我自己最喜歡的架構是在多語言設置下訓練的,不僅單獨一個模型就可以從任意源語言翻譯到任意目標語言,而且還可以是弱監督(甚至完全無監督)的。

機器人:這個領域的傳統一直是把問題分解為感知、位姿預測、規劃、控制、不確定建模等等模塊,在中間層表徵之上運用顯式表徵和演算法。雖然完全離解決問題還有相當的距離,但UC伯克利和谷歌的研究人員都通過種種證據表明軟體2.0可能會在表徵所有這些代碼上發揮出好得多的作用。

遊戲:下圍棋的程序已經存在了很久了,但是AlphaGo Zero(能夠直接觀察棋盤狀態並下出一步棋的卷積神經網路)已經成為了目前最強的圍棋棋手。我預計我們還能在其它領域看到非常類似的結果,比如DOTA2或者星際爭霸。

可能有讀者發現上面提到的很多研究都來自谷歌。這是因為谷歌目前就站在把大型軟體重寫成軟體2.0代碼的最前沿。「One model to rule them all」這篇論文里就給大家帶來了一點早期感受,每個領域各自的統計力量可以聯合起來形成對世界的一致理解。

軟體2.0的好處

為什麼我們應當主動把複雜的程序轉換到軟體2.0的形式呢?有個簡單又明確的答案就是,它們在實際情況中的表現要更好。除此之外也有很多別的好原因選擇這種模式。下面我們來把軟體2.0(比如一個卷積神經網路)和軟體1.0(比如一個生產級別的C++代碼庫)做個比較,看看有哪些好處。軟體2.0的特點是:

計算同質化。從第一階來說,一個典型的神經網路是由矩陣乘法和零閾值(ReLU)像三明治那樣一層接一層堆疊起來形成的。和傳統軟體的指令集相比,神經網路計算的同質化程度要高許多、計算複雜度也要高許多。由於用軟體1.0實現神經網路時只需要為一小部分核心計算提供支持(比如矩陣乘法),那麼需要保證計算的正確率、提高計算性能等等時就簡單的多。

可以簡單地集成進矽片中。由於神經網路的指令集相對很小,就可以得到一個推論,那就是想要用更接近矽片的方式實現神經網路的時候就要簡單得多,比如通過定製的ASIC、仿神經計算晶元等等。當低功耗的智能晶元環繞著我們的時候,整個世界將會變得大為不同。這些又小又便宜的晶元可以包含著訓練過的卷積網路、語音識別器、WaveNet語音生成器等等,這樣的小巧的原始大腦可以連接到任何東西上面。

恆定的運行時間。神經網路典型的前向迭代過程總會需要同樣的浮點運算量。運行在盤根錯節的C++代碼基礎上的神經網路運算即便採用不同的路徑運行,所需的計算量也不會有任何變化。當然了,計算圖也可以是動態的,但執行的數據流總的來說還是有著非常大的限制、沒法做出大幅度變化。這樣一來,可以說我們幾乎永遠都不會意外地陷在無限的循環計算中出不來。

固定的內存使用量。跟前一點類似,各個地方都沒有動態分配的內存,所以幾乎不會出現用硬碟做緩衝區的需求,也不會有什麼需要追蹤代碼才能發現的內存泄露問題。

高可遷移性。與傳統二進位程序代碼或者腳本相比,一系列的矩陣乘法操作想要運行在任意的計算硬體上要簡單太多了。

非常靈活。如果有一段C++代碼的程序,然後有人想要把它的運行速度提升到原來的兩倍那麼快(如果需要的話也要付出一點執行效果代價),那麼為新指標調整這個系統是一件非常困難的事情。然而,對於軟體2.0來說,只需要去掉網路中一半的通道、重新訓練一下,它就可以直接以原來的兩倍的速度運行,只不過表現要差一點點。這就有點神奇了。反過來說,如果你剛好有更多的數據、更多的計算能力,你也只需要給程序中加入更多的通道、再重新訓練一下,就可以提高它的表現。

可以融合多個模型達到全局最優。目前的軟體通常可以分解成不同的模塊,它們通過公有函數、API或者終端相互溝通。不過,如果兩個本來分別獨立訓練的軟體2.0模塊需要互動的話,可以很輕鬆地做全局反向傳播。想想看,如果你的瀏覽器可以自動重新設計10層底層指令集來達到更高的網頁載入效率的話,這將是多麼驚人的一件事啊。而在軟體2.0中,這會成為默認發生的一件事。

易學。我喜歡開玩笑說「深度學習挺淺的」。因為深度學習並不是原子物理,你不需要先讀一個博士學位才能做出來任何一件有意義的事情。理解深度學習背後的概念只需要基礎的線性代數、微積分、Python以及CS231n中的幾節課。當然了,在實踐的過程中也還能學到許多精闢的見解和直覺,所以更準確的表述應該是:軟體2.0的層層知識想學的話很容易入門,但是想成為高手也並不容易。

它要比你強。最後,以及最重要的是,一個神經網路對應的代碼要比你、我、甚至任何人能在某個很大的具體領域寫出的代碼都要好得多,目前神經網路至少就和圖像/視頻,聲音/語音以及文本有關係。

軟體2.0的限制

軟體2.0的方法也有一些自己的缺點。優化之後我們得到的結果是運行表現出色、但非常難以解釋的大規模網路。在許許多多的應用場景中我們都面臨著這樣的選擇:是選那個我們能理解為什麼但只有90%準確率的模型,還是選擇那個有99%準確率但我們不理解的模型。

軟體2.0的方法也可能帶來反直覺的、令人尷尬的做法,甚至更糟。它們可能「悄悄地崩潰」,比如從訓練數據中悄悄地學到了偏見。訓練數據中的偏見又很難正確分析和檢驗,數據集的大小多數時候都是百萬級起步的,進一步增大了這個困難。

最後,軟體2.0中新的奇怪特性也在不斷被研究人員們發現著。比如,對抗性樣本和攻擊的存在就體現出了軟體2.0方法反直覺的本質。

最後的一點想法

如果你心中的神經網路是一種新的軟體編寫方法,而不僅僅是一類不錯的分類器的話,那你很快就能發現它們有許許多多的優點,也有很大的潛力改變整個軟體業態。

長期來看,軟體2.0的未來非常明亮,對於通用人工智慧的開發者來說這件事已經變得越來越明確,它一定會是用軟體2.0寫出來的。

那麼軟體3.0呢?那完全要看通用人工智慧的發展如何了。

(完)

大家都能認可深度神經網路是新的思路新的做法,不過在Andrej Karpathy的這篇文章之前我們也不常細想它會對傳統軟體產生多大的影響。不過正如他在文中所說,「軟體2.0」的前途還非常光明,AI研習社也期待著深度神經網路帶來更大的改變。

如何選擇機器學習模型?

如何提高選擇演算法的能力?

對於演算法能力應該從哪塊開始抓起?

歡迎報名演算法進階課程

演算法推導+實操

雙倍告訴你

(不要等早鳥票過期了才後悔~)

史上最好記的神經網路結構速記表(上)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

全國首個人工智慧商業案例榜單:「AI最佳掘金案例年度評選」正式啟動
循環神經網路的介紹、代碼及實現
從零入門機器學習演算法與實踐
深度學習崗位面試問題一覽
從LeNet-5到DenseNet

TAG:AI研習社 |