CNN(卷積神經網絡)、RNN(循環神經網絡)、DNN(深度神經網絡)的內部網絡結構有什么區別?
https://www.zhihu.com/question/34681168
首先,我感覺不必像 @李Shawn 同學一樣認為DNN、CNN、RNN完全不能相提並論。從廣義上來說,NN(或是更美的DNN)確實可以認為包含了CNN、RNN這些具體的變種形式。在實際應用中,所謂的深度神經網絡DNN,往往融合了多種已知的結構,包括卷積層或是LSTM單元。但是就題主的意思來看,這里的DNN應該特指全連接的神經元結構,並不包含卷積單元或是時間上的關聯。因此,題主一定要將DNN、CNN、RNN等進行對比,也未嘗不可。
其實,如果我們順着神經網絡技術發展的脈絡,就很容易弄清這幾種網絡結構發明的初衷,和他們之間本質的區別,希望對題主有所幫助。
=========================== 分 割 線 就 是 我 ================================
神經網絡技術起源於上世紀五、六十年代,當時叫感知機(perceptron),擁有輸入層、輸出層和一個隱含層。輸入的特征向量通過隱含層變換達到輸出層,在輸出層得到分類結果。早期感知機的推動者是Rosenblatt。(扯一個不相關的:由於計算技術的落后,當時感知器傳輸函數是用線拉動變阻器改變電阻的方法機械實現的,腦補一下科學家們扯着密密麻麻的導線的樣子…)
但是,Rosenblatt的單層感知機有一個嚴重得不能再嚴重的問題,即它對稍復雜一些的函數都無能為力(比如最為典型的“異或”操作)。連異或都不能擬合,你還能指望這貨有什么實際用途么o(╯□╰)o
隨着數學的發展,這個缺點直到上世紀八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)發明的多層感知機(multilayer perceptron)克服。多層感知機,顧名思義,就是有多個隱含層的感知機(廢話……)。好好,我們看一下多層感知機的結構:

圖1上下層神經元全部相連的神經網絡——多層感知機
多層感知機可以擺脫早期離散傳輸函數的束縛,使用sigmoid或tanh等連續函數模擬神經元對激勵的響應,在訓練算法上則使用Werbos發明的反向傳播BP算法。對,這貨就是我們現在所說的神經網絡NN——神經網絡聽起來不知道比感知機高端到哪里去了!這再次告訴我們起一個好聽的名字對於研(zhuang)究(bi)很重要!
多層感知機解決了之前無法模擬異或邏輯的缺陷,同時更多的層數也讓網絡更能夠刻畫現實世界中的復雜情形。相信年輕如Hinton當時一定是春風得意。
多層感知機給我們帶來的啟示是,神經網絡的層數直接決定了它對現實的刻畫能力——利用每層更少的神經元擬合更加復雜的函數[1]。
(Bengio如是說:functions that can be compactly represented by a depth k architecture might require an exponential number of computational elements to be represented by a depth k − 1 architecture.)
即便大牛們早就預料到神經網絡需要變得更深,但是有一個夢魘總是縈繞左右。隨着神經網絡層數的加深,優化函數越來越容易陷入局部最優解,並且這個“陷阱”越來越偏離真正的全局最優。利用有限數據訓練的深層網絡,性能還不如較淺層網絡。同時,另一個不可忽略的問題是隨着網絡層數增加,“梯度消失”現象更加嚴重。具體來說,我們常常使用sigmoid作為神經元的輸入輸出函數。對於幅度為1的信號,在BP反向傳播梯度時,每傳遞一層,梯度衰減為原來的0.25。層數一多,梯度指數衰減后低層基本上接受不到有效的訓練信號。
2006年,Hinton利用預訓練方法緩解了局部最優解問題,將隱含層推動到了7層[2],神經網絡真正意義上有了“深度”,由此揭開了深度學習的熱潮。這里的“深度”並沒有固定的定義——在語音識別中4層網絡就能夠被認為是“較深的”,而在圖像識別中20層以上的網絡屢見不鮮。為了克服梯度消失,ReLU、maxout等傳輸函數代替了sigmoid,形成了如今DNN的基本形式。單從結構上來說,全連接的DNN和圖1的多層感知機是沒有任何區別的。
值得一提的是,今年出現的高速公路網絡(highway network)和深度殘差學習(deep residual learning)進一步避免了梯度消失,網絡層數達到了前所未有的一百多層(深度殘差學習:152層)[3,4]!具體結構題主可自行搜索了解。如果你之前在懷疑是不是有很多方法打上了“深度學習”的噱頭,這個結果真是深得讓人心服口服。

