Recurrent Neural Network(循環神經網絡)


Reference:   Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks]

Alex是RNN最著名變種,LSTM發明者Jürgen Schmidhuber的高徒,現加入University of Toronto,拜師Hinton。

統計語言模型與序列學習

1.1 基於頻數統計的語言模型

NLP領域最著名的語言模型莫過於N-Gram。

它基於馬爾可夫假設,當然,這是一個2-Gram(Bi-Gram)模型:

任意一個詞$W_{i}$出現的概率只同它前面的詞$W_{i-1}$有關。

遷移到N-Gram中,就變成:

在一個句子當中,一個單詞的T出現的概率,和其前N個單詞是有關的:

$P(W_{t}|W_{t-N}....,W_{t-1},W_{t+1}....,W_{t+N})$

早期計算Bi-Gram的方法,正如吳軍博士所著的《數學之美》里科普的那樣,采用詞頻統計法:

$P(W_{i}|W_{i-1})=\frac{P(W_{i-1},W_{i})}{P(W_{i-1})}\approx \frac{Cnt(W_{i-1},W_{i})}{Cnt(W_{i-1})}$

只需要統計一下$W_{i}$、$W_{i-1}$一起出現的頻數就可以了。

看起來確實很簡單,很數學之美。當然,作為一本科普讀物,它是不會告訴你這種方法是有多大危害的。

具體實現,可以使用以下兩個算法:

①KMP:將$W_{i}$、$W_{i-1}$兩個詞拼在一起,跑一次Text串。

②AC自動機:同樣拼接,不過是預先拼好所有的模式串,輸入AC自動機里,僅僅跑一次Text串。

但如果你是一名ACM選手,應該對AC自動機深有體會,這玩意簡直就是內存殺手。

兩者相害,取其輕。很明顯,實際運用的時候,根本不會考慮KMP,優先選擇空間換時間的AC自動機算法。

在[CS224D Lecture7]中,Socher提到了N-Gram頻數統計法的state-of-art結果,[Heafield 2013]

看看Abstract就夠嚇人了:

Using one machine with 140 GB RAM for 2.8 days, we built an unpruned model on 126 billion tokens.

還是建立在 MapReduce 上這種吃硬件的方法,不得不說,真是夠糟糕的。

1.2 基於神經網絡的語言模型

Neural Network Language Model (NNLM),最早正式在[Bengio03]提出。

Bengio使用的是一個經典的前饋網絡來訓練N-Gram不同之處在於,輸入層是可訓練的。

輸入層最后被訓練成Word Vector,在[Mikolov13]提出Word2Vec之前,大多稱為Word Embeddings。

具體的方法:

①為每個詞,構建$|N*Dim|$的向量參數。這點與Word2Vec的簡化方法有所不同。

Word2Vec取消訓練了詞序信息,所以向量大小是$|Dim|$。

②拿到一個句子,句子長度是T,利用詞的索引,組合出$|T,N*Dim|$的輸入矩陣。

③如普通NN一樣,Softmax誤差,BP傳播,更新。

NNLM方法,輕量的復現的N-Gram模型,需要更少的內存。且無須做平滑處理,如[Katz backoff]。

1.3 序列學習

正如朴素貝葉斯假設一樣,馬爾可夫假設也是一種糟糕的近似。

對於一個詞$W_{i}$,只覆蓋前N個詞,很多時候是抓不住重點的。

最好的解決方案,當然是對於一個詞$W_{i}$,覆蓋其前面的所有詞。

模仿動態規划原理,構建成一個動態序列模型。這需要Recurrent Neural Network(RNN)來實現。

RNN通常譯為循環神經網絡,其類似動態規划的原理,也可譯為時序遞歸神經網絡。

當然還有結構遞歸神經網絡RNN(Recursive Neural Network),使用頻率不高,沒落。

通常RNN指的是時序遞歸RNN。

 

RNN結構與更新

2.1 經典之作:Elman's Simple Recurrent Networks(SRN)

J. L. Elman提出的SRN是RNN系中結構最簡單的一個變種,相較於傳統的2層FC前饋網絡,它僅僅在FC層添加了時序反饋連接。

左圖是不完整的結構圖,因為循環層的環太難畫,包含自環、交叉環。

所以RNN一般都畫成時序展開圖,如右圖。

從時序展開圖中,容易看出,SRN在時序t時,前面的全部狀態,壓縮在一起,輸入到當前隱層中。

因而,RNN可以看成是具有動態深度結構的圖模型,隨着時序的增加,網絡深度越來越大,因而屬於深度神經網絡。

2.2 前向傳播

較於2層前饋網絡,唯一變化是,時序為$t$時,隱層輸入由兩部分組成:

①輸入層映射變換。(非遞歸)

