寫給人類的機器學習四、神經網路和深度學習

apachecn_飛龍發表於2017-10-18

四、神經網路和深度學習

原文:Machine Learning for Humans, Part 4: Neural Networks & Deep Learning

作者:Vishal Maini

譯者:飛龍

協議:CC BY-NC-SA 4.0

深度神經網路的工作地點、原因和方式。從大腦中獲取靈感。卷積神經網路(CNN)和迴圈神經網路(RNN)。真實世界中的應用。

使用深度學習,我們仍然是習得一個函式f,將輸入X對映為輸出Y,並使測試資料上的損失最小,就像我們之前那樣。回憶一下,在 2.1 節監督學習中,我們的初始“問題陳述”:

Y = f(X) + ϵ

訓練:機器從帶標籤的訓練資料習得f

測試:機器從不帶標籤的測試資料預測Y

真實世界很亂,所以有時f很複雜。在自然語言問題中,較大的詞彙數量意味著大量特徵。視覺問題設計大量的畫素相關的視覺資訊。玩遊戲需要基於複雜場景做決策,也帶有許多可能的未知。當我們處理的資料不是很複雜時,我們目前涉及的學習機制做的很好。但是,它們如何推廣到像這樣的場景,還不清楚。

深度學習非常善於習得f,特別是在資料很複雜的場景中。實際上,人工神經網路也被成為通用函式近似器,因為它們能夠學習任何函式,無論多麼扭曲,都只需要一個隱藏層。

讓我們看看影像分類的問題。我們選取一張圖片作為輸入,並輸出一個分類(例如狗、貓、車)。

通過圖解,深度神經網路的影像分類解決方式,類似於這樣:

圖片來自 Jeff Clune 在 YouTube 上的一小時深度學習概覽

但是說真的,這是個巨大的數學方程,有數百萬個項和大量引數。假設輸入X是灰度影像,由w*h的畫素亮度矩陣表示。輸出Y是每個分類的概率的向量。也就是說,我們輸出“每個分類是正確標籤”的概率。如果這個神經網路能用的話,最高的概率就是正確的分類。然後,中間的層僅僅計算大量的矩陣相同,通過在每個隱藏層之後,使用非線性變換(啟用函式),對啟用值x的權重求和,來讓神經網路習得非線性函式。

難以置信的是,你可以使用梯度下降,以 2.1 節中我們對線性迴歸所做的相同方式,使損失最小。所以使用大量樣本和大量梯度下降,模型可以習得如何正確分類動物圖片。這個,簡單來說,就是“深度學習”。

深度學習做得好的地方,以及一些歷史

人工神經網路實際上有很長時間了。它們的應用可追溯到控制論(cybernetics,1940s~1960s),連線機制(connectionism,1980s~1990s),之後變成了流行的深度學習。大約在 2006 年,神經網路開始變得“更深”(Goodfellow 等,2016)。但是最近我們才開始觸及它們的全部潛能。

就像 Andrej Karpathy(特斯拉的 AI 總監,它被認為是深度學習的 Shaman)描述的那樣,有四個“將 AI 帶回來”的不同因素:

  • 計算(最明顯的一個:摩爾定律,GPU,ASIC)
  • 資料(以不錯的形式,並不在網際網路上某處,也就是 ImageNet)
  • 演算法(研究和理念,也就是 backprop, CNN, LSTM),以及
  • 基礎設施(你下面的軟體,Linux, TCP/IP, Git, ROS, PR2, AWS, AMT, TensorFlow, 以及其它)(Karpathy, 2016)。

在過去的十年當中,深度學習的全部潛能,最紅被(1)和(2)的進步解鎖,它反過來產生了(3)和(4)的突破。並且這個迴圈仍在繼續,成倍的人們不斷參與到深度學習研究的前線中,沿著這條路(想想你現在做的事情)。

由 NVIDIA 演示,它是一家核彈 GPU 領導廠商。GPU 最開始為遊戲構建,但是最終很好地順應了深度學習所需的平行計算。

在這一章的剩餘部分中,我們提供一些來自生物和統計的被寂靜,來解釋神經網路裡面發生額了什麼,之後討論深度學習的一些神奇應用。最後,我們連結到一些資源,所以你可以自行應用深度學習,甚至穿著睡衣坐在沙發上,拿著筆記本,在特定種類的問題上快速實現超越人類級別的表現。

從大腦中(或者只是統計?)獲取靈感:神經網路中發生了什麼

神經元、特徵學習和抽象層次

當你閱讀這些詞彙的時候,你並沒有檢查每個詞的每個字,或者組成字的每個畫素,來獲得單詞的含義。你從細節中將東西抽象、組裝成高階的概念:詞、短語、句子、段落。

