cs224n學習筆記L6: Language models and RNNs

一、語言模型

1.1 什麼是語言模型(LM)

語言模型是指利用當前序列預測下一個可能出現的詞。
P(x(1),,x(T))=P(x(1))×P(x(2)x(1))××P(x(T)x(T1),,x(1))=t=1TP(x(t)x(t1),,x(1))\begin{aligned} P\left(\boldsymbol{x}^{(1)}, \ldots, \boldsymbol{x}^{(T)}\right) &=P\left(\boldsymbol{x}^{(1)}\right) \times P\left(\boldsymbol{x}^{(2)} | \boldsymbol{x}^{(1)}\right) \times \cdots \times P\left(\boldsymbol{x}^{(T)} | \boldsymbol{x}^{(T-1)}, \ldots, \boldsymbol{x}^{(1)}\right) \\ &=\prod_{t=1}^{T} P\left(\boldsymbol{x}^{(t)} | \boldsymbol{x}^{(t-1)}, \ldots, \boldsymbol{x}^{(1)}\right) \end{aligned}
在這裏插入圖片描述
輸入法的聯想功能就是這個原理

1.2 n-gram語言模型

訓練一個語言模型的一種簡單方法是n-gram, n-gram是指大小爲n滑動步長爲1的窗口框選出的單詞塊。包括:

  • unigrams
  • bigrams
  • trigrams
  • 4-grams

1.2.1 n-gram數學原理

