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)