圖2縮減版的深度殘差學習網絡,僅有34層,終極版有152層,自行感受一下
如圖1所示,我們看到全連接DNN的結構里下層神經元和所有上層神經元都能夠形成連接,帶來的潛在問題是參數數量的膨脹。假設輸入的是一幅像素為1K*1K的圖像,隱含層有1M個節點,光這一層就有10^12個權重需要訓練,這不僅容易過擬合,而且極容易陷入局部最優。另外,圖像中有固有的局部模式(比如輪廓、邊界,人的眼睛、鼻子、嘴等)可以利用,顯然應該將圖像處理中的概念和神經網絡技術相結合。此時我們可以祭出題主所說的卷積神經網絡CNN。對於CNN來說,並不是所有上下層神經元都能直接相連,而是通過“卷積核”作為中介。同一個卷積核在所有圖像內是共享的,圖像通過卷積操作后仍然保留原先的位置關系。兩層之間的卷積傳輸的示意圖如下:

圖3卷積神經網絡隱含層(摘自Theano教程)
通過一個例子簡單說明卷積神經網絡的結構。假設圖3中m-1=1是輸入層,我們需要識別一幅彩色圖像,這幅圖像具有四個通道ARGB(透明度和紅綠藍,對應了四幅相同大小的圖像),假設卷積核大小為100*100,共使用100個卷積核w1到w100(從直覺來看,每個卷積核應該學習到不同的結構特征)。用w1在ARGB圖像上進行卷積操作,可以得到隱含層的第一幅圖像;這幅隱含層圖像左上角第一個像素是四幅輸入圖像左上角100*100區域內像素的加權求和,以此類推。同理,算上其他卷積核,隱含層對應100幅“圖像”。每幅圖像對是對原始圖像中不同特征的響應。按照這樣的結構繼續傳遞下去。CNN中還有max-pooling等操作進一步提高魯棒性。

圖4一個典型的卷積神經網絡結構,注意到最后一層實際上是一個全連接層(摘自Theano教程)
在這個例子里,我們注意到輸入層到隱含層的參數瞬間降低到了100*100*100=10^6個!這使得我們能夠用已有的訓練數據得到良好的模型。題主所說的適用於圖像識別,正是由於CNN模型限制參數了個數並挖掘了局部結構的這個特點。順着同樣的思路,利用語音語譜結構中的局部信息,CNN照樣能應用在語音識別中。
全連接的DNN還存在着另一個問題——無法對時間序列上的變化進行建模。然而,樣本出現的時間順序對於自然語言處理、語音識別、手寫體識別等應用非常重要。對了適應這種需求,就出現了題主所說的另一種神經網絡結構——循環神經網絡RNN。
在普通的全連接網絡或CNN中,每層神經元的信號只能向上一層傳播,樣本的處理在各個時刻獨立,因此又被成為前向神經網絡(Feed-forward Neural Networks)。而在RNN中,神經元的輸出可以在下一個時間戳直接作用到自身,即第i層神經元在m時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(m-1)時刻的輸出!表示成圖就是這樣的:

圖5 RNN網絡結構
我們可以看到在隱含層節點之間增加了互連。為了分析方便,我們常將RNN在時間上進行展開,得到如圖6所示的結構:

圖6 RNN在時間上進行展開
Cool,(t+1)時刻網絡的最終結果O(t+1)是該時刻輸入和所有歷史共同作用的結果!這就達到了對時間序列建模的目的。
不知題主是否發現,RNN可以看成一個在時間上傳遞的神經網絡,它的深度是時間的長度!正如我們上面所說,“梯度消失”現象又要出現了,只不過這次發生在時間軸上。對於t時刻來說,它產生的梯度在時間軸上向歷史傳播幾層之后就消失了,根本就無法影響太遙遠的過去。因此,之前說“所有歷史”共同作用只是理想的情況,在實際中,這種影響也就只能維持若干個時間戳。
為了解決時間上的梯度消失,機器學習領域發展出了長短時記憶單元LSTM,通過門的開關實現時間上記憶功能,並防止梯度消失,一個LSTM單元長這個樣子:

