淺談CNN和RNN
原創【51CTO.com原創稿件】
1 導讀
在上一篇文稿中主要對深度學習的基礎做了一個闡述,對于其中的神經網絡和BP算法進行額外的延伸與拓展。但作為日前最為火熱的人工智能技術,掌握這些內容遠遠還不夠。因為深度學習面臨的實際問題往往不是線性可分的問題,有時甚至超出了分類的問題,這就必須對深度學習模型加以改進,對其中的訓練模型網絡進行優化,從而使得用來預測結果數據的網絡更加豐富化、智能化。做到實際上的智能,就是訓練模型真正的能通過輸入的數據來預測結果并且每預測一次都可以對自身網絡模型進行加強和優化,也就好比一個“不斷學習進步的人”一樣。隨著時間和訓練次數的推進,訓練的模型自身能力會越來越強。這樣的網絡模型才是我們真正需要的。當然要達到這一步光是靠之前的線性網絡模型和淺層、深層神經網絡遠遠不夠。所以,在一篇文稿中,將對對神經網絡進行延伸補充,是對神經網絡模型的一次優化,讓能運用的實際場景更為廣泛和豐富。
2 卷積神經網絡(CNN)
2.1 卷積神經網絡VS傳統神經網絡
CNN稱為卷積神經網絡,那么卷積神經與之前的神經網絡有什么區別呢?卷積神經網絡(Convolutional Neural Network)可以有效地減少了傳統的神經網絡對輸入數據所進行的預處理環節,降低了過程的復雜性。但是這種方式會導致網絡結構的整體復雜性增加,因為它是通過輸入層或者隱層進行傅里葉卷積操作來進行輸出,增加網絡卷積層。這樣就會使得網絡更加難以優化,很容易產生過擬合現象。所以這種神經網絡主要應用在圖像分類和物品識別等場景比較多,因為對于圖像進行預處理比較復雜,卷積神經網絡雖然網絡復雜,但是減少了對圖像預處理環節,直接把輸入的圖像作為輸入數據即可,并且通過卷積神經網絡的非線性可以得出目標函數的近似結構,從而得到更好的特征表達。
2.2 卷積神經網絡結構層次
卷積神經網絡主要分數據輸入層(Input Layer)、卷積計算層(CONV Layer)、ReLU激勵層(ReLU Layer)、池化層(Pooling Layer)、全連接層(FC Layer)五個層次,這五個層次都是依次相連,每一層都接受上一層的輸出特征數據來提供給下一層。其中數據輸入層是對輸入數據的特征進行提取;卷積計算層是對這些特征進行卷積映射;激勵層是利用非線性激勵函數對神經元進行激勵達到條件將特征信息傳遞到下一個神經元;池化層則是用來壓縮數據和參數的量,從而減小過擬合情況;全連接層就是連接所有輸出層的特征信息,并對這些信息進行匯總整理完成輸出。下面分別闡述下這幾個層次的具體內容。
2.3 輸入層(Input Layer)
2.3.1 預處理原因
和神經網絡/機器學習一樣,都需要對輸入的數據進行預處理操作,進行預處理的主要原因在于:
1.輸入的數據單位可能不一樣,因此可能會導致神經網絡的收斂速度較慢,從而致使訓練時間過長;
2.數據范圍太大的輸入在模式分類中的作用會導致偏大,而數據范圍較小的作用也就有可能偏小;
3.由于神經網絡中的激活函數是有值域限制的,因此需要將網絡訓練的目標數據映射到激活函數的值域;
4.Sigmod激活函數(0,1)區間以外區域很平緩,從而導致區分度太小,影響最終的輸出效果。
2.3.2預處理方式
輸入層對數據進行預處理主要有3種方式,這3中數據預處理方式各有不同,分別是:
1.去均值:就是將輸入數據的各個維度中心化到0;
2.歸一化:將輸入的數據的各個維度的幅度歸一化到同一范圍,具體操作在之前的推薦系統文稿里有介紹。
3.PCA/白化:也就是用PCA降維或者是白化,也就是將數據的每個特征軸上的幅度歸一化,也是平時用的最多的數據預處理方法。
2.3.3 預處理效果
三種預處理方法的效果圖如下所示:
例如,利用白化進行預處理后就會使得輸入的數據或者特征之間相關性較低,并且使得所有特征具有相同的方差。
2.4 卷積層(CONV Layer)
2.4.1 卷積神經網絡
在將卷積層之前,首先大致了解下卷積神經網絡。卷積神經網絡是保存了層級的網絡結構,以至于使得不同的層次有不同的形式或者運算與功能。而卷積神經網絡是主要適用于圖片信息處理的場景,而卷積層就是識別圖像中一個最為關鍵的步驟或者層級。類似人的大腦在識別圖片的過程中,不同的腦皮質層會處理來自不同方面的數據,例如顏色、形狀等,然后通過不同皮質層的處理結果進行合并并且映射操作,從而得出最終的結果。也就是說第一部分實質上是一個局部的觀察結果,第二部分是一個整體的結果合并。因此卷積神經網絡就是基于人的大腦識別圖片的過程,每個神經元就沒有必要對全局的圖像進行感知,只需要對局部的圖像進行感知即可,最后在更高層次對局部的信息進行綜合操作得出全局的信息。
2.4.2 卷積層參數
卷積層也叫卷積計算層,類比人腦識別圖像過程,它主要有以下幾個概念:
1局部關聯:每個神經元看作是一個filter,進行,作用就是對局部數據進行識別;
2.窗口(receptive field)滑動,也就是將filter對局部數據進行計算,滑動預先會設定步長,移動位置來得到下一個窗口;
3.對于窗口中滑動過程中,有深度(depth)、步長(stride)、填充值(zero-padding)這幾個重要參數,深度即轉換的次數(結果產生的depth);步長就是設定每一步移動多少;填充值就是在矩陣周邊添加一些擴充值(目的就是解決圖片輸入不規整)
計算模型如下圖所示:
2.4.3 卷積計算
卷積計算過程中有一個重要機制就是參數共享機制,假設每個神經元連接數據窗的權重是固定的,也就是固定每個神經元的連接權重,因此就可以將神經元看成一個模塊;也就是每個神經元只關注一個特性,從而使得需要計算的權重個數會大大的減少。而卷積計算就是將一組固定的權重和不同窗口內數據做內積,就叫卷積。
2.5 激勵層(ReLU Layer)
2.5.1 非線性激勵函數
激勵層,顧名思義就是加一個激勵函數對其神經元進行刺激或者激勵,也就是使用映射函數來完成非線性的映射。在卷積神經網絡中,激勵函數是非線性的。激勵層是接在卷積層后面的一層網絡,負責將卷積層的輸出結果做一次非線性的映射,即激勵。在卷積神經網絡中,經常用到的非線性映射函數有S函數(Sigmoid)、雙曲正切函數(Tanh)、ReLU、Leaky ReLu、ELU和Maxout等。如下就是某些激勵函數的函數圖像:
2.5.2 激勵層選取
由于非線性激勵函數較多,但是各有不同,因此在選擇激勵層的非線性激勵函數時,有不同的采取建議:
1.卷積神經網絡(CNN)首先盡量不要使用S函數(sigmoid),如果要使用,建議只在全連接層使用;
2.優先建議使用RELU,因為RELU函數的迭代速度快,但是有可能會導致效果不佳;
3.如果在選取RELU激勵函數后,達不到想要的效果(激勵函數失效)的情況下,則考慮使用Leaky ReLu或者Maxout;
4.雙曲正切函數(tanh)在某些情況下會有比較好的效果,但是能應用的場景比較少。
因此總結起來就是:雙曲正切函數和S函數用于全連接層,ReLu用于卷積計算層,普遍使用ELU,而Maxout是使用最大值來設置值。
2.6 池化層(Pooling Layer)
池化層存在于連續的卷積層中間,它的主要功能就是通過逐步減小表征的空間尺寸從而減小參數量和網絡中的計算復雜度;并且池化層都是在每一個特征圖上獨立進行操作。所以使用池化層有一個明顯的優勢就是可以壓縮數據和參數的量,來解決過擬合問題。
在池化層中,一般采用兩種策略去進行壓縮來減少特征數量,分別為最大池化(Max Pooling)和平均池化(Average Pooling)。例如給定某一個向量表征圖像,如下所示:
對于上面向量表征圖像池化為四個網格的小表征圖,那么利用最大池化策略就是每四個正方形格子取最大值,就分別得到6、8、3、4,同理可得,平均池化就是計算每四個正方形格子的平均值,就分別得到3、5、2、2,分別得到如上圖所示的網格。
2.7 全連接層(FC Layer)
類似傳統神經網絡中的結構,卷積神經網絡中的池化層(FC)中的神經元跟之前層次的所有激活輸出都是連接著的,也就是說兩層之間所有的神經元都有權重連接;作為最終的連接整理輸出,對每層的輸出結果進行匯總計算,全連接層只會在卷積神經網絡的尾部出現。
3 CNN訓練算法與CNN優缺點
3.1 CNN訓練算法
CNN訓練算法和一般的機器學習算法一樣,首先需要定義損失函數(Loss Function)來計算損失值,從而衡量出預測值和實際值之間的誤差,在這里一般采用平方和誤差公式。對于在網絡中找到最小損失函數的W和b的值,卷積神經網絡通暢采用隨機梯度下降算法(SGD),這個算法在之前的推薦算法文稿中有所闡述。簡而言之,卷積神經網絡的訓練算法其實就是一個機器學習中的反向傳播(BP)算法,SGD需要計算W和b的偏導,根據偏導來不斷迭代更新W和b。
3.2 CNN優缺點
對于卷積神經網絡,有以下幾個優點:
1.可以共享卷積核(共享參數),使得卷積神經網絡對高維的數據處理沒有壓力;
2.不需要選擇特征屬性,只需要訓練好每一個權重,也就可以得到特征值;
3.在深層次的神經網絡中,使得對圖像信息的抽取更為豐富,從而使得最終表達效果好;
但是卷積神經網絡同樣也有一些缺點,比如在卷積神經網絡中需要調參,這就會導致需要大量的樣本,使得訓練迭代次數比較多,最好使用GPU來訓練;另外對于卷積神經網絡每一層的輸出結果的物理含義并不明確,也就是很難從每一層輸出看出含義,即可解釋性較差。
4 正則化和Dropout延伸
神經網絡的學習能力受神經元數目和神經網絡的層級影響,一般來說,神經元數目越多,神經網絡的層級就越高,那么這個神經網絡的學習能力就越強,但是有可能就會出現過擬合(overfitting)的問題。解決過擬合的方法主要還是正則化(Regularization)和Dropout,這兩個方法在之前的神經網絡文稿中有所闡述,在這里進一步說明下:
1.正則化是通過降低模型的復雜度,通過在cost函數上添加一個正則項的方式來降低overfitting;Dropout是通過隨機刪除神經網絡中的部分神經元來解決過擬合問題,使得在每次僅限迭代時,只是用部分神經元訓練模型來獲取W和d的值,從而使得CNN沒有太多的泛化能力,通過合并多次迭代的結果可以增加模型的準確率。
2.一般情況下,對于同一組訓練數據,利用不同的神經網絡之后,求它輸出的平均值就可以減少過擬合。因此Dropout就是利用這個原理,每次都丟掉一半左右的隱藏層神經元,也就相當于在不同的神經網絡上進行訓練,這樣就減少了神經元之間的依賴性,即每個神經元不能依賴于某幾個其他神經元(在這里指層與層之間想連接的神經元),使得神經網絡更具健壯性的特征,還能更好的提高準確率。
對于一些典型的卷積神經網絡模型介紹,網上都有資料,讀者感興趣的話可以自己搜索瀏覽下,在這里就不贅述了。
5 循環神經網絡(RNN)
5.1 應用場景
循環神經網絡的運用場景較多,在目前的互聯網或者信息科技公司運用循環神經網絡最多的幾個場景有自然語言處理(NLP)、機器翻譯、語音識別、圖像描述生成,自然語言處理也包括了語言模型與文本的生成,在互聯網行業主要劃分為語音/語義識別部門。對推向進行識別描述,與卷積神經網絡(CNN)不同點在于:CNN是去做一個圖片的識別,例如圖片的的東西是什么,而RNN雖然也可以識別圖片里的東西是什么,但是運用RNN更多的是度圖片上的東西進行描述,提供出圖片上的內容信息。
那么有人就會問,既然有BP神經網絡和CNN,為什么還要RNN呢?這個就跟RNN的循環有關了,之前的BP神經網絡和CNN的每一個神經元輸入輸出都是相互獨立的,互相并沒有產生干擾或者聯系,而在實際應用場景中呢?有些場景的輸出內容和之前的內容是有關聯的,也就是一種“記憶”的概念,因此RNN引入這個概念,循環就是指每一個神經元都執行相同的任務,但是輸出不僅依賴于輸入,還依賴于神經元自身之前的“記憶”。
5.2 RNN結構
因為“記憶”的概念與時間的先后有關,所以講神經元序列按照時間先后展開就可以得到RNN的結構如下圖所示:
在上述結構中, 是時間t的輸入, 是時間t出的“記憶”, 是時間t的輸出。
還有一種循環神經網絡是雙向RNN(Bidirectional RNN),也就是在之前的結構中當前t的輸出不僅僅和之前的序列有關,而且還與之后的序列有關。例如:預測一個語句中缺失的詞語,那么就需要根據上下文進行預測。雙向RNN其實是一個相對簡單的RNN結構,是有兩個RNN上下疊加在一起組成。輸出就是有這兩個RNN的隱藏層的狀態決定。
5.3 訓練算法
5.3.1 BPTT算法
循環神經網絡(RNN)的訓練其實也很CNN訓練一樣,同樣可以用BP反向傳播誤差算法。唯一的區別就在于:RNN中的參數W是共享的,并且在隨機梯度下降算法中,每一步的輸出不僅僅依賴當前步的網絡,并且還需要前若干步網絡的狀態,也就是對之前的BP短發進行改版,這個改版的BP算法叫做BPTT(Backpropagation Through Time),BPTT算法和BP算法一樣,在多層訓練時,都有可能產生梯度消失和爆炸的問題。BPTT算法的思路和BP算法一樣,都是求偏導,但是需要同時考慮到時間對step的影響。
5.3.2 LSTM
對于BPTT算法中可能產生梯度消失和梯度爆炸的問題,這是由于在BPTT計算中,對于長期依賴“記憶”問題導致的,而LSTM就特別適合解決這類長時間依賴的問題。LSTM是RNN的一種,大致結構一致,區別在于LSTM的“記憶神經元”是改造過后的,并且記錄的信息就會一致傳遞下去,不該記錄的信息就會被截斷掉。 如下圖所示
LSTM結構圖
在LSTM中,有一個關鍵點在于“細胞狀態”,也就是記憶神經元的狀態。細胞狀態類似于傳送帶,都是直接在整個鏈上運行,只有一些少量的線性交互過程,這樣就使得信息在上面流傳是保持不變較為容易。那么怎么去控制“細胞狀態”呢?控制“細胞狀態”的過程有以下幾個步驟:
1.LSTM可以通過“門”(gates)這種結構來去除或者增加“細胞狀態”的信息;
2.用包含一個sigmoid神經網絡層次和一個pointwist乘法操作;
3.Sigmoid層輸出一個0到1之間的概率值,描述每個部分有多少量可以通過,0表示“不允許任務變量通過”,1表示“運行所有變量通過”;
4.LSTM中主要有是三個“門”結構來控制“細胞狀態”。
5.3.3 三個“門”?
下面對LSTM的三個“門”進行延伸:
1.第一個“門”也叫“忘記門”,它決定了從“細胞狀態”中丟棄什么信息;比如在語言模型中,細胞狀態可能包含了性別信息,當我們看到新的名詞后,就可以考慮忘記掉舊的數據信息;
2.第二個門也叫“信息增加門”,它決定了放什么新的信息到“細胞狀態”中去,其中Sigmoid層決定什么值需要更新;Tanh層創建一個新的候選向量,主要都是為了進行狀態更新做準備。
3.第三個“門”就是基于“細胞狀態”得到輸出,經過第一個“門”和第二個“門”后,可以缺東傳遞信息的刪除和增加,也就可以進行“細胞狀態”的更新,第三個“門”首先運行一個Sigmoid層來確定細胞狀態的哪個部分被輸出,然后再使用tanh處理細胞狀態得到-1到1之間的值,再將它與sigmoid門的輸出相乘,輸出過程確定了輸出的部分。
三個“門”的部分圖分別如下所示:
5.3.4 LSTM結構改造
對于上述的LSTM結構,也有針對其中的某些部分進行改造,其中例如有在第二個“門”之前增加“配額phone connections”層,從而使得“門”層也接受細胞狀態的輸入;還有通過耦合忘記門和更新輸入門,不在單獨考慮忘記什么信息、增加什么信息,而是放在一起進行考慮。
在對LSTM結構進行設計改造中,相對比較出眾的就是2014年提出的一個結構,如下圖所示,主要區別在于以下幾點:
1.該結構將忘記門和輸入門合并成為一個單一的更新門,也就是將忘記的信息和輸入的信息一并進行考慮;
2.合并了數據單元狀態與隱藏狀態;
3.它的結構比LSTM的結構更為簡單。
6 總結與補充
6.1 總結
深度學習的神經網絡在目前主要運用場景為圖片識別、文本識別、游戲、語言識別等。其中的一些主要算法在上面也已經進行了闡述。除此之外還有一些輔助算法如極大極小值算法。對于這一塊內容我將在下文提到。因此在學習神經網絡這一塊的時候,一定要分類去理解、分情況去討論,結合實際的運用場景功能來完成神經網絡模型的選擇與訓練,從而達到最好的輸出效果。關于CNN和RNN的一些擴展,其中包括Fast R-CNN(快速卷積)和R-FCN(基于區域的全卷積)這些內容和結構,有興趣的讀者可以自行了解下,實際運用的場景并不多。
6.2 補充
對于運用神經網絡知識這一塊的深度學習領域,還有額外的一些需要了解的知識內容,例如遷移學習和極大極小值算法等。在這里我將對這些進行一個補充,僅僅作為一個引子,來激發讀者更多的探討興趣。
6.2.1 遷移學習
遷移學習就是一個算法思想、一個算法訓練方式,一般的深度學習算法都會要求我們的訓練數據集中數據標注數據比較多,但是在實際應用中,有很多場景標注的數據是比較少的。因此使用比較少的數據來進行訓練而達到跟之前一樣很好的效果是非常困難的。而遷移學習就是一個解決這一類問題的算法思想,它是指用基于很少標注的數據集進行高質量的模型訓練。在目前運用場景中,使用遷移學習的主要是在圖片檢測或者標注這一塊。
6.2.2 極大極小值算法
極大極小值算法(MiniMax)是一種找出失敗的最大可能性中的最小值的算法,也就是盡量是對手的最大收益最小化。這個算法通常是通過遞歸的形式實現,常用語棋類或者競技較量類的游戲程序中。
該算法同時也就是一個零和博弈,也就是使得雙方的輸贏總和為0,即一方要在可選的條件下選擇出對其優勢最大化的方法,而另外一方也需要選擇出令對手優勢最小化的一個方法。簡而言之,博弈中有人贏錢,就得有人輸錢,輸的錢數是與贏的錢數相等。但是在這算法過程中,因為用到的是遞歸操作,所以算法的層級深度會非常深,學過數據結構的都知道,遞歸算法雖然書寫代碼簡便,但是其時間復雜度較高,甚至會陷入死循環而宕機,因此在使用極大極小值算法中就有可能對神經網絡進行優化,盡量降低神經網絡訓練時的時間復雜度。
【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】