Recurrent Neural Networks
Last updated
Last updated
Sequence data 指的是一連串的 data
例如訓練 input 一連串聲音 output 成文字 (speech recognition)
我們要利用例如 Recurrent Neural Network (RNN) 來建立出 sequence model
model 將幫助我們把 non-sequence/sequence data 轉換成 non-sequence/sequence data
假設有一個 name entity recognition 案例
要標示出所有的人名
句子中每個字依照順序會標註成
因為 y 跟 x 的字一模一樣,所以用 1 標示是要找的人名
另外 表示句子的字數,同樣方式表達 y 的字數
因為可能有多筆 training set,若要表示第 i 筆 data 的第 t 個 word
表達字數的方式也差不多
通常會用一整個列表記錄所有單字,一個列表可能會有 30 ~ 100000 個單字
上面的案例是一個 10000 個單字的 dictionary
and
的 index 在 367
Harry
在 4075
Potter
在 6830
接著用 one-hot 方式來呈現單字
例如 Harry 就會是一個全為 0 但 index=4075 為 1 的 10000 長度向量
該 model 的目標就是給定一堆 找出各別對應的
以 Harry 例子來說,Input 9 個單字要產生 9 個 output,每個 input/output 又都是 10000 長的 one-hot vector
第一個問題
每個 training set 的 input 跟 output 會不斷改變
第二個問題
Input features 之間並沒有 share 的關係
在 發現 Harry 是人名, 又是 Harry,那 1 能告訴 87 嗎?
第三個問題
參數太多,計算量太大
Recurrent Neural Network 沒有這些問題
我們會先讀第一個單字
將他丟入 neural network 產生
同時會產生 給下一個單字 使用
通常 是一個 0 vector
所以 可以共享資訊給 來產生
這個模型無法由 3 供應資訊給 1
之後會談到雙向的 RNNs (Bidirectional RNNs)
所有的 neural networks 會共享三大參數
命名的規則 (已 ax 為例) : 跟 x 作用並產生 a
以一般化 來解釋每個單字在網路中的 forward propogation
第一個 activation function 可選擇 tanh 或 ReLU
第二個 activation function 可選擇 sigmoid 或 softmax
為了講解之後較複雜的 RNNs,我們可以將 forward propogation 進一步簡化
將 Waa 和 Wax 合併為 Wa
若 Waa 是一個 100*100 矩陣
且 Wax 是一個 100*10000 矩陣
那麼 Wa 就是 100*10100 的寬矩陣
將 和 也合併起來
若 a 是一個 100*1 向量
且 x 是一個 10000*1 向量
那麼合併後就是一個長為 10100*1 的向量
新的 forward propogation 公式
RNNs 的 backpropogation 又稱作 backpropogation through time
因為由右至左推回來,像是時間逆流的感覺
要計算 backpropogation 之前,要先知道每個單字的 loss function
這邊使用 Cross-entropy loss 作為每個單字 (或說時間點) 的 loss function
也就是在 時的 loss 表示為
而整體的 loss function 可以定義為
如此一來,就可以回推並更新
剛剛的網路建立在 的狀況下
如果要達成各式不同的 input/output 勢必需要不同的網路形式
One-to-One
很無聊,就是個普通的神經網路
One-to-Many
用於 sequence generation
e.g. music generation
給定音樂種類,生產出一系列的音符
要注意的是該種類會把 當作下一層的 input
Many-to-One
用於 sentiment classification
e.g. 電影評價打分數
讀入一連串的評價,產出 1~5 的分數
Many-to-many with same length
e.g. name entity recognition
給定一串文字,標示出文字為名稱的部分
Many-to-many with different length
e.g. machine translation
給定一串英文,翻譯成長度不同的中文
首先先讀取 x 的部分,最後再處理 y 的部分
假設 speech recognition 時聽到了一句話
“The apple and pear salad.”
那到底是聽到上面的句子還是 “The apple and pair salad.” ?
為了判斷是哪一句話,所以給兩句話機率的方法就是 language modelling
可以看到在這個 language model 中
The apple and pear salad 的機率比較高
training set 會是 large corpus of english text
corpus 是一個 NLP 名詞,代表大量句子所組成的文本
首先要 tokenize corpus 中的所有單字,也就是建立字典
標點符號可以 tokenize 可以不要
tokenize 前有時會增加一個 <EOS>
代表句子結束
tokenize 會將每一個單字轉換為 one hot vector
假設有一個 10000 單字的字典,那就會在該單字的 index 設 1 其他設 0
今天遇到一個不在字典的單字,例如 Mau
那就會將他設定在 <UNK>
的位置,表示 unknown
Tokenize 後就可以將他們 input 到 RNN 訓練
首先 和 都設為 0
第一個 timestep 算出的 代表字典中所有單字是句子中第一個字的機率
有 10002 個字,包括 EOS
和 UNK
第二個 timestep 的 就是原本句子得到的
加上上一個 timestep 算出的
所以算出來的 代表出現 cats 後字典裡每一個單字是下一個字的機率
所以 average 應該要是最高才對
以此類推, 表示 cats average 出現後,字典中每個單字的出現機率
為了要訓練這個 RNN 我們定義 cost function
在 predict 第 t 個單字時的 softmax loss function 為
Overall 的 Cost function 為
總結一下,要預測一個句子 的機率
等於要計算
以及知道 下的 為何
再來是 下 為何
訓練好的 language model 可以用 sampling 方式來呈現他所學的結果
Sampling 方式就像 one-to-many model
給定
算出 之後,用 np.random.choice
方式從中選取任意一個 sample
這個 sample 作為 繼續算出 再選一個 sample
以此類推直到 sampling 到 EOS 或是自訂回合數就停止
以上的方法每個 都是一個單字,稱作 word level model
我們可以使用 character 作為每個 inputs
可以有大小寫字母、數字、符號
優點是不會有 <UNK>
缺點是資料量變大,計算變大、訓練成本過高
不過隨著硬體發展,有一些專案使用 character level model
Sampling example
下圖左是一個從 news 訓練出的 model 所產生的 sampling novel sequences
下圖右則是讀完沙士比亞文章所產生的 sequences
觀察以下兩句句子
人類可以記住非常前面的詞 (cat/cats) 來去判斷很後面的詞 (was/were)
但目前的 basic RNN models 很難去找出這種 Long-term Dependencies
原因跟 deep neural networks 已提過的 vanishing gradients 有著很大關係
回憶一下 vanishing gradients 是因為 backprop 的導數小於 1
造成越往回走梯度越小,最終使得梯度消失
RNN 中也有類似 vanishing gradient 的情況,在 RNN 中會出現 local influences
舉例來說 只會跟 有較大關係
假設 was 在 那他就無法跟最前面的 cat/cats 互相影響了
這造成 basic RNN model 有著無法處理 long-term dependencies 的弱點
補充 : RNN 也有可能出現 Exploding gradient 但情況較少
而且梯度爆炸比較好偵錯,只要參數有問題或是出現 numerial overflow (出現 NaN) 就會知道
並且可以用 gradient clipping 方法解決 (設定 threshold 避免梯度繼續增高)
為了處理 RNN 中的 vanishing gradient,要使用 GRU 及 LSTM 的技術
先回顧 basic RNN 的架構,在計算 時是這樣計算
可以將 basic RNN 畫成下圖表示
GRU 在 basic RNN 中加入一個 memory cell 的概念
回到原本的句子,目標是讓網路可以記憶 cat
並在之後知道要使用 was
定義每一個 會和 相等
然後定義 是可能取代掉 的候補
接著定義一個 Update Gate 用來決定是否要用 取代掉
Update Gate 最好要能 output 0/1 值,1 決定取代、0 放棄取代,所以使用 sigmoid function
最後用以下公式決定每個 time step 要不要更新
當 時,後面被消掉,所以
當 時,前面被消掉,所以
Example
回到 cat 的句子問題
在 cat 時把
此時的 就會被設定為 1 (假設 1 代表單數、0 代表多數)
接著句子持續下去,每一個的 都設定為 0,避免 cat 的資訊被刷掉
直到 was 的 time step 出現,我們就可以用 告訴他是 cat 要用 was
等到 was 結束,不會再用到這個資訊,在之後的某個地方就會設定 更新
因為使用 sigmoid 作為 的計算方式
使得 長期都會非常接近 0 或是 1
當 時, 就會被更新
當 時, 就會保持
由於 c 經過很長時間依然不變,且 c 就是 a,所以也解決了 vanishing gradients
在 GRU 的 network 中
先用 和 進行 tanh
得到
再用 和 進行 sigmoid
得到
然後透過紫色區塊 (就是決定是否更新) 來更新新的
最後跟一般一樣,產出
要注意的是, 可以是一個 vector
若是 是一個 100 dimensional 的向量
那麼 也會是 100 dimensional
而更新 的乘法就會是 element-wise 的乘法
以上的 GRU 是簡化過的 GRU
在完整的 GRU 中,會再添加一個 Relevance Gate
Relevance gate 用來表示 和 的關聯性
我們在原本的
加入 Relevance gate
而 Relevance gate 的算法也很簡單
Full GRU 的算式如下
補充 : GRU 最重要的兩篇論文 :
LSTM 跟 GRU 長的很像,但其實 LSTM 是較早出現的架構
LSTM 捨棄了 relevance gate,保留 update gate,並新增了 forget gate 和 output gate
所以 LSTM 共有三個 gates
LSTM 不再讓 ,並將兩者分開來計算
首先 不再使用 而是使用 來跟著 一起計算
然後依次算出
更新 時,不再是兩者取一,而是將 乘上 forget gate 後,加進 update 的
最終用 output gate 乘上 來更新
單個 LSTM 模型可以表示如下
接收上一層的
結合 算出三個 gate 和
計算出這一層的 給下一層使用
算出預測值
將多個 LSTM 相連在一起就是 LSTM network
上面的 LSTM 的三個 gate 值只有使用 計算出來
但在實作上有一種方法將 也帶入計算 gate 值
這種方法稱為 Peephole connection
注意點是,若 gate 是個 100 dimensional 的 vector
那麼 c 的第 i 個值,只會影響到 gate vector 中的第 i 個值
也就是 c 和 gate 的關係是 1 對 1 的
跟 GRU 在更新 gate 是不一樣的
前面也說過,單方向的 RNN 會無法處理一些問題
例如單字必須透過後方單字才能辨別是否是人名
上面兩個句子,只讀前三個字,可能會判斷兩個 Teddy 都是人名
但事實上只有第二句的 Teddy 指的是人名
為了解決此問題,出現了能夠雙向處理的 RNN - Bidirectional RNN (BRNN)
為了簡化問題,假設現在只讀了前四個字 He said Teddy Roosevelt
首先一如往常將句子由左至右產出 (以 表示)
接著再將句子由右至左產出 (以 表示)
要注意的是,兩個都是 forward propogation,並非 backpropogation !
所以現在要計算句子中任意一個 都可以配合左右兩邊的資訊來計算
例如要計算 的 Teddy 為人名的機率
他考慮的 考慮了 a1, a2 的 He said
他考慮的 考慮了 a4 的 Roosevelt
BRNN 的缺點是需要完整的句子序列,才可以訓練並預測句子中的任意單字
若用在 speech recognition,不可能等所有話講完,再慢慢處理所有文字
所以在 speech recognition 的實際應用上,不會使用 standard BRNN
但是在能夠一次取得完整句子的 NLP 應用中, standard BRNN 是很有效率的
到目前為止見到的只是 one hidden layer 的 RNN model
事實上 RNN 也可以有多個 hidden layer,只是不會像 CNN 那麼多
上圖有幾個 notation 需要解釋
用來代表第 l 層
用來代表第 t 個 time step
所以 代表是第 2 個 hidden layer 在第 3 個 timestep 的狀況
另外在 parameters 也有不同
代表在第 l 層的
代表在第 l 層的
所以 的算法為
DRNN 中的每一個 blocks 可以是一般的、GRU、LSTM blocks
DRNN 在計算 前,也可以先接上一連串的 fully-connected networks
因為 RNN 的計算量已經相當龐大,所以 DRNN 的 hidden layers 數目並不會太多