斯坦福大學-自然語言處理與深度學習(CS224n)筆記 第八課 迴圈神經網路
課程概要
1、傳統語言模型
2、迴圈神經網路
3、例項(python)
4、RNN處理的一些技巧
5、針對其他任務的序列模型
6、總結
一、傳統語言模型
語言模型可以計算一些系列的單詞的概率P(w1,…,wT)
-
可以用來進行機器翻譯
- 單詞順序:p(the cat is small) > p(small the is cat)
- 單詞選擇:p(walking home after school) > p(walking house after school)
-
對於單詞的概率估計一般是依據馬爾可夫假設,我們認為只有單詞前面的幾個單詞會和單詞的概率相關,因此我們只計算條件於前面N個單詞的單詞概率。
-
對於這些的條件概率的計算,是通過語料庫中先驗的條件概率來進行估計的。下面展示的是一元和二元的估計。一般而言,隨著n元中n的增加,準確率也會增加,但是n的增加會增加許多對記憶體(RAM)的需求。
二、迴圈神經網路
對於一組單詞向量x1,x2,x3,x4…而言,每一個時間步的公式可以寫成:
- x t是t時刻輸入的詞向量,長度為d
- h t-1是t-1時刻得到非線性啟用函式的輸出值
- W(hx)是輸入詞向量的權值矩陣,維度:Dh×d
- W(hh)是h t-1的權值矩陣,維度:Dh×Dh
- W(S)是在softmax中的對ht的權值矩陣
- 要注意的是對於所有時刻的神經元都共用同一個W(hx),W(hh)和W(S)
迴圈神經網路的影象表示:
上圖的多神經元展開:
這裡使用的損失函式,和我們之前提到的交叉熵損失函式是一樣的。但是,考慮到我們現在的任務不是對中心詞進行分類, 而是預測每個時刻的單詞,因此我們需要把之前的基於類的加和換成詞彙加和。
3、迴圈神經網路(RNN)的訓練問題:梯度爆炸/消失
對於迴圈神經網路而言,在進行前饋計算的時候,每一個時刻都會乘以一個相同的矩陣;而在進行後饋計算的時候,每一個時刻也都會乘以一個相同的矩陣。
具體從公式展開,將RNN公式寫成相似但是更簡單的公式。
就對總體誤差E求導W而言,就是求所有時刻的誤差的導數之和。
利用鏈式法則可以把每個時刻的導數寫成
其中
上面的連乘公式的每一個乘子都是一個Jacobain雅克比矩陣,雅克比矩陣的基本形狀如下:
對雅克比矩陣而言,我們可以得到它的範數的上界,其中β是對應的範數上界:
因為梯度是一系列雅克比矩陣的連乘,所以我們可以得到對應的範數上界:
只要我們一開始設定的初始是大於1的,那麼我們最終得到的梯度將會無窮大;而當初始一開始是小於1的,最終梯度將會變得無窮小。
梯度無窮小還會帶來的一個問題是當我們在判斷t時刻的單詞的時候,t-n時刻的單詞的影響會變得很小。比如句子,Jane walked into the room.John walked in too. It was late in the day. Jane said hi to ____可能就沒有辦法填入正確的單詞John。
三、例項(python)
演示程式碼見此處
如上面的圖所示,這是兩個RNN模型,一個使用ReLu,一個使用sigmoid為啟用函式以後得到的梯度曲線。我們可以看到的共同點是,第一層的梯度是小於第二層的梯度的,因此很有可能會發生梯度消失的問題。
四、RNN處理的一些技巧
1、處理梯度爆炸的方法:clipping trick
這是一個由Mikolov引入的方法,具體是當梯度超過某個最大的值的時候,將梯度截斷。
直觀的思想展示:這裡構建了一個十分簡單的神經網路,只包含一個隱層,下圖繪製出的是目標函式的三維圖。可以看到,實線是沒有進行clipping 處理的優化情況,當梯度遇上凸出部分的時候可能會優化到一個非常遠的地方;虛線是進行clipping 處理之後,可以一定程度上控制優化的距離。
2、處理梯度消失的方法:初始化+ReLus
所謂的初始化指的是對W矩陣進行初始化定義為單位舉證(也就是預設為初始是:單位矩陣f+單位舉證x,也就是詞向量的加和),並且進行f(z)=rect(z)=max(z,0)的啟用函式計算。
參考文獻:
Parsing with Compositional Vector Grammars, Socher et al. 2013
A Simple Way to Initialize Recurrent Networks of Rectified Linear Units, Le et al. 2015
3、複雜度(Perplexity)結果
我們將RNN的結果,與傳統的語言模型的結果(五元+Kneser-Ney平滑)進行復雜度的比較,結果發現RNN的表現更加優秀,複雜度(Perplexity)更低。
4、技巧:基於分類的單詞預測
softmax的計算實際上是十分巨大和緩慢的,為了提升它的計算,我們可以應用一個技巧:基於分類的單詞預測。 簡單來說就是先預測單詞的分類(分類可以依據單詞出現的頻率),再預測具體類中的具體單詞。分的單詞類越多,複雜度(Perplexity)降低也越多,但是分類越多也可能會導致速度變慢,所以這中間需要進行一定的權衡。
p(wt|history)=p(ct|history)p(wt|ct)=p(ct|ht)p(wt|ct)
5、後饋技巧
在進行後饋計算的時候,只需要遍歷一遍整個序列,然後從每個Et中累積δ。
五、針對其他任務的序列模型
對每個單詞進行命名實體的識別(NER),實體層面的情感分析,意見表達(opinionated expressions)
以意見表達舉例,一個任務是識別直接主觀表達(DSEs)和表現主觀表達(ESEs)。前者是明確指出個人的觀點,後者是暗含的情感與情緒。
具體的標註方法BIO標註,B表示一個實體的開始,I表示實體的繼續,O表示什麼都不是
我們可以利用RNN來完成這個任務。結構和公式如下,其中x表示一個詞向量,y表示一個標記(B、I、O),g表示softmax
在進行分類的時候,我們一般希望不僅使用這個單詞之前的單詞,我們也希望使用這個單詞之後的單詞,因此我們可以使用雙向RNN來解決這個問題。
當然也可以構建深度的雙向RNN模型。
資料情況:MPQA 1.2 corpus(Wiebe et al., 2005) 包含535篇新聞,11111個句子。在片語層面人工進行標註DSEs與ESEs。
評價標準:F1
在不同的語料規模上,得到的不同層數的F1情況。
六、總結
- 迴圈神經網路(RNN)是最好的NLP的深度學習模型之一。
- 訓練它存在的一個困難時梯度爆炸和梯度消失。
- 它可以進行很多方面的拓展,可以使用很多技巧使得訓練得以提升。
- 下一節課將會介紹它的拓展LSTMs與GRUs