臺灣大學深度學習課程 學習筆記 lecture3-1 Recurrent Neural Network (RNN)
Recurrent Neural Network (RNN)迴圈神經網路常被用到的領域是Language Modeling,下面就從Language Modeling方法的發展,引入RNN。
Language Modeling
多個word組成一句話,根據一句話出現的概率可以得到更符合語法結構和有意義的句子。
比如根據給出的一段語音,可以得到兩種完全不同的句子“recognize speech”、“wreck a nice beach”,但是“recognize speech”出現的可能性更大。
N-Gram Language Modeling
想要估算出word sequence的概率,首先介紹了N-Gram Language Model
那麼如何確定概率呢?
這需要先收集大量的訓練資料使用機器學習的方法去訓練得到概率。
還有一個問題,假如蒐集的訓練集中有些sequences並沒有出現,而恰好這些sequences就出現在了測試資料中。那麼sequences概率就是0,這就會導致上面連乘公式
解決方法也很簡單,叫 Smoothing,就是對這些沒有出現,後面計算概率是直接賦予一個比較小的結果,比如“0.0001”。在一些情況下,效果還是不錯的,但是這種簡單粗暴的方法總是會存在一些問題,首先準確度不夠,其次不同的情況賦予值是相同的。
以上就是傳統的處理方法,存在一些侷限性。下面介紹使用深度學習的方法。
Feed-Forward Neural Language Model
假設我們已經有了一個訓練好的神經網路模型,可以輸入資料然後的到各種word出現的概率。
下圖中,輸入不同的vector(黃色),經過相同的神經網路模型(藍色區域)進行預測,得到不同word出現的概率,選擇所需的概率
上面講的神經網路訓練的方法相比傳統的方法有一個優點,如下圖。遇到未訓練過的sequences時,可以自動的Smoothing,填充一個合適的值。原因是,假如訓練資料中只有“…dog jump…”,而預測 “…cat jump…”時,模型會把類似於“dog”、“cat”、“rabbit”等屬性相近的words歸到一類,從而近似的預測“…cat jump…”的概率,最終的結果中
上面的模型還是需要提供一個window
Recurrent Neural Network Language Model (RNNLM)
RNN 會考慮所有情況,並且和時間也有關係。
首先,這是之前說的一個神經網路結構的形式。
RNN Language Model 是將這些網路連線了起來,前一個word的資訊也會傳遞到下一個word模型的計算中去。
單獨看一個神經網路的話,在第
上面一節從傳統方法及其侷限問題,為了解決這些問題,講到使用RNN進行處理。接下來,將對RNN的方法進行詳細講解。
Recurrent Neural Network
Definition
RNN的結構如下,簡單表示就是下圖左的樣子,將其展開後,程式設計下圖右的結構。
每個word按照在句子中的順序,會接收上一個word的神經網路隱藏層並對其賦予
最後將本次神經網路的隱藏層同樣賦予
雖然展開後有很多層,但是所有的神經網路其實用的是同一套引數,所以只有
Training via Backpropagation through Time (BPTT)
反向傳播之前課程中有詳細介紹 Backpropagation ,如果理解了反向傳播後,就會發現,其實RNN 的 Backpropagation 其實是同樣的計算方法。只不過由於是多級神經網路增加了很多級而已,但是每一個神經網路其實以一樣的原理。
首先是對輸出層的損失函式
根據時間也就是
其中的引數型別按照上面講到的, 分為三種。
第一種是 輸出層 之間的引數 為
第三種是神經網路傳遞過程中每次都需要輸入的
下面的圖比較直觀的反映了反向傳播的順序,以及各輸出結果的損失函式
每次Backpropagation都是全部同步更新的。
Training Issue
梯度爆炸和梯度消失
由於RNN中每個神經網路使用相同的一套引數,矩陣不斷地進行相乘後一部分值會成指數級的升高或降低,從而出現梯度爆炸和梯度消失。
下圖中,通過不斷地迭代後,出現梯度爆炸和梯度消失,在50 steps時,引數分佈在兩端和0附近。
解決方法
梯度爆炸解決方法,將數字限定在一個範圍裡面,以防止其過大。
下面是使用IRNN後的效果對比。
另外,梯度下降還會引發另一個問題。當RNN有非常多迴圈,前面的神經網路就很難去影響後面的結果。但是有時候在一句話中,前面句子裡面的word和靠後面word之間關係還是比較大的。針對這個問題,後面的課程中還會講到。
Extension
除了上面講到的RNN結構,還有一些其他形式。
比如雙向RNN和深層雙向RNN。
需要注意的是,雙向RNN並不是所有情況都適用。比如在股票預測這種就無法進行雙向,因為股票資訊無法獲得之後未來的資訊。
Applications
Sequential Input
在輸入方面的應用,由於RNN訓練的結果在是有前後順序資訊的。所以可以對句子先進行RNN得到vector,將vector結果作為另一個神經網路的輸入資料。
Sequential Output
在輸出方面的應用。可以做詞性的標記,在RNN中,設定不同的輸出資訊,可以訓練得到相應的標籤序列。例如,根據一個word在一句話中所在的位置,輸出這個word的詞性。
另外一個是,做Natural Language Understanding (NLU) 自然語言理解。比如向Siri說出一段指令,Siri理解並根據指令進行操作。
如下圖,其實是從這句話中找出符合send_email API介面的相應標籤資訊。
還有一個就是上面兩種的結合使用,使用兩個RNNs,一個用於處理輸入資訊,一個用於處理輸出資訊。兩個RNNs同步訓練。