RNN-LSTM系列

Posted by

深度學習-CNN(6)循環神經網絡(RNN, Recurrent Neural Networks)介紹

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

這篇文章很多內容是參考:,在這篇文章中,加入了一些新的內容與一些自己的理解。

循環神經網絡(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引入了定向循環,能夠處理那些輸入之間前後關聯的問題。定向循環結構如下圖所示:

該tutorial默認讀者已經熟悉了基本的神經網絡模型。如果不熟悉,可以點擊:Implementing A Neural Network From Scratch進行學習。

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


From Nature
RNNs包含輸入單元(Input units),輸入集標記為{x0x1…xtxt+1…},而輸出單元(Output units)的輸出集則被標記為{y0y1…ytyt+1…}。RNNs還包含隱藏單元(Hidden units),我們將其輸出集標記為{s0s1…stst+1…},這些隱藏單元完成了最為主要的工作。你會發現,在圖中:有一條單向流動的信息流是從輸入單元到達隱藏單元的,與此同時另一條單向流動的信息流從隱藏單元到達輸出單元。在某些情況下,RNNs會打破後者的限制,引導信息從輸出單元返回隱藏單元,這些被稱為「Back Projections」,並且隱藏層的輸入還包括上一隱藏層的狀態,即隱藏層內的節點可以自連也可以互連。

上圖將循環神經網絡進行展開成一個全神經網絡。例如,對一個包含5個單詞的語句,那麼展開的網絡便是一個五層的神經網絡,每一層代表一個單詞。對於該網絡的計算過程如下:xt表示第tt=123…步(step)的輸入。比如,x1為第二個詞的one-hot向量(根據上圖,x0為第一個詞);
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。

為隱藏層的第t步的狀態,它是網絡的記憶單元。st根據當前輸入層的輸出與上一步隱藏層的狀態進行計算。st=f(Uxt+Wst−1),其中s0時,即第一個單詞的隱藏層狀態,需要用到s−1,但是其並不存在,在實現中一般置為0向量;ot是第t步的輸出,如下個單詞的向量表示,ot=softmax(Vst).
需要注意的是:你可以認為隱藏層狀態st是網絡的記憶單元.st包含了前面所有步的隱藏層狀態。而輸出層的輸出只與當前步的st有關,在實踐中,為了降低網絡的複雜度,往往st只包含前面若干步而不是所有步的隱藏層狀態;在傳統神經網絡中,每一個網絡層的參數是不共享的。而在RNNs中,每輸入一步,每一層各自都共享參數UVW。其反應者RNNs中的每一步都在做相同的事,只是輸入不同,因此大大地降低了網絡中需要學習的參數;這裡並沒有說清楚,解釋一下,傳統神經網絡的參數是不共享的,並不是表示對於每個輸入有不同的參數,而是將RNN是進行展開,這樣變成了多層的網絡,如果這是一個多層的傳統神經網絡,那麼xtst之間的U矩陣與st+1之間的U是不同的,而RNNs中的卻是一樣的,同理對於s層之間的s層與o層之間的V也是一樣的。

上圖中每一步都會有輸出,但是每一步都要有輸出並不是必須的。比如,我們需要預測一條語句所表達的情緒,我們僅僅需要關係最後一個單詞輸入後的輸出,而不需要知道每個單詞輸入後的輸出。同理,每步都需要輸入也不是必須的。RNNs的關鍵之處在於隱藏層,隱藏層能夠捕捉序列的信息。

RNNs能幹什麼?

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

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

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

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

RNN for Machine Translation.

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

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

圖像描述生成中的深度視覺語義對比. Image Source  對於RNN是的訓練和對傳統的ANN訓練一樣。同樣使用BP誤差反向傳播算法,不過有一點區別。如果將RNNs進行網絡展開,那麼參數WUV是共享的,而傳統神經網絡卻不是的。並且在使用梯度下降算法中,每一步的輸出不僅依賴當前步的網絡,並且還以來前面若干步網絡的狀態。比如,在t=4時,我們還需要向後傳遞三步,已經後面的三步都需要加上各種的梯度。該學習算法稱為Backpropagation Through Time (BPTT)。後面會對BPTT進行詳細的介紹。需要意識到的是,在vanilla RNNs訓練中,BPTT無法解決長時依賴問題(即當前的輸出與前面很長的一段序列有關,一般超過十步就無能為力了),因為BPTT會帶來所謂的梯度消失或梯度爆炸問題(the vanishing/exploding gradient problem)。當然,有很多方法去解決這個問題,如LSTMs便是專門應對這種問題的。

RNNs擴展和改進模型

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

SRNs是RNNs的一種特例,它是一個三層網絡,並且在隱藏層增加了上下文單元,下圖中的y便是隱藏層,u便是上下文單元。上下文單元節點與隱藏層中的節點的連接是固定(誰與誰連接)的,並且權值也是固定的(值是多少),其實是一個上下文節點與隱藏層節點一一對應,並且值是確定的。在每一步中,使用標準的前向反饋進行傳播,然後使用學習算法進行學習。上下文每一個節點保存其連接的隱藏層節點的上一步的輸出,即保存上文,並作用於當前步對應的隱藏層節點的狀態,即隱藏層的輸入由輸入層的輸出與上一步的自己的狀態所決定的。因此SRNs能夠解決標準的多層感知機(MLP)無法解決的對序列數據進行預測的任務。
SRNs網絡結構如下圖所示:
  Bidirectional RNNs(雙向網絡)的改進之處便是,假設當前的輸出(第t步的輸出)不僅僅與前面的序列有關,並且還與後面的序列有關。例如:預測一個語句中缺失的詞語那麼就需要根據上下文來進行預測。Bidirectional RNNs是一個相對較簡單的RNNs,是由兩個RNNs上下疊加在一起組成的。輸出由這兩個RNNs的隱藏層的狀態決定的。如下圖所示:
  Deep(Bidirectional)RNNs與Bidirectional RNNs相似,只是對於每一步的輸入有多層網絡。這樣,該網絡便有更強大的表達與學習能力,但是複雜性也提高了,同時需要更多的訓練數據。Deep(Bidirectional)RNNs的結構如下圖所示:

Echo State Networks[5]

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

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

從結構上講,ESNs是一種特殊類型的循環神經網絡,其基本思想是:使用大規模隨機連接的循環網絡取代經典神經網絡中的中間層,從而簡化網絡的訓練過程。因此ESNs的關鍵是中間的儲備池。網絡中的參數包括:Win為輸入層到儲備池之間的連接權值矩陣,表明儲備池中的神經元之間是連接的,Wback為輸出層到儲備池之間的反饋連接權值矩陣,表明儲備池會有輸出層來的反饋,Wout為輸入層、儲備池、輸出層到輸出層的連接權值矩陣,表明輸出層不僅與儲備池連接,還與輸入層和自己連接。Woutbias表示輸出層的偏置項。
對於ESNs,關鍵是儲備池的四個參數,如儲備池內部連接權譜半徑SR(SR=λmax=max{|W的特征指|},只有SR <1時,ESNs才能具有回聲狀態屬性)、儲備池規模N(即儲備池中神經元的個數)、儲備池輸入單元尺度IS(IS為儲備池的輸入信號連接到儲備池內部神經元之前需要相乘的一個尺度因子)、儲備池稀疏程度SD(即為儲備池中互相連接的神經元個數占儲備池神經元總個數的比例)。對於IS,如果需要處理的任務的非線性越強,那麼輸入單元尺度越大。該原則的本質就是通過輸入單元尺度IS,將輸入變換到神經元激活函數相應的範圍(神經元激活函數的不同輸入範圍,其非線性程度不同)。
ESNs的結構如下圖所示:

Gated Recurrent Unit Recurrent Neural Networks[6]

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的結合。
  LSTMs與GRUs類似,目前非常流行。它與一般的RNNs結構本質上並沒有什麼不同,只是使用了不同的函數去去計算隱藏層的狀態。在LSTMs中,i結構被稱為cells,可以把cells看作是黑盒用以保存當前輸入xt之前的保存的狀態ht−1,這些cells更加一定的條件決定哪些cell抑制哪些cell興奮。它們結合前面的狀態、當前的記憶與當前的輸入。已經證明,該網絡結構在對長序列依賴問題中非常有效。LSTMs的網絡結構如下圖所示。對於LSTMs的學習,參見this post has an excellent explanation

LSTMs解決的問題也是GRU中所提到的問題,如下圖所示:

LSTMs與GRUs的區別如圖所示[8]:

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

  • 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,每一組中的神經元個數相同,設為Ti∈{T1T2…Tg}j到組i的循環連接則需要滿足Tj大於Ti。如下圖所示,將這些組按照時鐘周期遞增從左到右進行排序,即T1<T2<…<Tg,那麼連接便是從右到左。例如:隱藏層共有256個節點,分為四組,周期分別是[1,2,4,8],那麼每個隱藏層組256/4=64個節點,第一組隱藏層與隱藏層的連接矩陣為6464的矩陣,第二層的矩陣則為64128矩陣,第三組為64(364)=64192矩陣,第四組為64(464)=64256矩陣。這就解釋了上一段的後面部分,速度慢的組連到速度快的組,反之則不成立。
CW-RNNs的網絡結構如下圖所示:

在傳統的RNN中,按照下面的公式進行計算:

st=fs(Wst−1+Winxt)
ot=fo(Woutst)

WWoutxt是第t步的輸入,st−1為第t−1st為第t步隱藏層的輸出,ot為第t步的輸出,fs為隱藏層的激活函數,fo為輸出層的激活函數。
與傳統的RNNs不同的是,在第t步時,只有那些滿足(tmodTi)=0的隱藏層組才會執行。並且每一隱藏層組的周期{T1T2…Tg}都可以是任意的。原文中是選擇指數序列作為它們的周期,即Ti=2i−1i∈[1…g]。
因此Win將被劃分為g個塊。如下:

Win=⎡⎣⎢Win1…Wing⎤⎦⎥

其中WWi被劃分為列向量{W1i…Wii0(i+1)i…0gi}TWjij∈[1…g]表示第i個組到第j個組的連接權值矩陣。在每一步中,Win只有部分組行處於執行狀態,其它的為0:

Wi={Wi0for(tmodTi)=0otherwise
Wini={Wini0for(tmodTi)=0otherwise

Win寫成Win。並且執行的組所對應的o才會有輸出。處於非執行狀態下的隱藏層組仍保留著上一步的狀態。下圖是含五個隱藏層組在t=6時的計算圖:

在CW-RNNs中,慢速組(周期大的組)處理、保留、輸出長依賴信息,而快速組則會進行更新。CW-RNNs的誤差後向傳播也和傳統的RNNs類似,只是誤差只在處於執行狀態的隱藏層組進行傳播,而非執行狀態的隱藏層組也複製其連接的前面的隱藏層組的後向傳播。即執行態的隱藏層組的誤差後向傳播的信息不僅來自與輸出層,並且來自與其連接到的左邊的隱藏層組的後向傳播信息,而非執行態的後向傳播信息只來自於其連接到的左邊的隱藏層組的後向傳播數據。
下圖是原文對三個不同RNNs模型的實驗結果圖:

上圖中,綠色實線是預測結果,藍色散點是真實結果。每個模型都是對前半部分進行學習,然後預測後半部分。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的字符級別的語言模型實現了。

[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.

廣告

Comments

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料