Sequence Models — week 1

Kevin Chiu
CodingJourney
Published in
4 min readAug 15, 2019

Week 1: Recurrent Neural Networks

下一篇:week 2

Sequence model, 例如Recurrent neural networks, 在語音辨識, NLP等領域有極大的影響力,在這堂課,我們將學會如何建構自己的sequence model。

在這週我們將講解Recurrent Neural Network

1. Why sequence models

2. Notations

介紹一些建立sequence model時會用到的符號

以姓名辨識為例:

接著介紹Dictionary,以及用one-hot representation來表示各個單字

3. Recurrent Neural Network Model

在介紹RNN之前,先理解:為什麼標準的Neural network的效果不大呢?

不外乎語音或是文字的輸入/出會不一樣,並且沒有共同相似的位置特徵

接著就進入正題:Recurrent Neural Network (循環神經網路)

為什麼需要RNN呢?因為許多的應用場景,是有序列概念(Sequences)的,如文字(下一個字的機率會取決與上一個字是什麼)、影片(可視為圖片之序列)、聲音等。因此,要訓練RNN,就需要有序列型的資料,以下圖來看,RNN的輸入為每個時序中各變數的值。

RNN可以將某層計算完成的輸出,再回傳給該層自己作為輸入。如下圖所示,藍色圓圈即為輸出,其同時也在下一個時間點(不是另一個隱藏層)成為自己的輸入之一。因此也有人說RNN具有記憶!

RNN動畫(From DL4J

Andrew提到一個RNN的問題是,在分析語句時,只能從前面的句子來共同得到結果,但卻不會從後面的句子一起分析,此會造成問題(如下圖要判斷Teddy是人名與否就沒辦法),會在之後介紹的bi-directional RNN來解決。

計算RNN的 Forward Propagation

簡化上圖的方程式 a(t), y(t)

再來計算RNN 的back propagation

首先,要實作forward propagation,綠色的參數W_a, b_a會被應用到每一個a_1, a_2, …, a_t ; 綠色參數W_y, b_y 則會被應用到每個y hat 輸出

要計算back propagation,則需要Lost function ; 得到相對的Lost function如下圖最上排格子,最後再反向將back propagation實作完成

4. Different types of RNNs

前面介紹的RNN模型輸入/輸出數量是一樣的,但其實很多應用都不同,例如影評(句子換成分數),聲音…,有各種形式的模型

從左到右:多對多(tx=ty),多對一,一對多,多對多(tx != ty)

5. Language model and sequence generation

建立一個語言模型是RNN在很重要的運用。

如何使用RNN構建語言模型?

  1. 首先需要一個夠大的訓練集,訓練集由大量的單詞庫(corpus)構成。
  2. 然後,對文本(corpus)的每句話做 tokenize(分詞)。做法如之前所說,建立詞彙集(vocabulary),對每個單詞進行one-hot編碼。
  3. 每句話結束末尾,需要加上 EOS (End of Sentence),作為語句結束符。若語句中有詞彙表中沒有的單詞,可用UNK 表示。

以語音辨識作為例子,語言模型在收到輸入時會判斷哪一個句子的正確機率較高,並以P(y_1, y_2, …,)作為輸出

講解以實例句子應用在RNN模型上

a_1會判斷y_1最有可能輸出的詞(Cats),,a_2則透過前面y_1來判斷y_2最有可能輸出的詞(average),之後便以此類推…

6. Sampling novel sequences

(1)文字等級(word level )RNN

Sampling novel sequences. 利用訓練好的RNN語言模型,可以進行新的序列採樣,從而隨機產生新的語句(一樣是透過前面的字句來產生新的語句)

(2) 字母等級(Character level) RNN

y是由單個字母(character)組成而不是word。訓練集中的每句話都當成是由許多字母組成的。 它的優點是能有效避免遇到詞彙表中不存在的單詞(UNK) ,缺點是運算量很大。

另外由於文句以字母表示時,會讓序列很大,這種大的跨度也增加尋找語句前後部分之關聯性尋找的困難。因此目前字母級別RNN多用於特定應用。

7. Vanishing gradients with RNNs

接下來我們要解決 RNN的梯度消失問題

以下圖為例,句子很前面出現的單詞可能會對後面的單詞造成影響,但基本RNN模型,仍不擅長捕捉這種long term dependency,所以造成RNN出現梯度消失/爆炸的問題。

先講梯度爆炸的問題,若發現參數可能會變成 NaN 或非數字的情況(梯度向量大於某個threshold)便是遇到梯度爆炸。

要怎麼解決呢?常用的方法稱為梯度修剪(gradient clipping)

梯度修剪: 設定一個 threshold (閾值),一旦梯度最大值達到這個閾值,就re-scale整個梯度向量。這種做法被稱為梯度修剪(gradient clipping)。

接著我們要討論解決Vanishing gradients的辦法:GRU

8. Gated Recurrent Unit (GRU)

GRU是一種修改RNN隱藏層的方式,使得他能捕捉模型中長距離的連結,對梯度消失很有幫助。

RNN的隱藏層單元結構如下圖左,為了解決梯度消失問題。對上述單元添加了記憶單元C,構建GRU,如下圖右。Γu為gate,記憶單元。

當Γu=1時,代表需要更新;Γu=0時,代表保留之前的輸出。因此,Γu能夠保證RNN模型中跨度很大的相依性不受影響,消除梯度消失問題。

上面介紹的是簡化的GRU模型,完整的GRU添加另外一個gate,即Γr,如下圖。

9. Long Short Term Memory (LSTM) 長短期記憶

LSTM包含三個gates:Γu,Γf,Γo

Γu:update gate

Γf:forget gate

Γo:output gate

gate(門閘)都是sigmoid函數。它對應的RNN隱藏層單元結構與式子如下圖。

考慮c<t−1>對Γu,Γf,Γo的影響,即一些論文所討論的peephole connection,對LSTM的表達式就變成:

比較GRU&LSTM 哪個比較好呢? 這並沒有定論

  • GRU 的優點就是它是個相對簡單的模型,所以更容易建構出較大的網路。一個單元只有兩個門閘,所以計算速度也較快。
  • LSTM 表現更為強大而有效(因為它有三個門閘)

在過去表現上,人們會預設優先嘗試 LSTM。但是在過去幾年當中 GRU 也持續受到更多支持,有越來越多團隊使用它。因為它的結構更簡單,而表現經常和 LSTM 不相上下。

10. Bidirectional RNN (BRNN)

前面(Teddy是人名與否的問題)有提到,單向的RNN(只看前面)會使模型沒辦法從後面的data(句子)找出特徵,因此提出雙向RNN來解決這個問題。

BRNN能夠同時對序列進行雙向處理,但缺點是需要entire sequence of data來做預測。以語音辨識來說,需要等全部句子講完才能開始預測。

值得一提的是,除了RNN以外,LSTM, GRU也常跟BRNN一起使用。

11. Deep RNNs

標準的RNN如下(分別為時間序列1, 2, 3,…):

下圖的上面箭頭經過一層就輸出y<t>

接著介紹Deep RNN。通常DNN層數可達100多,但是以Deep RNNs來說3層已經很複雜了。 常見的Deep RNNs結構如下圖,每個輸出層上還有一些垂直單元,如y<1>和y<2>,連接各自的深度神經網絡,但沒有水平的連接。

#Assignment 1: Building a recurrent neural network — step by step

#Assignment 2: Dinosaur Island — Character-Level Language Modeling

#Assignment 3: Jazz improvisation with LSTM

--

--