Yuor abiilty to exaimne hgiher-lveel fteaures is waht aollws yuo to unedrtsand waht is hpapening in tihs snetecne wthiout too mcuh troulbe (or myabe yuo sned too mnay dnruk txets).

(你檢測高階特徵的能力,讓你理解句子中發生的東西,而不會太麻煩(或者可能你傳送了大量的亂序文字)。

視覺上發生的事情相同,這並不僅僅在人類,也在動物的視覺系統中。

大腦由神經元組成,它們在足夠“啟用”之後,通過向其他神經元傳送電訊號來“觸發”。這些神經元都是可塑的,根據有多少來自神經元的訊號新增到當前神經元的啟用水平上(大概來說,將神經元彼此連線的權重最後會被訓練,使神經連線更加有用,就像線性迴歸中的引數可以被訓練,來改進輸入到輸出的對映)。

生物和人工神經網路的端到端的演示,來自史丹佛 CS231n。這個比喻不是很嚴謹,生物神經元可以做人工神經元不能做的事,反之亦然。但是理解生物中的靈感十分有用。更多細節請見生物和人工神經元的維基百科的描述

我們的生物網路以層次方式排列,以便特定神經元最終檢測我們周圍的世界的,不是極其特定的特徵,而是更加抽象的特徵,也就是,更低階的特徵的規律或者分組。例如,人類視覺系統中的紡錘狀臉部區域可特別用於人臉識別。

持續學習抽象特徵的演示,來自 NVIDIA。

人工神經網路如何選取原始畫素輸入,開發中介“神經元”來檢測高階特徵(也就是鼻子的存在),以及組合它們的輸出來建立最終輸出。來自《神經網路和深度學習》(Nielsen, 2017)。

生物神經網路表現出的層次結構最早於 1950s 發現,當研究員 David Hubel 和 Torsten Wiesel 研究貓的視覺皮層中的神經元的時候。在給貓大量刺激之後,它們不能觀察到神經活動:暗點、亮點、揮手、甚至是雜誌上的女性照片。但是在它們的失望中,它們從投影儀中移除了對角線處的照片,它們注意到了一些神經活動。結果是,位於某個特定角度的,對角線上的邊能夠導致特定的神經元被啟用。

這樣就逐漸有意義了,因為自然環境通常是嘈雜和隨機的(想想草原和荒野)。所以當野外的貓感知到一條“邊”的時候,也就是一條不同於背景的線,這可能表明,一個物體或者生物進入了視野範圍。當邊緣的神經元的特定組合被啟用時,這些活動會集體產生更加抽象的活動,以此類推,直到最終的抽象是個有用的概念,比如“鳥”或者“狼”。

深度神經網路背後的概念就是,使用人工神經網路的層次來模擬類似的結構。

為什麼線性模型不能用

為了提煉史丹佛的優秀的深度學習課程,CS231n:卷積神經網路和視覺識別,想象我們打算訓練一個神經網路,使用下列標籤的正確的那個來分類影像:["plane", "car", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"]

一種方式可能是,使用訓練樣本為每個分類構造一個“模板”,或者平均影像,之後使用最近鄰演算法,在測試期間來度量每個未分類影像的畫素值,到每個模板的距離。總的來說是這樣。這個方法不涉及任何抽象層次。這是個線性模型,將每個影像型別的所有不同的方向組合為一個平均的影子。

例如,它可以選取所有的車,無論它們面向左邊、右邊、中間,也無論它們的顏色,只是將它們平均。模板最終看起來非常模糊。

來自史丹佛 CS231n 第二篇講義的樣本。

要注意,上面的馬的模板出現了兩個頭。這對我們並沒什麼幫助:我們想要能夠分別檢測頭朝右邊或者頭朝左邊的馬,並且如果這些特徵的任何一個被檢測到了,我們就說我們看到了一匹馬。深度神經網路提供給我們這種靈活性,我們會在下一節中看到。

深度神經網路使用抽象層來解決影像分類問題。

為了重複我們在這一節之前解釋的東西:輸入層接受影像的原始畫素亮度。最終的層級會是類概率的輸出向量(也就是影像是貓、車子、馬,以及其他的概率)。

但是我們不習得一個簡單的,和輸入輸出相關的線性模型。我們構造網路中間的隱藏層,它們會漸進學習抽象特徵,這讓我們不會丟失複雜資料中的所有細微差異。

來源:Analytics Vidhya

就像我們描述的動物大腦檢測抽象特徵,隱藏層中的人工神經元會學著檢測抽象概念,無論哪個概念,只要它對於捕捉最多資訊,以及使網路輸出的準確度中的損失最小非常實用(這是個發生在網路中的,無監督學習的例項)。

這損失了模型的可解釋性,因為當你新增更多隱藏層時,神經元開始表示越來越多的抽象和無法理解的特徵。在這個層面上,你可能聽說,深度學習也被稱作“黑箱優化”,其中你基本上只是隨機嘗試一些東西,然後觀察出現了什麼,而無需真正理解裡面發生了什麼。

線性迴歸是可解釋的,因為你決定了模型中包含哪個特徵。深度神經網路難以解釋,因為習得的特徵在任何地方都不能用自然語言解釋。它完全在機器的想象中。

一些值得注意的擴充套件和深層概念

  • 深度學習軟體包。你很少需要從零開始實現神經網路的所有部分,因為現有的庫和工具使深度學習更加易於實現。有許多這類東西:TensorFlow, Caffe, Torch, Keras, 以及其它。

  • 卷積神經網路(CNN)。CNN 特地為接受影像輸入而設計,並且對於計算機視覺任務非常高效。它們也有助於深度增強/強化學習。CNN 的靈感特別來源於動物的視覺皮層的工作方式,並且它們是深度學習課程的熱點。我們已經在文章中引用它了,就是史丹佛 CS231n。

  • 迴圈神經網路(RNN)。RNN 擁有內建記憶的概念,並且非常適合語言問題。它們在強化學習中也很重要,因為它們讓智慧體能夠跟蹤東西在哪裡,以及之前發生了什麼,甚至在那些東西不能一次性看到的時候。Christopher Olah 編寫了一個非常棒的,在語言問題的語境中的, RNN 和 LSTM 的參考文獻

  • 深度增強/強化學習。這是深度學習研究中的最刺激的領域之一,處在近期研究的核心位置,例如 OpenAI 擊敗了 Dota2 職業玩家,以及 DeepMind 的 AlphaGo 在圍棋競技中勝過人類。我們在第五章會深度,但是本質上的目標是將這篇文章中的所有技術,應用於一個問題,教會智慧體使回報最大。這可以用於與任何可以遊戲化的環境,從真實的遊戲,例如反恐精英或者吃豆人,到無人駕駛的汽車,或者股票交易,最終到真實生活和真實世界。

深度學習應用

深度學習正在重構世界的幾乎每個領域。這裡是深度學習可以做的無法置信的事情的示例:

  • Fackbook 訓練了一個神經網路,由短時記憶加持,來智慧地回答《指環王》情節中的問題。

    來自 FAIR(Facebook AI 實驗室)的研究,將加持了分離的短時記憶的深度神經網路,應用於回答 LOTR 情節的問題。這是史詩級的定義。

  • 無人駕駛的汽車依賴深度學習,用於解決視覺任務,例如理解路面標誌,檢測道路和識別障礙。

    來源:Business Insider

  • 深度學習可以用於有趣的東西,例如藝術生成。一個叫做 Neural Style(神經風格)的工具可以模擬藝術家的風格,並且用它來重新組合另一幅圖片,令人難以置信。

    梵高的《星夜》的風格應用於史丹佛校園的影像上,通過 Justin Johnson 的 neural style 實現:https://github.com/jcjohnson/neural-style

其它值得注意的示例包括:

  • 預測藥物發現中的分子的生物活性。

  • 用於照片和視訊標註的人臉識別。

  • 增強谷歌搜尋的結果。

  • 自然語言理解和生成,也就是谷歌翻譯

  • 火星探索者機器人“好奇號”,基於視覺檢測,自動選取值得檢查的土壤目標。

…以及很多,非常多,太多了。

現在開始去做吧!

對於神經網路如何實際建立,我們這裡沒有涉及太多細節。因為你通過自己實現,更易於理解細節。這裡是一些非常棒的實踐資源,用於起步。

  • 使用谷歌的 Neural Network Playground 玩轉神經網路的架構,來看看不同的配置如何影響網路的效能。

  • 使用這篇谷歌的教程快速準備好並起步:TensorFlow 和深度學習。以超過 99% 的準確度分類手寫數字,你不需要是 PhD,只需要在三個小時內,熟悉 TensorFlow 以及學習深度學習概念。

  • 之後,瀏覽史丹佛 CS231n 的至少前幾篇講義,以及第一個作業,從零開始構建雙層的神經網路,來實際強化這篇文章中涉及的概念。

更多資源

深度學習是個非常廣闊的領域。因此,我們也編譯了一些最佳資源,我們在這個話題中遇到過它們,以便你打算深入瞭解。

下一章:到了玩遊戲的時候了!

最後是第五章:強化/增強學習。


相關文章