CNN(卷積神經網絡)、RNN(循環神經網絡)、DNN(深度神經網絡)的內部網絡結構區別

神經網絡技術起源於上世紀五、六十年代,當時叫感知機(perceptron),擁有輸入層、輸出層和一個隱含層。輸入的特徵向量通過隱含層變換達到輸出層,在輸出層得到分類結果。早期感知機的推動者是Rosenblatt。(扯一個不相關的:由於計算技術的落後,當時感知器傳輸函數是用線拉動變阻器改變電阻的方法機械實現的,腦補一下科學家們扯着密密麻麻的導線的樣子…)

但是,Rosenblatt的單層感知機有一個嚴重得不能再嚴重的問題,即它對稍複雜一些的函數都無能爲力(比如最爲典型的“異或”操作)。連異或都不能擬合,你還能指望這貨有什麼實際用途麼o(╯□╰)o


隨着數學的發展,這個缺點直到上世紀八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)發明的多層感知機(multilayer perceptron)克服。多層感知機,顧名思義,就是有多個隱含層的感知機(廢話……)。好好,我們看一下多層感知機的結構:

<img src="https://pic4.zhimg.com/e186f18d73fdafa8d4a5e75ed55ed4a3_b.png" data-rawwidth="866" data-rawheight="249" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic4.zhimg.com/e186f18d73fdafa8d4a5e75ed55ed4a3_r.png">

圖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]!具體結構題主可自行搜索瞭解。如果你之前在懷疑是不是有很多方法打上了“深度學習”的噱頭,這個結果真是深得讓人心服口服。


<img src="https://pic3.zhimg.com/7b3ee9e4f4a2e61acf35820a2768cc12_b.png" data-rawwidth="866" data-rawheight="1228" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic3.zhimg.com/7b3ee9e4f4a2e61acf35820a2768cc12_r.png">

圖2縮減版的深度殘差學習網絡,僅有34層,終極版有152層,自行感受一下


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


<img src="https://pic2.zhimg.com/440765dbaab356739fb855834f901e7d_b.png" data-rawwidth="866" data-rawheight="457" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic2.zhimg.com/440765dbaab356739fb855834f901e7d_r.png">

圖3卷積神經網絡隱含層(摘自Theano教程)


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


<img src="https://pic3.zhimg.com/c71cd39abe8b0dd29e229f37058404da_b.png" data-rawwidth="866" data-rawheight="203" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic3.zhimg.com/c71cd39abe8b0dd29e229f37058404da_r.png">

圖4一個典型的卷積神經網絡結構,注意到最後一層實際上是一個全連接層(摘自Theano教程)


在這個例子裏,我們注意到輸入層到隱含層的參數瞬間降低到了100*100*100=10^6個!這使得我們能夠用已有的訓練數據得到良好的模型。題主所說的適用於圖像識別,正是由於CNN模型限制參數了個數並挖掘了局部結構的這個特點。順着同樣的思路,利用語音語譜結構中的局部信息,CNN照樣能應用在語音識別中。


全連接的DNN還存在着另一個問題——無法對時間序列上的變化進行建模。然而,樣本出現的時間順序對於自然語言處理、語音識別、手寫體識別等應用非常重要。對了適應這種需求,就出現了題主所說的另一種神經網絡結構——循環神經網絡RNN。


在普通的全連接網絡或CNN中,每層神經元的信號只能向上一層傳播,樣本的處理在各個時刻獨立,因此又被成爲前向神經網絡(Feed-forward Neural Networks)。而在RNN中,神經元的輸出可以在下一個時間戳直接作用到自身,即第i層神經元在m時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(m-1)時刻的輸出!表示成圖就是這樣的:


<img src="https://pic2.zhimg.com/bef6a6073d311e79cad53eb47757af9d_b.png" data-rawwidth="866" data-rawheight="441" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic2.zhimg.com/bef6a6073d311e79cad53eb47757af9d_r.png">

圖5 RNN網絡結構


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


<img src="https://pic3.zhimg.com/c2eb9099048761fd25f0e90aa66d363a_b.png" data-rawwidth="866" data-rawheight="348" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic3.zhimg.com/c2eb9099048761fd25f0e90aa66d363a_r.png">

圖6 RNN在時間上進行展開


Cool,(t+1)時刻網絡的最終結果O(t+1)是該時刻輸入和所有歷史共同作用的結果!這就達到了對時間序列建模的目的。


不知題主是否發現,RNN可以看成一個在時間上傳遞的神經網絡,它的深度是時間的長度!正如我們上面所說,“梯度消失”現象又要出現了,只不過這次發生在時間軸上。對於t時刻來說,它產生的梯度在時間軸上向歷史傳播幾層之後就消失了,根本就無法影響太遙遠的過去。因此,之前說“所有歷史”共同作用只是理想的情況,在實際中,這種影響也就只能維持若干個時間戳。


爲了解決時間上的梯度消失,機器學習領域發展出了長短時記憶單元LSTM,通過門的開關實現時間上記憶功能,並防止梯度消失,一個LSTM單元長這個樣子:


<img src="https://pic4.zhimg.com/a8f4582707b70d41f250fdf0a43812fb_b.png" data-rawwidth="866" data-rawheight="555" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic4.zhimg.com/a8f4582707b70d41f250fdf0a43812fb_r.png">

圖7 LSTM的模樣


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


<img src="https://pic1.zhimg.com/a3ab3ac82679db4f51ecdafda617db0c_b.png" data-rawwidth="866" data-rawheight="365" class="origin_image zh-lightbox-thumb" width="866" data-original="https://pic1.zhimg.com/a3ab3ac82679db4f51ecdafda617db0c_r.png">

圖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.


個人覺得CNN、RNN和DNN不能放在一起比較。
DNN是一個大類,CNN是一個典型的空間上深度的神經網絡,RNN是在時間上深度的神經網絡。
推薦你從UFLDL開始看,這是斯坦福深度學習的課程,瞭解一些神經網絡的基礎,會對你的學習有很大幫助。
=============================分割線======================================
前面一位同學回答得非常詳細完整,我再回來談一談怎麼學習這些模型,我來分享一下我的學習歷程。我也是在學習中,以後會慢慢繼續補充。
1、ufldl.stanford.edu/wiki教程
這是我最開始接觸神經網絡時看的資料,把這個仔細研究完會對神經網絡的模型以及如何訓練(反向傳播算法)有一個基本的認識,算是一個基本功。

2、Deep Learning Tutorials
這是一個開源的深度學習工具包,裏面有很多深度學習模型的python代碼還有一些對模型以及代碼細節的解釋。我覺得學習深度學習光了解模型是不難的,難點在於把模型落地寫成代碼,因爲裏面會有很多細節只有動手寫了代碼纔會瞭解。但Theano也有缺點,就是極其難以調試,以至於我後來就算自己動手寫幾百行的代碼也不願意再用它的工具包。所以我覺得Theano的正確用法還是在於看裏面解釋的文字,不要害怕英文,這是必經之路。PS:推薦使用python語言,目前來看比較主流。(更新:自己寫坑實在太多了,CUDA也不知道怎麼用,還是乖乖用theano吧...)

3、Stanford University CS231n: Convolutional Neural Networks for Visual Recognition
斯坦福的一門課:卷積神經網絡,李飛飛教授主講。這門課會系統的講一下卷積神經網絡的模型,然後還有一些課後習題,題目很有代表性,也是用python寫的,是在一份代碼中填寫一部分缺失的代碼。如果把這個完整學完,相信使用卷積神經網絡就不是一個大問題了。

4、斯坦福大學公開課 :機器學習課程
這可能是機器學習領域最經典最知名的公開課了,由大牛Andrew Ng主講,這個就不僅僅是深度學習了,它是帶你領略機器學習領域中最重要的概念,然後建立起一個框架,使你對機器學習這個學科有一個較爲完整的認識。這個我覺得所有學習機器學習的人都應該看一下,我甚至在某公司的招聘要求上看到過:認真看過並深入研究過Andrew Ng的機器學習課程,由此可見其重要性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章