1. 程式人生 > 其它 >機器學習篇:迴圈神經網路RNN

機器學習篇:迴圈神經網路RNN

0 前言

  1. 卷積神經網路DNN和CNN

  2. 迴圈神經網路RNN

  3. 神經網路發展歷史

  4. 自然語言處理 NLP

迴圈神經網路想要整理的內容包括:

  1. 迴圈神經網路結構

  2. 經典迴圈神經網路

  3. 迴圈神經網路的變體

1 迴圈神經網路結構

1.1 迴圈神經網路

神經網路可以當作可以擬合任何函式的盒子,而全連線神經網路存在引數過多的維數災難,卷積神經網路通過使用卷積核作為特徵提取做到了區域性連線、權值共享。

而針對序列資料,如文字、語音、視訊、氣象觀測資料、股票交易資料等,經典神經網路存在兩個問題:

  1. 輸入和輸出不固定。樣本資料,如文字中,我們並不能限制每個句子長度一致。

  2. 特徵無法複用,導致引數規模龐大產生維數災難。譬如說卷積神經網路利用卷積核進行特徵提取就做到了特徵複用,引數共享。

所以引入了迴圈神經網路(Recurrent neural network, RNN),迴圈神經網路是一類擴充套件的人工神經網路,它是為了對序列資料進行建模而產生的。迴圈神經網路針對物件是序列資料,其核心思想:

  • 樣本間存在順序關係,每個樣本和它之前的樣本存在關聯。

  • 通過神經網路在時序上的展開,我們能夠找到樣本之間的序列相關性。

1.2 迴圈神經網路結構

卷積神經網路通過卷積核來達到引數共享,而迴圈神經網路是針對的時間序列,時間序列的下一個序列的計算引數由上一個序列計算得出,這樣子時間序列的每一個輸入都會受到之前輸入的影響。迴圈神經網路RNN的結構如下所示:

其中X是輸入的時間序列或者說是一個向量,O也是一個向量,是輸出層,S也是一個向量,是隱藏層。U是輸入層到隱藏層的權重矩陣,V是隱藏層到輸出層的權重矩陣。從下圖可以看出,隱藏層的值St不僅僅取決於當前的輸入X,還取決於上一次隱藏層的值St-1,權重W矩陣W就是上一次的值作為這一次的輸出的權重。

用公式表示如下:

1.2.1 迴圈神經網路的常見結構包含

one to one:也即是原始神經網路

one to many:譬如說影象描述

many to one:譬如說情感分類,通過一個輸入的句子中多個詞來獲取情感類別,但是存在上下文、長時間的序列損失的缺點。

many to many I:機器翻譯,文字序列生成文字序列

many to many II:命名實體識別

1.2.2 網路內部計算過程

前面有簡單地瞭解一下迴圈神經的網路結構,可得到公式:

其中的Ot是輸出,St是傳遞到下一時間序列並施加影響的向量。但是在這裡要提一下啟用函式的概念。

之前有提到過,神經網路幾乎可以擬合任何函式,但是如果如下所示,僅僅是權重相乘並新增偏置,無論如何,擬合的結果Y'都只會是線性,那麼網路的逼近能力就相當有限。所以便引入了非線性函式作為啟用函式(激勵函式),這樣深層神經網路表達能力就更加強大。

早期研究神經網路主要採用sigmoid函式或者tanh函式,輸出有界,很容易充當下一層的輸入。近些年Relu函式及其改進型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多層神經網路中應用比較多。

在添加了激勵單元后,將迴圈神經網路的計算單元內部展開可以得到如下的結果:

也即是:

1.2.3 迴圈神經網路遇到的問題

當網路層次越來越深的時候(序列越來越長)就可能產生:梯度爆炸和梯度消失。所謂梯度消失是指,在我們訓練模型的過程中,需要按照反向傳播來不斷訓練模型的引數,但是隨著網路層次越來越深,反向傳播的值無法傳到淺層,資料不再變化,無法再訓練。

梯度消失和梯度爆炸的本質上上一樣的,都是因為網路層數太深而引發的梯度反向轉筆中的連乘效應。當我們對sigmoid函式求導,其導數取值範圍在0至0.25之間,而我們初始化的網路權值|W|通常都小於1,因此,當層數增多時,小於0的值不斷相乘,最後就導致梯度消失的情況出現。同理,梯度爆炸就是當權值|W|過大時,導致|sigmoid'(z)W|>1,最後大於1的值不斷相乘,就會產生梯度爆炸。

同時,對於某些進行正確預測可能依賴於很久之前的某些資訊的序列,迴圈神經網路的預測可能不夠準確,因為RNN的預測受到的主要影響是較為靠近的輸入。如:

The Cat, which already ate apples banana ..., was full The Cats, which already ate apples banana ..., were full

解決方法

  1. 梯度爆炸:進行梯度修剪,也即是設定一個剪下閾值,如果更新梯度時,梯度超過了這個閾值,那麼將其強制限制在這個範圍之內。這樣可以防止梯度爆炸。

  2. 梯度消失:1) 改變啟用函式,將tanh啟用函式更改為ReLU。2)修改網路結構,如GRU和LSTM。作為目前最廣為使用的RNN變體,LSTM和GRU通過門控機制很大程度上緩解了RNN的梯度消失問題,但是它們的內部結構看上去十分複雜,使得初學者很難理解其中的原理所在。

2、經典迴圈神經網路

前最廣為使用的RNN變體就是上面所說的LSTM和GRU,相對而言比較複雜。

2.1 LSTM 長短時記憶網路

