自然語言處理之循環神經網絡(自然語言處理為什么要用到循環神經網絡)
文章目錄
1. RNN基礎
1.1 RNN的結構
1.2 循環神經網絡的提出背景
1.3 BPTT算法
2. 雙向RNN
3. 遞歸神經網絡
4. LSTM、GRU的結構
4.1 LSTM
4.2 LSTM李宏毅課程詳解
4.2.1 簡化版本的LSTM詳解
4.2.2 LSTM與MLP的關系
4.2.3 完整LSTM的結構
4.3 LSTM、GRU優缺點
4.4 GRU( Gated Recurrent Unit,LSTM變體)
5. 針對梯度消失(LSTM等其他門控RNN)
5.1 梯度爆炸(梯度截斷)的解決方案
6. Text-RNN的原理
7. 其他學習鏈接
1. RNN基礎
循環神經網絡RNN,是一類用于處理序列數據的神經網絡。就像卷積網絡是專門用于處理網格化數據的神經網絡,循環神經網絡是專門用于處理序列 x ( 1 ) , … , x T x^{(1)},\dots,x^{T} x(1),…,xT的神經網絡。正如卷積網絡可以很容易地擴展到具有很大寬度的高度的圖像,以及處理大小可變的圖像,循環網絡可以擴展到更長的序列,大多數循環網絡也能處理可變長的序列。
1.1 RNN的結構
其中每個圓圈可以看作是一個單元,而且每個單元做的事情也是一樣的,因此可以折疊呈左半圖的樣子。用一句話解釋RNN,就是一個單元結構重復使用。
x t x_t xt 是時間t處的輸入 ;
s t s_t st 是時間t處的“記憶”, s t = f ( U ( X t ) + W ? s t ? 1 ) s_t=f(U(X_t)+W \cdot s_{t?1}) st =f(U(Xt )+W?st?1 ),f可以是tanh等 ;
o t o_t ot 是時間t出的輸出,比如是預測下個詞的話,可能是softmax輸出的屬于每個候選詞的概率
循環神經網絡在t時刻接收到輸入 x t x_t xt 之后,隱藏層的值是 s t s_t st ,輸出值是 o t o_t ot 。關鍵一點是,st的值不僅僅取決于 x t x_t xt ,還取決于 s t ? 1 s_{t?1} st?1 。我們可以用下面的公式來表示循環神經網絡的計算方法:
s t = f ( U ( x t ) + W ? s t ? 1 ) s_t=f(U(x_t)+W \cdot s_{t?1}) st =f(U(xt )+W?st?1 ) o t = g ( V s t ) o_t=g(Vs_t) ot =g(Vst )
式2是輸出層的計算公式,輸出層是一個全連接層,也就是它的每個節點都和隱藏層的每個節點相連。V是輸出層的權重矩陣,g是激活函數。式2是隱藏層的計算公式,它是循環層。U是輸入x的權重矩陣,W是上一次的值作為這一次的輸入的權重矩陣,f是激活函數。
循環神經網絡也是由輸入層、隱藏層、輸出層構成的。區別之處在于隱藏層的輸出會存儲到記憶單元中。記憶單元會和輸入層同時作為下個輸入。
為了更好理解網絡的內部結構,下圖為網絡結構圖(包括了),其中詞向量維度為4,隱藏層神經元為單層,隱藏層神經元個數為3,輸出維度為4。如果和MLP進行對比的話,考慮了單詞之間的順序,對于每一步來說,隱藏層多了當前時刻的輸入以及上一時刻的隱藏層。
個人淺顯理解:我們看看第一個隱層表示的是第一個詞內部關系,第二個隱層表示的是第二個詞和第一個詞之間的關系,第三個隱層輸出的是第三個詞和(第二個詞和第一個詞之間的關系)的關系,舉個例子,如:abc為一句話,第二個隱層能夠表示b和a的關系,第三個隱層的輸出能夠表示c和b,a之間的關系。那么黑色連接部分是表示關系轉換信息,也就是ab和abc之間應該存在著某些特定的模式,而轉換矩陣w就是要學習到這些關系;藍色的連接是當前詞對當前句子的影響程度;綠色連接和黑色連接的意義差不多。
通過圖我們也可以看出RNN的巧妙之處,對于任意長度的輸入,輸出是一致的;能夠表達序列之間的關系;參數共享易于訓練。但是也發現了一個問題,就是RNN對于長句子表達的不好,我們看到第一個詞和最后一個詞的關系是通過好多次轉換矩陣才產生的,這樣句子很長這種關系就很難表示出來,這也一度成為RNN的瓶頸,當然這些問題最后被LSTM(1997),GRU等RNN變種網絡給解決了。一個有趣的問題是,類似于LSTM這種直接連接近似解決梯度彌散的方法在CNN使用中直到ResNet(2015)提出才被廣泛使用,不過兩者相差了好多年,也充分說明了一個現象,只有想不到沒有做不到,哈哈。
接下來我們再看看模型的容量,如詞向量的維度是1024維,隱層有1000個單元,輸出也是1024維,那么整個網絡的參數個數為:U參數+V參數+W參數=10241000+10001024+10001000≈310^6,也就是300萬個參數,這個模型的容量對于千變萬化的語言來說估計有點小。
但在使用tensorflow.keras和Pytorch中,RNN或者LSTM本質上只包括上圖中的輸入層和隱藏層,而輸出層是需要自己添加,如全連接層。
為了更好的理解RNN,我們舉例來說,其中詞向量維度為1,隱藏層神經元個數為1,如下圖所示:
要得到 y 1 y_1 y1 和 y 2 y_2 y2 ,分為兩步,分別是:
更新hidden layer,其中hidden layer更新的時候,有四個輸入(given initial value1、given initial value2、 x 1 x_1 x1 、 x 2 x_2 x2 )。
更新output layer( y y y),有2個輸入,分別是兩個隱藏層的神經元。
其中最下方黃色的塊指的是輸入層(輸入分別為[1, 1], [1, 1], [2, 2])。中間綠色的塊指的是隱藏層(隱藏層的初始值為[0, 0]),橘紅色指的是輸出層。藍色指的是記憶單元(上一次隱藏層的結果)。此時輸入(最下層的黑色線)和記憶單元(藍色線)會共同輸入,從而計算出本次隱藏層的結果。然后兩個隱藏單元的結果匯總得到輸出 y 1 y_1 y1 和 y 2 y_2 y2 。
然后把[2, 2]放進記憶單元,如下圖所示:
新的輸入[1, 1],記憶單元為[2, 2],隱藏層單個結果即為1+1+2+2 = 6, y 1 y_1 y1 即為6+6=12,如下圖所示:
然后把[6, 6]放進記憶單元,如下圖所示:
新的輸入[2, 2],記憶單元為[6, 6],隱藏層單個結果即為2+2+6+6 = 16, y 1 y_1 y1 即為16+16=32,如下圖所示:
1.2 循環神經網絡的提出背景
RNN通過每層之間節點的連接結構來記憶之前的信息,并利用這些信息來影響后面節點的輸出。RNN可充分挖掘序列數據中的時序信息以及語義信息,這種在處理時序數據時比全連接神經網絡和CNN更具有深度表達能力,RNN已廣泛應用于語音識別、語言模型、機器翻譯、時序分析等各個領域。
1.3 BPTT算法
RNN的訓練方法——BPTT算法(back-propagation through time)
BPTT(back-propagation through time)算法是常用的訓練RNN的方法,其實本質還是BP算法,只不過RNN處理時間序列數據,所以要基于時間反向傳播,故叫隨時間反向傳播。BPTT的中心思想和BP算法相同,沿著需要優化的參數的負梯度方向不斷尋找更優的點直至收斂。綜上所述,BPTT算法本質還是BP算法,BP算法本質還是梯度下降法,那么求各個參數的梯度便成了此算法的核心。 這里尋優的參數有三個,分別是U、V、W。與BP算法不同的是,其中W和U兩個參數的尋優過程需要追溯之前的歷史數據,參數V相對簡單只需關注目前,那么我們就來先求解參數V的偏導數。
? L ( t ) ? V = ? L ( t ) ? o ( t ) ? ? o ( t ) ? V \frac{\partial L^{(t)}}{\partial V} =\frac{\partial L^{(t)}}{\partial o^{(t)}} \cdot \frac{\partial o^{(t)}}{\partial V} ?V?L(t) =?o(t)?L(t) ??V?o(t)
這個式子看起來簡單但是求解起來很容易出錯,因為其中嵌套著激活函數函數,是復合函數的求導過程。RNN的損失也是會隨著時間累加的,所以不能只求t時刻的偏導。W和U的偏導的求解由于需要涉及到歷史數據,其偏導求起來相對復雜,我們先假設只有三個時刻,那么在第三個時刻 L對W的偏導數為:
L = ∑ n = 1 n L ( t ) L = \sum \limits _{n=1}^n L^{(t)} L=n=1∑n L(t)
? L ? V = ∑ n = 1 n ? L ( t ) ? o ( t ) ? ? o ( t ) ? V \frac{\partial L}{\partial V} =\sum \limits _{n=1} ^{n} \frac{\partial L^{(t)}}{\partial o^{(t)}} \cdot \frac{\partial o^{(t)}}{\partial V} ?V?L =n=1∑n ?o(t)?L(t) ??V?o(t)
2. 雙向RNN
Bidirectional RNN(雙向RNN)假設當前t的輸出不僅僅和之前的序列有關,并且 還與之后的序列有關,例如:預測一個語句中缺失的詞語那么需要根據上下文進 行預測;Bidirectional RNN是一個相對簡單的RNNs,由兩個RNNs上下疊加在 一起組成。輸出由這兩個RNNs的隱藏層的狀態決定。雙向RNN相當于并聯結構,而多層RNN相當于串聯結構。
3. 遞歸神經網絡
在RNN中,信息只在一個方向上移動。當它作出決定時,會考慮當前的輸入以及它從之前收到的輸入中學到的內容。下面的兩張圖片說明了RNN和前饋神經網絡之間的信息流的差異。
通常RNN是具有短期記憶的,結合LSTM,他們也有長期記憶,這一點,我們將在下面進一步討論。
說明RNN記憶概念的另一個好方法是用一個例子來解釋它:假設你有一個正常的前饋神經網絡,并給它一個單詞“neuron(神經元)”作為輸入,并逐字處理這個單詞。當它到達字符“r”時,它已經忘記了“n”,“e”和“u”,這使得這種類型的神經網絡幾乎不可能預測接下來會出現什么字符。而經常性的神經網絡則能夠準確記住,因為它是內部記憶。它產生輸出,復制輸出并將其循環回網絡。遞歸神經網絡有兩個輸入,現在和最近的過去。這很重要,因為數據序列包含關于接下來會發生什么的重要信息,這就是為什么RNN可以做其他算法無法做的事情。與所有其他深度學習算法一樣,前饋神經網絡將權重矩陣分配給其輸入,然后生成輸出。請注意,RNN將權重應用于當前以及之前的輸入。此外,他們還通過梯度下降和反向傳播時間調整權重,我們將在下面的部分討論。還要注意,盡管前饋神經網絡將一個輸入映射到一個輸出,但RNN可以映射一對多,多對多(翻譯)和多對一(分類語音)。
4. LSTM、GRU的結構
4.1 LSTM
上面介紹的RNN模型,存在“長期依賴”的問題。模型在預測“大海的顏色是”下一個單詞時,很容易判斷為“藍色”,因為這里相關信息與待預測詞的位置相差不大,模型不需要記憶這個短句子之前更長的上下文信息。但當模型預測“十年前,北京的天空很藍,但隨著大量工廠的開設,廢氣排放監控不力,空氣污染開始變得越來越嚴重,漸漸地,這里的天空變成了”下一個單詞時,依靠“短期依賴”就不能很好的解決這類問題,因為僅僅根據“這里的天空變成了”這一小段,后一個單詞可以是“藍色”,也可以是“灰色”。上節描述的簡單RNN結構可能無法學習到這種“長期依賴”的信息,LSTM可以很好的解決這類問題。
與簡單RNN結構中單一tanh循環體不同的是,LSTM使用三個“門”結構來控制不同時刻的狀態和輸出。所謂的“門”結構就是使用了sigmoid激活函數的全連接神經網絡和一個按位做乘法的操作,sigmoid激活函數會輸出一個0~1之間的數值,這個數值描述的是當前有多少信息能通過“門”,0表示任何信息都無法通過,1表示全部信息都可以通過。其中,“遺忘門”和“輸入門”是LSTM單元結構的核心。下面我們來詳細分析下三種“門”結構。
遺忘門,用來讓RNN“忘記”之前沒有用的信息。比如“十年前,北京的天空是藍色的”,但當看到“空氣污染開始變得越來越嚴重”后,RNN應該忘記“北京的天空是藍色的”這個信息。遺忘門會根據當前時刻節點的輸入Xt、上一時刻節點的狀態C(t-1)和上一時刻節點的輸出h(t-1)來決定哪些信息將被遺忘。
輸入門,用來讓RNN決定當前輸入數據中哪些信息將被留下來。在RNN使用遺忘門“忘記”部分之前的信息后,還需要從當前的輸入補充最新的記憶。輸入門會根據當前時刻節點的輸入Xt、上一時刻節點的狀態C(t-1)和上一時刻節點的輸出h(t-1)來決定哪些信息將進入當前時刻節點的狀態Ct,比如看到“空氣污染開始變得越來越嚴重”后,模型需要記憶這個最新的信息。
輸出門,LSTM在得到最新節點狀態Ct后,結合上一時刻節點的輸出h(t-1)和當前時刻節點的輸入Xt來決定當前時刻節點的輸出。比如當前時刻節點狀態為被污染,那么“天空的顏色”后面的單詞應該是“灰色”。
在TensorFlow中可以使用lstm = rnn_cell.BasicLSTMCell(lstm_hidden_size)來聲明一個LSTM結構。
4.2 LSTM李宏毅課程詳解
4.2.1 簡化版本的LSTM詳解
LSTM:long short-term memory,這里指的是long來形容short-term(這一點要注意)。
LSTM是由三個門(輸入門、輸出門、遺忘門)、四大輸入信號、一個輸出信號構成的。其中每個門的輸出是一個概率值,介于0~1之間,表示的是對信號的選擇控制能力。
每個門的輸出是一個概率值,介于0~1之間,表示的是對相乘信號的選擇控制能力。
為了更好的理解,用舉例的方式來講解,其中x(輸入數據)是由三個維度( x 1 , x 2 , x 3 x_1, x_2, x_3 x1 ,x2 ,x3 )構成的,g和h均為sigmoid函數,為了簡單起見,將所有的權重初始化為如圖中的結果:
當輸入數據為第一組數據即[3, 1, 0]的時候,LSTM的值即為下圖,計算結果為下下圖:
其中memory cell是對原有的值進行累加。
memory cell new value = 遺忘門的輸出乘以memory cell old value + 輸入門的輸出乘以輸入。這里假設g和h均為sigmoid函數。
當輸入數據為第二組數據即[4, 1, 0]的時候,LSTM的值即為下圖,計算結果為下下圖:
當輸入數據為第三組數據即[2, 0, 0]的時候,LSTM的值即為下圖,計算結果為下下圖:
當輸入數據為最后一組數據即[3, -1, 0]的時候,LSTM的值即為下圖,計算結果為下下圖:
4.2.2 LSTM與MLP的關系
將LSTM和MLP進行對比,LSTM本質上只是把簡單的神經元替換成了LSTM單元。
原本是單個輸入,現在變成了4個輸入。
4.2.3 完整LSTM的結構
其中四個輸入 z f , z i , z , z o z^f, z^i, z, z^o zf,zi,z,zo都是由 x t x^t xt乘以一個矩陣得到的。
把多個LSTM單元當作是LSTM單元的向量來看。
把memory cell的值 c t c^t ct、memory cell經過函數變換后的值 h ( c t ) h(c^t) h(ct)、以及輸入 x t + 1 x^{t+1} xt+1。其中前兩個均為上個LSTM單元的輸出,所以輸入為下一個時刻的結果。把三者拉成一個向量作為輸入。
4.3 LSTM、GRU優缺點
LSTM是一種特殊的RNN類型,一般的RNN結構如下圖所示,是一種將以往學習的結果應用到當前學習的模型,但是這種一般的RNN存在著許多的弊端。舉個例子,如果我們要預測“the clouds are in the sky”的最后一個單詞,因為只在這一個句子的語境中進行預測,那么將很容易地預測出是這個單詞是sky。在這樣的場景中,相關的信息和預測的詞位置之間的間隔是非常小的,RNN 可以學會使用先前的信息。
標準的RNN結構中只有一個神經元,一個tanh層進行重復的學習,這樣會存在一些弊端。例如,在比較長的環境中,例如在“I grew up in France… I speak fluent French”中去預測最后的French,那么模型會推薦一種語言的名字,但是預測具體是哪一種語言時就需要用到很遠以前的Franch,這就說明在長環境中相關的信息和預測的詞之間的間隔可以是非常長的。在理論上,RNN 絕對可以處理這樣的長環境問題。人們可以仔細挑選參數來解決這類問題中的最初級形式,但在實踐中,RNN 并不能夠成功學習到這些知識。然而,LSTM模型就可以解決這一問題。
如圖所示,標準LSTM模型是一種特殊的RNN類型,在每一個重復的模塊中有四個特殊的結構,以一種特殊的方式進行交互。在圖中,每一條黑線傳輸著一整個向量,粉色的圈代表一種pointwise 操作(將定義域上的每一點的函數值分別進行運算),諸如向量的和,而黃色的矩陣就是學習到的神經網絡層。 LSTM模型的核心思想是“細胞狀態”。“細胞狀態”類似于傳送帶。直接在整個鏈上運行,只有一些少量的線性交互。信息在上面流傳保持不變會很容易。
LSTM 有通過精心設計的稱作為“門”的結構來去除或者增加信息到細胞狀態的能力。門是一種讓信息選擇式通過的方法。他們包含一個 sigmoid 神經網絡層和一個 pointwise 乘法操作。 Sigmoid 層輸出 0 到 1 之間的數值,描述每個部分有多少量可以通過。0 代表“不許任何量通過”,1 就指“允許任意量通過”。LSTM 擁有三個門,來保護和控制細胞狀態。
在LSTM模型中,第一步是決定我們從“細胞”中丟棄什么信息,這個操作由一個忘記門層來完成。該層讀取當前輸入x和前神經元信息h,由ft來決定丟棄的信息。輸出結果1表示“完全保留”,0 表示“完全舍棄”。
第二步是確定細胞狀態所存放的新信息,這一步由兩層組成。sigmoid層作為“輸入門層”,決定我們將要更新的值i;tanh層來創建一個新的候選值向量~Ct加入到狀態中。在語言模型的例子中,我們希望增加新的主語到細胞狀態中,來替代舊的需要忘記的主語。
第三步就是更新舊細胞的狀態,將Ct-1更新為Ct。我們把舊狀態與 ft相乘,丟棄掉我們確定需要丟棄的信息。接著加上 it * ~Ct。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。在語言模型的例子中,這就是我們實際根據前面確定的目標,丟棄舊代詞的信息并添加新的信息的地方。
最后一步就是確定輸出了,這個輸出將會基于我們的細胞狀態,但是也是一個過濾后的版本。首先,我們運行一個 sigmoid 層來確定細胞狀態的哪個部分將輸出出去。接著,我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)并將它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。在語言模型的例子中,因為語境中有一個代詞,可能需要輸出與之相關的信息。例如,輸出判斷是一個動詞,那么我們需要根據代詞是單數還是負數,進行動詞的詞形變化。
4.4 GRU( Gated Recurrent Unit,LSTM變體)
GRU作為LSTM的一種變體,將忘記門和輸入門合成了一個單一的更新門。同樣還混合了細胞狀態和隱藏狀態,加諸其他一些改動。最終的模型比標準的 LSTM 模型要簡單,也是非常流行的變體。
5. 針對梯度消失(LSTM等其他門控RNN)
5.1 梯度爆炸(梯度截斷)的解決方案
LSTM只能避免RNN的梯度消失(gradient vanishing),但是不能對抗梯度爆炸問題(Exploding Gradient)。梯度膨脹(gradient explosion)不是個嚴重的問題,一般靠裁剪后的優化算法即可解決,比如gradient clipping(如果梯度的范數大于某個給定值,將梯度同比收縮)。
梯度剪裁的方法一般有兩種:
一種是當梯度的某個維度絕對值大于某個上限的時候,就剪裁為上限。
另一種是梯度的L2范數大于上限后,讓梯度除以范數,避免過大。
6. Text-RNN的原理
TextCNN擅長捕獲更短的序列信息,但是TextRNN擅長捕獲更長的序列信息。具體到文本分類任務中,BiLSTM從某種意義上可以理解為可以捕獲變長且雙向的N-Gram信息。
7. 其他學習鏈接
https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks
神經網絡 自然語言處理基礎
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。