# RNN part2 (李宏毅) ### RNN 訓練方法 1. Somple RNN Learning Target 示意圖 ![](https://i.imgur.com/b9G3zpi.png) - 1. 對Training Data做embedding,並帶入輸入層 - 2. 將輸出層與真實Target計算所設定的loss function - 3. 利用Backpropagation進行gradient descent 2. Backpropagation through time(BPTT) ![](https://i.imgur.com/xgaVge6.png) https://en.wikipedia.org/wiki/Backpropagation_through_time 3. RNN並不容易Train ![](https://i.imgur.com/VICspzB.png) ![](https://i.imgur.com/VcknZ6M.png) - 1. Loss function有可能會劇烈震盪 - 2. Loss function的等高線圖其實存在一些斷崖,導致當參數剛好落在斷崖上時,gradient就會爆掉而無法training - 3. 可以用Clipping的方式來給一些限制,使gradient不要太大 ![](https://i.imgur.com/0iBTJ36.png) - 4. 原因為:Somple RNN memory項的參數會一直被疊加,導致在計算gradient時,參數的一點點小變化就會有很大的差異 ![](https://i.imgur.com/6ajgqWJ.png) - 5. LSTM可以解決gradient vanishing的問題,因為Memory及input是疊加的,且forget gate不常關掉,memory就不容易被洗掉導致gradient消失 ### RNN各類應用 #### 多對一 * 需要對一串句子進行分類判斷,所以需要用到RNN的特性來處理句子,最後再將輸出轉為分類模型 ![](https://i.imgur.com/FakHy6V.png) #### 多對多 * 輸入音訊,每個一小段時間就用 vector 表示,可以做到每一個 vector 對應到一個 character * input, output 皆為 sequence, 但 output 比較短是 character sequence * 因為取的時間過短,output 可能會有同樣的 character 發生 * 解法:可用 trimming 把重複的 output 拿掉,但會有誤拿的狀況發生 ![](https://i.imgur.com/FxZkAew.jpg) #### CTC * 此問題可以用 CTC 解決,其在 output 後面增加 “中” 表示 null * ctc training 可運用窮舉法,假設全部都是對的,透過 training data 自動把詞彙組合起來 ![](https://i.imgur.com/Z767PMk.jpg) ![](https://i.imgur.com/NRtjb2G.png) #### sequence to sequence learning * input output 都是 sequence, 不知道哪個長哪個短 * 最後的時點,memory存了所有input information * 會不斷的跑下去,要如何阻止他? 加入symbol ===(斷) ![](https://i.imgur.com/umG8AJO.png) #### Many to Many (No Limitation) * 不做語音辨識,直接把聲音訊號丟進去,model得到辨識的結果 * 不用知道是何種語言(台語) #### Sequence-to-sequence Auto-encoder -Text * document to vector * 可以使用 bag of word 但會忽略掉 word order information * bag of word 詞彙是一樣的,但順序不同就會有不同意思 ![](https://i.imgur.com/m2Wbu2J.png) * word sequence 透過 RNN 變成invalid vector,當作encode輸入,長回一樣的句子 * invalid vector 當作input,長回原來的句子,代表 encode 資訊是重要的 ![](https://i.imgur.com/MrN1NW1.png) #### sequence-to-sequence auto-encoder -speech * audio segments (word-level) to Fixed-length vector * 把聲音訊號變成vector ![](https://i.imgur.com/QkDcNfA.png)