假設:第t+1個詞x(t+1)x^{(t+1)}由前n-1個詞決定:
在這裏插入圖片描述
由條件概率的定義:
在這裏插入圖片描述
可以通過直接統計這麼gram的頻數獲得這些n-gram和(n-1)-gram的概率。即:
Pcount(x(t+1),x(t),,x(tn+2))count(x(t),,x(tn+2))P\approx \frac{\operatorname{count}\left(\boldsymbol{x}^{(t+1)}, \boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}{\operatorname{count}\left(\boldsymbol{x}^{(t)}, \ldots, \boldsymbol{x}^{(t-n+2)}\right)}

1.2.2 n-gram缺點

以4-grams爲例:

  • n-gram模型確實十分簡單,但是爲了簡化問題,丟掉上下文顯然是不合理的假設。
  • 稀疏問題: 如果在測試集中出現了一個詞,這個詞在訓練集中沒有出現過
    • 導致未登錄詞的概率爲0(解決方案:給每一個詞都初始化一個很小的概率,即平滑操作,從而將計數的稀疏矩陣轉換爲稠密矩陣)
    • 導致分母爲零, 且包含這個未登錄詞的三元組計數都爲0(解決辦法:只看前兩個詞/前一個詞)。
  • 存儲問題:計數需要存儲所有出現的n-gram, 複雜度可能爲n的指數量級。

此外,當n越大時,理論上預測效果越好,但稀疏問題會變得非常嚴峻。

1.3 爲什麼要研究語言建模

  • 語言建模是衡量我們對自然語言理解的一項基本任務(benchmark task)
  • 這是很多語言任務的子模塊之一,例如:
    • 預測輸入
    • 語音識別
    • 手寫字符識別
    • 拼寫/語法檢查
    • 機器翻譯
    • 自動摘要

1.4 LM理解

LM是指一個用來預測下一個詞的系統,RNN不是LM,只是一種實現LM的方式。

二、神經網絡語言模型

2.1 基於窗口的語言模型

上一節課我們用到了這個模型
在這裏插入圖片描述
這個模型帶來以下提升:

  • 沒有稀疏問題
  • 不需要存儲所有的grams片段

仍然存在的問題:

  • 固定的窗口太小
  • 增大窗口就需要增大W
  • 由於窗口再大都不爲過,那麼W也就可能無限增大
  • 權重中每個部分只學到了窗口中某個位置的信息。

因此我們需要一個能夠處理任意長度的神經網絡結構。

2.2 RNN

注意下面這裏的y^\hat y實際上就是RNN隱藏層的狀態向量。
在這裏插入圖片描述
當t=0時,h0就是隱藏層初始狀態,t>0時,隱藏層的計算公式如下:
h(t)=σ(Whh(t1)+Wee(t)+bh)(2.2.1)h^{(t)} = \sigma (W_hh^{(t-1)} + W_ee^{(t)} + \boldsymbol b_h) \tag {2.2.1}
y^(t)=softmax(Uh(t)+bU)\hat y^{(t)} = softmax(Uh^{(t)} + \boldsymbol b_U)
這裏的WhW_h類似馬爾科夫鏈中的轉移矩陣。
在這裏插入圖片描述

2.3 RNN優缺點

優點:

  • 處理任意長度輸入序列
  • 計算一個時間步可以利用前面多個時間步的信息
  • 由於對每個時間步使用同一個權重,學習到的信息是對稱的

缺點:

  • 並行度低,計算慢
  • 實際使用時只有短距離的信息依賴

2.4 如何訓練RNN模型

  1. 對於一個語料庫構成的一個文本序列x(1),,x(T)x^{(1)}, \cdots, x^{(T)}, 將其餵給RNN,對每個x(t)x^{(t)}, 都輸出一個y^(t)\hat y^{(t)}(一個n-class維向量)

  2. 損失函數是在每一個y^(t)\hat y^{(t)}處使用一個softmax函數將其轉換爲概率分佈,並用交叉熵計算其損失
    J(t)(θ)=CE(y(t),y^(t))=wVyw(t)logy^w(t)=logy^xt+1(t) J ^ { ( t ) } ( \theta ) = C E \left( \boldsymbol { y } ^ { ( t ) } , \hat { \boldsymbol { y } } ^ { ( t ) } \right) = - \sum _ { w \in V } \boldsymbol { y } _ { w } ^ { ( t ) } \log \hat { \boldsymbol { y } } _ { w } ^ { ( t ) } = - \log \hat { \boldsymbol { y } } _ { x t + 1 } ^ { ( t ) }

  3. 將這T個交叉熵平均作爲整體損失:
    J(θ)=1Tt=1TJ(t)(θ)=1Tt=1Tlogy^xt+1(t) J ( \theta ) = \frac { 1 } { T } \sum _ { t = 1 } ^ { T } J ^ { ( t ) } ( \theta ) = \frac { 1 } { T } \sum _ { t = 1 } ^ { T } - \log \hat { \boldsymbol { y } } _ { \boldsymbol { x } _ { t + 1 } } ^ { ( t ) }

  4. 老規矩,在整個數據集上面計算一次損失並更新代價太大,因此使用SGD,通常將語料中的一句話作爲一個序列,每次更新使用多句話構成一個batch.

2.5 RNN反向傳播

2.5.1 基本計算公式及其推導

如何計算J(t)(θ)J^{(t)}(\theta)對重複使用的權重矩陣WhW_h的偏導?先給出ppt的答案:
J(t)Wh=i=1tJ(t)Wh(i) \frac { \partial J ^ { ( t ) } } { \partial \boldsymbol { W } _ { \boldsymbol { h } } } = \left. \sum _ { i = 1 } ^ { t } \frac { \partial J ^ { ( t ) } } { \partial \boldsymbol { W } _ { \boldsymbol { h } } } \right| _ { ( i ) }
來看看課堂上的推導講解,這裏要知道在每一個樣本的計算中,Wh=Wh(1)==Wh(T)W_h = W_h|_{(1)} = \cdots = W_h|_{(T)}, 因爲訓練過程中每一個batch計算完纔會更新一次。
在這裏插入圖片描述
這個看着可能還是不太能理解,我們從數學公式上下手也很簡單。根據公式2.2.1:
h(t)=σ(Whh(t1)+Wee(t)+bh)h^{(t)} = \sigma (W_hh^{(t-1)} + W_ee^{(t)} + b_h)
u=Whh(t1)+Wee(t)+bhu = W_hh^{(t-1)} + W_ee^{(t)} + \boldsymbol b_h, 由於h(t1)h^{(t-1)}是W的函數,J(t)J^{(t)} 爲與h(t)h^{(t)}相關的交叉熵損失,因此直接考慮
h(t)Wh=h(t)σ(u)(uW+uh(t1)h(t1)W)=h(t)Wh(t)+λh(t1)Wh\begin{aligned} \frac { \partial h ^ { ( t ) } } { \partial { W } _ { \boldsymbol { h } } } & =\frac { \partial h ^ { ( t ) } } {\sigma(u)} (\frac{\partial u}{\partial W} + \frac{\partial u}{\partial h^{(t-1)}}\frac{\partial h^{(t-1)}}{\partial W}) \\ &= \left. \frac { \partial h ^ { ( t ) } } {\partial W_h}\right|_{(t)}+ \lambda\frac { \partial h ^ { ( t -1) } } {\partial W_h} \end{aligned}
可以看到這個式子能夠被遞歸展開,而且展開的深度爲t。要注意這裏是對所有time-step權重求偏導,而反向傳播時是一步一步的計算,不需要遞歸展開。

2.5.2 時間序上的反向傳播

由於RNN的真實輸出爲最後一個time-step的隱藏層h(T)h^{(T)}, 因此反向傳播要從這裏開始,計算最後一個時間步對W的梯度。整個方向傳播的結果就相當於2.5.1中的計算公式。
在這裏插入圖片描述

2.5.3 RNN-LM文本預測及生成

直接預測下一個time-step的隱藏層向量即可。RNN可以模仿任意語言風格,甚至能夠精確的學習到語言中的引號匹配等問題。

2.6 RNN其他用法

  1. 序列標註(詞性標註、命名實體識別)
    在這裏插入圖片描述
  2. 情感分類
    在這裏插入圖片描述
  3. 用作編碼器模塊(encoder module)
    在這裏插入圖片描述
  4. 用於語音識別、手寫字符識別、自動摘要等文本生成任務
    在這裏插入圖片描述

三、評價語言模型:困惑度(perplexity)

使用困惑度評價指標,直觀上理解該公式,就是要使LM預測給定語料的概率儘可能大。
perplexitv=t=1T(1PLM(x(t+1)x(t),,x(1)))1/T=t=1T(1y^xt+1(t))1/T=exp(1Tt=1Tlogy^xt+1(t))=exp(J(θ))\begin{aligned} perplexitv &= \prod_{t=1}^{T}(\frac{1}{P_{LM}(x^{(t+1)}|x^{(t)},\cdots,x^{(1)})})^{1/T} \\ &= \prod _ { t = 1 } ^ { T } \left( \frac { 1 } { \hat { \boldsymbol { y } } _ { x _ { t + 1 } } ^ { ( t ) } } \right) ^ { 1 / T } \\&= \exp \left( \frac { 1 } { T } \sum _ { t = 1 } ^ { T } - \log \hat { \boldsymbol { y } } _ { \boldsymbol { x } _ { t + 1 } } ^ { ( t ) } \right) \\ &= \exp ( J ( \theta ) ) \end{aligned}
這與我們訓練時的目標函數一致,越小的困惑度的模型越好。除此之外,也可以使用word error rate來評價模型。

四、術語筆記

  1. 本節課中的RNN被稱作普通RNN(vanilla RNN)
  2. RNN升級版:GRU、LSTM、多層RNN
  3. 課程結束應該能理解“stacked bidirectional LSTM with residual connections and self-attention”這樣的術語。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章