圖7 LSTM的模樣
除了題主疑惑的三種網絡,和我之前提到的深度殘差學習、LSTM外,深度學習還有許多其他的結構。舉個例子,RNN既然能繼承歷史信息,是不是也能吸收點未來的信息呢?因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了雙向RNN、雙向LSTM,同時利用歷史和未來的信息。

圖8雙向RNN
事實上,不論是那種網絡,他們在實際應用中常常都混合着使用,比如CNN和RNN在上層輸出之前往往會接上全連接層,很難說某個網絡到底屬於哪個類別。不難想象隨着深度學習熱度的延續,更靈活的組合方式、更多的網絡結構將被發展出來。盡管看起來千變萬化,但研究者們的出發點肯定都是為了解決特定的問題。題主如果想進行這方面的研究,不妨仔細分析一下這些結構各自的特點以及它們達成目標的手段。入門的話可以參考:
Ng寫的Ufldl:UFLDL教程 - Ufldl
也可以看Theano內自帶的教程,例子非常具體:Deep Learning Tutorials
歡迎大家繼續推薦補充。
當然啦,如果題主只是想湊個熱鬧時髦一把,或者大概了解一下方便以后把妹使,這樣看看也就罷了吧。
參考文獻:
[1] Bengio Y. Learning Deep Architectures for AI[J]. Foundations & Trends® in Machine Learning, 2009, 2(1):1-127.
[2] Hinton G E, Salakhutdinov R R. Reducing the Dimensionality of Data with Neural Networks[J]. Science, 2006, 313(5786):504-507.
[3] He K, Zhang X, Ren S, Sun J. Deep Residual Learning for Image Recognition. arXiv:1512.03385, 2015.
[4] Srivastava R K, Greff K, Schmidhuber J. Highway networks. arXiv:1505.00387, 2015.
【“科研君”公眾號初衷始終是希望聚集各專業一線科研人員和工作者,在進行科學研究的同時也作為知識的傳播者,利用自己的專業知識解釋和普及生活中的 一些現象和原理,展現科學有趣生動的一面。該公眾號由清華大學一群在校博士生發起,目前參與的作者人數有10人,但我們感覺這遠遠不能覆蓋所以想科普的領域,並且由於空閑時間有限,導致我們只能每周發布一篇文章。我們期待更多的戰友加入,認識更多志同道合的人,每個人都是科研君,每個人都是知識的傳播者。我們期待大家的參與,想加入我們,進QQ群吧~:108141238】
【非常高興看到大家喜歡並贊同我們的回答。應許多知友的建議,最近我們開通了同名公眾號:PhDer,也會定期更新我們的文章,如果您不想錯過我們的每篇回答,歡迎掃碼關注~ 】
個人覺得CNN、RNN和DNN不能放在一起比較。
DNN是一個大類,CNN是一個典型的空間上深度的神經網絡,RNN是在時間上深度的神經網絡。
推薦你從UFLDL開始看,這是斯坦福深度學習的課程,了解一些神經網絡的基礎,會對你的學習有很大幫助。
=============================分割線======================================
前面一位同學回答得非常詳細完整,我再回來談一談怎么學習這些模型,我來分享一下我的學習歷程。我也是在學習中,以后會慢慢繼續補充。
1、http://ufldl.stanford.edu/wiki/index.php/UFLDL教程
這是我最開始接觸神經網絡時看的資料,把這個仔細研究完會對神經網絡的模型以及如何訓練(反向傳播算法)有一個基本的認識,算是一個基本功。
2、Deep Learning Tutorials
這是一個開源的深度學習工具包,里面有很多深度學習模型的python代碼還有一些對模型以及代碼細節的解釋。我覺得學習深度學習光了解模型是不難的,難點在於把模型落地寫成代碼,因為里面會有很多細節只有動手寫了代碼才會了解。但Theano也有缺點,就是極其難以調試,以至於我后來就算自己動手寫幾百行的代碼也不願意再用它的工具包。所以我覺得Theano的正確用法還是在於看里面解釋的文字,不要害怕英文,這是必經之路。PS:推薦使用python語言,目前來看比較主流。(更新:自己寫坑實在太多了,CUDA也不知道怎么用,還是乖乖用theano吧...)
3、Stanford University CS231n: Convolutional Neural Networks for Visual Recognition
斯坦福的一門課:卷積神經網絡,李飛飛教授主講。這門課會系統的講一下卷積神經網絡的模型,然后還有一些課后習題,題目很有代表性,也是用python寫的,是在一份代碼中填寫一部分缺失的代碼。如果把這個完整學完,相信使用卷積神經網絡就不是一個大問題了。
這可能是機器學習領域最經典最知名的公開課了,由大牛Andrew Ng主講,這個就不僅僅是深度學習了,它是帶你領略機器學習領域中最重要的概念,然后建立起一個框架,使你對機器學習這個學科有一個較為完整的認識。這個我覺得所有學習機器學習的人都應該看一下,我甚至在某公司的招聘要求上看到過:認真看過並深入研究過Andrew Ng的機器學習課程,由此可見其重要性。
2017年7月3日 更新
不同網絡的區別:人們在網絡中實現加入的先驗知識的不同。
整體解釋:公開課 | 深層神經網絡設計理念 附帶 ppt下載(無視頻版)
神經網絡入門:深層學習為何要“Deep”(上)
前饋神經網絡引入的先驗知識:並行、迭代;
- 詳細解釋:深層學習為何要“Deep”(下) 較難懂,建議先看完公開課再看該篇文章。
循環神經網絡引入的先驗知識:時間共享;
- 詳細解釋:循環神經網絡--介紹
循環神經網絡引入的先驗知識:空間共享;
- 詳細解釋:卷積神經網絡--介紹

