淺談深度學習基礎(下)

CNN、RNN和LSTM

卷積神經網絡(Convolutional Neural Network,CNN)

1984年,日本學者福島基于感受區域概念提出了神經認知機。神經認知機可以看作是卷積神經網絡的第一個實現網絡,也是感受區域概念在人工神經網絡領域的首次應用。神經認知機將一個視覺模式分解成許多feature,然后進入分層遞階式相連的feature maps進行處理,這樣就可以將視覺系統模型化,使其能夠在物體有位移或輕微變形的時候,也能完成識別。

卷積神經網絡LeNet-5示例

我們以用于手寫數字識別的LeNet-5為例來講卷積神經網絡。

卷積神經網絡由卷積層(Convolutions Layer)、池化層(Pooling Layer)和全連接層構成。全連接層在最后,前面是若干卷積層和池化層,每個卷積層后面跟一個池化層,如此重復。

圖中展示了LeNet-5網絡的結構,一共七層,前面四層是卷積層和池化層(池化層又叫子采樣層,也即Subsample Layer),后面三層是全連接層,最后一層輸出層是高斯連接層,也是全連接層,共有10個節點,分別代表數字0到9,且如果節點i的值為0,則網絡識別的結果是數字i。采用的是歐式徑向基函數(ERBF)的網絡連接方式。假設x是上一層的輸入,y是ERBF的輸出,則ERBF輸出的計算方式是:

理解卷積神經網絡的核心在于理解前面的卷積層和池化層。既然我們將卷積神經網絡分為了卷積層、池化層和全連接層,則隱含了前面的卷積層和池化層并不是全連接的,那它們是怎么連接的呢?

介紹連接方式之前需要先介紹卷積層與池化層的性質:

卷積層:卷積層由若干張feature map(FM)構成。對輸入數據應用卷積核(可以認為是對特定feature非常敏感的探測器),在輸入數據上滾一遍我們的卷積核,就得到了一張FM,FM上記錄了卷積核在原圖不同區域的激活程度(與該卷積核的feature越契合,激活程度越高),也即去掉了讀不懂的數據,留下了符合一定feature的數據。每個卷積核擁有一個feature,也就能產生一張對應feature的FM。

池化層:池化層的價值在于縮減輸入數據的規模,FM上k*k一共k^2個激活值合并成為池化層上的一個激活值,合并的方法有很多種,比如最大值合并、平均值合并及隨機合并,需要視情況而定,比如如果要確定『有沒有』的問題,就要采用最大值合并,把最高的激活值保留下來。

然后最后一個池化層后面連接到一個或多個全連接層,全連接層的輸出就是最后的輸出。訓練過程通過改進的反向傳播實現,在反向傳播的時候需要特別考慮到池化層合并激活值的方法,最大值合并、平均值合并等,均需要采用特定的處理方法,并以此來更新卷積核。

我們能人工定義的是卷積核的寬和高,還有卷積核的個數。卷積核對什么feature敏感,是先隨機初始化,再經過BP算法慢慢訓練出來的,卷積核的權重就是卷積神經網絡主要需要學習的參數。


3*3的一個卷積核

卷積神經網絡通過『局部感知野』與『權值共享』大大減少了連接的個數,也即需要訓練的參數的個數。

就拿原圖像到第一層卷積層的連接舉例,假設我們的圖像是1000*1000的,則有10^6個隱層神經元,那么它們全連接的話,也就是每個隱層神經元都連接圖像的每個像素點,就有10^12個連接,也即10^12個權值參數需要訓練,這顯然是不值得的。但是對于一個只識別特定feature的卷積核,需要大到覆蓋整個圖像的所有像素點嗎?通常是不需要的,一個特定feature,尤其是第一層需要提取的feature,通常都相當基礎,只占圖像很小的一部分。所以我們設置一個較小的局部感受區域,比如10*10,也即每個神經元只需要和這10*10的局部圖像相連接,所以10^6個神經元也就有10^8個連接。這就叫局部感知野。

那什么叫權值共享呢?在上面的局部連接中,10^6個神經元,每個神經元都對應100個參數,所以是10^8個參數,那如果每個神經元所對應的參數都是相同的,那需要訓練的參數就只有100個了。

這后面隱含的道理在于,這100個參數就是一個卷積核,而卷積核是提取feature的方式,與其在圖像上的位置無關,圖像一個局部的統計特征與其他局部的統計特征是一樣的,我們用在這個局部抽取feature的卷積核也可以用在圖像上的其它任何地方。

