Recurrent Neural Networks
Last updated
Was this helpful?
Last updated
Was this helpful?
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 數目並不會太多