深層學習的“深”字是由於將分類/回歸和特征提取兩者結合在一起來訓練了。
Recurrent layer和convolutional layer都可以看成是特征提取層。
- 語音識別用Recurrent layer去學習“如何”去聽,再用學好的聽取方式去處理聲音再送入分類器中。人腦舉例子,我們大腦已有從中文學來的對語音的“特征提取層”和“分類層”。學習外語的時候,只是新訓練了一個“分類層”,繼續用中文的語音的“特征提取層”,這是外語聽力的不好的原因之一。
- 畫面識別convolutional layer學習“如何”去觀察,再用學好的觀察方式去處理畫面再送入分類器中。人腦舉例子,我們在觀察圖片的時候並不是一眼把所有畫面都送入大腦進行識別的,而是跟convolutional layer的處理方式一樣,逐一掃描局部后再合並。不同的掃描方式,所觀察出的內容也不同。
具體可以看下面的部分
簡單理解神經網絡應該分為兩部分:
- 網絡結構:神經網絡是怎么計算預測的,以及神經網絡為什么好用。
- 網絡訓練:神經網絡是怎么訓練的,以及如何克服在訓練時所遇到的如過擬合,梯度消失等問題。
進一步理解圍繞“深層”二字來神經網絡的的話應該在網絡結構中細分兩類: 網絡結構:
- 特征結構:之所以要深層是因為一部分的層在完成“學習如何提取特征”的任務。比如畫面處理的convolutional layers ,時間序列處理的Recurrent layers。甚至feedforward layers也能完成此任務。
- 分類/遞歸結構:如果僅需完成分類器的任務的話,一個hidden feedforward足以。其他的機器學習算法如SVM,GP甚至做的要比神經網絡要好。

舉例說明:比如圖片識別。一個圖片究竟是什么不僅取決於圖片本身,還取決於識別者“如何觀察”。
如果這是一個訓練樣本。
- 當你給的標簽是少女的時候,convolutional layers會以此學習“如何觀察”成少女
- 當你給的標簽是老婦的時候,convolutional layers會以此學習“如何觀察”成老婦
- 之所以深層,是因為一定數量的層數在學習“如何觀察”。再學習完如何觀察后再傳遞給“分類層”中去。而分類層並不需要“深”。
- 網絡結構中最重要的是特征結構層,畫面處理的convolutional layers ,時間序列處理的Recurrent layers最好理解為特征結構層。
一、深度學習:
深度學習是機器學習的一個分支。可以理解為具有多層結構的模型。
二、基本模型:
給大家總結一下深度學習里面的基本模型。我將這些模型大致分為了這幾類:多層感知機模型;深度神經網絡模型和遞歸神經網絡模型。
2.1 多層感知機模型(也就是你這里說的深度神經網絡):
2.1.1 Stacked Auto-Encoder堆疊自編碼器
堆疊自編碼器是一種最基礎的深度學習模型,該模型的子網絡結構自編碼器通過假設輸出與輸入是相同的來訓練調整網絡參數,得到每一層中的權重。通過堆疊多層自編碼網絡可以得到輸入信號的幾種不同表征(每一層代表一種表征),這些表征就是特征。自動編碼器就是一種盡可能復現輸入信號的神經網絡。為了實現這種復現,自編碼器就必須捕捉可以代表輸入數據的最重要的因素,就像PCA那樣,找到可以代表原信息的主要成分。
2.1.1.1 網絡結構
堆疊自編碼器的網絡結構本質上就是一種普通的多層神經網絡結構。

