自然語言處理學習篇03——Language Models

本章介紹語言模型,包括如下內容:

  1. Introduction to N-grams
  2. Estimating N-gram Probabilities
  3. Evaluation and Perplexity
  4. Generalization and Zeros
  5. Smoothing: Add-One 
  6. Interpolation 
  7. Good-Turing Smoothing 
  8. Kneser-Ney Smoothing

  • 1. Introduction to N-grams
  • 我們現在使用是Probalilistic Language Models(概率語言模型)。即估計一個字符串序列或者句子出現的可能性大小。
  • 比如說W是一句話,w1,w2,...,wn是構成這句話的單詞,W = w1,w2,...,wn   
  • P(W)指代這句話的出現的概率
  • P(W) = P(w1,w2,...,wn) ——公式1.1
  • P(w1,w2,...,wn) = P(w1)*P(w2|w1)*P(w3|w1,w2)*...*P(wn|w1,w2,...,wn) ——公式1.2
  • 就像計算如下一句話的概率:

  • 其計算公式的一般表示法爲:

  • 即我們需要知道每個wi(i=1...n) 在w1,w2,...wi-1條件下的概率P(wi|w1,w2,...wi-1),要計算每個單詞在前面幾個單詞出現的條件下的概率是很難的,因此我們採用簡化的方法,我們認爲每個單詞的出現只與它的前一個單詞相關即P(wi|w1,w2,...,wi-1) ≈ P(wi|wi-1),這樣就比較容易計算了,這樣的模型成爲”二元“模型。
  • 當然我們也可以有個更通用的定義:每個單詞都只與它前面的N-1個單詞相關,那麼P(wi|w1,w2,...,wi-1) ≈  P(wi|wi-N+1, wi-N+2,...,wi-1),那麼該模型就成爲”N元模型“
  • 最簡單的模型即Unigram model(一元模型),即認爲每個單詞出現的概率只與本身相關,不受之前單詞的影響,那麼

  • 我們也可以使用4元模型、5元模型,N越大,語言模型的準確率就越大,但是每增加一元,帶來的是計算量的指數增長,而且有的時候就算是5階,也不可能把單詞與前面單詞的關係展示清楚,如下面一句話的最後一個單詞crashed,實際上是與句子中靠前的computer相關,這種情況稱爲”長程依賴“,就算是使用5元模型也不可能把單詞之前的相關性展示出來。



  • 補充:
  • 條件概率的公式:
  • P(A|B) = P(A,B) / P(B) ——公式1.3
  • (公式1.3)轉換成 
  • P(A|B) * P(B) = P(A,B) ——公式1.4
  • 注意:
  • 本章內容建議提前看一下吳軍老師所著的《數學之美》第三章——統計語言模型。



2. Estimating N-gram Probabilities(估算模型參數)

上節我們講了N元語言模型,下面我們學習一下該如何求N元模型的概率。
每對單詞的條件概率稱爲該語言模型的“模型參數”,求取參數的過程稱之爲“模型訓練”。
以”二元“模型爲例,我們需要知道句子W中每個單詞wi出現在wi-1之後的概率P(wi|wi-1)
公式如下:

即我們只需要用全部語料庫中出現連着出現(wi-1,wi)的次數 除以 wi-1出現的次數,當然我們要保證語料庫足夠大。
下面是對一個比較大的語料庫(貌似是與餐館相關的)進行統計的結果:
上一欄是:(列單詞,行單詞)出現的次數,如(i, want)出現的次數是827
中間一欄是:"I want to eat chinese food lunch spend"8個單詞統計總數;
最下一欄是:每對單詞出現次數/總數 求得的概率,如(i,want)/2533 = 0.33




計算完每相鄰兩個單詞出現的概率後,就可以得到這句話出現的概率
P(w1,w2,...,wn) = P(w1) * P(w2|w1) * P(w3 | w2) * ... * P(wn |wn-1)

實際上從每對單詞出現的概率上我們也能總結出一些知識。比如說下面的圖中所顯示的,(want, english)出現的概率比(want, chinese)低,大概是因爲中國食品更受歡迎一些。(want, to)和(to, eat)是固定的語法規則,而(spend, want)不和語法,因此出現的概率爲0.


