1. 程式人生 > 其它 >什麼是「深度學習」,主流的「深度學習模型」主要有哪些?

什麼是「深度學習」,主流的「深度學習模型」主要有哪些?

https://www.zhihu.com/question/316993598/answer/1064707487

中國科學院大學 軟體工程博士在讀  
去年開始,工作中需要做許多有關 AI 科普的事情。很長時間裡一直在想,該如何給一個沒有 CS 背景的人講解什麼是深度學習,以便讓一個非技術的投資人、企業管理者、行業專家、媒體記者乃至普通大眾明白深度學習為什麼會特別有效,理解 AI 是如何幫助人們解決具體問題的。中間經由 Quora 一篇簡短回答的啟發,大致形成了用水流脈絡來比擬神經網路的想法。曾經在面向銀行界、教育界、投資界人士的演講中,嘗試過基於這個比喻的講解方法,效果很不錯。慢慢就形成了這樣一篇文章,最近也被收進了李開復和
王詠剛
合著的科普書《人工智慧》中。
主要參考文獻:《人工智慧》

【注】特別需要說明的是,本文對深度學習的概念闡述刻意避免了數學公式和數學論證,這種用水管網路來普及深度學習的方法只適合一般公眾。對於懂數學、懂電腦科學的專業人士來說,這樣的描述相當不完備也不精確。流量調節閥的比喻與深度神經網路中每個神經元相關的權重調整,在數學上並非完全等價。對水管網路的整體描述也有意忽略了深度學習演算法中的代價函式、梯度下降、反向傳播等重要概念。專業人士要學習深度學習,還是要從專業教程看起。

從根本上說,深度學習和所有機器學習方法一樣,是一種用數學模型對真實世界中的特定問題進行建模,以解決該領域內相似問題的過程。

首先,深度學習是一種機器學習。既然名為“學習”,那自然與我們人類的學習過程有某種程度的相似。回想一下,一個人類小朋友是如何學習的?

人類小朋友是如何學習的?機器又是如何學習的?

比如,很多小朋友都用識字卡片來認字。從古時候人們用的“上大人、孔乙己”之類的描紅本,到今天在手機、平板電腦上教小朋友認字的識字卡片APP,最基本的思路就是按照從簡單到複雜的順序,讓小朋友反覆看每個漢字的各種寫法(大一點的小朋友甚至要學著認識不同的書法字型),看得多了,自然就記住了。下次再見到同一個字,就很容易能認出來。

這個有趣的識字過程看似簡單,實則奧妙無窮。認字時,一定是小朋友的大腦在接受許多遍相似影象的刺激後,為每個漢字總結出了某種規律性的東西,下次大腦再看到符合這種規律的圖案,就知道是什麼字了。

其實,要教計算機認字,差不多也是同樣的道理。計算機也要先把每一個字的圖案反覆看很多很多遍,然後,在計算機的大腦(處理器加上

儲存器)裡,總結出一個規律來,以後計算機再看到類似的圖案,只要符合之前總結的規律,計算機就能知道這圖案到底是什麼字。

用專業的術語來說,計算機用來學習的、反覆看的圖片叫“訓練資料集”;“訓練資料集”中,一類資料區別於另一類資料的不同方面的屬性或特質,叫做“特徵”;計算機在“大腦”中總結規律的過程,叫“建模”;計算機在“大腦”中總結出的規律,就是我們常說的“模型”;而計算機通過反覆看圖,總結出規律,然後學會認字的過程,就叫“機器學習”。

到底計算機是怎麼學習的?計算機總結出的規律又是什麼樣的呢?這取決於我們使用什麼樣的機器學習演算法。