圖1 自編碼器網絡結構
2.1.1.2 訓練過程
堆疊自編碼器與普通神經網絡不同之處在於其訓練過程,該網絡結構訓練主要分兩步:非監督預訓練和有監督微調訓練。
(1)非監督預訓練
自編碼器通過自學習得到原始數據的壓縮和分布式表征,一般用於高層特征提取與數據非線性降維。結構上類似於一個典型的三層BP神經網絡,由一個輸入層,一個中間隱含層和一個輸出層構成。但是,輸出層與輸入層的神經元個數相等,且訓練樣本集合的標簽值為輸入值,即無標簽值。輸入層到隱含層之間的映射稱為編碼(Encoder),隱含層到輸出層之間的映射稱為解碼(Decoder)。非監督預訓練自編碼器的中間層為特征層,在訓練好第一層特征層后,第二層和第一層的訓練方式相同。我們將第一層輸出的特征層當成第二層的輸入層,同樣最小化重構誤差,就會得到第二層的參數,並且得到第二層輸入的特征層,也就是原輸入信息的第二個表征。以此類推可以訓練其他特征層。
(3)有監督微調訓練
經過上面的訓練方法,可以得到一個多層的堆疊自編碼器,每一層都會得到原始輸入的不同的表達。到這里,這個堆疊自編碼器還不能用來分類數據,因為它還沒有學習如何去連結一個輸入和一個類。它只是學習獲得了一個可以良好代表輸入的特征,這個特征可以最大程度上代表原輸入信號。那么,為了實現分類,我們就可以在AutoEncoder的最頂的編碼層添加一個分類器(例如邏輯斯蒂回歸、SVM等),然后通過標准的多層神經網絡的監督訓練方法(梯度下降法)微調訓練。
2.1.1.3 典型改進
(1)Sparse AutoEncoder稀疏自編碼器
在AutoEncoder的基礎上加上L1的稀疏限制(L1主要是約束每一層中的節點中大部分都要為0,只有少數不為0,這就是Sparse名字的來源)來減小過擬合的影響,我們就可以得到稀疏自編碼器。
(2)Denoising AutoEncoders降噪自編碼器
降噪自動編碼器是在自動編碼器的基礎上,訓練數據加入噪聲,所以自動編碼器必須學習去去除這種噪聲而獲得真正的沒有被噪聲污染過的輸入。因此,這就迫使編碼器去學習輸入信號的更加魯棒的表達,這也是它的泛化能力比一般編碼器強的原因。
2.1.1.4 模型優缺點
(1)優點:
(1)、可以利用足夠多的無標簽數據進行模型預訓練;
(2)、具有較強的數據表征能力。
(2)缺點:
(1)、因為是全連接網絡,需要訓練的參數較多,容易出現過擬合;深度模型容易出現梯度消散問題。
(2)、要求輸入數據具有平移不變性。
2.1.2、Deep belief network 深度信念網絡
2006年,Geoffrey Hinton提出深度信念網絡(DBN)及其高效的學習算法,即Pre-training+Fine tuning,並發表於《Science》上,成為其后深度學習算法的主要框架。DBN是一種生成模型,通過訓練其神經元間的權重,我們可以讓整個神經網絡按照最大概率來生成訓練數據。所以,我們不僅可以使用DBN識別特征、分類數據,還可以用它來生成數據。
2.1.2.1 網絡結構
深度信念網絡(DBN)由若干層受限玻爾茲曼機(RBM)堆疊而成,上一層RBM的隱層作為下一層RBM的可見層。下面先介紹RBM,再介紹DBN。
(1) RBM