補充:
在實際的運算中,往往把公式
P(w1,w2,...,wn)= P(w1) * P(w2|w1) * P(w3 | w2) * ... * P(wn |wn-1)
寫成log( P(w1,w2,...,wn) ) = log( P(w1)) + log( P(w2|w1)) + ... + log( P(wn|wn-1))的形式
這樣既可以避免underflow(下溢,具體不知道什麼意思),而且做加法比做乘法快。

有一些公開的語言模型工具,如:
1. SRILM
2. Google N-Gram Release
Google Machiine Translation Team公開的大數據集,你可以自己下載
3. Google Book N-grams


3. Evaluation and Perplexity

本節我們將評估之前所建立的語言模型(是否比其它模型更準確)。
首先我們根據training set(訓練集數據)求得模型參數,然後使用新的數據集(test set)來測試所建立語言模型的性能。
Train set和Test set屬於同一領域時,訓練出的語言模型的準確性就高,對test set的預測性就越好。倘若兩者屬於不同領域,那麼所訓練的模型就未必好。
Extrinsic(外部)evaluation:根據一個具體的任務,訓練兩個語言模型A和B,然後使用大量數據來監測A和B,比較兩者的錯誤率等等。這回消耗大量時間,需要幾天到幾周不等。
Intrinsic (內部)evaluation: Perplexity(混亂度)的定義如下。
PP(W)y越小就意味着P(W)的可能行越大。對與普適模型和二元模型PP(W)的公式如下

PP(W)越小,語言模型的性能也就越好



4. Generalization and Zeros


在二元語言模型中,很多單詞對出現的次數爲0,實際上在|V^2種單詞對中,大多數的單詞對出現的次數都是0,在多元模型中情況更甚,會有更多的概率爲0的單詞對(語料庫的詞彙量爲|V|,N元模型中單詞序列種類爲|V|的N次方)。
另一個問題是:很可能我們使用的train set數據中計算的某個單詞對概率爲0,但是在test set中確實真實存在的。
如下面這個例子:

5. Smoothing: Add-One 

解決零概率的方法稱爲爲平滑技術。

在我們的train set中統計到denied the的搭配有3個allegations,2個reports,1個claims和1個request,總共7個。但這個模型中並沒有denied the attack,denied the man等等用法,而這些搭配在test set中很可能會出現,因此smoothing的方法就是從概率總和中偷出一部分用來代表那些未出現的搭配的概率,而原有的搭配的概率相應地減小。如下圖所示:2.5個allegations,1.5個reports,0.5claims,0.5個request,再加上2個其它可能的搭配,總共還是7個。


按照什麼樣的方法“偷”一部分概率給那些未出現的可能性呢?最簡單的方法成爲Add-one estimation,亦稱Laplace smoothing(拉普拉斯平滑)。這個方法的核心很簡單:我們假定每個單詞至少都出現一次,對所有的單詞,其出現的個數都+1,即使在train set中並沒有出現也是如此操作。因此我們之前計算模型參數的公式就由

變成

注:
MLE代表最大似然估計,是從train set中得到的原始概率。給定一個語料庫,通過原始(簡單求概率未經修改的)方法訓練出來的模型,我們稱之爲maximum-likelihood語言模型。
V即train set語料庫的詞彙量(出現“零概率“時有兩種可能,一種是在train set中的確沒有(wi-1,wi)搭配,還有一種是train set中壓根沒有test set中的某些單詞。因爲我們只能根據train set求參數,test set是未知的,因此,這裏的V只能是train set的詞彙量,我們把語料庫中的每種單詞的默認數量都+1,相應的認爲wi-1可以與語料庫中所有的單詞都存在一次以上的搭配可能性)

還是使用之前的restaurant語料庫,對其進行laplace smoothed 


然後再計算概率


將通過laplace smooth計算的概率再乘以總數得到平滑後不同單詞搭配出現的次數,與之前原始數據次數相比較。


