主流的深度學習模型有哪些?
0. 前言
深度學習大熱以後各種模型層出不窮,很多朋友都在問到底什麼是DNN、CNN和RNN,這麼多個網路到底有什麼不同,作用各是什麼?
趁著回答:深度學習的主要分類是什麼呀?這些網路cnn dbn dnm rnn是怎樣的關係?這個問題的機會,我也想介紹一下主流的神經網路模型。因為格式問題和傳播原因,我把原回答內容在這篇文章中再次向大家介紹。
在更詳細的介紹各種網路前,首先說明:
- 大部分神經網路都可以用深度(depth)和連接結構(connection)來定義,下面會具體情況具體分析。
- 籠統的說,神經網路也可以分為有監督的神經網路和無/半監督學習,但其實往往是你中有我我中有你,不必死摳字眼。
- 有鑒於篇幅,只能粗略的科普一下這些非常相似的網路以及應用場景,具體的細節無法展開詳談,有機會在專欄中深入解析。
文章中介紹的網路包括:
1. 有監督的神經網路(Supervised Neural Networks)
1.1. 神經網路(Artificial Neural Networks)和深度神經網路(Deep Neural Networks)
追根溯源的話,神經網路的基礎模型是感知機(Perceptron),因此神經網路也可以叫做多層感知機(Multi-layer Perceptron),簡稱MLP。單層感知機叫做感知機,多層感知機(MLP) 人工神經網路(ANN)。
那麼多層到底是幾層?一般來說有1-2個隱藏層的神經網路就可以叫做多層,準確的說是(淺層)神經網路(Shallow Neural Networks)。隨著隱藏層的增多,更深的神經網路(一般來說超過5層)就都叫做深度學習(DNN)。然而,「深度」只是一個商業概念,很多時候工業界把3層隱藏層也叫做「深度學習」,所以不要在層數上太較真。在機器學習領域的約定俗成是,名字中有深度(Deep)的網路僅代表其有超過5-7層的隱藏層。
神經網路的結構指的是「神經元」之間如何連接,它可以是任意深度。以下圖的3種不同結構為例,我們可以看到連接結構是非常靈活多樣的。
圖片來源:10 Misconceptions about Neural Networks
需要特別指出的是,卷積網路(CNN)和循環網路(RNN)一般不加Deep在名字中的原因是:它們的結構一般都較深,因此不需要特別指明深度。想對比的,自編碼器(Auto Encoder)可以是很淺的網路,也可以很深。所以你會看到人們用Deep Auto Encoder來特別指明其深度。
應用場景:全連接的前饋深度神經網路(Fully Connected Feed Forward Neural Networks),也就是DNN適用於大部分分類(Classification)任務,比如數字識別等。但一般的現實場景中我們很少有那麼大的數據量來支持DNN,所以純粹的全連接網路應用性並不是很強。
1. 2. 循環神經網路(Recurrent Neural Networks)和遞歸神經網路(Recursive Neural Networks)
雖然很多時候我們把這兩種網路都叫做RNN,但事實上這兩種網路的結構事實上是不同的。而我們常常把兩個網路放在一起的原因是:它們都可以處理有序列的問題,比如時間序列等。
舉個最簡單的例子,我們預測股票走勢用RNN就比普通的DNN效果要好,原因是股票走勢和時間相關,今天的價格和昨天、上周、上個月都有關係。而RNN有「記憶」能力,可以「模擬」數據間的依賴關係(Dependency)。為了加強這種「記憶能力」,人們開發各種各樣的變形體,如非常著名的Long Short-term Memory(LSTM),用於解決「長期及遠距離的依賴關係」。如下圖所示,左邊的小圖是最簡單版本的循環網路,而右邊是人們為了增強記憶能力而開發的LSTM。
同理,另一個循環網路的變種 - 雙向循環網路(Bi-directional RNN)也是現階段自然語言處理和語音分析中的重要模型。開發雙向循環網路的原因是語言/語音的構成取決於上下文,即「現在」依託於「過去」和「未來」。單向的循環網路僅著重於從「過去」推出「現在」,而無法對「未來」的依賴性有效的建模。
遞歸神經網路和循環神經網路不同,它的計算圖結構是樹狀結構而不是網狀結構。遞歸循環網路的目標和循環網路相似,也是希望解決數據之間的長期依賴問題。而且其比較好的特點是用樹狀可以降低序列的長度,從 降低到 ,熟悉數據結構的朋友都不陌生。但和其他樹狀數據結構一樣,如何構造最佳的樹狀結構如平衡樹/平衡二叉樹並不容易。
應用場景:語音分析,文字分析,時間序列分析。主要的重點就是數據之間存在前後依賴關係,有序列關係。一般首選LSTM,如果預測對象同時取決於過去和未來,可以選擇雙向結構,如雙向LSTM。
1.3. 卷積網路(Convolutional Neural Networks)
卷積網路早已大名鼎鼎,從某種意義上也是為深度學習打下良好口碑的功臣。不僅如此,卷積網路也是一個很好的計算機科學借鑒神經科學的例子。卷積網路的精髓其實就是在多個空間位置上共享參數,據說我們的視覺系統也有相類似的模式。
首先簡單說什麼是卷積。卷積運算是一種數學計算,和矩陣相乘不同,卷積運算可以實現稀疏相乘和參數共享,可以壓縮輸入端的維度。和普通DNN不同,CNN並不需要為每一個神經元所對應的每一個輸入數據提供單獨的權重。與池化(pooling)相結合,CNN可以被理解為一種公共特徵的提取過程,不僅是CNN大部分神經網路都可以近似的認為大部分神經元都被用於特徵提取。
以上圖為例,卷積、池化的過程將一張圖片的維度進行了壓縮。從圖示上我們不難看出卷積網路的精髓就是適合處理結構化數據,而該數據在跨區域上依然有關聯。
應用場景:雖然我們一般都把CNN和圖片聯繫在一起,但事實上CNN可以處理大部分格狀結構化數據(Grid-like Data)。舉個例子,圖片的像素是二維的格狀數據,時間序列在等時間上抽取相當於一維的的格狀數據,而視頻數據可以理解為對應視頻幀寬度、高度、時間的三維數據。
2. 無監督的預訓練網路(Unsupervised Pre-trained Neural Networks)
2.1. 深度生成模型(Deep Generative Models)
說到生成模型,大家一般想到的無監督學習中的很多建模方法,比如擬合一個高斯混合模型或者使用貝葉斯模型。深度學習中的生成模型主要還是集中於想使用無監督學習來幫助監督學習,畢竟監督學習所需的標籤代價往往很高...所以請大家不要較真我把這些方法放在了無監督學習中。
2.1.1. 玻爾茲曼機(Boltzmann Machines)和受限玻爾茲曼機(Restricted Boltzmann Machines)
每次一提到玻爾茲曼機和受限玻爾茲曼機我其實都很頭疼。簡單的說,玻爾茲曼機是一個很漂亮的基於能量的模型,一般用最大似然法進行學習,而且還符合Hebbs Rule這個生物規律。但更多的是適合理論推演,有相當多的實際操作難度。
而受限玻爾茲曼機更加實際,它限定了其結構必須是二分圖(Biparitite Graph)且隱藏層和可觀測層之間不可以相連接。此處提及RBM的原因是因為它是深度信念網路的構成要素之一。
應用場景:實際工作中一般不推薦單獨使用RBM...
2.1.2. 深度信念網路(Deep Belief Neural Networks)
DBN是祖師爺Hinton在06年提出的,主要有兩個部分: 1. 堆疊的受限玻爾茲曼機(Stacked RBM) 2. 一層普通的前饋網路。
DBN最主要的特色可以理解為兩階段學習,階段1用堆疊的RBM通過無監督學習進行預訓練(Pre-train),階段2用普通的前饋網路進行微調。就像我上文提到的,神經網路的精髓就是進行特徵提取。和後文將提到的自動編碼器相似,我們期待堆疊的RBF有數據重建能力,及輸入一些數據經過RBF我們還可以重建這些數據,這代表我們學到了這些數據的重要特徵。
將RBF堆疊的原因就是將底層RBF學到的特徵逐漸傳遞的上層的RBF上,逐漸抽取複雜的特徵。比如下圖從左到右就可以是低層RBF學到的特徵到高層RBF學到的複雜特徵。在得到這些良好的特徵後就可以用第二部分的傳統神經網路進行學習。
多說一句,特徵抽取並重建的過程不僅可以用堆疊的RBM,也可以用後文介紹的自編碼器。
應用場景:現在來說DBN更多是了解深度學習「哲學」和「思維模式」的一個手段,在實際應用中還是推薦CNN/RNN等,類似的深度玻爾茲曼機也有類似的特性但工業界使用較少。
2.1.3. 生成式對抗網路(Generative Adversarial Networks)
生成式對抗網路用無監督學習同時訓練兩個模型,內核哲學取自於博弈論...
簡單的說,GAN訓練兩個網路:1. 生成網路用於生成圖片使其與訓練數據相似 2. 判別式網路用於判斷生成網路中得到的圖片是否是真的是訓練數據還是偽裝的數據。生成網路一般有逆卷積層(deconvolutional layer)而判別網路一般就是上文介紹的CNN。自古紅藍出CP,下圖左邊是生成網路,右邊是判別網路,相愛相殺。
熟悉博弈論的朋友都知道零和遊戲(zero-sum game)會很難得到優化方程,或很難優化,GAN也不可避免這個問題。但有趣的是,GAN的實際表現比我們預期的要好,而且所需的參數也遠遠按照正常方法訓練神經網路,可以更加有效率的學到數據的分布。
另一個常常被放在GAN一起討論的模型叫做變分自編碼器(Variational Auto-encoder),有興趣的讀者可以自己搜索。
應用場景:現階段的GAN還主要是在圖像領域比較流行,但很多人都認為它有很大的潛力大規模推廣到聲音、視頻領域。
2.2. 自編碼器(Auto-encoder)
自編碼器是一種從名字上完全看不出和神經網路有什麼關係的無監督神經網路,而且從名字上看也很難猜測其作用。讓我們看一幅圖了解它的工作原理...
如上圖所示,Autoencoder主要有2個部分:1. 編碼器(Encoder) 2. 解碼器(Decoder)。我們將輸入(圖片2)從左端輸入後,經過了編碼器和解碼器,我們得到了輸出....一個2。但事實上我們真正學習到是中間的用紅色標註的部分,即數在低維度的壓縮表示。評估自編碼器的方法是重建誤差,即輸出的那個數字2和原始輸入的數字2之間的差別,當然越小越好。
和主成分分析(PCA)類似,自編碼器也可以用來進行數據壓縮(Data Compression),從原始數據中提取最重要的特徵。認真的讀者應該已經發現輸入的那個數字2和輸出的數字2略有不同,這是因為數據壓縮中的損失,非常正常。
應用場景:主要用於降維(Dimension Reduction),這點和PCA比較類似。同時也有專門用於去除噪音還原原始數據的去噪編碼器(Denoising Auto-encoder)。
更多深度學習相關文章敬請期待?????
推薦閱讀:
※邊看邊練的簡明機器學習教程 Part II
※深度學習——分類之SENet
※人類的宿命-人是什麼系列外篇之三
※AI研習社每周公開課預告(10.24-10.27)
※人工智慧來了,但只是生產工具而已
TAG:人工智能 | 深度学习DeepLearning | 互联网 |