圖2 RBM網絡結構
一個普通的RBM網絡結構如上圖所示,是一個雙層模型,由m個可見層單元及n個隱層單元組成,其中,層內神經元無連接,層間神經元全連接,也就是說:在給定可見層狀態時,隱層的激活狀態條件獨立,反之,當給定隱層狀態時,可見層的激活狀態條件獨立。這保證了層內神經元之間的條件獨立性,降低概率分布計算及訓練的復雜度。RBM可以被視為一個無向圖模型,可見層神經元與隱層神經元之間的連接權重是雙向的,即可見層到隱層的連接權重為W,則隱層到可見層的連接權重為W’。除以上提及的參數外,RBM的參數還包括可見層偏置b及隱層偏置c。
RBM可見層和隱層單元所定義的分布可根據實際需要更換,包括:Binary單元、Gaussian單元、Rectified Linear單元等,這些不同單元的主要區別在於其激活函數不同。
(2) DBN

圖3 DBN模型結構
DBN模型由若干層RBM堆疊而成,如果在訓練集中有標簽數據,那么最后一層RBM的可見層中既包含前一層RBM的隱層單元,也包含標簽層單元。假設頂層RBM的可見層有500個神經元,訓練數據的分類一共分成了10類,那么頂層RBM的可見層有510個顯性神經元,對每一訓練數據,相應的標簽神經元被打開設為1,而其他的則被關閉設為0。
2.1.2.2 訓練過程
DBN的訓練包括Pre-training和Fine tuning兩步,其中Pre-training過程相當於逐層訓練每一個RBM,經過Pre-training的DBN已經可用於模擬訓練數據,而為了進一步提高網絡的判別性能, Fine tuning過程利用標簽數據通過BP算法對網絡參數進行微調。
(1) Pre-training
如前面所說,DBN的Pre-training過程相當於逐層訓練每一個RBM,因此進行Pre-training時直接使用RBM的訓練算法。
(2) Fine tuning
建立一個與DBN相同層數的神經網絡,將Pre-training過程獲得的網絡參數賦給此神經網絡,作為其參數的初始值,然后在最后一層后添加標簽層,結合訓練數據標簽,利用BP算法微調整個網絡參數,完成Fine tuning過程。
2.1.2.3 改進模型
DBN的變體比較多,它的改進主要集中於其組成“零件”RBM的改進,下面列舉兩種主要的變體。(這邊的改進模型暫時沒有深入研究,所以大概參考網上的內容)
(1) 卷積DBN(CDBN)
DBN並沒有考慮到圖像的二維結構信息,因為輸入是簡單的將一個圖像矩陣轉換為一維向量。而CDBN利用鄰域像素的空域關系,通過一個稱為卷積RBM(CRBM)的模型達到生成模型的變換不變性,而且可以容易得變換到高維圖像。
(2) 條件RBM(Conditional RBM)
DBN並沒有明確地處理對觀察變量的時間聯系的學習上,Conditional RBM通過考慮前一時刻的可見層單元變量作為附加的條件輸入,以模擬序列數據,這種變體在語音信號處理領域應用較多。
2.1.2.4 典型優缺點
對DBN優缺點的總結主要集中在生成模型與判別模型的優缺點總結上。
(1)優點:
(1)、生成模型學習聯合概率密度分布,所以就可以從統計的角度表示數據的分布情況,能夠反映同類數據本身的相似度;
(2)、生成模型可以還原出條件概率分布,此時相當於判別模型,而判別模型無法得到聯合分布,所以不能當成生成模型使用。
(2)缺點:
(1)、 生成模型不關心不同類別之間的最優分類面到底在哪兒,所以用於分類問題時,分類精度可能沒有判別模型高;
(2)、由於生成模型學習的是數據的聯合分布,因此在某種程度上學習問題的復雜性更高。
(3)、要求輸入數據具有平移不變性。
2.2、Convolution Neural Networks卷積神經網絡
卷積神經網絡是人工神經網絡的一種,已成為當前語音分析和圖像識別領域的研究熱點。它的權值共享網絡結構使之更類似於生物神經網絡,降低了網絡模型的復雜度,減少了權值的數量。該優點在網絡的輸入是多維圖像時表現的更為明顯,使圖像可以直接作為網絡的輸入,避免了傳統識別算法中復雜的特征提取和數據重建過程。卷積網絡是為識別二維形狀而特殊設計的一個多層感知器,這種網絡結構對平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。
2.2.1 網絡結構
卷積神經網絡是一個多層的神經網絡,其基本運算單元包括:卷積運算、池化運算、全連接運算和識別運算。

