1. 程式人生 > >迴圈神經網路( Recurrent Neural Networks,RNN)介紹

迴圈神經網路( Recurrent Neural Networks,RNN)介紹

迴圈神經網路(RNN, Recurrent Neural Networks)介紹

  迴圈神經網路(Recurrent Neural Networks,RNNs)已經在眾多自然語言處理(Natural Language Processing, NLP)中取得了巨大成功以及廣泛應用。但是,目前網上與RNNs有關的學習資料很少,因此該系列便是介紹RNNs的原理以及如何實現。主要分成以下幾個部分對RNNs進行介紹:
1. RNNs的基本介紹以及一些常見的RNNs(本文內容);
2. 詳細介紹RNNs中一些經常使用的訓練演算法,如Back Propagation Through Time(BPTT)、Real-time Recurrent Learning(RTRL)、Extended Kalman Filter(EKF)等學習演算法,以及梯度消失問題(vanishing gradient problem)
3. 詳細介紹Long Short-Term Memory(LSTM,長短時記憶網路);
4. 詳細介紹Clockwork RNNs(CW-RNNs,時鐘頻率驅動迴圈神經網路);
5. 基於Python和

Theano對RNNs進行實現,包括一些常見的RNNs模型。

  不同於傳統的FNNs(Feed-forward Neural Networks,前向反饋神經網路),RNNs引入了定向迴圈,能夠處理那些輸入之間前後關聯的問題。定向迴圈結構如下圖所示:
RNNs_0

什麼是RNNs

  RNNs的目的使用來處理序列資料。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連線的,每層之間的節點是無連線的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNNs之所以稱為迴圈神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的資訊進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連線而是有連線的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNNs能夠對任何長度的序列資料進行處理。但是在實踐中,為了降低複雜性往往假設當前的狀態只與前面的幾個狀態相關,下圖便是一個典型的RNNs:
RNN_2

RNN_3
From Nature
  RNNs包含輸入單元(Input units),輸入集標記為{x0,x1,...,xt,xt+1,...},這些隱藏單元完成了最為主要的工作。你會發現,在圖中:有一條單向流動的資訊流是從輸入單元到達隱藏單元的,與此同時另一條單向流動的資訊流從隱藏單元到達輸出單元。在某些情況下,RNNs會打破後者的限制,引導資訊從輸出單元返回隱藏單元,這些被稱為“Back Projections”,並且隱藏層的輸入還包括上一隱藏層的狀態,即隱藏層內的節點可以自連也可以互連。
  上圖將迴圈神經網路進行展開成一個全神經網路。例如,對一個包含5個單詞的語句,那麼展開的網路便是一個五層的神經網路,每一層代表一個單詞。對於該網路的計算過程如下:

  • xt為第一個詞);
    PS:使用計算機對自然語言進行處理,便需要將自然語言處理成為機器能夠識別的符號,加上在機器學習過程中,需要將其進行數值化。而詞是自然語言理解與處理的基礎,因此需要對詞進行數值化,詞向量(Word Representation,Word embeding)[1]便是一種可行又有效的方法。何為詞向量,即使用一個指定長度的實數向量v來表示一個詞。有一種種最簡單的表示方法,就是使用One-hot vector表示單詞,即根據單詞的數量|V|生成一個|V| * 1的向量,當某一位為一的時候其他位都為零,然後這個向量就代表一個單詞。缺點也很明顯:
    1. 由於向量長度是根據單詞個數來的,如果有新詞出現,這個向量還得增加,麻煩!(Impossible to keep up to date);
    2. 主觀性太強(subjective)
    3. 這麼多單詞,還得人工打labor並且adapt,想想就恐
    4. 最不能忍受的一點便是很難計算單詞之間的相似性。
      現在有一種更加有效的詞向量模式,該模式是通過神經網或者深度學習對詞進行訓練,輸出一個指定維度的向量,該向量便是輸入詞的表達。如word2vec
  • st,但是其並不存在,在實現中一般置為0向量;
  • ot.
    需要注意的是:
  • 你可以認為隱藏層狀態st只包含前面若干步而不是所有步的隱藏層狀態;
  • 在傳統神經網路中,每一個網路層的引數是不共享的。而在RNNs中,每輸入一步,每一層各自都共享引數U,V,W也是一樣的。
  • 上圖中每一步都會有輸出,但是每一步都要有輸出並不是必須的。比如,我們需要預測一條語句所表達的情緒,我們僅僅需要關係最後一個單詞輸入後的輸出,而不需要知道每個單詞輸入後的輸出。同理,每步都需要輸入也不是必須的。RNNs的關鍵之處在於隱藏層,隱藏層能夠捕捉序列的資訊。

