1. 程式人生 > >臺灣大學深度學習課程 學習筆記 lecture3-1 Recurrent Neural Network (RNN)

臺灣大學深度學習課程 學習筆記 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”出現的可能性更大。

Language Modeling

N-Gram Language Modeling

想要估算出word sequence的概率,首先介紹了N-Gram Language Model

方法,是一種傳統處理的方法。只考慮前面 (n1) 個words出現的概率。比如句子“我是誰”,令 n=2 ,“誰”這個字只考慮前面的“是”。

N-Gram

那麼如何確定概率呢?
這需要先收集大量的訓練資料使用機器學習的方法去訓練得到概率。

概率計算

還有一個問題,假如蒐集的訓練集中有些sequences並沒有出現,而恰好這些sequences就出現在了測試資料中。那麼sequences概率就是0,這就會導致上面連乘公式 P(w1,w2,...,wm)=0。哪怕其他概率再大,只要出現一個未知的0,最終結果也是0 。

解決方法也很簡單,叫 Smoothing,就是對這些沒有出現,後面計算概率是直接賦予一個比較小的結果,比如“0.0001”。在一些情況下,效果還是不錯的,但是這種簡單粗暴的方法總是會存在一些問題,首先準確度不夠,其次不同的情況賦予值是相同的。

解決方法

以上就是傳統的處理方法,存在一些侷限性。下面介紹使用深度學習的方法。

Feed-Forward Neural Language Model

假設我們已經有了一個訓練好的神經網路模型,可以輸入資料然後的到各種word出現的概率。
下圖中,輸入不同的vector(黃色),經過相同的神經網路模型(藍色區域)進行預測,得到不同word出現的概率,選擇所需的概率 P 。例如,輸入 vector of “wreck”,選擇對應的 “a”出現的概率 P(nextwordisa) ,最後把所有的概率相乘。

神經網路初步應用

NN結構

上面講的神經網路訓練的方法相比傳統的方法有一個優點,如下圖。遇到未訓練過的sequences時,可以自動的Smoothing,填充一個合適的值。原因是,假如訓練資料中只有“…dog jump…”,而預測 “…cat jump…”時,模型會把類似於“dog”、“cat”、“rabbit”等屬性相近的words歸到一類,從而近似的預測“…cat jump…”的概率,最終的結果中 p

(jump|cat) 值會相應的提高,而不是簡單的用0.0001代替。

優勢與劣勢

上面的模型還是需要提供一個window n 的值,但是有時候 n 並不確定。

Recurrent Neural Network Language Model (RNNLM)

RNN 會考慮所有情況,並且和時間也有關係。

RNN

首先,這是之前說的一個神經網路結構的形式。

one-model

RNN Language Model 是將這些網路連線了起來,前一個word的資訊也會傳遞到下一個word模型的計算中去。

RNN-model

單獨看一個神經網路的話,在第 t 個神經網路的隱藏層 ht 中,除了正常的輸入 x 外,還增加了 ht1 的資訊。

結構

上面一節從傳統方法及其侷限問題,為了解決這些問題,講到使用RNN進行處理。接下來,將對RNN的方法進行詳細講解。

Recurrent Neural Network

Definition

RNN的結構如下,簡單表示就是下圖左的樣子,將其展開後,程式設計下圖右的結構。

每個word按照在句子中的順序,會接收上一個word的神經網路隱藏層並對其賦予 W 權重,與輸入層的資料 xt 一起,隱藏層整合成一個新的線性關係 Wst1+Uxt 。然後放入啟用函式(一般為 tanhReLU),經過一系列計算,最終預測出多分類結果(softmax(Vst))。從結果中找出預測為下一個word的概率值。
最後將本次神經網路的隱藏層同樣賦予 W 權重後再傳遞到下一個word的預測中去。

Definition

雖然展開後有很多層,但是所有的神經網路其實用的是同一套引數,所以只有 U,V,W 這三類引數,減少了計算量。

引數

Training via Backpropagation through Time (BPTT)

反向傳播之前課程中有詳細介紹 Backpropagation ,如果理解了反向傳播後,就會發現,其實RNN 的 Backpropagation 其實是同樣的計算方法。只不過由於是多級神經網路增加了很多級而已,但是每一個神經網路其實以一樣的原理。

首先是對輸出層的損失函式 C(θ) 求偏導,得到各級輸出結果組成的梯度方向 C

Backpropagation_C_theta

根據時間也就是 tt1 的方向向前轉播。傳遞的內容和方式與之前講的反向傳播的方式一樣。

Backpropagation2

其中的引數型別按照上面講到的, 分為三種。
第一種是 輸出層 之間的引數 為 V ,第二種是隱藏層之間進行傳遞的引數 W

Backpropagation引數

第三種是神經網路傳遞過程中每次都需要輸入的 x 輸入層之間的引數 U 。理論上講,每個 U 會不一樣,但是上面講過,各迴圈之間共用一套引數,所以強制將 U 進行同步更新,保證使用的是相同的 U 。實際操作中就是將各層的 U 指向同一記憶體。

dU

dW

下面的圖比較直觀的反映了反向傳播的順序,以及各輸出結果的損失函式 C 對各位置引數的影響。
每次Backpropagation都是全部同步更新的。

BPTT方向

Training Issue

梯度爆炸和梯度消失

由於RNN中每個神經網路使用相同的一套引數,矩陣不斷地進行相乘後一部分值會成指數級的升高或降低,從而出現梯度爆炸和梯度消失。

issue

下圖中,通過不斷地迭代後,出現梯度爆炸和梯度消失,在50 steps時,引數分佈在兩端和0附近。

example

解決方法

梯度爆炸解決方法,將數字限定在一個範圍裡面,以防止其過大。

梯度爆炸解決方法

梯度消失解決方法

下面是使用IRNN後的效果對比。

效果對比

另外,梯度下降還會引發另一個問題。當RNN有非常多迴圈,前面的神經網路就很難去影響後面的結果。但是有時候在一句話中,前面句子裡面的word和靠後面word之間關係還是比較大的。針對這個問題,後面的課程中還會講到。

gating mechanism

Extension

除了上面講到的RNN結構,還有一些其他形式。
比如雙向RNN和深層雙向RNN。
需要注意的是,雙向RNN並不是所有情況都適用。比如在股票預測這種就無法進行雙向,因為股票資訊無法獲得之後未來的資訊。

Bidirectional RNN

Deep Bidirectional RNN

Applications

Sequential Input

在輸入方面的應用,由於RNN訓練的結果在是有前後順序資訊的。所以可以對句子先進行RNN得到vector,將vector結果作為另一個神經網路的輸入資料。

input

Sequential Output

在輸出方面的應用。可以做詞性的標記,在RNN中,設定不同的輸出資訊,可以訓練得到相應的標籤序列。例如,根據一個word在一句話中所在的位置,輸出這個word的詞性。

Tagging

另外一個是,做Natural Language Understanding (NLU) 自然語言理解。比如向Siri說出一段指令,Siri理解並根據指令進行操作。
如下圖,其實是從這句話中找出符合send_email API介面的相應標籤資訊。

NLU

還有一個就是上面兩種的結合使用,使用兩個RNNs,一個用於處理輸入資訊,一個用於處理輸出資訊。兩個RNNs同步訓練。

Machine Translation