天天看點

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

序列模型(Recurrent Neural Networks)是Andrw Ng深度學習專項課程中的第五門課,也是最後一門課。這門課主要介紹循環神經網絡(RNN)的基本概念、模型和具體應用。該門課共有3周課時,是以我将分成3次筆記來總結,這是第一節筆記。

——前言

1 Why Sequence Models

序列模型能夠應用在許多領域,例如:

  • 語音識别
  • 音樂發生器
  • 情感分類
  • DNA序列分析
  • 機器翻譯
  • 視訊動作識别
  • 命名實體識别
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

這些序列模型基本都屬于監督式學習,輸入x和輸出y不一定都是序列模型。如果都是序列模型的話,模型長度不一定完全一緻。

2 Notation

下面以命名實體識别為例,介紹序列模型的命名規則。示例語句為:

Harry Potter and Hermione Granger invented a new spell.

該句話包含9個單詞,輸出y即為1 x 9向量,每位表征對應單詞是否為人名的一部分,1表示是,0表示否。很明顯,該句話中“Harry”, “Potter”, “Hermione”, “Granger”均是人名成分,是以,對應的輸出y可表示為:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

3 Recurrent Neural Network Model

對于序列模型,如果使用标準的神經網絡,其模型結構如下:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

使用标準的神經網絡模型存在兩個問題:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

4 Backpropagation through Time

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

然後,反向傳播(Backpropagation)過程就是從右到左分别計算L(y^,y)對參數Wa,Wy,ba,by的偏導數。思路與做法與标準的神經網絡是一樣的。一般可以通過成熟的深度學習架構自動求導,例如PyTorch、Tensorflow等。這種從右到左的求導過程被稱為Backpropagation through time。

5 Different Types of RNNs

以上介紹的例子中,Tx=Ty。但是在很多RNN模型中,Tx是不等于Ty的。例如第1節介紹的許多模型都是Tx≠Ty。根據Tx與Ty的關系,RNN模型包含以下幾個類型:

  • Many to many: Tx=TyTx=Ty
  • Many to many: Tx≠TyTx≠Ty
  • Many to one: Tx>1,Ty=1Tx>1,Ty=1
  • One to many: Tx=1,Ty>1Tx=1,Ty>1
  • One to one: Tx=1,Ty=1Tx=1,Ty=1

不同類型相應的示例結構如下:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

6 Language Model and Sequence Generation

語言模型是自然語言處理(NLP)中最基本和最重要的任務之一。使用RNN能夠很好地建立需要的不同語言風格的語言模型。

什麼是語言模型呢?舉個例子,在語音識别中,某句語音有兩種翻譯:

  • The apple and pair salad.
  • The apple and pear salad.

很明顯,第二句話更有可能是正确的翻譯。語言模型實際上會計算出這兩句話各自的出現機率。比如第一句話機率為10^−13,第二句話機率為10^−10。也就是說,利用語言模型得到各自語句的機率,選擇機率最大的語句作為正确的翻譯。機率計算的表達式為:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

如何使用RNN建構語言模型?首先,我們需要一個足夠大的訓練集,訓練集由大量的單詞語句語料庫(corpus)構成。然後,對corpus的每句話進行切分詞(tokenize)。做法就跟第2節介紹的一樣,建立vocabulary,對每個單詞進行one-hot編碼。例如下面這句話:

The Egyptian Mau is a bread of cat.

One-hot編碼已經介紹過了,不再贅述。還需注意的是,每句話結束末尾,需要加上< EOS >作為語句結束符。另外,若語句中有詞彙表中沒有的單詞,用< UNK >表示。假設單詞“Mau”不在詞彙表中,則上面這句話可表示為:

The Egyptian < UNK > is a bread of cat. < EOS >

準備好訓練集并對語料庫進行切分詞等處理之後,接下來建構相應的RNN模型。

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

對語料庫的每條語句進行RNN模型訓練,最終得到的模型可以根據給出語句的前幾個單詞預測其餘部分,将語句補充完整。例如給出“Cats average 15”,RNN模型可能預測完整的語句是“Cats average 15 hours of sleep a day.”。

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

7 Sampling Novel Sequences

利用訓練好的RNN語言模型,可以進行新的序列采樣,進而随機産生新的語句。與上一節介紹的一樣,相應的RNN模型如下所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

值得一提的是,如果不希望新的語句中包含< UNK >标志符,可以在每次産生< UNK >時重新采樣,直到生成非< UNK >标志符為止。

以上介紹的是word level RNN,即每次生成單個word,語句由多個words構成。另外一種情況是character level RNN,即詞彙表由單個英文字母或字元組成,如下所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

Character level RNN與word level RNN不同的是,y^<t>由單個字元組成而不是word。訓練集中的每句話都當成是由許多字元組成的。character level RNN的優點是能有效避免遇到詞彙表中不存在的單詞< UNK >。但是,character level RNN的缺點也很突出。由于是字元表征,每句話的字元數量很大,這種大的跨度不利于尋找語句前部分和後部分之間的依賴性。另外,character level RNN的在訓練時的計算量也是龐大的。基于這些缺點,目前character level RNN的應用并不廣泛,但是在特定應用下仍然有發展的趨勢。

8 Vanisging Gradients with RNNs

語句中可能存在跨度很大的依賴關系,即某個word可能與它距離較遠的某個word具有強依賴關系。例如下面這兩條語句:

The cat, which already ate fish, was full.

The cats, which already ate fish, were full.

第一句話中,was受cat影響;第二句話中,were受cats影響。它們之間都跨越了很多單詞。而一般的RNN模型每個元素受其周圍附近的影響較大,難以建立跨度較大的依賴性。上面兩句話的這種依賴關系,由于跨度很大,普通的RNN網絡容易出現梯度消失,捕捉不到它們之間的依賴,造成文法錯誤。關于梯度消失的原理,我們在之前的

吳恩達《優化深度神經網絡》筆記(1)– 深度學習的實用層面

已經有過介紹,可參考。

另一方面,RNN也可能出現梯度爆炸的問題,即gradient過大。常用的解決辦法是設定一個門檻值,一旦梯度最大值達到這個門檻值,就對整個梯度向量進行尺度縮小。這種做法被稱為gradient clipping。

9 Gated Recurrent Unit(GRU)

RNN的隐藏層單元結構如下圖所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)
力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

10 Long Short Term Memory(LSTM)

LSTM是另一種更強大的解決梯度消失問題的方法。它對應的RNN隐藏層單元結構如下圖所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

LSTM包含三個gates:Γu,Γf,Γo,分别對應update gate,forget gate和output gate。

如果考慮c^<t−1>對Γu,Γf,Γo的影響,可加入peephole connection,對LSTM的表達式進行修改:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

GRU可以看成是簡化的LSTM,兩種方法都具有各自的優勢。

11 Bidirectional RNN

我們在第3節中簡單提過Bidirectional RNN,它的結構如下圖所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

BRNN對應的輸出表達式為:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

BRNN能夠同時對序列進行雙向處理,性能大大提高。但是計算量較大,且在處理實時語音時,需要等到完整的一句話結束時才能進行分析。

12 Deep RNNs

Deep RNNs由多層RNN組成,其結構如下圖所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

我們知道DNN層數可達100多,而Deep RNNs一般沒有那麼多層,3層RNNs已經較複雜了。

另外一種Deep RNNs結構是每個輸出層上還有一些垂直單元,如下圖所示:

力薦 | 吳恩達《序列模型》精煉筆記(1)-- 循環神經網絡(RNN)

繼續閱讀