1. 程式人生 > >帶你深入AI(5)- 自然語言處理領域:RNN LSTM GRU

帶你深入AI(5)- 自然語言處理領域:RNN LSTM GRU

系列文章,請多關注
Tensorflow原始碼解析1 – 核心架構和原始碼結構
自然語言處理1 – 分詞
帶你深入AI(1) - 深度學習模型訓練痛點及解決方法
帶你深入AI(2)- 深度學習啟用函式,準確率,優化方法等總結
帶你深入AI(3)- 物體分類領域:AlexNet VGG Inception ResNet mobileNet
帶你深入AI(4)- 目標檢測領域:R-CNN,faster R-CNN,yolo,SSD, yoloV2
帶你深入AI(5)- 自然語言處理領域:RNN LSTM GRU
帶你深入AI(6)- 詳解bazel
帶你深入AI(7)- 深度學習重要Python庫

1 引言

深度學習演算法模型大致分為三類,物體分類,目標檢測和自然語言處理。前面兩章我們分析了物體分類演算法和目標檢測演算法,著重講解了演算法執行流程,優缺點,以及他們的優化技巧。本文分析最後一個大類,即自然語言處理領域。

與物體分類和目標檢測不同,自然語言處理中,前一個時刻和後一個時刻會對我們當前的輸出結果產生影響,也就是網路模型是與時序相關的。比如“我是法國人,我會說“這個句子中,我們要預測最後的詞語,需要結合前面的詞語來分析。針對這個問題,業界提出了迴圈神經網路RNN,以及它的變種LSTM,GRU等。

2 RNN

普通的CNN網路,沒有時序的概念。輸入層經過隱藏層後,達到輸出層,從而得到結果。而RNN中,輸入層和上一時刻的隱藏層,會一起進入到當前時刻的隱藏層,最後到達輸出層。如下圖所示

Xt時刻的輸入和前一時刻的隱藏層St-1,共同進入到當前時刻的隱藏層St中,經過運算得到輸出層Ot。當前時刻的隱藏層不僅僅和當前時刻的輸入有關,還和上一時刻,以及上上時刻的隱藏層有關。所以稱之為迴圈神經網路。為了減少計算量,借鑑卷積神經網路中的權值共享的理念,每個時刻的網路結構以及引數,如U V W都是相同的。這樣,理論上我們可以構建無限長的RNN網路。

2.1 RNN結構分類

根據網路結構,RNN的變種有雙向RNN和deep RNN

2.1.1 雙向RNN

單向RNN中,當前時刻的隱藏層只和之前時刻相關。但對於很多問題,當前時刻與之前和未來都有關係。因此提出了雙向RNN。當前時刻的隱藏層和之前時刻和之後時刻都相關。如下圖

2.1.2 deep RNN

為了抽取更為高階的特徵,我們可以將每一個隱藏層變為多層的結構,從而提高泛化性。這樣網路具有更強大的學習和表達能力。但複雜度也會大大提高。如下圖

2.2 RNN使用場景分類

根據輸入和輸出的資料對比,可以分為N對1, 1對N,N對N,N對M等結構。

N對1的網路如上圖,我們並不需要得到每個時刻網路的輸出,僅僅需要得到最後的輸出而已。比如預測”我是中國人,我會說“ 這句話中的最後一個詞語。

1對N如上圖所示,針對同一個輸入得到不同時刻的輸出。比如針對一幅圖,我們預測出它對應的一句話(看圖說話)。

N對M如上圖所示,這個場景比較複雜,比如機器翻譯。將一句中文翻譯為一句英文。這種場景稱為seq2seq,我們一般會建立一個encoder和一個decoder。先將N個輸入建模,得到encoder,然後decode出M個輸出。

2.3 RNN訓練難點

RNN有個最大的問題,就是對於距離當前時刻比較遠的隱藏層,容易出現梯度爆炸或者梯度彌散。這是由於在反向傳播求解梯度過程中,各個隱藏層的引數會累乘,當特徵值小於1時,不斷相乘導致特徵值向0衰減。特徵值大於1時,則向正無窮擴增。導致無法利用梯度來對距離比較遠的時刻進行調節,稱之為長距離依賴。

因為長距離依賴問題,我們無法訓練比較長的序列,導致RNN的應用領域大大受限。為了解決這個問題,LSTM網路應運而生。

3 LSTM

LSTM全稱為Long short Term Memory,它通過門控的方式,使得不斷相乘的梯度的積保持在接近1的數值,從而使得長序列仍然可以訓練。門控,也就是gates,是一個(0,1) 的數值,它控制資訊的流動量。如果為0表示資訊不通過,為1則表示資訊全部通過。gate也是由神經網路訓練得到的,通過它可以動態的控制當前時刻的輸入量以及上一時刻隱藏層的輸入量。