RNNs能幹什麼?

  RNNs已經被在實踐中證明對NLP是非常成功的。如詞向量表達、語句合法性檢查、詞性標註等。在RNNs中,目前使用最廣泛最成功的模型便是LSTMs(Long Short-Term Memory,長短時記憶模型)模型,該模型通常比vanilla RNNs能夠更好地對長短時依賴進行表達,該模型相對於一般的RNNs,只是在隱藏層做了手腳。對於LSTMs,後面會進行詳細地介紹。下面對RNNs在NLP中的應用進行簡單的介紹。

語言模型與文字生成(Language Modeling and Generating Text)

  給你一個單詞序列,我們需要根據前面的單詞預測每一個單詞的可能性。語言模型能夠一個語句正確的可能性,這是機器翻譯的一部分,往往可能性越大,語句越正確。另一種應用便是使用生成模型預測下一個單詞的概率,從而生成新的文字根據輸出概率的取樣。語言模型中,典型的輸入是單詞序列中每個單詞的詞向量(如 One-hot vector),輸出時預測的單詞序列。當在對網路進行訓練時,如果otxt+1步的輸出便是下一步的輸入。
  下面是RNNs中的語言模型和文字生成研究的三篇文章:

機器翻譯(Machine Translation)

  機器翻譯是將一種源語言語句變成意思相同的另一種源語言語句,如將英語語句變成同樣意思的中文語句。與語言模型關鍵的區別在於,需要將源語言語句序列輸入後,才進行輸出,即輸出第一個單詞時,便需要從完整的輸入序列中進行獲取。機器翻譯如下圖所示:
MT
RNN for Machine Translation. Image Source
  下面是關於RNNs中機器翻譯研究的三篇文章:

語音識別(Speech Recognition)

  語音識別是指給一段聲波的聲音訊號,預測該聲波對應的某種指定源語言的語句以及該語句的概率值。
  RNNs中的語音識別研究論文:

影象描述生成 (Generating Image Descriptions)

  和卷積神經網路(convolutional Neural Networks, CNNs)一樣,RNNs已經在對無標影象描述自動生成中得到應用。將CNNs與RNNs結合進行影象描述自動生成。這是一個非常神奇的研究與應用。該組合模型能夠根據影象的特徵生成描述。如下圖所示:
GID
  影象描述生成中的深度視覺語義對比. Image Source

如何訓練RNNs

  對於RNN是的訓練和對傳統的ANN訓練一樣。同樣使用BP誤差反向傳播演算法,不過有一點區別。如果將RNNs進行網路展開,那麼引數W,U,V時,我們還需要向後傳遞三步,已經後面的三步都需要加上各種的梯度。該學習演算法稱為Backpropagation Through Time (BPTT)。後面會對BPTT進行詳細的介紹。需要意識到的是,在vanilla RNNs訓練中,BPTT無法解決長時依賴問題(即當前的輸出與前面很長的一段序列有關,一般超過十步就無能為力了),因為BPTT會帶來所謂的梯度消失或梯度爆炸問題(the vanishing/exploding gradient problem)。當然,有很多方法去解決這個問題,如LSTMs便是專門應對這種問題的。

RNNs擴充套件和改進模型

  這些年,研究者們已經提出了多鍾複雜的RNNs去改進vanilla RNN模型的缺點。下面是目前常見的一些RNNs模型,後面會對其中使用比較廣泛的進行詳細講解,在這裡進行簡單的概述。

  SRNs是RNNs的一種特例,它是一個三層網路,並且在隱藏層增加了上下文單元,下圖中的y便是上下文單元。上下文單元節點與隱藏層中的節點的連線是固定(誰與誰連線)的,並且權值也是固定的(值是多少),其實是一個上下文節點與隱藏層節點一一對應,並且值是確定的。在每一步中,使用標準的前向反饋進行傳播,然後使用學習演算法進行學習。上下文每一個節點儲存其連線的隱藏層節點的上一步的輸出,即儲存上文,並作用於當前步對應的隱藏層節點的狀態,即隱藏層的輸入由輸入層的輸出與上一步的自己的狀態所決定的。因此SRNs能夠解決標準的多層感知機(MLP)無法解決的對序列資料進行預測的任務。
  SRNs網路結構如下圖所示:
SRN

  Bidirectional RNNs(雙向網路)的改進之處便是,假設當前的輸出(第t步的輸出)不僅僅與前面的序列有關,並且還與後面的序列有關。例如:預測一個語句中缺失的詞語那麼就需要根據上下文來進行預測。Bidirectional RNNs是一個相對較簡單的RNNs,是由兩個RNNs上下疊加在一起組成的。輸出由這兩個RNNs的隱藏層的狀態決定的。如下圖所示:
bidirectional-rnn

  Deep(Bidirectional)RNNs與Bidirectional RNNs相似,只是對於每一步的輸入有多層網路。這樣,該網路便有更強大的表達與學習能力,但是複雜性也提高了,同時需要更多的訓練資料。Deep(Bidirectional)RNNs的結構如下圖所示:
Deep(Bidirectional)RNNs

  ESNs(回聲狀態網路)雖然也是一種RNNs,但是它與傳統的RNNs相差很大。ESNs具有三個特點:

  • 它的核心結構時一個隨機生成、且保持不變的儲備池(Reservoir),儲備池是大規模的、隨機生成的、稀疏連線(SD通常保持1%~5%,SD表示儲備池中互相連線的神經元佔總的神經元個數N的比例)的迴圈結構;
  • 其儲備池到輸出層的權值矩陣是唯一需要調整的部分;
  • 簡單的線性迴歸就可完成網路的訓練。

  從結構上講,ESNs是一種特殊型別的迴圈神經網路,其基本思想是:使用大規模隨機連線的迴圈網路取代經典神經網路中的中間層,從而簡化網路的訓練過程。因此ESNs的關鍵是中間的儲備池。網路中的引數包括:W表示輸出層的偏置項。
  對於ESNs,關鍵是儲備池的四個引數,如儲備池內部連線權譜半徑SR(SR=λmax=max{|W|},只有SR <1時,ESNs才能具有回聲狀態屬性)、儲備池規模N(即儲備池中神經元的個數)、儲備池輸入單元尺度IS(IS為儲備池的輸入訊號連線到儲備池內部神經元之前需要相乘的一個尺度因子)、儲備池稀疏程度SD(即為儲備池中互相連線的神經元個數佔儲備池神經元總個數的比例)。對於IS,如果需要處理的任務的非線性越強,那麼輸入單元尺度越大。該原則的本質就是通過輸入單元尺度IS,將輸入變換到神經元啟用函式相應的範圍(神經元啟用函式的不同輸入範圍,其非線性程度不同)。
  ESNs的結構如下圖所示:
ESN_1
ESN_2
ESN_3

  GRUs也是一般的RNNs的改良版本,主要是從以下兩個方面進行改進。一是,序列中不同的位置處的單詞(已單詞舉例)對當前的隱藏層的狀態的影響不同,越前面的影響越小,即每個前面狀態對當前的影響進行了距離加權,距離越遠,權值越小。二是,在產生誤差error時,誤差可能是由某一個或者幾個單詞而引發的,所以應當僅僅對對應的單詞weight進行更新。GRUs的結構如下圖所示。GRUs首先根據當前輸入單詞向量word vector已經前一個隱藏層的狀態hidden state計算出update gate和reset gate。再根據reset gate、當前word vector以及前一個hidden state計算新的記憶單元內容(new memory content)。當reset gate為1的時候,new memory content忽略之前的所有memory content,最終的memory是之前的hidden state與new memory content的結合。
GRU

  LSTMs與GRUs類似,目前非常流行。它與一般的RNNs結構本質上並沒有什麼不同,只是使用了不同的函式去去計算隱藏層的狀態。在LSTMs中,i結構被稱為cells,可以把cells看作是黑盒用以儲存當前輸入xt,這些cells更加一定的條件決定哪些cell抑制哪些cell興奮。它們結合前面的狀態、當前的記憶與當前的輸入。已經證明,該網路結構在對長序列依賴問題中非常有效。LSTMs的網路結構如下圖所示。對於LSTMs的學習,參見 this post has an excellent explanation
LSTM_1
LSTM_2
LSTM_3
  LSTMs解決的問題也是GRU中所提到的問題,如下圖所示:
LSTM-GRU_1
  LSTMs與GRUs的區別如圖所示[8]:
LSTM-GRU_2

  從上圖可以看出,它們之間非常相像,不同在於:

  • new memory的計算方法都是根據之前的state及input進行計算,但是GRUs中有一個reset gate控制之前state的進入量,而在LSTMs裡沒有這個gate;
  • 產生新的state的方式不同,LSTMs有兩個不同的gate,分別是forget gate (f gate)和input gate(i gate),而GRUs只有一個update gate(z gate);
  • LSTMs對新產生的state又一個output gate(o gate)可以調節大小,而GRUs直接輸出無任何調節。

  CW-RNNs是較新的一種RNNs模型,其論文發表於2014年Beijing ICML。在原文[8]中作者表示其效果較SRN與LSTMs都好。
  CW-RNNs也是一個RNNs的改良版本,是一種使用時鐘頻率來驅動的RNNs。它將隱藏層分為幾個塊(組,Group/Module),每一組按照自己規定的時鐘頻率對輸入進行處理。並且為了降低標準的RNNs的複雜性,CW-RNNs減少了引數的數目,提高了網路效能,加速了網路的訓練。CW-RNNs通過不同的隱藏層模組工作在不同的時鐘頻率下來解決長時間依賴問題。將時鐘時間進行離散化,然後在不同的時間點,不同的隱藏層組在工作。因此,所有的隱藏層組在每一步不會都同時工作,這樣便會加快網路的訓練。並且,時鐘週期小的組的神經元的不會連線到時鐘週期大的組的神經元,只會週期大的連線到週期小的(認為組與組之間的連線是有向的就好了,代表資訊的傳遞是有向的),週期大的速度慢,週期小的速度快,那麼便是速度慢的連速度快的,反之則不成立。現在還不明白不要緊,下面會進行講解。
   CW-RNNs與SRNs網路結構類似,也包括輸入層(Input)、隱藏層(Hidden)、輸出層(Output),它們之間也有向前連線,輸入層到隱藏層的連線,隱藏層到輸出層的連線。但是與SRN不同的是,隱藏層中的神經元會被劃分為若干個組,設為g,那麼連線便是從右到左。例如:隱藏層共有256個節點,分為四組,週期分別是[1,2,4,8],那麼每個隱藏層組256/4=64個節點,第一組隱藏層與隱藏層的連線矩陣為64*64的矩陣,第二層的矩陣則為64*128矩陣,第三組為64*(3*64)=64*192矩陣,第四組為64*(4*64)=64*256矩陣。這就解釋了上一段的後面部分,速度慢的組連到速度快的組,反之則不成立。
  CW-RNNs的網路結構如下圖所示:
CW-RNN
  在傳統的RNN中,按照下面的公式進行計算:

st=fs(Wst1+Winxt)
ot=fo(Woutst)
  其中,W為輸出層的啟用函式。
  與傳統的RNNs不同的是,在第t
  因此W個塊。如下:
W=W1...Wg\begin{equation} %開始數學環境 W=\left[ %左括號 \begin{array}{ccc} %該矩陣一共3列,每一列都居中放置 W_1\\ %第一行元素 ...\\ %第二行元素 W_g\\ %第三行元素 \end{array} \right] %右括號
Win=Win1...Wing\begin{equation} %開始數學環境 W_{in}=\left[ %左括號 \begin{array}{ccc} %該矩陣一共3列,每一列都居中放置 W_{in1}\\ %第一行元素 ...\\ %第二行元素 W_{ing}\\ %第三行元素 \end{array} \right] %右括號
其中W只有部分組行處於執行狀態,其它的為0:
Wi={Wi0,for(tmodTi)=0,otherwise W_i=\left\{ Wi,for(tmodTi)=00,otherwise \right.
Wini={Wini0,for(tmodTi)=0,otherwise W^{in}_{i}=\left\{ Wiin,for(tmodTi)=00,otherwise \right.
  為了使表達不混淆,將Win時的計算圖:
CW-RNN
  在CW-RNNs中,慢速組(週期大的組)處理、保留、輸出長依賴資訊,而快速組則會進行更新。CW-RNNs的誤差後向傳播也和傳統的RNNs類似,只是誤差只在處於執行狀態的隱藏層組進行傳播,而非執行狀態的隱藏層組也複製其連線的前面的隱藏層組的後向傳播。即執行態的隱藏層組的誤差後向傳播的資訊不僅來自與輸出層,並且來自與其連線到的左邊的隱藏層組的後向傳播資訊,而非執行態的後向傳播資訊只來自於其連線到的左邊的隱藏層組的後向傳播資料。
  下圖是原文對三個不同RNNs模型的實驗結果圖:
CW-RNN
  上圖中,綠色實線是預測結果,藍色散點是真實結果。每個模型都是對前半部分進行學習,然後預測後半部分。LSTMs模型類似滑動平均,但是CW-RNNs效果更好。其中三個模型的輸入層、隱藏層、輸出層的節點數都相同,並且只有一個隱藏層,權值都使用均值為0,標準差為0.1的高斯分佈進行初始化,隱藏層的初始狀態都為0,每一個模型都使用Nesterov-style
momentum SGD(Stochastic Gradient Descent,隨機梯度下降演算法)[10]
進行學習與優化。

總結

  到目前為止,本文對RNNs進行了基本的介紹,並對常見的幾種RNNs模型進行了初步講解。下一步將基於Theano與Python實現一個RNNs語言模型並對上面的一些RNNs模型進行詳解。這裡有更多的RNNs模型

  後面將陸續推出:

  • 詳細介紹RNNs中一些經常使用的訓練演算法,如Back Propagation Through Time(BPTT)、Real-time Recurrent Learning(RTRL)、Extended Kalman Filter(EKF)等學習演算法,以及梯度消失問題(vanishing gradient problem)
  • 詳細介紹Long Short-Term Memory(LSTM,長短時記憶網路);
  • 詳細介紹Clockwork RNNs(CW-RNNs,時鐘頻率驅動迴圈神經網路);
  • 基於Python和Theano對RNNs進行實現,包括一些常見的RNNs模型;

  本系列將實現一個基於迴圈神經網路的語言模型(recurrent neural network based language model)。該實現包含兩個方面:一是能夠得到任意語句在現實中成立的得分,其提供了判斷語法與語義的正確性的度量方式。該模型是機器翻譯中的典型應用。二是模型能夠產生新的文字,這是一個非常棒的應用。比如,對莎士比亞的文章進行訓練,能夠產生一個新的類似莎士比亞的文字,目前,這個有趣的想法已經被Andrew Karpathy基於RNNs的字元級別的語言模型實現了。

本文轉載自http://blog.csdn.net/heyongluoyao8/article/details/48636251

參考博文

參考文獻

[1] Hinton G E. Learning Distributed Representations of Concepts[C]. Proceedings of the 8th Annual Conference of the Cognitive Science Society. 1986, 1: 12.
[2] Elman, J. L. Finding structure in time. CRL Technical Report 8801, Center for Research in Language, University
of California, San Diego, 1988.
[3] Schuster M, Paliwal K K. Bidirectional recurrent neural networks[J]. Signal Processing, IEEE Transactions on, 1997, 45(11): 2673-2681.
[4] Graves A, Mohamed A R, Hinton G. Speech Recognition with Deep Recurrent Neural Networks[J]. Acoustics Speech & Signal Processing . icassp. international Conference on, 2013:6645 - 6649.
[5] Jaeger H, Haas H. Harnessing nonlinearity: Predicting chaotic systems and saving energy in wireless communication[J]. Science, 2004, 304(5667): 78-80.
[6] Cho K, Van Merrienboer B, Gulcehre C, et al. Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation[J]. Eprint Arxiv, 2014.
[7] Hochreiter S, Schmidhuber J. Long short-term memory.[J]. Neural Computation, 1997, 9(8):1735-1780.
[8] Chung J, Gulcehre C, Cho K H, et al. Empirical evaluation of gated recurrent neural networks on sequence modeling[J]. arXiv preprint arXiv:1412.3555, 2014.
[9] Jan Koutnik, Klaus Greff, Faustino Gomez, Juergen Schmidhuber. A Clockwork RNN[J]. Proceedings of The 31st International Conference on Machine Learning, pp. 1863–1871, 2014.
[10] Sutskever, Ilya, Martens, James, Dahl, George E., and Hinton, Geoffrey E. On the importance of initialization and momentum in deep learning. In Dasgupta, Sanjoy and Mcallester, David (eds.), Proceedings of the 30th International Conference on Machine Learning (ICML-13), volume 28, pp. 1139–1147.