有一種演算法非常簡單,模仿的是小朋友學識字的思路。家長和老師們可能都有這樣的經驗:小朋友開始學識字,比如先教小朋友分辨“一”、“二”、“三”時,我們會告訴小朋友說,一筆寫成的字是“一”,兩筆寫成的字是“二”,三筆寫成的字是“三”。這個規律好記又好用。但是,開始學新字時,這個規律就未必奏效了。比如,“口”也是三筆,可它卻不是“三”。我們通常會告訴小朋友,圍成個方框兒的是“口”,排成橫排的是“三”。這規律又豐富了一層,但仍然禁不住識字數量的增長。很快,小朋友就發現,“田”也是個方框兒,可它不是“口”。我們這時會告訴小朋友,方框裡有個“十”的是“田”。再往後,我們多半就要告訴小朋友,“田”上面出頭是“由”,下面出頭是“甲”,上下都出頭是“申”。很多小朋友就是在這樣一步一步豐富起來的特徵規律的指引下,慢慢學會自己總結規律,自己記住新的漢字,並進而學會幾千個漢字的。

有一種名叫決策樹的機器學習方法,就和上面根據特徵規律來識字的過程非常相似。當計算機只需要認識“一”、“二”、“三”這三個字時,計算機只要數一下要識別的漢字的筆畫數量,就可以分辨出來了。當我們為待識別漢字集(訓練資料集)增加“口”和“田”時,計算機之前的判定方法失敗,就必須引入其他判定條件。由此一步步推進,計算機就能認識越來越多的字。

附圖顯示了計算機學習“由”、“甲”、“申”這三個新漢字前後,計算機內部的決策樹的不同。這說明,當我們給計算機“看”了三個新漢字及其特徵後,計算機就像小朋友那樣,總結並記住了新的規律,“認識”了更多的漢字。這個過程,就是一種最基本的機器學習了。

當然,這種基於決策樹的學習方法太簡單了,很難擴充套件,也很難適應現實世界的不同情況。於是,科學家和工程師們陸續發明出了許許多多不同的機器學習方法。

例如,我們可以把漢字“由”、“甲”、“申”的特徵,包括有沒有出頭,筆畫間的位置關係等,對映到某個特定空間裡的一個點(我知道,這裡又出現數學術語了。不過這不重要,是否理解“對映”的真實含義,完全不影響後續閱讀)。也就是說,訓練資料集中,這三個字的大量不同寫法,在計算機看來就變成了空間中的一大堆點。只要我們對每個字的特徵提取得足夠好,空間中的一大堆點就會大致分佈在三個不同的範圍裡。

這時,讓計算機觀察這些點的規律,看能不能用一種簡明的分割方法(比如在空間中畫直線),把空間分割成幾個相互獨立的區域,儘量使得訓練資料集中每個字對應的點都位於同一個區域內。如果這種分割是可行的,就說明計算機“學”到了這些字在空間中的分佈規律,為這些字建立了模型。

接下來,看見一個新的漢字影象時,計算機就簡單把影象換算成空間裡的一個點,然後判斷這個點落在了哪個字的區域裡,這下,不就能知道這個影象是什麼字了嗎?

很多人可能已經看出來了,使用畫直線的方法來分割一個平面空間(如附圖所示),很難適應幾千個漢字以及總計至少數萬種不同的寫法。如果想把每個漢字的不同變形都對應為空間中的點,那就極難找到一種數學上比較直截了當的方法,來將每個漢字對應的點都分割包圍在不同區域裡。

很多年裡,數學家和電腦科學家就是被類似的問題所困擾。人們不斷改進機器學習方法。比如,用複雜的高階函式來畫出變化多端的曲線,以便將空間裡相互交錯的點分開來,或者,乾脆想辦法把二維空間變成三維空間、四維空間甚至幾百維、幾千維、幾萬維的高維空間。在深度學習實用化之前,人們發明了許多種傳統的、非深度的機器學習方法。這些方法雖然在特定領域取得了一定成就,但這個世界實在是複雜多樣、變化萬千,無論人們為計算機選擇了多麼優雅的建模方法,都很難真正模擬世界萬物的特徵規律。這就像一個試圖用有限幾種顏色畫出世界真實面貌的畫家,即便畫藝再高明,他也很難做到“寫實”二字。

那麼,如何大幅擴充套件計算機在描述世界規律時的基本手段呢?有沒有可能為計算機設計一種靈活度極高的表達方式,然後讓計算機在大規模的學習過程裡不斷嘗試和尋找,自己去總結規律,直到最終找到符合真實世界特徵的一種表示方法呢?

現在,我們終於要談到深度學習了!

深度學習就是這樣一種在表達能力上靈活多變,同時又允許計算機不斷嘗試,直到最終逼近目標的一種機器學習方法。從數學本質上說,深度學習與前面談到的傳統機器學習方法並沒有實質性差別,都是希望在高維空間中,根據物件特徵,將不同類別的物件區分開來。但深度學習的表達能力,與傳統機器學習相比,卻有著天壤之別。

簡單地說,深度學習就是把計算機要學習的東西看成一大堆資料,把這些資料丟進一個複雜的、包含多個層級的資料處理網路(深度神經網路),然後檢查經過這個網路處理得到的結果資料是不是符合要求——如果符合,就保留這個網路作為目標模型,如果不符合,就一次次地、鍥而不捨地調整網路的引數設定,直到輸出滿足要求為止。

這麼說還是太抽象,太難懂。我們換一種更直觀的講法。

假設深度學習要處理的資料是資訊的“水流”,而處理資料的深度學習網路是一個由管道和閥門組成的巨大的水管網路。網路的入口是若干管道開口,網路的出口也是若干管道開口。這個水管網路有許多層,每一層有許多個可以控制水流流向與流量的調節閥。根據不同任務的需要,水管網路的層數、每層的調節閥數量可以有不同的變化組合。對複雜任務來說,調節閥的總數可以成千上萬甚至更多。水管網路中,每一層的每個調節閥都通過水管與下一層的所有調節閥連線起來,組成一個從前到後,逐層完全連通的水流系統(這裡說的是一種比較基本的情況,不同的深度學習模型,在水管的安裝和連線方式上,是有差別的)。

那麼,計算機該如何使用這個龐大的水管網路,來學習識字呢?

比如,當計算機看到一張寫有“田”字的圖片時,就簡單將組成這張圖片的所有數字(在計算機裡,圖片的每個顏色點都是用“0”和“1”組成的數字來表示的)全都變成資訊的水流,從入口灌進水管網路。

我們預先在水管網路的每個出口都插一塊字牌,對應於每一個我們想讓計算機認識的漢字。這時,因為輸入的是“田”這個漢字,等水流流過整個水管網路,計算機就會跑到管道出口位置去看一看,是不是標記有“田”字的管道出口流出來的水流最多。如果是這樣,就說明這個管道網路符合要求。如果不是這樣,我們就給計算機下達命令:調節水管網路裡的每一個流量調節閥,讓“田”字出口“流出”的數字水流最多。

這下,計算機可要忙一陣子了,要調節那麼多閥門呢!好在計算機計算速度快,暴力計算外加演算法優化(其實,主要是精妙的數學方法了,不過我們這裡不講數學公式,大家只要想象計算機拼命計算的樣子就可以了),總是可以很快給出一個解決方案,調好所有閥門,讓出口處的流量符合要求。

下一步,學習“申”字時,我們就用類似的方法,把每一張寫有“申”字的圖片變成一大堆數字組成的水流,灌進水管網路,看一看,是不是寫有“申”字的那個管道出口流出來的水最多,如果不是,我們還得再次調整所有的調節閥。這一次,要既保證剛才學過的“田”字不受影響,也要保證新的“申”字可以被正確處理。

如此反覆進行,直到所有漢字對應的水流都可以按照期望的方式流過整個水管網路。這時,我們就說,這個水管網路已經是一個訓練好的深度學習模型了。

例如,附圖顯示了“田”字的資訊水流被灌入水管網路的過程。為了讓水流更多地從標記有“田”字的出口流出,計算機需要用特定方式近乎瘋狂地調節所有流量調節閥,不斷實驗、摸索,直到水流符合要求為止。

當大量識字卡片被這個管道網路處理,所有閥門都調節到位後,整套水管網路就可以用來識別漢字了。這時,我們可以把調節好的所有閥門都“焊死”,靜候新的水流到來。