3.1 網路結構

LSTM的網路結構如下所示

網路結構中包含三部分,輸入層Xt, Xt-1, Xt+1, 輸出隱藏層ht ht-1 ht+1, 記憶單元Ct Ct-1 Ct+1。我們的目標是通過輸入層和記憶單元得到隱藏層。輸入層和隱藏層很容易理解,記憶單元是LSTM中提出的,它用以儲存當前時刻網路資訊,並作用到下一個時刻。

LSTM中包含三個門,遺忘門,輸入門和輸出門,對應到上圖中的三個sigmoid方框。回顧一下sigmoid函式,它輸出(0, 1)區間的數值,用於決定多少資訊可以通過。0表示全部不通過,1表示全部通過。LSTM的三個門的作用我們分別講解

3.1.1 遺忘門

最左邊的是遺忘門,它用於決定有多少上一時刻的記憶單元資訊Ct-1可以作用到當前時刻。也就是說有多少上一時刻的資訊需要遺忘,或者叫捨棄。它的結構圖如下

遺忘門的輸出ft會作用到前一時刻記憶單元Ct-1上,從而決定有多少上一時刻資訊需要遺忘掉。ft與當前輸入層Xt和前一時刻隱藏層ht-1相關,計算公式如上所示。

3.1.2 輸入門

中間一個是輸入門,它用於決定當前多少輸入資訊可以作用到最終的結果中。結構圖如下

通過輸入門控制後的輸入資訊it, 會作用到當前輸入和上一時刻隱藏層上(當前輸入和上一時刻隱藏層在RNN中都是輸入資訊),最終和經過遺忘門作用後的前一時刻記憶單元Ct-1,累加後得到當前時刻的記憶單元Ct。這個門主要是處理輸入資訊(當前輸入層和上一時刻隱藏層), 故稱之為輸入門。其計算公式如上圖。

3.1.3 輸出門

最後,我們需要決定當前記憶單元中有多少東西需要輸出到隱藏層中,輸出門結構如下圖所示

經過上圖中的輸出門後的資訊Ot, 會作用到當前記憶單元Ct上,從而控制有多少當前記憶單元資訊可以傳遞到隱藏層中。故稱之為輸出門。

上面可能會有個問題,為啥採用tanh作為啟用函式,而不是relu呢。因為relu在大於0時,輸出為y=x, 可能會導致非常大的輸出值。而tanh輸出範圍永遠在(-1, 1)之間。

4 GRU

GRU是LSTM的變種,它將LSTM中的遺忘門和輸入門合併成了一個更新門,也就是說你需要輸入多少新內容時,就需要遺忘掉一定量的上一時刻資訊。另外,為了簡化結構,它將記憶單元和隱藏層合併,直接用隱藏層來表示記憶單元。結構如下

其中包含兩個gate,為reset gate rt和update gate Zt。更新門的一路類似於LSTM中的遺忘門,表示多少上一時刻的隱藏層資訊(其實也是記憶單元)會作用到這個時刻中。更新門的另一路則類似於LSTM的輸入門,表示多少輸入資訊(當前時刻輸入Xt和上一時刻隱藏層ht-1)會作用到這個時刻中。

而重置門則作用在上一時刻隱藏層上,並和當前時刻輸入值一起,經過啟用函式後,作用到當前時刻輸出中。如果重置門為0,則之前隱藏層資訊會丟棄,這樣允許模型去掉一些和當前無關的資訊。

GRU相比LSTM結構更簡單,引數更少,因此應用也比較廣泛。

5 總結

RNN的網路模型不像CNN那樣種類繁多,現在使用得比較多的就是LSTM和它的變種GRU。它們都是為了解決RNN中的長距離梯度彌散問題的,也就是長程依賴問題。

系列文章,請多關注
Tensorflow原始碼解析1 – 核心架構和原始碼結構
自然語言處理1 – 分詞
帶你深入AI(1) - 深度學習模型訓練痛點及解決方法
帶你深入AI(2)- 深度學習啟用函式,準確率,優化方法等總結
帶你深入AI(3)- 物體分類領域:AlexNet VGG Inception ResNet mobileNet
帶你深入AI(4)- 目標檢測領域:R-CNN,faster R-CNN,yolo,SSD, yoloV2
帶你深入AI(5)- 自然語言處理領域:RNN LSTM GRU
帶你深入AI(6)- 詳解bazel
帶你深入AI(7)- 深度學習重要Python庫