你可以發現兩者之間差別很大,比如(chinese, food)從82變成了8.2,因爲更多的概率分配給了那些在train set 中沒有出現但可能的搭配。
正因如此,add-1 estimation並非”鋒利“的工具,它不適用於N-grams,我們在之後會講到更好的 方法。Add-1 通常用於平滑其它一些NLP模型,如text classification(文本分類),以及一些零概率出現比較少的情況。

6. Interpolation (插值)

有時我們需要將多種語言模型——trigram(三元)、bigram(二元)、unigram(一元)模型混合使用,這就需要使用插值方法。
簡單插值,給unigram/bigram/trigram的概率賦一個權值,權值之和爲1,如下圖所示:


另一種就是λ取值由上下文決定,如下圖所示:


如何設置λ呢?這裏我們介紹一個新的概念”held-out data"(留存數據或留存語料)。把原有的train set數據分成兩份,一份繼續作爲train set(訓練語料),用於初始的頻率估計;另一份用來改善最初的頻率高几,這一份便稱爲“held-out data"。設置λ的方法如下圖所示:

即我們選擇的λ要使得修改後的語言模型能夠最佳匹配到held-out data。

假如事先知道所有的單詞,即V是固定的,那麼就訓練語言模型的過程就稱爲closed vocabulary task;假如不知道所有的單詞,即test set中的某些單詞並沒有在train set中出現,那麼這些單詞就稱爲OOV(out of vocabulary) words,併爲這些單詞指定一個統一個標識符<UNK>,相應的訓練語言模型的過程稱爲open vocabulary task.

7. Good-Turing Smoothing(古德-圖靈平滑)

第6節中我們講到的Add-One平滑,其更一般的形式是Add-k平滑(就是把原來的加1換成加常數K),公式如下:

此外,還有其他更高級的平滑方法,如Good-Turing/Kneser-Ney/Witten-Bell等。
我們先介紹一個基本定義:Nc——出現c次的單詞的種類的個數。
如:Sam I am I am Sam I do not eat 統計如下:
I 3
sam   2
am  2
do 1
not 1
eat  1
因此N1=3,N2=2,N3=1.
Good-Turning的計算方法如下:

先看前一個公式:前一個公式是得到我們所沒看到的事件的概率,這些事件在訓練數據中沒有,但在現實生活中很可能存在。方法是用N1(即只出現1次的事件數)除以事件總數。
再看第二個公式:因爲前面已經把一部分概率分給了未出現的事件,那麼之前已經出現的事件的概率也需要相應的減少,這個公式就是計算之前出現的事件的概率,C*代表的是Good-Turning count。
舉例說明,我釣了18條魚,分別是
10carp,3 perch,2 whitefish,1 trout,1 salmon,1 eel = 18 fish
N1=3,N2=1,N3=1,N10=1
問題一:我釣的下一條魚是trout的概率是?採用MLE最大似然估計的方法答案是1/18
問題二:下一條魚是新的品種的概率是?假如採用MLE最大似然估計的方法,那麼答案是0/18;而採用Good-Turing估計,則爲N1/N=3/18.
問題三:下一條魚是trout的概率是?Pmle(trout)=1/18;而使用Good-Turing方法,新種魚的概率已經佔去了3/18,因此Pgt(trout)肯定小於Pmle(trout)。計算可得:C*(trout)=2·N2/N1=2/3,Pgt(trout)=C*(trout)/18=1/27.

細心的讀者會注意到,出現次數最多的單詞經過Good-Turing計算的C*等於零,因爲N(c+1)=0,這顯然是與常識違背的,因爲出現最多的單詞,下一次出現的概率也應該最大才是。另外,倘若單詞計數有斷層,就像下圖所示,也會出現C*=0的情況。

如上圖所示,當詞頻k比較小時,N(k)遠大於N(k+1),因此計算出的C*可以比C小,進而使得Pgt比Pmle小。
而當k比較大時,情況就不一定了,C*的值可能比C大,也可能比C小,很可能在C周圍浮動,另外,斷層現象會增加,顯而易見,當語料庫比較大時,出現1,2,3,...幾百次的都會有,但是當k增長到幾千的時候,N(k)就不一定存在了。
解決方法是對N(k)進行平滑處理,處理成下圖的樣子:


1.8 Kneser-Ney Smoothing
本節介紹Kneser-Ney平滑方法。




















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