而且這100個參數只是一種卷積核,只能提取一種feature,我們完全可以采用100個卷積核,提取100種feature,而所需要訓練的參數也不過10^4,最開始我們訓練10^12個參數,還只能提取一種特征。選取100個卷積核,我們就能得到100張FM,每張FM可以看做是一張圖像的不同通道。

接下來我要具體介紹一下利用卷積核卷積生成FM的過程:


3*3卷積核在5*5圖像上卷積的過程

左側綠色的是5*5的原圖,左側黃色的是3*3的卷積核覆蓋的區域,右側是3*3的FM。

原圖就不說了,卷積核的權重是黃色區域每個格子右下角乘號后面的數字,也即卷積核就是我們前面用作示例的那個卷積核:


3*3的一個卷積核

具體的卷積過程,就是將卷積核覆蓋在原圖上,從左上角開始,一次向右移動一個像素,卷積完一行,整個卷積核向下移動一個像素,再開始卷積。在卷積核覆蓋的區域范圍內,原圖與卷積核對應位置的像素分別做乘法,再全部加和。

至于FM為什么是3*3的,因為(5-3)/1 + 1 = 3。原圖5*5,卷積核3*3,按這樣的方法法卷積(卷積核卷積的滑動步長為1),得到的feature也就是3*3的。也即這一層隱層的神經元的個數是3*3,不過這只是一張FM,如果10張相同的FM,那神經元的個數就是10倍了。

如果定義了滑動步長為2,那就每次向右移動2個像素了,一行結束也是向下移動2個像素,當然FM大小的計算方法也要隨之改變了,也即(5-3)/2 + 1 = 2,公式為(原圖寬高-卷積核寬高)/滑動步長 + 1

這樣基本的卷積過程就講完了,接下來講池化過程。


池化過程

池化過程看起來要簡單的多,就是一個取局部平均值\最大值的過程(根據具體池化方法決定)。人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。

另外需要提的一點是,前面說10*10的卷積核需要訓練的參數是100個,嚴格來講是錯誤的,其實是101個,因為每個卷積核還有一個可訓練偏置。

接下來以LeNet-5為例,從頭捋一遍卷積神經網絡的過程,重新放一遍LeNet-5的圖:


卷積神經網絡LeNet-5示例

輸入層是32*32像素的圖片,比數據集中最大的的字符(最大體積是20*20像素的字符,位于28*28像素區域的中心)大很多。這樣做的原因是能使潛在的特征比如邊緣的端點、拐角能夠出現在最高層次的卷積核的接收域的中心。

然后第一層C1,6個卷積核,所以也就6張FM,卷積核是5*5的,至于為什么每張FM是28*28的,(32-5)/1 + 1 = 28。那C1一共有多少個需要訓練的參數呢?(5*5+1)*6 = 156個可訓練參數,每個卷積核26個可訓練參數,6個卷積核,也就是156個可訓練參數。那C1與原圖一共有多少個連接呢?(28*28)*6*26 = 122304個連接,28*28的FM,一共有6張,所以乘6,這6張FM里的每一個點,都是采用了6種卷積核的其中之一卷積出來的,不管是這6種卷積核里的哪種,都有26個參數,也即26個連接,所以要乘以26。當然每張FM里面的點用的是同樣的卷積核,連接數公式簡記為(FM寬高*FM寬高)*可訓練參數

然后第二層S2,以2*2的范圍去池化,我們也稱其為一個2*2的池化核。6張28*28的FM被池化成了14*14的圖,這個算法很簡單,可以參考上面池化層的動圖去理解。這里的每個池化核有兩個可訓練參數,一個負責與池化核里4個輸入相加的和相乘,另一個作為可訓練偏置加在乘積上,最后得到池化結果。6張FM,也對應6個池化核,每個池化核2個參數,也即12個可訓練參數。那S2層與C1層有多少連接呢?(14*14)*6*5 = 5880個連接,這里池化核與卷積核不同,對于卷積核而言,26個可訓練參數,也即26個連接;而池化只有2個可訓練參數,但是如果池化核也只有2個連接,那那4個輸入是從哪來的呢,所以這里2*2的池化核對應5個連接。然后6張圖,每張14*14,每個點5個連接,所以得到5880個連接。

然后是C3層,C3層同樣通過5*5的卷積核去卷積每張圖14*14的S2,然后得到的每張FM就是10*10的,算法與C1時相同。它有16種不同的卷積核,所以C3層就對應了16張FM。這里有個比C1層復雜的多的問題,就是C1層只卷積1張圖,而C3層要卷積6張圖。那這16張FM是如何卷積前面S2層的6張圖的呢?如下圖:


C3層卷積S2層對應關系圖

0-5這6張FM卷積S2中的3張圖,6-11這6張FM卷積S2中連續的4張圖,12-14這3張FM卷積S2中不連續的4張圖,15這張FM卷積所有的6張圖。FM0卷積圖012、FM6卷積圖0123、FM12卷積圖0134、FM15卷積圖012345。

我們知道一張FM對應一個卷積核,那一個卷積核怎樣同時卷積多張圖呢?我們把多張圖上同一位置的卷積結果相加,然后代入激活函數:


雙曲正切激活函數

我們來想一下卷積多張圖的意義在哪?我們知道,越往后的卷積核的feature就越高級越抽象,而這個高級feature往往是通過組合低級feature得到的,比如低級feature可能是折線,而高級feature就可能是一個輪子、一張人臉。卷積多張圖就是組合低級feature嘗試生成高級feature的過程,這種不對稱的組合連接的方式有利于提取多種組合特征。

這里計算可訓練參數和連接數也比C1層復雜得多,C3層一共(5*5*3+1)*6 + (5*5*4+1)*6 + (5*5*4+1)*3 + (5*5*6+1)*1 = 1516個訓練參數,需要注意的是,之前的算法是(5*5+1)*卷積核數這里不再適用,因為每個卷積核不再只卷積一張圖,5\*5后面要接著乘以卷積圖的張圖,因為之前只有1張,所以就省略了,這里每個卷積核都卷積多張圖,所以不能省略,而且要分開計算,因為不同的卷積核卷積圖的張數也分為不同的幾種;至于連接數,代之前的公式,一共(10*10)*1516 = 151600個連接。

再后面是S4層,用16個2*2的池化核將16張10*10的FM池化成16張5*5的圖,一共16\*2 = 32個可訓練參數,一共(5*5)*16*5 = 2000個連接。

然后是C5層,我們看到S4層每張圖就已經是5*5的了,而我們的卷積核也是5*5的,所以卷積完了就是一個點。這里用120個卷積核,生成120張FM,每張FM就一個點。每張FM都卷積S4層全部16張圖,卷積多張圖的方法也和C3層講的一樣。

再后面是F6層,F6層是全連接層,有84個單元,與C5層全連接,有10164個可訓練參數。如同經典神經網絡,F6層計算輸入向量和權重限量之間的點積,再加上一個偏置。然后將其傳遞給Sigmoid函數產生單元i的一個狀態。

輸出層也是全連接層,前面提到過它的計算方式,這里重復一下,一共10個輸出,10個單元,每個單元有84個輸入,且如果節點i的值為0,則網絡識別的結果是數字i。采用的是歐式徑向基函數(ERBF)的網絡連接方式。假設x是上一層的輸入,y是ERBF的輸出,則ERBF輸出的計算方式是:

其意義是計算每個輸入向量與參數向量之間的歐式距離,輸入離參數向量越遠,ERBF的輸出值就越大,輸出值越小,也即越匹配越契合。一個ERBF的輸出可以被理解為衡量輸入模式和ERBF相關聯類的一個模型的匹配程度的懲罰項。

CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN特征檢測層通過訓練數據進行學習,在使用CNN時,避免了顯式的特征抽取,而隱式地從訓練數據中進行學習;再者,由于同一FM上的神經元權值相同,所以網絡可以并行學習,這也是卷積網絡相對于神經元彼此相連網絡的一大優勢。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有著獨特的優越性,其布局更接近于實際的生物神經網絡,權值共享降低了網絡的復雜性,避免了特征提取和分類過程中數據重建的復雜度。

遞歸神經網絡(RNN)

遞歸神經網絡(RNN),是兩種人工神經網絡的總稱。一種是時間遞歸神經網絡(recurrent neural network),另一種是結構遞歸神經網絡(recursive neural network)。時間遞歸神經網絡的神經元間連接構成有向圖,而結構遞歸神經網絡利用相似的神經網絡結構遞歸構造更為復雜的深度網絡。RNN一般指代時間遞歸神經網絡,也叫循環神經網絡。單純遞歸神經網絡因為無法處理隨著遞歸,梯度爆炸或消失的問題,難以捕捉長期時間關聯;而LSTM(長短期記憶神經網絡,Long-Short Term Memory)可以很好地解決這個問題。

