---
# System prepended metadata

title: RNN、LSTM
tags: [李宏毅]

---

RNN、LSTM
===

###### tags: `李宏毅`

## 教材
* [pdf](https://drive.google.com/file/d/1QRJ_zbyRZpCdRujUiVvWejaGXrlofPfp/view?usp=sharing)
* [youtube part1](https://www.youtube.com/watch?v=xCGidAeyS4M&ab_channel=Hung-yiLee)
* [youtube part2](https://www.youtube.com/watch?v=rTqmWlnwz_0&ab_channel=Hung-yiLee)


## RNN
Hidden Layer 的輸出會被存到 Memory，如下圖藍色，Neuron 除了考慮輸入之外，還會考慮存在 Memory 中的值。除了 Memory，輸入的順序也會很大的影響輸出的結果。

![](https://i.imgur.com/nWx74KZ.png)


舉例來說，要把字串 `arrive Taipei on November 2nd` 訓練模型可以找到地點與時間。一開始 `arrive` 被輸入之後，Hidden Layer 的輸出備存到 $a^1$，下一個輸入 `Taipei` 就會考慮到 $a^1$。

![](https://i.imgur.com/rnFOaX5.png)


也可以是 Deep 的。
![](https://i.imgur.com/TW80pcu.png)


上圖把 Hidden Layer 的 Output 存在 Memory 的方式叫做 Elman Network，如果是存最後的 Outpu 在 Memory，則稱作 Jordan Network，用 Jordan Network 可以取得較好的結果，因為離 Target 比較近，所以比較能知道那個值代表什麼。
![](https://i.imgur.com/Mu0bfky.png)


## Bidirectional RNN
把兩個方向的 RNN 的 Hidden Layer 的 Output 再一起接到 Output Layer，意義上是可以看前後文的結果產生輸出，所以可以比只看一邊還要準確。
![](https://i.imgur.com/tqlGjh0.png)


## Long Short-term Memory(LSTM)
LSTM 有個特別的 Neuron，可以控制 Input Gate、Forget Gate、Output Gate，分別決定要不要讓輸入進來這個 Neuron；要不要洗掉 Memory；要不要有 Output。而這些 Gate 是否打開也是學習來的。
![](https://i.imgur.com/OYkE8X9.png)


這些 Gate 的值會先經過 Sigmoid 產生 0~1 之間的值。Input Gate 會跟輸入 z 相乘，取得 $g(z)f(z_i)$，中間的 Memory 和 Forget Gate 則會變成 $cf(z_f)$，所以 Memory 會變成 $c'=g(z)f(z_i)+cf(z_f)$，最後在 Output Layer 計算 $a=h(c')f(z_o)$。
![](https://i.imgur.com/XpFuWKY.png)


舉個例子計算 LSTM，下圖黃色方塊有三維，分別是給 Input Gate、Forget Gate、Output Gate。
![](https://i.imgur.com/nyxuxcO.png)



## Multiple-Layer LSTM
h 是前一個輸入的輸出；c 是 peephole，也就是存在 Memory Cell 中的值。
![](https://i.imgur.com/iHzAI9Z.png)


## RNN 訓練方式
### Learning Target
計算實際的值與輸出的 Cross Entropy 就是 Model 的 Loss Function。
![](https://i.imgur.com/Xw6muCw.png)


### Learning
Gradient Descent，Memory 的 Weight 也是用 Backpropagation 計算，只是因為要考慮時間，所以是用 Backpropagation through time(BPTT)。
![](https://i.imgur.com/wZWuyvU.png)


### RNN 的 Loss 變化
RNN 的 Loss 曲線可能會跳很多，所以會使用 Clipping 的方式，也就是設一個 Threshold，每次的調整不能大於 Threshold。
![](https://i.imgur.com/De0SKqF.png)


一次跳很多是因為同一個 Memory 會根據 Weight 持續放大或縮小，所以不是因為 Activation Function，而是來自於它有 Time Sequence 會在不同時間點被反覆使用。
![](https://i.imgur.com/KggWp1Z.png)


解決方法其中一個是 LSTM，它可以解決 Gradient Vanishing 的問題，所以能把 Learning Rate 設小一點。
![](https://i.imgur.com/p9P062v.png)


除了 LSTM 外，也可以用 Clockwise RNN 或 Structurally Constrained Recurrent Network(SCRN) 解決。
![](https://i.imgur.com/a0fXSbU.png)


## RNN 應用
### Many to one
除了前面舉例的把每個詞歸類不同 Slot 外，也可以用 Sentiment Analysis，判斷語意是正面或負面的。
![](https://i.imgur.com/nkqZEL7.png)


### Many to Many
做語音辨識，因為很可能多個 Vector 才會對應到一個字，然後用 Trimming 把重複的拿掉。
![](https://i.imgur.com/H2sa67w.png)


不過如果現在說的是 `好棒棒`，Trimming 後就會變成 `好棒`，所以可以用 Connectionist Temporal Classification(CTC)，也就是使用 null 插在字跟字之間。
![](https://i.imgur.com/6uiMNYj.png)


### Sequence-to-sequence Auto-encoder Speech
把聲音訊號直接拿去訓練，辨識詞，RNN 分別訓練 Encoder 和 Decoder，同時訓練來回的，讓它們越接近越好。
![](https://i.imgur.com/tEuY495.png)


### Attention-based Model


### RNN、LSTM + Structured Learning
Deep Learning 和 Structured Learning 各有優缺點。
![](https://i.imgur.com/jz21A70.png)


所以可以先做 Deep Learning 再接 Structured Learning。
![](https://i.imgur.com/SRX8TVJ.png)
