1. 程式人生 > >吳恩達序列模型學習筆記--迴圈神經網路(RNN)

吳恩達序列模型學習筆記--迴圈神經網路(RNN)

1. 序列模型的應用

序列模型能解決哪些激動人心的問題呢?

語音識別:將輸入的語音訊號直接輸出相應的語音文字資訊。無論是語音訊號還是文字資訊均是序列資料。

音樂生成:生成音樂樂譜。只有輸出的音樂樂譜是序列資料,輸入可以是空或者一個整數。

情感分類:將輸入的評論句子轉換為相應的等級或評分。輸入是一個序列,輸出則是一個單獨的類別。

DNA序列分析:找到輸入的DNA序列的蛋白質表達的子序列。

機器翻譯:兩種不同語言之間的想換轉換。輸入和輸出均為序列資料。

視訊行為識別:識別輸入的視訊幀序列中的人物行為。

命名實體識別:從輸入的句子中識別實體的名字。

x和y可以只有一個是序列,也可以都是序列。 

2. 數學符號

輸入x:如“Harry Potter and Herminone Granger invented a new spell.”(以序列作為一個輸入),表示輸入x中的第t個符號。

輸出y:如“1 1 0 1 1 0 0 0 0”(人名定位),同樣,表示輸出y中的第t個符號。

用來表示輸入x的長度;

用來表示輸出y的長度 ;

表示第i個輸入樣本的第t個符號,其餘同理。

利用單詞字典編碼來表示每一個輸入的符號:如one-hot編碼等,實現輸入x和輸出y之間的對映關係。

3. 迴圈神經網路模型

傳統標準的神經網路

對於學習X和Y的對映,我們可以很直接的想到一種方法就是使用

傳統的標準神經網路。也許我們可以將輸入的序列X以某種方式進行字典編碼以後,如one-hot編碼,輸入到一個多層的深度神經網路中,最後得到對應的輸出Y。如下圖所示:

但是,結果表明這種方法並不好,主要是存在下面兩個問題:

  1. 輸入和輸出資料在不同的例子中可以有不同的長度;

  1. 這種樸素的神經網路結果並不能共享從文字不同位置(如在序列1或者其他序列位置)所學習到的特徵。(如卷積神經網路中學到的特徵的快速地推廣到圖片其他位置)

*迴圈神經網路:

    迴圈神經網路作為一種新型的網路結構,在處理序列資料問題上則不存在上面的兩個缺點。在每一個時間步中,迴圈神經網路會傳遞一個啟用值到下一個時間步中,用於下一時間步的計算。如下圖所示:

    這裡需要注意在零時刻,我們需要編造一個啟用值,通常輸入一個零向量,有的研究人員會使用隨機的方法對該初始啟用向量進行初始化。同時,上圖中右邊的迴圈神經網路的繪製結構與左邊是等價的。

   迴圈神經網路是從左到右掃描資料的,同時共享每個時間步的引數。  如在上面的迴圈神經網路中,預測y<3>時,用的不僅是x<3>,還要使用x<1>和x<2>的資訊     

    管理從輸入x<t>到隱藏層的連線,每個時間步都使用相同的Wax,同下;Waa管理啟用值a<t>到隱藏層的連線;Wya管理隱藏層到啟用值y<t>的連線。

    上述迴圈神經網路結構的缺點:每個預測輸出y<t>僅使用了前面的輸入資訊,而沒有使用後面的資訊。Bidirectional RNN(雙向迴圈神經網路)可以解決這種存在的缺點。

迴圈神經網路的前向傳播:

下圖是迴圈神經網路結構圖:

RNN模型包含三類權重係數,分別是 Wax ,Waa , Wya 且不同元素之間同一位置共享同一權重係數。

RNN的正向傳播(Forward Propagation)過程為: 

其中,g(⋅)表示啟用函式,不同的問題需要使用不同的啟用函式。

為了簡化表示式,可以對 項進行整合:

則正向傳播可表示為:

    值得一提的是,以上所述的RNN為單向RNN,即按照從左到右順序,單向進行,只與左邊的元素有關。但是,有時候也可能與右邊元素有關。例如下面兩個句子中,單憑前三個單詞,無法確定“Teddy”是否為人名,必須根據右邊單詞進行判斷。

He said, “Teddy Roosevelt was a great President.”

He said, “Teddy bears are on sale!”

因此,有另外一種RNN結構是雙向RNN,簡稱為BRNN。y^<t>與左右元素均有關係,我們之後再詳細介紹。

4. 通過時間的反向傳播

為了進行反向傳播計算,使用梯度下降等方法來更新RNN的引數,我們需要定義一個損失函式, 單個元素的損失函式如下:

該樣本所有元素的損失函式為(對每個時間步求和):

    反向傳播(Backpropagation)過程就是從右到左分別計對引數WaWybaby的偏導數。思路與做法與標準的神經網路是一樣的。一般可以通過成熟的深度學習框架自動求導,例如PyTorch、Tensorflow等。

________________________________________________________________________

5. 不同型別的RNN

對於RNN,不同的問題需要不同的輸入輸出結構。

many-to-many:

    這種情況下的輸入和輸出的長度相同,是上面例子的結構,如下圖所示:        

    我們上面介紹的一種RNN的結構是輸入和輸出序列的長度是相同的,但是像機器翻譯這種類似的應用來說,輸入和輸出都是序列,但長度卻不相同,這是另外一種多對多的結構:

many-to-one:

如在情感分類問題中,我們要對某個序列進行正負判別或者打星操作。在這種情況下,就是輸入是一個序列,但輸出只有一個值:

one-to-many:

如在音樂生成的例子中,輸入一個音樂的型別或者空值,直接生成一段音樂序列或者音符序列。在這種情況下,就是輸入是一個值,但輸出是一個序列:

6. 語言模型和序列生成

在NLP中,構建語言模型是最基礎也是最重要的工作之一,我們可以通過RNN來很好的實現。

什麼是語言模型?

    對於下面的例子,兩句話有相似的發音,但是想表達的意義和正確性卻不相同,如何讓我們的構建的語音識別系統能夠輸出正確地給出想要的輸出。也就是對於語言模型來說,從輸入的句子中,評估各個句子中各個單詞出現的可能性,進而給出整個句子出現的可能性。

使用RNN構建語言模型:(通過幾個詞預測後面的詞)

訓練集:一個很大的語言文字語料庫;

    Tokenize:將句子使用字典庫標記化;其中,未出現在字典庫中的詞使用“UNK”來表示;

第一步:使用零向量對輸出進行預測,即預測第一個單詞是某個單詞的可能性;

第二步:通過前面的輸入,逐步預測後面一個單詞出現的概率;

訓練網路:使用softmax損失函式計算損失,對網路進行引數更新,提升語言模型的準確率。

7. 新序列取樣

    在完成一個序列模型的訓練之後,如果我們想要了解這個模型學到了什麼,其中一種非正式的方法就是進行一次新序列取樣(sample novel sequences)。

    對於一個序列模型,其模擬了任意特定單詞序列的概率,如P(y<1>,,y<Ty>)而我們要做的就是對這個概率分佈進行取樣,來生成一個新的單詞序列。    如下面的一個已經訓練好的RNN結構,我們為了進行取樣需要做的:x<1>=0a<0>=0,在這第一個時間步,我們得到所有可能的輸出經過softmax層後可能的概率,根據這個softmax的分佈,進行隨機取樣,獲取第一個隨機取樣單詞y^<1>然後繼續下一個時間步,我們以剛剛取樣得到的y^<1>作為下一個時間步的輸入,進而softmax層會預測下一個輸出y^<2>,依次類推;如果字典中有結束的標誌如:“EOS”,那麼輸出是該符號時則表示結束;若沒有這種標誌,則我們可以自行設定結束的時間步。

上面的模型是基於詞彙的語言模型,我們還可以構建基於字元的語言模型,其中每個單詞和符號則表示一個相應的輸入或者輸出:

     但是基於字元的語言模型,一個主要的缺點就是我們最後會得到太多太長的輸出序列,其對於捕捉句子前後依賴關係,也就是句子前部分如何影響後面部分,不如基於詞彙的語言模型那樣效果好;同時基於字元的語言模型訓練代價比較高。所以目前的趨勢和常見的均是基於詞彙的語言模型。但隨著計算機運算能力的增強,在一些特定的情況下,也會開始使用基於字元的語言模型。

8. RNN的梯度消失