RNN的目的是用來處理序列數據,普通的前饋神經網絡,是從輸入層到隱層再到輸出層,相鄰層的節點之間是全連接的,然而一層內的節點之間卻是沒有連接的。這種普通的神經網絡對很多問題是無能為力的,例如,你要預測句子中的下一個詞是什么就一般要用到前面的詞,因為詞與詞之間往往不是相互獨立的。RNN之所以被稱為循環神經網絡,就是因為一個序列當前的輸出不僅和當前的輸入有關,還和過去的輸出有關。RNN會對前面的輸出進行記憶并用在當前的輸出計算之中,同時意味著隱層內的節點也不再是無連接的。

舉一個例子,填槽問題,有這樣一句話,『I would like to arrive Taipei on November 2nd』。將這句話作為輸入提供給機票預訂系統,需要填的槽位有三個,一個是出發地,一個是目的地,另一個是到達時間,當然這句話只能填兩個。

首先我們嘗試用普通前饋神經網絡來解決這個問題。比如有這樣一個神經網絡,它有兩個輸出神經元,分別對應三個槽,一個槽是出發地,一個槽是目的地,一個槽是到達時間;然后我們要訓練這個神經網絡,使其在接受『I would like to arrive Taipei on November 2nd』輸入序列時,目的地槽位對應輸出神經元的激活值在輸入Taipei時達到最大,而到達時間槽位對應輸出神經元的激活值在輸入November 2nd時達到最大?

那我們考慮一下,如果將輸入序列這樣修改一下『I would like to leave Taipei on November 2nd』,我們還能把Taipei填到目的地槽位里面嗎?難道我們要先檢索一下句子里的是leave還是arrive?要是人家用其他的詞呢?這就是人工學習而不是機器學習了,都是治標不治本的做法。最本質的解決方法是要讓神經網絡擁有『記憶』。

我們不斷重復使用同樣的網絡結構,將其隱層相連,前面隱層的輸出作為后面隱層輸入的一部分使用。

上圖是神經單元的展開,如果收起,則結構如下:


一個循環的神經單元

那使用RNN如何解決前面提到的問題呢?在RNN里,當前面的詞不同時,對應的隱層輸出也就不同,前面詞的隱層輸出作為輸入的一部分提供給了Taipei對應的隱層,進而使得Taipei被填進每個槽位的概率也不同。從而實現,當前面是arrive時,將Taipei填進目的地槽;當前面是leave時,將Taipei填進出發地槽。

下面來講RNN中廣泛使用且效果極為出色的一種類型 —— LSTM(長短期記憶神經網絡,Long-Short Term Memory)。

前面講,普通RNN無法處理隨著遞歸,梯度爆炸或消失的問題,這樣導致普通RNN無法捕捉過長時間的關聯。前面隱層輸出的不同會隨著梯度消失,距離越遠,影響就越小。而LSTM通過特殊的結構解決了這個長期依賴的問題。

LSTM的結構這部分我主要讀了兩篇資料,一篇是Christopher Olah 的博文,另一篇是李宏毅教授Deep Learning Tutorial里面的對應內容。

這兩篇資料的講解,一篇以等價的邏輯結構來講,更通俗;一篇以真實結構來講,更深入,這里我準備加上自己的理解,將兩種結構對比起來講。

先說標準RNN的結構,所有的RNN都有神經網絡的重復模塊組成的鏈式結構。對于標準的RNN,這種重復模塊有一個非常簡單的結構,如一個單一的tanh(雙曲正切)層:


LSTM中也有這樣的鏈式結構,但重復模塊卻具有和一般RNN不同的結構。前面標準RNN只有一個交互層,而LSTM有四個。

為了便于理解,我們先以LSTM的等價邏輯結構進行講解:


LSTM的等價邏輯結構

如圖所示,LSTM的神經元由四部分組成,分別是:輸入門、輸出門、遺忘門和記憶細胞。接受4個輸入,1個輸出。輸入門、輸出門、遺忘門各接受一種控制信號輸入。輸入門還額外接受上個神經元的輸入,輸出門額外給出一個到下個神經元的輸出。3種門是用來保護和控制細胞狀態的。

下圖展示了邏輯結構下的實際計算過程:


首先,前面講輸入門、輸出門、遺忘門各接受一種控制信號輸入,也就是這里圖上的zizozf,這三種信號進來要經過的函數f為激活函數,通常使用Sigmoid函數,我們知道Sigmoid函數的輸出在0到1之間,非常適合作為門的控制信號,0代表完全舍棄(關閉),1代表完全保留(開啟)。

