【Natural Language Processing】語言模型(Language Modeling)

一、語言模型簡介
  語言模型用於對特定序列的一系列詞彙的出現概率進行計算。一個長度爲m的詞彙序列{w1,w2,...,wn }的聯合概率被表示爲p(w1,w2,...,wn )。那麼根據鏈式規則可以得到:

P(S)=p(w1,w2,...,wn)=nip(wi|w1,w2,...wi1)

  其中p(wi|w1,w2,...wi1) 的計算方法可以爲:
p(wi|w1,w2,...wi)=p(w1,w2,...wi)/p(w1,w2,...wi1)

  上面的P(S)即爲語言模型。
1.1 語言模型的應用
  ①機器翻譯:P(high winds tonite) > P(large winds tonite);
  ②拼寫糾錯:P(about fifteen minutes from) > P(about fifteen minuets from);
  ③語音識別:P(I saw a van) >> P(eyes awe of an);
  自動文摘、問答系統、etc.!etc.!
二、Markov Assumption與N-gram
  假設我們基於上述模型進行計算,那麼將會出現指數冪種可能句子,也無法有足夠的數據老訓練模型,這個時候馬爾科夫假設(Markov Assumption)就閃亮登場了,其假設當前出現的單詞僅僅與前一個或k個單詞有關,即:
P(the | its water is so transparent that) P(the | that)

  Or
P(the | its water is so transparent that) P(the | transparent that)

  理論上k取得越大那麼模型的效果就會越好,但是如果取得過大又會出現原來的問題,在實際應用中,k的值一般取2或者3,即分別爲2-gram(Bigram model)和3-gram(Trigram model)。
  最終每個單詞到來的概率計算公式爲:
p(wi|w1,w2,...,wi1)p(wi|wik,wik+1,...wi1)

  相應的語言模型變爲:
P(S)=p(w1,w2,...,wn)=nip(wi|wik,wik+1,...wi1)

三、建立語言模型
  一般地,通過最大似然估計(Maximum Likelihood Estimate)來建立語言模型,即:
p(wi|wi1)=count(wi1,wI)count(wi1)

  假設存在訓練語料爲:
  < s> I am Sam < /s>
  < s> Sam I am < /s>
  < s> I do not like green eggs and ham < /s>
  那麼通過計算可得:

這裏寫圖片描述

  如果存在一個更大的語料,通過同樣的計算方法得到如下信息:

這裏寫圖片描述

這裏寫圖片描述

  最終句子< s> I want english food < /s>的概率爲:
  P(< s> I want english food < /s>)
  = P(I|< s>)× P(want|I)× P(english|want) × P(food|english) × P(< /s>|food)
  =0 .000031
  我們可以發現計算得到的數值通常很小,避免數據溢出、提高性能,通常會使用取log後使用加法運算替代乘法運算,即爲:

log(p1p2p3p4)=logp1+logp2+logp3+logp4

四、平滑技術
  數據平滑是對頻率爲0的n元對進行估計,典型的平滑算法有加法平滑、Good-Turing平滑、Katz平滑、插值平滑,etc.
4.1 Add-one(Laplace) Smoothing
  加一平滑法,又稱拉普拉斯定律,其保證每個n-gram在訓練語料中至少出現1次,以bigram爲例子,計算方法如下:

這裏寫圖片描述

4.2 Good-Turing Smoothing
  該方法首先我們假設在統計元組的過程中,發生c次N元組類別的數目爲Nc ,c即爲上文中統計的count值,那麼通過Good-Turing Smoothing方法,統計得到count更新後的值count*的計算方法爲:

count=(c+1)Nc+1Nc

  一個例子:
  訓練集合:T={< s>what is it what is small?}|T|=8;
  驗證集合:V={what is it small ? < s> flying birds are a bird.}, |V|=12;
  在訓練集合上,我們得到:p(< s>)=p(it)=p(small)=p(?)=0.125, p(what)=p(is)=0.25,其他爲0;
  如果不經過平滑處理,則驗證集上兩句子的概率分別爲:p(what is it?)=(0.25^2)(0.125^2)≈0.001 p(it is flying.)=0.125*0.25(0*2)=0;
  現在用古德-圖靈算法進行平滑處理,如下:
  首先計算,各發生c次N元組類別的數目,依次爲N(0)=6,N(1)=4,N(2)=2,N(i)=0 ,i>2:
   其次,重新估計各概率值。
  ①對於發生0次的事件概率:Pr(.)=p(flying)=p(birds)=p(are)=p(bird)=p(a)=(0+1)*N(0+1)/(8*N(0))=1*4/(8*6)≈0.083
  ②對於發生1次的時間概率:Pr(it)=p(< s>)=p(small)=p(?)=(1+1)*N(1+1)/(8*N(1))=2*2/(8*4)=0.125
  ③對於發生兩次的時間概率:Pr(what)=Pr(is)=(2+1)*N(2+1)/(8*N(2))=3*0/(8*2)=0: 保持原值0.25
  歸一化處理,6*P0+4*P1+2*P2=1.5。
  所以,歸一化處理後:
  p(it)=p(< s>)=p(small)=p(?)= 0.125/1.5 ≈0.08,
  p(what)=p(is)= 0.25/1.5 ≈0.17
  p(.)=p(birds)=p(are)=p(bird)=p(a) = 0.083/1.5 ≈0.06
  最終計算得到:
  p(what is it?)=(0175^2)*(0.08^2)≈0.0002;
  p(it is flying.) ≈ 0.08*0.17*(0.06^2)≈0.00004。
4.3 Interpolation Smoothing
  前面兩種平滑技術,對於未出現的n-gramd都進行了一樣的處理,其中肯定存在不合理之處,對於線性插值平滑技術,其基本思想是將高階模型和低階模型作線性組合,利用低元n-gram模型對高元n-gram模型進行線性插值。因爲在沒有足夠的數據對高元n-gram模型進行概率估計時,低元n-gram模型通常可以提供有用的信息。

這裏寫圖片描述

  對於三種數據:Training data、Held-out data和Test data;

這裏寫圖片描述

  然後,根據Training data構造初始的語言模型,並確定初始的λs(如均爲1);
最後,基於EM算法迭代地優化λs,使得Held-out data概率(如下式)最大化。

logP(w1...wn|M(λ1...λn))=ilogPM(λ1...λn)(wi|wi1)

4.4 Stupid Backoff

這裏寫圖片描述

五、評價方法
  語言模型的評價方法在理論上可以使用困惑度/混亂度(preplexity),其基本思想是給測試集賦予較高概率值的語言模型較好,計算公式如下:

這裏寫圖片描述

  觀察上述公式可得困惑度越小,句子概率越大,則說明訓練得到的語言模型越好。以上即爲傳統中的傳統的語言模型做法。

參考文獻:
斯坦福大學自然語言處理課件
N元語法模型的數據稀疏問題解決方法之一:Good-Turing平滑

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