②時序為$t-1$時,隱層神經元的激活輸出。(時序遞歸)

以下用$a_{j}^{t}$表示神經元j的輸入,$b_{j}^{t}$表示神經元j的激活后輸出,為表示清晰,忽略Bias。

輸入到達隱層時,有:

$a_{h}^{t}=\sum_{i=1}^{I}w_{ih}x_{i}^{t}+\sum_{h^{'}=1}^{H}w_{h^{'}h}b_{h^{'}}^{t-1}$

多出的$h^{'}->h$變換,大可稱為隱隱層變換,為前饋網絡帶來記憶槽。

它記憶着時序$[1,t-1]$到達輸出層之前的神經元的全部狀態。

激活隱層神經元后,有:

$b_{h}^{t}=Activation(a_{h}^{t})$

經過輸出層后,有:

$y_{k}^{t}=Softmax(W_{hk}b_{h}^{t})$

2.3 反向傳播

仿照BP網絡一樣,定義局部梯度:

$\delta _{y}^{t}=\frac{\partial \mathcal{L}}{\partial b_{y}^{t}} \cdot \frac{\partial b_{y}^{t}}{\partial a_{y}^{t}}$

也就是說,從似然函數開始,由鏈式尾,導到$\partial W$的前一步。

對輸出層,有:

$\frac{\partial \mathcal{L}}{\partial W_{hk}}=\delta_{k}^{t}\cdot\frac{\partial a_{j}^{t}}{\partial W_{hk}}$

$\delta_{k}^{t}$即,Softmax里的 $(1\{y_{i}=j\}-P(y^{(i)}=j|x;\theta_{j})),j=1,2....k$

對隱隱層,有:

$\frac{\partial \mathcal{L}}{\partial W_{h^{'}h}}=\sum_{p=1}^{t}\frac{\partial \mathcal{L}}{\partial b_{k}^{t}}\cdot\frac{\partial b_{k}^{t}}{\partial a_{k}^{t}}\cdot\frac{\partial b_{h}^{t}}{\partial b_{h}^{p}}\cdot\frac{\partial b_{h}^{p}}{\partial W_{h^{'}h}} \qquad where \quad  \frac{\partial b_{h}^{t}}{\partial b_{h}^{p}}=\prod_{j=p+1}^{t}\frac{\partial b_{h}^{j}}{\partial b_{h}^{j-1}}$

上式來自[CS224d Lecture7],是RNN的Feet of Clay,需要牢記。

因為需要累乘,相當於求一個超深度神經網絡結構的梯度,會帶來嚴重的Gradient Vanish\Exploding。下文會詳細描述。

至於為什么可以寫成那樣,你可以用一個簡單的單神經元,無激活函數的網絡推一下:

$a_{3}=wx_{3}+w^{'}a_{2}=....=wx_{3}+w^{'}wx_{2}+(w^{'})^{2}wx_{1}\\\\\frac{\partial a_{3}}{w^{'}}=????\\\\Answer=\frac{\partial a_{3}}{\partial a_{3}}\cdot\frac{\partial a_{3}}{w^{'}}+\frac{\partial a_{3}}{\partial a_{3}}\cdot\frac{\partial a_{3}}{\partial a_{2}}\cdot\frac{\partial a_{2}}{w^{'}}+\frac{\partial a_{3}}{\partial a_{3}}\cdot\frac{\partial a_{3}}{\partial a_{2}}\cdot\frac{\partial a_{2}}{\partial a_{1}}\cdot\frac{\partial a_{1}}{w^{'}}$

同樣,去掉后面的部分,有局部梯度:

$\delta_{h^{'}}^{t}=\sum_{p=1}^{t}\frac{\partial \mathcal{L}}{\partial b_{k}^{t}}\cdot\frac{\partial b_{k}^{t}}{\partial a_{k}^{t}}\cdot\frac{\partial b_{h}^{t}}{\partial b_{h}^{p}} \qquad where \quad  \frac{\partial b_{h}^{t}}{\partial b_{h}^{p}}=\prod_{j=p+1}^{t}\frac{\partial b_{h}^{j}}{\partial b_{h}^{j-1}}$

這樣,對隱層,就有著名的BPTT更新法則,正如[Alex]書中所寫:

$\delta _{h}^{t}=Activation^{'}(a_{h}^{t})\begin{pmatrix}\sum_{k=1}^{K}\delta _{k}^{t}w_{hk}+\sum_{h^{'}=1}^{H}\delta _{h^{'}}^{t+1}w_{hh^{'}}\end{pmatrix}$

當然$\delta _{h^{'}}^{T+1}$會越界,等於0。

這里,最頭疼的是,為什么隱隱層的局部梯度是取決於時序t+1的?

這個需要跨越一步來看,$W^{t}$不僅會在當前時序t,作為隱層參數出現,還會在時序t+1,作為隱隱層的附加參數出現。

這樣,鏈式法則波及到了時序t,以及時序t+1,所以局部梯度由兩部分組成,這是BPTT更新法的精髓。

最后一部分:

$\frac{\partial \mathcal{L}}{\partial W_{ih}}=\frac{\partial \mathcal{L}}{\partial a_{h}^{t}}\cdot\frac{\partial a_{h}^{t}}{\partial W_{ih}}=\delta _{h}^{t}x_{i}^{t}$

RNN與語義分析

RNN的祖先是1982年提出的Hopfield網絡。

Hopfield網絡因為實現困難,外加沒有合適應用,被86年后的前饋網絡取代。

90年代恰逢神經網絡衰落期,前饋MLP在Optimization上被揪出種種弊端,又被SVM取代。

在Represention上,CV界老一輩還在用着hand-made特征,Speech&NLP也偏重Statistics的特征。

1990年提出的兩種變種RNN,Elman&Jordan SRN同樣因為沒有合適的實際應用,很快又被無視。

過了十幾年,遇上了DL熱潮,RNN被研究出具有挖掘語義信息的Distrubuted Represention能力。

終於被拿來做Speech和Language Model方面語義分析相關任務。

3.1 記憶特性

一個時長為T的Simple RNN,unfold(展開)后實質是一個深度為T的前饋網絡。

序列上所有的輸入信息、non-linearity變換的隱態信息從開始時刻,一直保留至當前時刻。

從生物神經學角度,就是長期記憶(Long-Term Memory)特性。

前饋網絡不是萬能的,盡管在CV上大放光彩,但確實不適合解決邏輯問題。

Prolog曾經大放光彩,很多人堅信概率解決不了邏輯智能問題,但被RNN打臉了,比如下面這個問題:

RNN就能夠通過長記憶,向前搜索出輸入中的關鍵信息。

3.2 Gradient Vanish

深度神經網絡的頭號問題就是Gradient Vanish,尤其是比MLP還要深多少倍的RNN。

★數學角度:[Bengio94]給出了Simple RNN出現Gradient Vanish的原因:

$\left |  \prod_{j=p+1}^{t}\frac{\partial b_{h}^{j}}{\partial b_{h}^{j-1}}\right |\leqslant (\beta_{W}\cdot\beta_{h})^{t-p} \quad where \quad \beta =UpperBound$

W、h兩個參數矩陣,先積后冪,導致上界突變速度飛快,要么$\rightarrow 0$,要么$\rightarrow \infty$

如若引入大量的飽和Non-Linearity,如Sigmoid(Logistic|Tanh),那么最普遍的情況就是$Gradient \rightarrow 0$

★生物學角度:

術語稱之為Long-Term Memory退化到Short-Term Memory,只能記憶短期記憶。

3.3 RNNLM

盡管Simple RNN有諸多缺陷,但Short-Term Memory畢竟聊勝於無。

[Mikolov10]最先提出用RNN來做LM,不過並沒有用Word Embedings。

RNNLM從sentence-level切入,把一個sentence看成是一個sequence,逐個跑word推動時序。

3.4 RNN For Speech Understanding

[Mesnil13]則又將RNN同最近比較火的Word Embedings結合起來。

這篇paper是Bengio組Mesnil和在微軟實習的時候和Redmond研究院語音領域兩位大牛Xiaodong He、Li Deng合作的。

目測是在MS傳播導師的Theano。(OS:看你們還在公式推Gradient,啊哈哈哈)

3.4.1 Word embeddings

回過頭來再看[Mikolov13]的Word2Vec,13年開始真是全民玩起了詞向量。

[Mesnil13]總結了詞向量的幾點好處:

★以較小的維度向量,提純出Word的N維的歐幾里得空間信息,俗稱降維。

★可以先在Wiki之類的大型Corpus上Pre-Training出部分語義語法信息,

然后根據實際任務Fine-Tuning,符合深度學習原則。

★大幅度提升Generalization。

3.4.2 Context Window

另一個流行起來的Trick就是Context Window,Word2Vec的核心之一。

不同的是,Word2Vec丟棄了窗口詞的空間排列信息,而正常方法則選擇將窗口詞合並。

[Bengio03]中的詞向量,是在詞典里直接取整個Dim長度的向量,設Dim=350。

而做了Context Window之后,單個詞的Dim變小,通常為(50|100),窗口大小通常為(3~19):

[Mesnil13]給出Context Window的唯一作用:

強化短期記憶(Short-Term)

看起來不是很有說服力,從Word2Vec來看,起碼還有這些作用:

★強化上下文信息捕捉能力

★強化語義、語法信息捕捉能力

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM