NLP | 自然語言處理 - 語言模型(Language Modeling)

爲什麼需要語言模型?

想象“語音識別”這樣的場景,機器通過一定的算法將語音轉換爲文字,顯然這個過程是及其容易出錯的。例如,用戶發音“Recognize Speech”,機器可能會正確地識別文字爲“Recognize speech”,但是也可以不小心錯誤地識別爲“Wrench a nice beach"。簡單地從詞法上進行分析,我們無法得到正確的識別,但是計算機也不懂語法,那麼我們應該如果處理這個問題呢?一個簡單易行的方法就是用統計學方法(馬爾可夫鏈)從概率上來判斷各個識別的正確可能性。


什麼是語言模型?

首先,我們定義一個有限的字典V。V = {the, a, man, telescope ... },通過字典間有限或者無限次笛卡兒積,我們可以得到一個無限的字符串組合S,S可能包含:

1,the

2,a

3,the man

4,the man walks

...


其次,假設我們有一個訓練數據集,數據集中包含了許多文章。通過統計數據集中出現的句子、其出現次數c(x)以及數據集句子總數N,我們可以計算出每個句子的出現頻率。令x ∈ S,p(x) = c(x)/N表示x的出現頻率,顯然Σp(x) = 1。


綜上所述,我們可以發現幾個問題:

1)上述的語言模型只是理論上存在的,當訓練數據集無限大的時候,數據集中的頻率可以無限接近語法中實際的概率;

2)對於S中的大部分句子,p(x)應當等於0,因此S是一個非常稀疏的數據集,很難存儲。


馬爾可夫鏈

既然上面這個簡單的語言模型不太完美,我們自然需要尋找其他的方法來獲得語言模型,其中一個比較著名的算法就是馬爾可夫鏈。假如考慮一個長度爲n的句子可以利用一串隨機變量來表示,即x1, x2, ... xn,其中xk ∈ V。那麼,我們的目標是求p(X1 = x1, X2 = x2, ..., Xn = xn)。


顯然,p(X1 = x1, X2 = x2, ..., Xn = xn) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * p(X3 = x3 | X1 = x1, X2 = x2) * ... * p(Xn = xn | X1 = x1, X2 = x2, ... Xn-1 = xn-1)。當n過大的時候,條件概率的複雜度會大大地增加,是否能夠找到一個近似的方法方便求出這些條件概率呢?答案是肯定的,我們需要做一個假設,即每個單詞這個隨機變量只與前k個隨機變量相關。


  • 一階馬爾可夫鏈
一階馬爾可夫鏈中我們認爲每個單詞這個隨機變量只與前一個隨機變量相關,因此上述表達式可以簡化爲p(X1 = x1, X2 = x2, ..., Xn = xn) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * p(X3 = x3 | X2 = x2) * ... * p(Xn = xn | Xn-1 = xn-1) = p(X1 = x1) * ∏p(Xk = xk | Xk-1 = xk-1)
  • 二階馬爾可夫鏈
二階馬爾可夫鏈中我們認爲每個單詞這個隨機變量只與前兩個隨機變量相關,因此上述表達式可以簡化爲p(X1 = x1, X2 = x2, ..., Xn = xn) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * p(X3 = x3 | X1 = x1, X2 = x2) * ... * p(Xn = xn | Xn-2 = xn-2, Xn-1 = xn-1) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * ∏p(Xk = xk | Xk-2 = xk-2, Xk-1 = xk-1)

通常長度n不是固定的,並且爲了表述方便,我們可以做一些細節的優化。
1)增加一個開始符號”*“,我們定義所有句子都是以”*“開始,即X-1 = X0 = *;
2)增加一個結束符號”STOP“,我們定義所有句子都是以”STOP“結束。
綜上所述,馬爾可夫鏈表達式可以簡化爲:
一階馬爾可夫鏈:p(X1 = x1, X2 = x2, ..., Xn = xn) = ∏p(Xk = xk | Xk-1 = xk-1)
二階馬爾可夫鏈:p(X1 = x1, X2 = x2, ..., Xn = xn) = ∏p(Xk = xk | Xk-2 = xk-2, Xk-1 = xk-1)