圖4 卷積神經網絡結構
l 卷積運算:前一層的特征圖與一個可學習的卷積核進行卷積運算,卷積的結果經過激活函數后的輸出形成這一層的神經元,從而構成該層特征圖,也稱特征提取層,每個神經元的輸入與前一層的局部感受野相連接,並提取該局部的特征,一旦該局部特征被提取,它與其它特征之間的位置關系就被確定。
l 池化運算:它把輸入信號分割成不重疊的區域,對於每個區域通過池化(下采樣)運算來降低網絡的空間分辨率,比如最大值池化是選擇區域內的最大值,均值池化是計算區域內的平均值。通過該運算來消除信號的偏移和扭曲。
l 全連接運算:輸入信號經過多次卷積核池化運算后,輸出為多組信號,經過全連接運算,將多組信號依次組合為一組信號。
l 識別運算:上述運算過程為特征學習運算,需在上述運算基礎上根據業務需求(分類或回歸問題)增加一層網絡用於分類或回歸計算。
2.2.2 訓練過程
卷積網絡在本質上是一種輸入到輸出的映射,它能夠學習大量的輸入與輸出之間的映射關系,而不需要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網絡加以訓練,網絡就具有輸入輸出對之間的映射能力。卷積網絡執行的是有監督訓練,所以其樣本集是由形如:(輸入信號,標簽值)的向量對構成的。
2.2.3 典型改進
卷積神經網絡因為其在各個領域中取得了好的效果,是近幾年來研究和應用最為廣泛的深度神經網絡。比較有名的卷積神經網絡模型主要包括1986年Lenet,2012年的Alexnet,2014年的GoogleNet,2014年的VGG,2015年的Deep Residual Learning。這些卷積神經網絡的改進版本或者模型的深度,或者模型的組織結構有一定的差異,但是組成模型的機構構建是相同的,基本都包含了卷積運算、池化運算、全連接運算和識別運算。
2.2.4 模型優缺點
(1)優點:
(1)、權重共享策略減少了需要訓練的參數,相同的權重可以讓濾波器不受信號位置的影響來檢測信號的特性,使得訓練出來的模型的泛化能力更強;
(2)、池化運算可以降低網絡的空間分辨率,從而消除信號的微小偏移和扭曲,從而對輸入數據的平移不變性要求不高。
(2)缺點:
(1)、深度模型容易出現梯度消散問題。
2.3、Recurrent neural network 遞歸神經網絡
在深度學習領域,傳統的多層感知機為基礎的上述各網絡結構具有出色的表現,取得了許多成功,它曾在許多不同的任務上——包括手寫數字識別和目標分類上創造了記錄。但是,他們也存在一定的問題,上述模型都無法分析輸入信息之間的整體邏輯序列。這些信息序列富含有大量的內容,信息彼此間有着復雜的時間關聯性,並且信息長度各種各樣。這是以上模型所無法解決的,遞歸神經網絡正是為了解決這種序列問題應運而生,其關鍵之處在於當前網絡的隱藏狀態會保留先前的輸入信息,用來作當前網絡的輸出。
許多任務需要處理序列數據,比如Image captioning, speech synthesis, and music generation 均需要模型生成序列數據,其他領域比如 time series prediction, video analysis, and musical information retrieval 等要求模型的輸入為序列數據,其他任務比如機器翻譯,人機對話,controlling a robot 的模型要求輸入輸出均為序列數據。
2.3.1 網絡結構
圖4.1左側是遞歸神經網絡的原始結構,如果先拋棄中間那個令人生畏的閉環,那其實就是簡單“輸入層=>隱藏層=>輸出層”的三層結構,但是圖中多了一個非常陌生的閉環,也就是說輸入到隱藏層之后,隱藏層還會輸入給自己,使得該網絡可以擁有記憶能力。我們說遞歸神經網絡擁有記憶能力,而這種能力就是通過W將以往的輸入狀態進行總結,而作為下次輸入的輔助。可以這樣理解隱藏狀態:
h=f(現有的輸入+過去記憶總結)