與訓練時做的事情類似,未知的圖片會被計算機轉變成資料的水流,灌入訓練好的水管網路。這時,計算機只要觀察一下,哪個出口流出來的水流最多,這張圖片寫的就是哪個字。

簡單嗎?神奇嗎?難道深度學習竟然就是這樣的一個靠瘋狂調節閥門來“湊”出最佳模型的學習方法?整個水管網路內部,每個閥門為什麼要如此調節,為什麼要調節到如此程度,難道完全由最終每個出口的水流量來決定?這裡面,真的沒有什麼深奧的道理可言?

深度學習大致就是這麼一個用人類的數學知識與計算機演算法構建起整體架構,再結合儘可能多的訓練資料,以及計算機的大規模運算能力去調節內部引數,儘可能逼近問題目標的半理論、半經驗的建模方式。

指導深度學習的基本是一種實用主義的思想。

不是要理解更復雜的世界規律嗎?那我們就不斷增加整個水管網路裡可調節的閥門的個數(增加層數或增加每層的調節閥數量)。不是有大量訓練資料和大規模計算能力嗎?那我們就讓許多CPU和許多GPU(圖形處理器,俗稱顯示卡晶片,原本是專用於作圖和玩遊戲的,碰巧也特別適合深度學習計算)組成龐大計算陣列,讓計算機在拼命調節無數個閥門的過程中,學到訓練資料中的隱藏的規律。也許正是因為這種實用主義的思想,深度學習的感知能力(建模能力)遠強於傳統的機器學習方法。

實用主義意味著不求甚解。即便一個深度學習模型已經被訓練得非常“聰明”,可以非常好地解決問題,但很多情況下,連設計整個水管網路的人也未必能說清楚,為什麼管道中每一個閥門要調節成這個樣子。也就是說,人們通常只知道深度學習模型是否工作,卻很難說出,模型中某個引數的取值與最終模型的感知能力之間,到底有怎樣的因果關係。

這真是一件特別有意思的事。有史以來最有效的機器學習方法,在許多人看來,竟然是一個只可意會、不可言傳的“黑盒子”。

由此引發的一個哲學思辨是,如果人們只知道計算機學會了做什麼,卻說不清計算機在學習過程中掌握的是一種什麼樣的規律,那這種學習本身會不會失控?

比如,很多人由此擔心,按照這樣的路子發展下去,計算機會不會悄悄學到什麼我們不希望它學會的知識?另外,從原理上說,如果無限增加深度學習模型的層數,那計算機的建模能力是不是就可以與真實世界的終極複雜度有一比呢?如果這個答案是肯定的,那隻要有足夠的資料,計算機就能學會宇宙中所有可能的知識——接下來會發生什麼?大家是不是對計算機的智慧超越人類有了些許的憂慮?還好,關於深度學習到底是否有能力表達宇宙級別的複雜知識,專家們尚未有一致看法。人類至少在可見的未來還是相對安全的。

補充一點:目前,已經出現了一些視覺化的工具,能夠幫助我們“看見”深度學習在進行大規模運算時的“樣子”。比如說,谷歌著名的深度學習框架TensorFlow就提供了一個網頁版的小工具(Tensorflow — Neural Network Playground),用人們易於理解的圖示,畫出了正在進行深度學習運算的整個網路的實時特徵。

 

附圖顯示了一個包含4層中間層級(隱含層)的深度神經網路針對某訓練資料集進行學習時的“樣子”。圖中,我們可以直觀地看到,網路的每個層級與下一個層級之間,資料“水流”的方向與大小。我們還可以隨時在這個網頁上改變深度學習框架的基本設定,從不同角度觀察深度學習演算法。這對我們學習和理解深度學習大有幫助。

(上邊摘自李開復、王詠剛《人工智慧》一書)

那麼我們瞭解了什麼是深度學習,主流的深度學習模型到底有哪些?

深度學習發展很快,新的模型層出不窮,所以要想全部列舉是不可能的。另外,很多模型都是這裡提出很長很長時間了,所以也不是說“老”模型就沒用,大家學習的話,還是要全面而深入的學習。

