--- tags: course, Deep learning --- # MIT Intro to Deep Learning: Lecture 2 RNN [Course link](https://www.youtube.com/watch?v=SEnXr6v2ifU&list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI&index=2) [Lab Link](https://github.com/aamini/introtodeeplearning/) ## Deep sequence Modeling * 這節課的重點轉移到如何把NN應用在序列資料並探討為什麼我們需要這麼多不同架構的模型去處理 * 如何預測下一顆球的位置? * 若只有這張圖,就只能隨機猜   ![](https://i.imgur.com/cWkxSpG.jpg) * 但若再給之前其他點的位置呢? * Sequential data is all around us * audio * Text * ... ## Sequence Modeling Problem:Predict the Next Word * 給你一段文字,你要怎麼利用這段文字來預測下一段文字呢? * 如何用NN做到這件事情呢? * 首先NN的input只能是Fixed-size的 * 但問題是實際上你每次的input都不一樣大 * 因此我們的模型必須要可以處理 variable length input ![](https://i.imgur.com/PmgT5Rr.jpg) --- ### Ideas 1. **Using Fixed window** * using one-hot encoding to encode ![](https://i.imgur.com/sTtasjG.jpg) * 但是在這個例子中這表示我們只能看兩個字來預測 * 也就是說我們沒辦法處理Long-term dependency ![](https://i.imgur.com/K9BpLIf.jpg) --- 2. **Bag of words** * 利用全部的句子建立一個字典 * Key是那個字元本身 * Value是這個字元出現的次數 ![](https://i.imgur.com/Nw1kX8n.jpg) * 如此一來現在就有了一個fixed-length vector可以丟進模型之中 * 然而詞袋的關鍵問題在於他沒有順序性 * 所以下例中詞義完全相反的句子卻會有相同的representations ![](https://i.imgur.com/MAqE7AQ.jpg) --- 3. **Using really big fixed window** * 如果用一個超大的window來解決long-term dependency問題呢? ![](https://i.imgur.com/J2ecDRd.jpg) * 這樣會導致每一個詞都會有獨立的weight,完全沒有共享參數 ![](https://i.imgur.com/YfiCdjw.jpg) * 綜上所述,所以我們需要一個不僅能接收可變長度的輸入又能處理long-term dependency還可以共享參數、認識文字順序的模型來model sequence * 達到這些需求的model就是RNNs ![](https://i.imgur.com/hW9dIw6.jpg) ## Recurrent Neural Networks (RNNs) * RNN不同於前向網路,他可以接收一連串的輸入,而非單個輸入 * Many to One * ex: 一個可以接收一串文字並輸出文字情感分類的模型 (sentiment analysis) * Many to Many * ex: Music/Text generation ![](https://i.imgur.com/7t2tsOn.jpg) * 另一個優點是RNN可以保存上一個結果 (hidden state) * RNN叫做**Recurrent**的原因: **Information is being passed from one time step to the next internally within the network** ![](https://i.imgur.com/fX749N6.jpg) ![](https://i.imgur.com/lYNvUmS.jpg) * RNN用來**update hidden state**的function實際上就是一個標準的NN (前向NN) ![](https://i.imgur.com/hsXhwn7.jpg) --- * 另一種解釋RNN的方法是可以將其看為一個擁有多個相同NN的網路,而這些相同的NN他們之間一直將訊息往下(descendant)傳遞 * 透過每個time step的輸出可以算出各自的loss $L_0...L_3$,並且將其加總可以獲得整體的loss, $L$ * 就前向傳導的過程 ![](https://i.imgur.com/AWCCF1e.jpg) ![](https://i.imgur.com/z0Ihuqq.jpg) * 但這串實作其實可以直接call ```tf.keras.layers.SimpleRNN(rnn_units)```即可 ## Backpropagation Through Time (BPTT) * 了解完RNN之後,這段要說的是實際上要如何發展一個演算法去Train RNN * 這個演算法就叫BPTT * 先回顧了一下前面說的後傳導流程 ![](https://i.imgur.com/dcP0igk.jpg) * 相較於計算單一個前向網路的後傳導只需考慮一個time step * RNN需要計算每一個不同time step的後傳導,最後算出**跨越所有time step的後傳導** * the reason why this is called **BPTT --- 更詳細的看RNN如何算出gradient並在不同time step之間傳遞 * 在每個time step之間都需要進行$W$的矩陣運算和Activation function的運算 * 這表示在計算後傳導的時候要重複很多梯度運算(Computation of gradient) * This can be **problematic**... * 2 problematic case * **exploding gradients** * use gradient clipping to solve it * **vanishing gradients** * 3 way to solve ![](https://i.imgur.com/H2UTUnz.jpg) ![](https://i.imgur.com/20R5s6M.jpg) ## The problem of Long-term dependencies * Vanishing gradients會造成網路無法學習到Long-term dependencies * 以剛剛預測下個詞的語言模型來舉例的話或許問題不大 * 因為句子短,所以預測下個詞所需要的關鍵詞並沒有距離很遠,問題不大 ![](https://i.imgur.com/BEIqWNH.jpg) * 但在句子較長的情況下,標準的RNN模型就會失準了,因為無法往回尋找time step差距很遠的關鍵詞 ![](https://i.imgur.com/qufGe8r.jpg) --- ### 如何緩解梯度消失問題呢? (3 way) 1. Activation Functions * Sigmoid和Tanh會讓gradient<1 * 但ReLU會直接讓>0的gradient直接變成1,以此來避免梯度消失 ![](https://i.imgur.com/b1KSDhA.jpg) 2. Parameter initialization * 把weights初始化為單位矩陣有助於避免他們太快發生梯度消失 ![](https://i.imgur.com/HAdXLJn.jpg) 3. Gated cells * 最後、最強、最常見的解決方法是使用更複雜的RNN去更有效率的track 到long-term dependencies in the data * 有很多種,這周只會先專注於講解LSTM ![](https://i.imgur.com/iM4Cvlq.jpg) ## Long Short Term Memory(LSTM) Networks * 首先拿架構圖來比較了Vanilla RNN跟LSTM的差別 * 講師這邊在講RNN時一直口吃XD * RNN ![](https://i.imgur.com/japhlqj.jpg) * LSTM中仍然保有RNN的架構,基於這之上做改變,讓模型更複雜 * 講師說不希望同學糾結在這複雜的運算中 * LSTM的關鍵在於這些layers可以選擇性的決定cell之中的資訊流 ![](https://i.imgur.com/CfuC5Sy.jpg) * Key building block behind LSTM is Gate ![](https://i.imgur.com/8MH6YgQ.jpg) * Gate是一個允許LSTM挑選輸入進來的資訊要加入到cell state中還是丟棄的function * 圖中的$\sigma$表示sigmoid * X代表點積 (point wise multiplication) * sigmoid會強制讓進來的數值clip到0和1之間 * 這個0和1之間的數值其實就代表LSTM究竟**允許多少**資訊進入 * 0代表不讓任何資訊輸入 * 1代表讓所有的資訊輸入 * LSTM的計算流程分為四個步驟 (four simple steps) * 這是本堂課最重要的一部分 * **Forget, Store, Update, Output** ![](https://i.imgur.com/j46X4pn.jpg) * Forget * 決定甚麼樣的資訊要從cell state之中丟棄 * To forget irrelevant history ![](https://i.imgur.com/MPznmvd.jpg) * Store * 選擇有多少的新資訊要儲存進cell state中 * decide what part of new info is relevant ![](https://i.imgur.com/WQpJAHk.jpg) * Update * 選擇前一個time step的output和現在的input各自有多少要update到cell state中 ![](https://i.imgur.com/FKOS4Nl.jpg) * Output * Output gate控制了要送什麼資訊到下一個time step ![](https://i.imgur.com/ebs3NJ4.jpg) * 再次強調不希望學生get too stuck在LSTM的運算細節中 * 只要知道LSTM如何調節資訊流,如何忘記不相關的歷史資訊和儲存重要的資訊,如何利用這個來更新cell state並產生output即可 * How does this help us to train the network? ![](https://i.imgur.com/JQtROtp.jpg) * cell state $C$ allows for the **uninterrupted flow of gradients through time** (紅色的) * 因此LSTM的gradients是連續且可以隨意往前回溯的參數 * A quick conclusion of LSTM ![](https://i.imgur.com/tsLhLov.jpg) ## RNN Applications * Example 1: 可以預測下一個音符並用此來生成音符的RNN模型 (Generative model) * 輸入會是一串的音符 * 每個time step的輸出會是那個time step對下個音符的預測 ![](https://i.imgur.com/8Tk6IJI.jpg) * Example 2: 分類輸入語句的情感 (Sentiment analysis) * positive or negative sentiment ![](https://i.imgur.com/gmL2NGq.jpg) ![](https://i.imgur.com/AGkzKXO.jpg) * Example 3: 機器翻譯 (Translation) * One of most powerful and widely use in RNN * encoder負責把輸入的語句轉換成state vector * decoder接收state vector並把它轉換成另一個語言 ![](https://i.imgur.com/pQqz1WB.jpg) * 但這樣的方法由於必須將所有的資訊濃縮在一個vector之中,那這個vector的大小就會是模型的bottleneck * This would be a problem * 為了解決上述所說的瓶頸,attention 就出現了 * decoder不只是使用encoder最後一個state的資訊,而是可以存取所有time steps的資訊 * Attention是利用另一個NN去學習他要對每個time step存取多少的資訊 ![](https://i.imgur.com/LpVsfhW.jpg) ## Summary * 正因為有了LSTM和Attention,RNN才能如此廣泛的被應用 ![](https://i.imgur.com/3sOWDk4.jpg)