圖5 遞歸神經網絡結構圖
2.3.2 訓練過程
遞歸神經網絡中由於輸入時疊加了之前的信號,所以反向傳導時不同於傳統的神經網絡,因為對於時刻t的輸入層,其殘差不僅來自於輸出,還來自於之后的隱層。通過反向傳遞算法,利用輸出層的誤差,求解各個權重的梯度,然后利用梯度下降法更新各個權重。
2.3.3 典型改進
遞歸神經網絡模型可以用來處理序列數據,遞歸神經網絡包含了大量參數,且難於訓練(時間維度的梯度消散或梯度爆炸),所以出現一系列對RNN優化,比如網絡結構、求解算法與並行化。今年來bidirectional RNN (BRNN)與 LSTM在image captioning, language translation, and handwriting recognition這幾個方向上有了突破性進展 。
2.3.4 模型優缺點
(1)優點:
(1)、模型是時間維度上的深度模型,可以對序列內容建模;
(2)缺點:
(1)、需要訓練的參數較多,容易出現梯度消散或梯度爆炸問題;
(2)、不具有特征學習能力。
鏈接:知乎專欄
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
首先, 要看RNN和對於圖像等靜態類變量處理立下神功的卷積網絡CNN的結構區別來看, “循環”兩個字,已經點出了RNN的核心特征, 即系統的輸出會保留在網絡里, 和系統下一刻的輸入一起共同決定下一刻的輸出。這就把動力學的本質體現了出來, 循環正對應動力學系統的反饋概念,可以刻畫復雜的歷史依賴。另一個角度看也符合著名的圖靈機原理。 即此刻的狀態包含上一刻的歷史,又是下一刻變化的依據。 這其實包含了可編程神經網絡的核心概念,即, 當你有一個未知的過程,但你可以測量到輸入和輸出, 你假設當這個過程通過RNN的時候,它是可以自己學會這樣的輸入輸出規律的, 而且因此具有預測能力。 在這點上說, RNN是圖靈完備的。

圖: 圖1即CNN的架構, 圖2到5是RNN的幾種基本玩法。圖2是把單一輸入轉化為序列輸出,例如把圖像轉化成一行文字。 圖三是把序列輸入轉化為單個輸出, 比如情感測試,測量一段話正面或負面的情緒。 圖四是把序列轉化為序列, 最典型的是機器翻譯, 注意輸入和輸出的“時差”。 圖5是無時差的序列到序列轉化, 比如給一個錄像中的每一幀貼標簽。 圖片來源 The unreasonable effective RNN。
我們用一段小巧的python代碼讓你重新理解下上述的原理:
classRNN:
# ...
def step(self, x):
# update the hidden state
self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x))
# compute the output vector
y = np.dot(self.W_hy, self.h)
return y
這里的h就是hidden variable 隱變量,即整個網絡每個神經元的狀態,x是輸入, y是輸出, 注意着三者都是高維向量。隱變量h,就是通常說的神經網絡本體,也正是循環得以實現的基礎, 因為它如同一個可以儲存無窮歷史信息(理論上)的水庫,一方面會通過輸入矩陣W_xh吸收輸入序列x的當下值,一方面通過網絡連接W_hh進行內部神經元間的相互作用(網絡效應,信息傳遞),因為其網絡的狀態和輸入的整個過去歷史有關, 最終的輸出又是兩部分加在一起共同通過非線性函數tanh。 整個過程就是一個循環神經網絡“循環”的過程。 W_hh理論上可以可以刻畫輸入的整個歷史對於最終輸出的任何反饋形式,從而刻畫序列內部,或序列之間的時間關聯, 這是RNN強大的關鍵。

那么CNN似乎也有類似的功能? 那么CNN是不是也可以當做RNN來用呢? 答案是否定的,RNN的重要特性是可以處理不定長的輸入,得到一定的輸出。當你的輸入可長可短, 比如訓練翻譯模型的時候, 你的句子長度都不固定,你是無法像一個訓練固定像素的圖像那樣用CNN搞定的。而利用RNN的循環特性可以輕松搞定。

在序列信號的應用上,CNN是只響應預先設定的信號長度(輸入向量的長度),RNN的響應長度是學習出來的。
CNN對特征的響應是線性的,RNN在這個遞進方向上是非線性響應的。這也帶來了很大的差別。CNN 專門解決圖像問題的,可用把它看作特征提取層,放在輸入層上,最后用MLP 做分類。
RNN 專門解決時間序列問題的,用來提取時間序列信息,放在特征提取層(如CNN)之后。
DNN 說白了就是 多層網絡,只是用了很多技巧,讓它能夠 deep 。
工具及教程:
http://tensorlayer.readthedocs.io
https://www.tensorflow.org/versions/r0.9/tutorials/index.html