關注圖中門的開啟關閉是如何起作用的,我們可以發現,假如輸入門接受信號zi過小,導致對應Sigmoid函數的輸出為0,則意味著輸入門關閉,我們可以看到f(zi)與神經元的輸入z處理得到的g(z)是相乘的關系,也即如果輸入門關閉,則該LSTM神經元不再接收輸入門的輸入z。同理,如果輸出門關閉,則該LSTM神經元輸出門無法產生有效的輸出a。而對于遺忘門,根據圖中的公式可知,如果遺忘門關閉,則意味著記憶細胞過去的記憶值c將被忘記,該LSTM神經元的輸出完全獨立,不受過去輸出的影響。(如果將遺忘門叫做記憶門或許更好理解,記憶門關閉則完全遺忘。)

LSTM計算過程舉例:


LSTM計算過程舉例

左邊的圖,遺忘門那,c' = 3+cc是7,c'就得到10了。

理解了LSTM的邏輯結構,接下來我們看一下LSTM的真實結構,可以翻上去和標準RNN的結構圖比較一下:


LSTM的真實結構

我們先來解釋一下圖中的各種圖標的含義:


黃色方塊代表一個神經網絡層,里面的σ代表Sigmoid激活函數,tanh代表雙曲正切激活函數。粉色的圈代表一次操作,比如求積求和。每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。合在一起的線表示向量的連接,分開的線表示內容被復制,然后分發到不同的位置。

我們這里準備一部分一部分的將真實結構對應到前面的邏輯結構上去。先是邏輯結構中的記憶細胞:


這里圖中的Ct-1Ct的過程,就是前面邏輯結構中cc'的過程,前面講cc'的過程有兩部分,一部分是由遺忘門f(zf)決定前面的c是否參與到c'的計算中來,對應到真實結構上也就是圖中的ft,它決定了Ct-1會不會加到C中去;另一部分就是輸入門的輸入,在講邏輯結構的過程中,我們知道,輸入門的輸入也由兩部分構成,一部分是信號輸入zi代入Sigmoid函數的結果f(zi)決定了是否接受輸入z,另一部分就是處理輸入z得到的g(z)了。對應到上面的圖中,it就是f(zi),負責決定輸入z要不要被采用,圖中與it相乘的另一部分,就可以理解為g(x)了。

接下來是遺忘門和輸入門,在上面已經講過了:


遺忘門

輸入門

上面說了,f(zf)就對應著ft,看遺忘門圖中的式子,括號里面的自然就是zf了,前面說過f函數就是Sigmoid函數就是圖中的σ;然后是輸入門,前面說,f(zi)就是it,看輸入門圖中右側的第一個式子,括號里面的自然就是zi了,下面的式子就是g(z),那對應起來g函數就是tanh了,z就是括號里面的內容。

然后是輸出門:


前面講,輸出門接受一個信號zo,經過處理得到f(zo);計算出的c',經過h函數處理,得到h(c'),然后乘起來得到aa = h(c')f(zo)(如果忘了可以往回翻一下邏輯結構圖)。這對應關系就很明顯了,zo是圖中第一個式子括號里面的那一大堆,ot就是f(zo),計算出的c'就是圖中的Ct,這個前面說過了,然后h函數還是tanh函數,然后乘起來得到的那個a就是ht。我覺得我講的真是不能再清楚了:)

LSTM可以通過控制門的開閉天然避免梯度消失。因為前面提到過,梯度消失的原因在于連乘式的產生,計算每層的梯度都需要用到下一層的梯度,需要一直乘到輸出層,而對于LSTM來說,輸入和記憶是相加的,也就是在邏輯結構那說的:


這有個什么好處呢,就是只要遺忘門不關閉(即f(zf)不等于0),前面的輸出c的影響就永遠不會消失。

以上,這樣這篇《淺談深度學習基礎》也就結束了,下一篇可能會是《淺談自然語言處理基礎》,因為我本身就是Chatbot方向的產品經理,對NLP也很感興趣。當然也可能不是:>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 五、Deep Learning的基本思想 假設我們有一個系統S,它有n層(S1,…Sn),它的輸入是I,輸出是O,...
    dma_master閱讀 1,687評論 1 2
  • 文/雪中萍 走時未提前定好回程時間和地點,提前五天想起買返程車票,只有硬座,無奈歸心似箭,一咬牙,硬...
    雪中萍閱讀 474評論 0 1
  • 捷克坐在白雪皚皚的山林中俯視這自己腳下的這片土地。這里是黑龍江哈爾濱東北虎園,捷克是這群老虎的國王。午后的陽光照在...
    琉璃mm閱讀 356評論 0 2
  • ————今天是為達康書記演技點贊的小編值班———— 人紅不紅,看看斗圖表情包! 最近無論是刷微信微博,還是和朋友斗...
    趣讀書吧閱讀 407評論 0 0