二階馬爾可夫的語言模型

有了二階馬爾可夫,我們可以重新定義一下語言模型:
1)一個有限的字典V
2)對於每個Trigram(三個連續的詞)定義一個參數q(w | u, v),w∈ V ∪ {STOP},u, v ∈ V ∪ {*}
3)對於任意句子x1, x2, ... xn,其中x-1 = x0 = *,xn = STOP,xk(k = 1, 2, ..., n-1)∈ V,句子的出現概率p(x1, x2, ... xn) = ∏q(Xk = xk | Xk-2 = xk-2, Xk-1 = xk-1)

舉個例來講,對於句子the dog barks STOP,我們可以做如下分析:
p(the dog barks STOP) = q(the | *, *) * q(dog | *, the) * q(barks | the, dog) * q(STOP | dog, barks)

二階馬爾可夫的語言模型的計算

計算二階馬爾可夫的語言模型似乎變成了一個簡單的統計問題,通過在訓練數據集中統計連續三個詞的出現次數c(u, v, w)和兩個詞的出現次數c(u, v),q(w | u, v) = c(u, v, w) / c(u, v)。


算法到了這裏看起來挺完美了,如果有一個不錯的訓練數據集,我們就可以訓練出語言模型了。但是上文我們還提到一個問題,即訓練數據集的稀疏性。只有數據集無限大的時候我們才能保證所有可能出現的句子都被語言模型包含,否則我們無法獲得可靠的語言模型。另外,倘若任意一個Trigram(三個連續的詞)對應的q(w | u, v) = 0,我們將災難性地獲得句子的概率等於0。


現實生活中,我們無法獲得無限大的訓練數據集,因爲我們希望找到一個近似的算法來是所有的Trigram(三個連續的詞)對應的q(w | u, v)都不爲0,同時儘可能地找到與事實接近的q(w | u, v)。一種常見的方法是利用Unigram(單個詞)、Bigram(兩個詞)、Trigram(三個詞)來做近似的計算。

Unigram:q'(w) = c(w) / c()

Bigram:q'(w | v) = c(v, w) / c(v)

Trigram:q'(w | u, v) = c(u, v, w) / c(u, v)

我們定義q(w | u, v) = k1 * q'(w | u, v) + k2 * q'(w | v) + k3 * q'(w),其中k1 + k2 + k3 = 1,ki >= 0。


首先,我們需要證明Σq(w | u, v) = 1。即Σq(w | u, v) = Σ[k1 * q'(w | u, v) + k2 * q'(w | v) + k3 * q'(w)] = k1 * Σq'(w | u, v) + k2 * Σq'(w | v) + k3 * Σq'(w) = k1 * 1 + k2 * 1 + k3 * 1 = k1 + k2 + k3 = 1。


其次,我們應該如果確定k1, k2與k3呢?利用類似交叉熵(Cross Entropy)的方法,我們可以讓q(w | u, v)儘量接近訓練集中的統計結果。假設c'(u, v, w)是從測試集中統計出的Trigram(三個詞)的出現次數,L(k1, k2, k3) = Σc'(u, v, w) * log[q(w | u, v)]。滿足L(k1, k2, k3)最大化的臨界點便能確定k1, k2, k3。


二階馬爾可夫的語言模型的度量:複雜度(Perplexity)

假設我們有一個測試數據集(共M個句子),每個句子si對應一個概率p(si),因此測試數據集的概率積爲∏p(si)。經過簡化,我們可以得到log∏p(si) = Σlog[p(si)]。Perplexity = 2^-l,其中l = 1 / M Σlog[p(si)]。(類似熵的定義)


幾個直觀的例子:

1)假設q(w | u, v) = 1/ M,Perplexity = M;

2)|V| = 50000的數據集的Trigram模型,Perplexity = 74;

3)|V| = 50000的數據集的Bigram模型,Perplexity = 137;

4)|V| = 50000的數據集的Unigram模型,Perplexity = 955。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章