RNN在NLP中具有很大的應用價值,但是其存在一個很大的缺陷,那就是梯度消失的問題。例如下面的例句中:

               The cat, which already ate ………..,was full;

               The cats, which already ate ………..,were full.

    在這兩個句子中,cat對應著was,cats對應著were,(中間存在很多很長省略的單詞),句子中存在長期依賴(long-term dependencies),前面的單詞對後面的單詞有很重要的影響。但是我們目前所見到的基本的RNN模型,是不擅長捕獲這種長期依賴關係的。

    如下圖所示,和基本的深度神經網路結構類似,輸出y得到的梯度很難通過反向傳播再傳播回去,也就是很難對前面幾層的權重產生影響,所以RNN也有同樣的問題,也就是很難讓網路記住前面的單詞是單數或者複數,進而對後面的輸出產生影響。 (即因為梯度消失的問題,反向傳播很困難,後面的層很難影響前面的層

    對於梯度消失問題,在RNN的結構中是我們首要關心的問題,也更難解決;雖然梯度爆炸(網路越深梯度不僅會指數下降也可能會指數上升的問題)在RNN中也會出現,但對於梯度爆炸問題,因為引數會指數級的梯度,會讓我們的網路引數變得很大,得到很多的Nan或者數值溢位。

    所以梯度爆炸是很容易發現的(反而梯度消失比較棘手),我們的解決方法就是用梯度修剪,也就是觀察梯度向量,如果其大於某個閾值,則對其進行縮放,保證它不會太大。

9. GRU單元

    門控迴圈單元(Gated Recurrent Unit, GRU)改變了RNN的隱藏層,使其能夠更好地捕捉深層次連線,並改善了梯度消失的問題。

RNN 單元:

    對於RNN的一個時間步的計算單元(RNN隱藏單元的視覺化呈現),在計算也就是下圖右邊的公式,能以左圖的形式視覺化呈現:

簡化的GRU 單元:

    我們以時間步從左到右進行計算的時候,在GRU單元中,存在一個新的變數稱為c,(代表cell),作為“記憶細胞”,其提供了長期的記憶能力。

GRU的視覺化實現如下圖右邊所示:

    門的作用是決定什麼時候去更新這個(當看到cats的時候更新,後面就不管了 )

門=0時,=

完整的GRU 單元:(視覺門和相關門)

完整的GRU單元還存在另外一個門,以決定每個時間步的候選值,公式如下:

10. LSTM**

    GRU能夠讓我們在序列中學習到更深的聯絡,長短期記憶(long short-term memory, LSTM)對捕捉序列中更深層次的聯絡要比GRU更加有效。LSTM中,使用了單獨的更新門Γu和遺忘門Γf,以及一個輸出門Γo,其主要的公式如下:

LSTM單元的視覺化圖如下所示:

    其中,在實際使用時,幾個門值不僅僅取決於和 還可能會取決於上一個記憶細胞的值,這也叫做偷窺孔連線。

11. 雙向RNN  (可以用於STML和GRU)

雙向RNN(bidirectional RNNs)模型能夠讓我們在序列的某處,不僅可以獲取之間的資訊,還可以獲取未來的資訊。

     對於下圖的單向RNN的例子中,無論我們的RNN單元是基本的RNN單元,還是GRU,或者LSTM單元,對於下面例子中第三個單詞”Teddy”很難判斷是否是人名,僅僅使用前面的兩個單詞是不夠的,需要後面的資訊來進行判斷,但是單向RNN就無法實現獲取未來的資訊。

    而雙向RNN則可以解決單向RNN存在的弊端。在BRNN中,不僅有從左向右的前向連線層,還存在一個從右向左的反向連線層。

其中,預測輸出的值:

預測結果即有前向的資訊,又有反向的資訊。在NLP問題中,常用的就是使用雙向RNN的LSTM。

     雙向RNN的缺點是你需要完整的資料的序列。比如識別語音,你要說完一段語音才能識別,這就是缺點。

12. 深層RNNs

與深層的基本神經網路結構相似,深層RNNs模型具有多層的迴圈結構,但不同的是,在傳統的神經網路中,我們可能會擁有很多層,幾十層上百層,但是對與RNN來說,三層的網路結構就已經很多了,因為RNN存在時間的維度,所以其結構已經足夠的龐大。如下圖所示: