全面理解卷積神經(jīng)網(wǎng)絡(luò)及其不同架構(gòu)
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達
在傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節(jié)點是無連接的。但是這種普通的神經(jīng)網(wǎng)絡(luò)對于很多問題卻無能無力。例如時序問題,比如你要預(yù)測句子的下一個單詞是什么,一般需要用到前面的單詞,因為一個句子中前后單詞并不是獨立的。這個時候,我們怎么辦呢?下面有兩種解決方案
一種思路是記憶之前的分類器的狀態(tài),在這個基礎(chǔ)上訓(xùn)練新的分類器,從而結(jié)合歷史影響,但是這樣需要大量歷史分類器
重用分類器,只用一個分類器總結(jié)狀態(tài),其他分類器接受對應(yīng)時間的訓(xùn)練,然后傳遞狀態(tài),這樣就避免了需要大量歷史分類器,而且還比較有效的解決了這個問題。而這樣一種東西是什么呢?沒錯,就是RNN(循環(huán)神經(jīng)網(wǎng)絡(luò)。
RNN出現(xiàn)的目的是來處理序列數(shù)據(jù)的。RNN之所以稱為循環(huán)神經(jīng)網(wǎng)路,是因為一個序列當(dāng)前的輸出與前面的輸出有關(guān)。具體的表現(xiàn)形式為網(wǎng)絡(luò)會對前面的信息進行記憶并應(yīng)用于當(dāng)前輸出的計算中,即隱藏層之間的節(jié)點不再無連接而是有連接的,也就是說隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠?qū)θ魏伍L度的序列數(shù)據(jù)進行處理。但是在實踐中,為了降低復(fù)雜性往往假設(shè)當(dāng)前的狀態(tài)只與前面的幾個狀態(tài)相關(guān),下圖便是一個典型的RNN:

如上右圖,隱藏單元(Hidden units)往往最為主要。你會發(fā)現(xiàn),在圖中:有一條單向流動的信息流是從輸入單元到達隱藏單元的,與此同時另一條單向流動的信息流從隱藏單元到達輸出單元。在某些情況下,RNN會打破后者的限制,引導(dǎo)信息從輸出單元返回隱藏單元,這些被稱為“Back Projections”,并且隱藏層的輸入還包括上一隱藏層的狀態(tài),即隱藏層內(nèi)的節(jié)點可以自連也可以互連。

需要注意的是:在RNN中,每輸入一步,每一層各自都共享參數(shù)U,V,W。其反映著RNN中的每一步都在做相同的事,只是輸入不同,因此大大地降低了網(wǎng)絡(luò)中需要學(xué)習(xí)的參數(shù),具體原因下面說。還有就是上圖中每一步都會有輸出,但是每一步都要有輸出并不是必須的。比如,我們需要預(yù)測一條語句所表達的情緒,我們僅僅需要關(guān)系最后一個單詞輸入后的輸出,而不需要知道每個單詞輸入后的輸出。同理,每步都需要輸入也不是必須的,其他架構(gòu)后面也會說。反正時時記得:RNN的關(guān)鍵之處在于隱藏層,隱藏層能夠捕捉序列的信息。
需要注意的是,那對每一個詞做處理的cell來說,他并不是只有1個神經(jīng)元的,而是n個hidden units,這個在tensorflow中是可以設(shè)置的,可以看成是神經(jīng)網(wǎng)絡(luò)的寬度!
對于RNN,我的理解是對于一個句子或者文本,那個參數(shù)可以看成是語法結(jié)構(gòu)或者一般規(guī)律,而下一個單詞的預(yù)測必須是上一個單詞和一般規(guī)律或者語法結(jié)構(gòu)向結(jié)合的。我們知道,語法結(jié)構(gòu)和一般規(guī)律在語言當(dāng)中是共享的,所以,參數(shù)自然就是共享的!
用通俗的例子解釋( 知乎@YJango大佬 的例子):

例2:演奏音樂時,樂器將力轉(zhuǎn)成相應(yīng)的震動產(chǎn)生聲音,而整個演奏擁有一個主旋律貫穿全曲。其中樂器的物理特性就相當(dāng)于參數(shù),同一樂器在各個時刻物理特性在各個時刻都是共享的。其內(nèi)在也有一個隱藏的主旋律基準(zhǔn)(主題),旋律信息(上一個狀態(tài)乘與主題)與音樂信息(輸入稱與參數(shù))共同決定下一時刻的實際聲音。
而捏陶瓷的例子可能更容易體會共享特性對于數(shù)據(jù)量的影響,不同角度相當(dāng)于不同的時刻。
若用前饋網(wǎng)絡(luò):網(wǎng)絡(luò)訓(xùn)練過程相當(dāng)于不用轉(zhuǎn)盤,而是徒手將各個角度捏成想要的形狀。不僅工作量大,效果也難以保證。
若用遞歸網(wǎng)絡(luò):網(wǎng)絡(luò)訓(xùn)練過程相當(dāng)于在不斷旋轉(zhuǎn)的轉(zhuǎn)盤上,以一種手勢捏造所有角度。工作量降低,效果也可保證。
CNN 和RNN的共享參數(shù):
我們需要記住的是,深度學(xué)習(xí)是怎么減少參數(shù)的,很大原因就是參數(shù)共享,而CNN是 在空間上共享參數(shù),RNN是在時間上(順序上)共享參數(shù):
對于RNN的訓(xùn)練和對傳統(tǒng)的ANN訓(xùn)練一樣。同樣使用BP誤差反向傳播算法,不過有一點區(qū)別。如果將RNN進行網(wǎng)絡(luò)展開,那么參數(shù)W,U,V是共享的,而傳統(tǒng)神經(jīng)網(wǎng)絡(luò)卻不是的。并且在使用梯度下降算法中,每一步的輸出不僅依賴當(dāng)前步的網(wǎng)絡(luò),并且還用前面若干步網(wǎng)絡(luò)的狀態(tài)。比如,在t=4時,我們還需要向后傳遞三步,以及后面的三步都需要加上各種的梯度。該學(xué)習(xí)算法稱為Backpropagation Through Time (BPTT)。需要注意的是,在普通RNN訓(xùn)練中,BPTT無法解決長時依賴問題(即當(dāng)前的輸出與前面很長的一段序列有關(guān),一般超過十步就無能為力了),因為BPTT會帶來所謂的梯度消失或梯度爆炸問題(the vanishing/exploding gradient problem)。當(dāng)然,有很多方法去解決這個問題,如LSTM便是專門應(yīng)對這種問題的。
因為BPTT具體推導(dǎo)的話占篇幅較大,之后在看看單獨一篇來寫吧!這里先做個簡介。
RNN幾種架構(gòu)
然后來說說幾種用RNN組成的常用架構(gòu),如下圖:
圖1是普通的單個神經(jīng)網(wǎng)絡(luò),圖2是把單一輸入轉(zhuǎn)化為序列輸出。圖3是把序列輸入轉(zhuǎn)化為單個輸出 圖4是把序列轉(zhuǎn)化為序列,也就是seq2seq的做法。圖5是無時差的序列到序列轉(zhuǎn)化,可以作為普通得語言模型,下面再說說幾個比較重要的架構(gòu):
1 to N:
這種情況有兩種方式,一種是只在序列開始進行輸入計算
還有一種結(jié)構(gòu)是把輸入信息X作為每個階段的輸入:
這種1toN的結(jié)構(gòu)可以處理的問題有挺多的,比如圖片標(biāo)注,輸出的X是圖像的特征,而輸出的y序列是一段句子或者從類別生成語音或音樂,輸入的x是類別,輸出的y是一串文字。
N to 1
輸入是一個序列,輸出是一個單獨的值而不是序列。這種結(jié)構(gòu)通常用來處理序列分類問題。如輸入一段文字判別它所屬的類別,輸入一個句子判斷其情感傾向,輸入一段文檔并判斷它的類別等等。具體如下圖:
N to N
輸入和輸出序列是等長的。這種可以作為簡單的Char RNN可以用來生成文章,詩歌,甚至是代碼,非常有意思)。
N to M
這種結(jié)構(gòu)又叫Encoder-Decoder模型,也可以稱之為Seq2Seq模型。在實現(xiàn)問題中,我們遇到的大部分序列都是不等長的,如機器翻譯中,源語言和目標(biāo)語言的句子往往并沒有相同的長度。而Encoder-Decoder結(jié)構(gòu)先將輸入數(shù)據(jù)編碼成一個上下文向量c,之后在通過這個上下文向量輸出預(yù)測序列。
注意,很多時候只用上下文向量C效果并不是很好,而attention技術(shù)很大程度彌補了這點。
seq2seq的應(yīng)用的范圍非常廣泛,機器翻譯,文本摘要,閱讀理解,對話生成....,之后會找機會詳細(xì)說明其中的知識,包括各種attention,不同結(jié)構(gòu)等。
有時候,我們只需要查看最近的信息來執(zhí)行現(xiàn)在的任務(wù),例如,考慮一個語言模型試圖基于先前的詞預(yù)測下一個詞。如果我們要預(yù)測“the clouds are in the sky”,我們不需要其他更遙遠的上下文 —— 非常明顯,下一個詞就應(yīng)該是sky。在這樣的例子中,相關(guān)信息和目的地之間的距離是很小的。RNN可以學(xué)著去使用過去的信息。
但也有一些情況是我們需要更多上下文的??紤]預(yù)測這個句子中最后一個詞:“I grew up in France… I speak fluent French.” 最近的信息表明下一個詞可能是一種語言的名字,但如果我們想要找出是哪種語言,我們需要從更久遠的地方獲取France的上下文。相關(guān)信息和目標(biāo)之間的距離完全可能是非常巨大的。而不幸的是,隨著距離的增大,RNN變得不能夠連接信息。
理論上,RNN是絕對能夠處理這樣的“長期依賴的”。人類可以仔細(xì)地從這些詞中找到參數(shù)然后解決這種形式的一些雛形問題。然而,實踐中,RNN似乎不能夠?qū)W習(xí)到這些。Hochreiter (1991) [German] 和 Bengio, et al. 1994年曾探索過這個問題,他們發(fā)現(xiàn)了一些非常根本的導(dǎo)致RNN難以生效的原因。幸運的是,LSTM或GRU沒有這個問題!也就是說不會產(chǎn)生由于太多層導(dǎo)致的梯度爆炸或者梯度消亡的問題!
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