為了解決梯度消失(Gradient Vanish)的問題,Hochreiter&Schmidhuber 在論文“Long short-term memory, 1997”中提出了 LSTM(Long Short-Term Memory)。原始的LSTM只有輸入門(Input Fate)和輸出門(Output Gate),後面由 Gers 在"Learning to Forget: Continual Prediction with LSTM, 2000"中提出了改進版本,添加了遺忘門(Forget Gate)。後來,在"LSTM Recurrent Networks Learn Simple Context Free and Context Sensitive Languages, 2001"中 Gers 又加入了 窺視孔連線(Peephole Connection) 的概念。同時,現在常用的深度學習框架 Tensorflow、Pytorch 等在實現 LSTM 上也有一些細微的區別。以上所說的雖然本質都是 LSTM,但結構上還是有所區別,在使用時需要注意一下。

LSTM中重複單元的內部計算如下圖所示:

公式如下所示:

決定丟棄資訊確定更新資訊當前的記憶更新細胞狀態,長期的記憶更新輸出資訊

其中,

  • 遺忘門(forget gate):它決定上一時刻的單元狀態C<t-1>(長期記憶)有多少資訊保留到當前時刻C<t>可以儲存很久很久之前的資訊,解決RNN網路中的長依賴問題。

  • 輸入門(input gate):它決定當前時刻的網路輸入x<t>有多少資訊儲存到單元狀態C<t>可避免當前無關緊要的內容進入記憶。

  • 輸出門(output gate):控制單元狀態C<t>有多少輸出到LSTM的當前輸出值h<t>控制了長期記憶對當前輸出的影響。

在我們訓練LSTM模型的過程中,目標則是學習8組引數,如下圖所示:

2.2 GRU 門控迴圈單元

LSTM有很多變體,其中較大改動的是Gated Recurrent Unit(GRU),這是由Cho,et al.(2014)提出。它將遺忘門與輸入門合成了一個單一的更新門,僅有兩個門:更新門(Update Gate)和重置門(reset Gate)。同樣還混合了細胞狀態和隱藏狀態,以及一些其他的改動。最終的模型比標準的LSTM模型要簡單。效果和LSTM差不多,但是引數少了1/3,不容易過擬合。作為LSTM的變體,GRU也可以解決RNN網路中的長依賴問題。

GRU中的重置門$ R_t$和更新門$Z_t$的輸入均為當前時間的輸入$x_t$與上一時間的隱藏狀態$h_{t-1}$進行權重及偏置計算後,在經由啟用函式sigmoid後計算得到。

候選隱藏狀態$\widetilde{h}_t$,GRU將計算候選隱藏狀態來輔助稍後的隱藏狀態的計算,將當前時間重置門與上一時間隱藏狀態做按元素乘法(若重置門的元素值接近0,則意味著丟棄上一時間的隱藏狀態,接近1則表示保留上一時間的隱藏狀態。),然後將結果與當前時間輸入連結,在經由啟用函式tanh後計算得出候選隱藏狀態,其所有元素的值域為[-1,1]。

候選隱藏狀態$\widetilde{h}t$只是為了更新新的隱藏狀態$h_t$,而並不是隱藏狀態,所以$h_t$計算需要使用當前時間的更新門$z_t$來對上一步的隱藏狀態$h{t-1}$和當前時間步的候選隱藏狀態$\widetilde{h}_t$做組合。

3、迴圈神經網路的變體

這裡會涉及迴圈神經網路RNN的兩個變體雙向迴圈網路(Bi-directional RNNs)和深層迴圈網路(Multi-layer RNNs)。

3.1 雙向迴圈網路(Bi-directional RNNs)

標準的RNN在時刻t的狀態只能從過去的序列以及當前的輸入中捕獲資訊,無法使用到後面序列的資訊。

BRNN結合時間上從序列起點開始移動的RNN和另一個時間上從序列末尾開始移動的RNN。這允許輸出單元能夠計算同時依賴於過去和未來且對時刻t的輸入值最敏感的表示。

BRNN在每個時刻增加一個隱藏單元,如下圖所示(圖源:深度學習)

其中隱藏單元h在時間上向前傳播,隱藏單元g在時間上向後傳播。

BRNN的缺點是必須獲取了所有時刻後的輸入之後,才能進行每個時刻的輸出。從其結構上來看,適合進行自然語言處理,能夠克服標準RNN不能處理上下文的缺陷。

3.2 深層迴圈網路(Deep RNNs)

在標準的RNN中,我們在每一個時刻對該時刻的輸入$x_t$的處理都只包含一個隱藏層。而DRNN是由多個隱藏層疊加而成,如下圖所示:

DRNN中較低的層起到了將原始輸入轉化為對更高層的隱藏狀態更適合的表示的作用。

一般來說,多層神經網路隨著層數增加,其擬合能力會更好。但是增加深度會帶來優化困難,而且因為RNN在時間維度上很大,所以一般不會構建很深的RNN。

參考

一文搞懂RNN(迴圈神經網路)基礎篇

Hopfield Network 霍普菲爾德網路入門

迴圈神經網路常見的結構(學習筆記)

常用啟用函式(激勵函式)理解與總結

深度學習中常用的激勵函式

梯度消失和梯度爆炸問題詳解

RNN & LSTM & GRU 的原理與區別

理解 LSTM 網路

深度學習之GRU網路

Word Embedding/RNN/LSTM

LSTM原理——輸入門、遺忘門、輸出門

GRU(門控迴圈單元)--學習筆記

花書+吳恩達深度學習(十六)序列模型之雙向迴圈網路 BRNN 和深度迴圈網路 Deep RNN

深層迴圈神經網路(DRNN)

當你深入瞭解,你就會發現世界如此廣袤,而你對世界的瞭解則是如此淺薄,請永遠保持謙卑的態度。