1、 Feed forward neural networks (FF or FFNN) and perceptrons (P)

前饋神經網路和感知機,資訊從前(輸入)往後(輸出)流動,一般用反向傳播(BP)來訓練。算是一種監督學習。

2、Radial basis function (RBF)

徑向基函式網路,是一種徑向基函式作為啟用函式的FFNNs(前饋神經網路)。

3、 Hopfield network (HN)

Hopfield網路,是一種每個神經元都跟其它神經元相連線的神經網路。

4、 Markov chains (MC or discrete time Markov Chain, DTMC)

馬爾可夫鏈 或離散時間馬爾可夫鏈,算是BMs和HNs的雛形。

5、 Boltzmann machines (BM)

玻爾茲曼機,和Hopfield網路很類似,但是:一些神經元作為輸入神經元,剩餘的是隱藏層。

6、Restricted Boltzmann machines (RBM)

受限玻爾茲曼機,和玻爾茲曼機 以及 Hopfield網路 都比較類似。

7、 Autoencoders (AE)

自動編碼,和FFNN有些類似,它更像是FFNN的另一種用法,而不是本質上完全不同的另一種架構。

8、Sparse autoencoders (SAE)

稀疏自動編碼,跟自動編碼在某種程度比較相反。

9、 Variational autoencoders (VAE)

變分自動編碼,和AE架構相似,不同的是:輸入樣本的一個近似概率分佈。這使得它跟BM、RBM更相近。

10、 Denoising autoencoders (DAE)

去噪自動編碼,也是一種自編碼機,它不僅需要訓練資料,還需要帶噪音的訓練資料。

11 Deep belief networks (DBN

深度信念網路,由多個受限玻爾茲曼機或變分自動編碼堆砌而成。

12 Convolutional neural networks (CNN or deep convolutional neural networks, DCNN)

卷積神經網路,這個不解釋也都知道。

13 Deconvolutional networks (DN)

去卷積網路,又叫逆圖形網路,是一種逆向的卷積神經網路。

14 Deep convolutional inverse graphics networks (DCIGN)

深度卷積逆向圖網路,實際上是VAE,且分別用CNN、DNN來作編碼和解碼。

15 Generative adversarial networks (GAN)

生成對抗網路,Goodfellow的封神之作,這個模型不用解釋也都知道。

16 Recurrent neural networks (RNN)

迴圈神經網路,這個更不用解釋,做語音、NLP的沒有人不知道,甚至非AI相關人員也知道。

17 Long / short term memory (LSTM)

長短期記憶網路, RNN的變種,解決梯度消失/爆炸的問題,也不用解釋,這幾年刷爆各大頂會。

18 Gated recurrent units (GRU)

門迴圈單元,類似LSTM的定位,算是LSTM的簡化版。

19 Neural Turing machines (NTM)

神經圖靈機,LSTM的抽象,以窺探LSTM的內部細節。具有讀取、寫入、修改狀態的能力。

20 Bidirectional recurrent neural networks, bidirectional long / short term memory networks and bidirectional gated recurrent units (BiRNN, BiLSTM and BiGRU respectively)

雙向迴圈神經網路、雙向長短期記憶網路和雙向門控迴圈單元,把RNN、雙向的LSTM、GRU雙向,不再只是從左到右,而是既有從左到右又有從右到左。

21 Deep residual networks (DRN)

深度殘差網路,是非常深的FFNN,它可以把資訊從某一層傳至後面幾層(通常2-5層)。

22 Echo state networks (ESN)

回聲狀態網路,是另一種不同型別的(迴圈)網路。

23 Extreme learning machines (ELM)

極限學習機,本質上是隨機連線的FFNN。

24 Liquid state machines (LSM)

液態機,跟ESN類似,區別是用閾值啟用函式取代了sigmoid啟用函式。

2.25 Kohonen networks (KN, also self organising (feature) map, SOM, SOFM)

Kohonen 網路,也稱之為自組織(特徵)對映。

 

更多的內容請來阿廣的個人公眾號:視學演算法,歡迎討論技術和人生問題~