Statistical language model 统计语言模型
生活随笔
收集整理的這篇文章主要介紹了
Statistical language model 统计语言模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習筆記來自斯坦福公開課的自然語言處理(https://class.coursera.org/nlp/),以其中講義為主,加入自己的學習理解,以加深學習印象。
內容提綱:
1. N-GRAM介紹 2. 參數估計 3.?語言模型的評價 4. 數據稀疏問題 5. 平滑方法
現在很多的應用中,需要計算一個句子的概率,一個句子是否合理,就看看它的可能性大小,這里可能性的大小就用概率來衡量。比如下面幾個例子:
上面的幾個例子中都需要計算一個句子的概率,以作為判斷其是否合理的依據。下面將上述的內容形式化描述。 我們需要計算一個句子或序列W的概率: P(W) ?= ?P(w 1 ,w 2 ,w 3 ,w 4 ,w 5 …w n )? 其中我們也需要計算一個相關的任務,比如P(w 5 |w 1 ,w 2 ,w 3 ,w 4 ),表示w 1 w 2 w 3 w 4?后面是w 5的概率,即下一個詞的概率。 像這樣計算P(W)或者P(w n |w 1 ,w 2 …w n--‐1 ) ?的模型叫做語言模型( language ?model簡稱LM)。
那么如何計算P(W)呢?用概率的鏈式規則,鏈式規則常常用來評估隨機變量的聯合概率,鏈式規則如下:
將上面的鏈式規則計算P(W)可以寫作如下:
按照鏈式規則計算方式,舉例如下: P(“its water is so transparent”) = P(its) × P(water|its) × ?P(is|its water) × ?P(so|its water is) × ?P(transparent|its water is so) 那么下面的問題是如何計算上面每一個概率,比如?P(transparent|its water is so),一種比較直觀的計算就是計數然后用除法:
事實上不能用這種方式去計算條件概率,原因有兩個: 1.直接這樣計算會導致參數空間過大,一個語言模型的參數就是所有的這些條件概率,試想按上面方式計算P(w 5 |w 1 ,w 2 ,w 3 ,w 4 ),這里w i都有一個詞典大小取值的可能,記作|V|,則該模型的參數個數是|V|^5,而且這還不包含P(w 4 | w1, w2, w3)的個數,可以看到這樣去計算條件概率會使語言模型參數個數過多而無法實用。 2.數據稀疏嚴重,我的理解是像上面那樣計數計算,比如計數分子its water is so transparen,在我們所能見的文本中出現的次數是很小的,這樣計算的結果是過多的條件概率會等于0,因為我們根本沒有看到足夠的文本來統計!
上面的計算方式是通過馬爾科夫假設進行簡化的,馬兒可夫假設是指假設第wi個詞語只與它前面的k個詞語相關,這樣我們就得到前面的條件概率計算簡化如下:
這樣我們的P(W)計算簡化如下:
當k = 0時,這個時候對應的模型叫做一元模型(Unigram ?model),即wi與它前面的0個詞相關,即wi不與任何詞相關,每一個詞都是相互獨立的,P(W)計算如下:
當k = 1時,對應的模型叫做二元模型(Bigram ?model),此時wi與它前面一個詞相關,P(W)計算如下:
同樣的,我們可以讓k = 2,叫做 trigrams,4-grams,5-grams,當k = N - 1,模型成為n元模型,即N-grams。
總的來說,N-grams有一些不足,因為語言存在一個長距離依賴關系,比如考慮下面的句子:
“The computer which I had just put into the machine room on the fifth floor crashed.”
假如我們要預測最后一個詞語crashed出現的概率,如果采用二元模型,那么crashed與floor實際關聯可能性應該非常小,相反的,這句子的主語computer與crashed的相關性很大,但是n-grams并沒有捕捉到這個信息。
要計算出模型中的條件概率,這些條件概率也稱為模型的參數,得到這些參數的過程稱為訓練。用最大似然性估計計算下面的條件概率:
其中c(wi-1)表示wi-1出現的次數,是count的首字母c。對一小段文本看一個例子:
其中<s><\s>分別表示一個句子的開頭和結束,s即start的意思。計算這段文本的二元模型如下:
比如計算P(I | <s>)表示I作為句子開頭的概率:
再看一個例子,這個例子來自大一點的語料庫,為了計算對應的二元模型的參數,即P(wi | wi-1),我們要先計數即c(wi-1,wi),然后計數c(wi-1),再用除法可得到這些條件概率??梢钥吹綄τ赾(wi-1,wi)來說,wi-1有語料庫詞典大小(記作|V|)的可能取值,wi也是,所以c(wi-1,wi)要計算的個數有|V|^2。c(wi-1,wi)計數結果如下:
c(wi-1)的計數結果如下:
那么二元模型的參數計算結果如下:
比如計算其中的P(want | i) = 0.33如下:
那么針對這個語料庫的二元模型建立好了后,我們可以計算我們的目標,即一個句子的概率了,一個例子如下:
P(<s> I want english food </s>) = P(I|<s>) × ?P(want|I) × P(english|want) × ?P(food|english) ?× ?P(</s>|food) = ?.000031
我們再看一下該二元模型所捕捉到的一些實際信息:
實際上常常在對數空間里面計算概率,原因有兩個: 1.防止溢出,可以看到,如果計算的句子很長,那么最后得到的結果將非常小,甚至會溢出,比如計算得到的概率是0.001,那么假設以10為底取對數的結果就是-3,這樣就不會溢出。 2.對數空間里面加法可以代替乘法,因為log(p1p2) = logp1 + logp2,而在計算機內部,顯然加法比乘法執行更快!
建立N-GRAM模型這里老師推薦了開源工具包,SRILM(?http://www.speech.sri.com/projects/srilm/),以及開源的N-GRAM數據集:http://ngrams.googlelabs.com/
我們能夠建立語言模型了,一般的我們在訓練集上得到語言模型的參數,在測試集里面來測試模型的性能,那么如何去衡量一個語言模型的好壞呢?比較兩個模型A,B好壞,一種外在的評價就是將AB放入具體的任務中,然后分別得到模型的準確率,這種方式當然是最好的方式,但這種方式的缺點是過于耗時,在實際情況中往往需要花費過多時間才能得到結果。另一種方式是使用下面要介紹的困惑度,但注意困惑度并不是上述外在評價的一個好的近似,所以一般使用在試點試驗上,所謂試點試驗就是一個小規模的初步研究,以評估一些性能。
困惑度
困惑度的基本評價方式是對測試集賦予高概率值的模型更好,一個句子W的困惑度(PP)定義如下:
對于二元模型,該公式為:
可以看到,概率越大,困惑度越小,即小的困惑度等于好的模型。且當wi之間是獨立的(一元模型),且等概率為p時,公式為:
比如計算一個只包含0~9數字序列的困惑度,每個數字發生的概率是1/10。那么我們得到困惑度PP(W) = 10。這里講義并沒有詳細的講一個測試集上的困惑度是如何定義的,需要一些信息論的概念,有機會再記錄學習筆記。
數據稀疏問題,就是由于有限的語料,產生了零概率問題,我們從前面一個例子看:
這個二元模型里面也是相當多的條件概率為0,再比如Shakespeare語料中,作為二元模型 進行訓練,結果有99.96%的條件概率為0,我們再看一個例子,在某個訓練集中:
… denied the allegations … denied the reports … denied the claims … denied the request
從這個訓練集,我們訓練得到模型,因為denied the offer在訓練集中從沒發生過,所以 P(“offer” | denied the) = 0
測試集如下: … denied the offer … denied the loan
當我們用這個模型在測試集中測試時,有P(denied the offer) = 0,模型試圖說明這個句子不太可能出現,而事實上只是它以前沒有見過而已,所以N-GRAM通常只在訓練集合和測試集很相似時預測效果才好,而這里出現的零概率問題,也導致不能計算困惑度,因為會導致分母為0。解決N-GRAM的零概率問題是很有必要的,下面討論一些方法。
平滑方法是用來解決上面語言模型的零概率問題,它的解決問題的基本思想就是把在訓練集中看到的概率分一點給未看到的,并保持概率和為1,我們看一個例子圖:對某個訓練集,計算P(w|denied the)后的統計圖:
經過平滑方法后,就變成如下:
下面看一些具體的平滑算法。
Laplace平滑
又稱加1平滑,加1 是由于其基本思想是保證所有計數結果至少出現一次,比如為二元模型時,計算公式如下:
這里V是語料詞匯量大小,可以想一想為什么分母是加V,因為要保證整個概率和為1,即固定w,對于某個條件概率P(wi | w)要有:
P(w1 | w) + P(w2 | w) + ... ?= ?1
即:
現在在分子上每一個計數都加1了,總共加了V個1,為了保證商為1,分母也要加V。
現在我們用這個平滑法將前面例子重新計數得到如下:
最后得到條件概率結果:
我們最開始講的平滑算法的都是把看見的概率分給了未看見的概率,我們重新計數一下,我們來對比一下到底分了多少,現在利用平滑后的概率計算新的計數:
利用這個公式,我們看下結果的對比:
所以能夠從中看到,對于語言模型,加1平滑并不是一個好的平滑方法,因為它將某些原來的計數大幅削減用于補償那些未看見的計數。 但它用于一些文本分類還是不錯的。
刪除插值
刪除插值使用線性插值的手段,將高階模型和低階模型做線性組合,例如計算三元語法時,把一元語法,二元語法和三元語法結合起來,每種語法用線性權值λ?來加權,公式如下:
還可以把每個λ看成上下文相關的函數,進一步擴展該公式為:(這里沒怎么看明白講義)
為了確定參數λ i,將原始語料中一部分作為留存數據(held-out data),即現在有三個數據集:
用最小化留存數據的困惑度來求的λ i: 1. 求出training data初始模型,并初始化λ i 2.數據集選擇留存數據,選擇λ i使得下面的概率最大化
Stupid backoff
backoff是退避的意思,回退的含義是比如要計算p(wn | wn-2,wn-1),但沒有相關的三元統計,就可以使用二元語法P(wn | wn-2)來估計,如果沒有相關的二元統計,那么我們就用一元模型P(wn)來估計。對于一些龐大的語料庫,比如Google N-gram語料庫,不能直接 拿來用,需要進行剪枝,縮小其規模,如僅使用出現頻率大于閾值的n-gram,去掉一些高階的n-grams等,另外在存儲效率上,也可以改變存儲的數據結構,改變數據類型等方法。對于這類大規模語料建立的語言模型,所用的平滑方法叫做Stupid backoff:
更好的平滑算法
前面介紹了加1平滑,效果不是很好,更一般的,我們有加k平滑,形式如下:
其中分母V仍然是語料詞匯量大小,至于為什么是加kV,可以用前面的推導證實?,F在把這個式子轉換一下,令
將m帶入到加k平滑算法中:
再得到如下公式,與一元模型概率相關(不知道這一步怎么推導過來的)
Unigram Prior平滑效果比較好,但對于語言模型來說仍然不夠好。下面依次介紹Good-Turing,Kneser-Ney,Witten-Bell,這幾種平滑算法都是用我們只出現一次的計數去估計未看見的。
Good-Turing(古德-圖靈)平滑算法
先介紹一個記號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,那么c * Nc =頻數為c的詞數
了解了這個以后,在舉一個例子來說明直觀的理解Good-Turing,假設現某人在釣魚且結果如下:
10 carp, 3 perch, 2 whitefish, 1 trout, 1 salmon, 1 eel = 18 fish
那么下一條魚是trout的概率是多少? 因為上面trout出現了一次,所以概率是1/18,那如果下一條魚是新的種類的概率是多少? 因為Good-Turing是將看過一次的計數去估計未看見的,上面N1 = 3,所以概率是3/18,如果用這樣的假設的話,只看過一次的概率就要打折分給未看見的,所以前面第一個問題的下一條魚的概率一定會小于1/18,下面看一下Good-Turing的計算公式:
所以對下一條是未看見的魚種類的概率:
那么下一條是僅看過一次的魚種類就如下計算:
可以看到,在最大似然估計下P(trout) = 1/18,現在折扣了2/3,那么對于發生了2次概率呢,比如求下一條魚是whitefish的概率?c=2時,按照古德-圖靈公式c* = 3/2,那么出現兩次詞語的概率就是3/2/18。所以對于Nk,k重新計數如下:
那么發生了k次詞語的概率計算如下:
下面對一個樣例應用圖靈-估計時,計算打折后的數據如下:
一般而言Nk > Nk+1,即發生次數少的單詞數多,比如只出現過一次的單詞就要比出現兩次的單詞多,出現兩次的單詞就要比出現3詞的單詞多,可以如下圖:
那么這種估計存在一個問題,比如按照公式計算發生高頻數的詞語,c* =(c+1)Nc+1 / Nc,由于c越大,后面就可能不連貫,即Nc+1很可能等于0,所以新的計數結果為0,可以將后面的處理為連續的平滑曲線來做計算,如下:
Kneser-Ney Smoothing
我們再看一下古德-圖靈估計的結果:
后面的折扣看上去很固定,大概都是c* = (c - 0.75)左右,即古德-圖靈的平滑的折扣是比較固定的,由此引出絕對減值法,下面看絕對減值法的一般公式: 在公式里面我們不直接計算一元模型概率P(w),我們看一個例子:
I can’t see without my reading___________?
下面一個詞的是glasses比Francisco更有可能,盡管從一元模型上來說,Francisco出現的概率很高,但它都是跟著San后面出現的,由此,并不直接計算P(w),而是計算,表示有多可能w會作為新的延續出現,對每一個詞,計算有多少不同的二元統計,即中有多少個不同的wi-1。
所以我們得到計算公式:
分母表示總共有多少個不同的二元統計,用這個公式,就可以看到比較平常的Francisco只能得到較低的概率。所以我們得到Kneser-Ney平滑算法:
其中
更一般的Kneser-Ney遞歸形式如下:
其中Ckn計算方式如下:
內容提綱:
1. N-GRAM介紹 2. 參數估計 3.?語言模型的評價 4. 數據稀疏問題 5. 平滑方法
N-GRAM介紹
現在很多的應用中,需要計算一個句子的概率,一個句子是否合理,就看看它的可能性大小,這里可能性的大小就用概率來衡量。比如下面幾個例子:
- 在機器翻譯中:
- 拼寫檢查中:
- 語音識別中:
上面的幾個例子中都需要計算一個句子的概率,以作為判斷其是否合理的依據。下面將上述的內容形式化描述。 我們需要計算一個句子或序列W的概率: P(W) ?= ?P(w 1 ,w 2 ,w 3 ,w 4 ,w 5 …w n )? 其中我們也需要計算一個相關的任務,比如P(w 5 |w 1 ,w 2 ,w 3 ,w 4 ),表示w 1 w 2 w 3 w 4?后面是w 5的概率,即下一個詞的概率。 像這樣計算P(W)或者P(w n |w 1 ,w 2 …w n--‐1 ) ?的模型叫做語言模型( language ?model簡稱LM)。
那么如何計算P(W)呢?用概率的鏈式規則,鏈式規則常常用來評估隨機變量的聯合概率,鏈式規則如下:
將上面的鏈式規則計算P(W)可以寫作如下:
按照鏈式規則計算方式,舉例如下: P(“its water is so transparent”) = P(its) × P(water|its) × ?P(is|its water) × ?P(so|its water is) × ?P(transparent|its water is so) 那么下面的問題是如何計算上面每一個概率,比如?P(transparent|its water is so),一種比較直觀的計算就是計數然后用除法:
事實上不能用這種方式去計算條件概率,原因有兩個: 1.直接這樣計算會導致參數空間過大,一個語言模型的參數就是所有的這些條件概率,試想按上面方式計算P(w 5 |w 1 ,w 2 ,w 3 ,w 4 ),這里w i都有一個詞典大小取值的可能,記作|V|,則該模型的參數個數是|V|^5,而且這還不包含P(w 4 | w1, w2, w3)的個數,可以看到這樣去計算條件概率會使語言模型參數個數過多而無法實用。 2.數據稀疏嚴重,我的理解是像上面那樣計數計算,比如計數分子its water is so transparen,在我們所能見的文本中出現的次數是很小的,這樣計算的結果是過多的條件概率會等于0,因為我們根本沒有看到足夠的文本來統計!
上面的計算方式是通過馬爾科夫假設進行簡化的,馬兒可夫假設是指假設第wi個詞語只與它前面的k個詞語相關,這樣我們就得到前面的條件概率計算簡化如下:
這樣我們的P(W)計算簡化如下:
當k = 0時,這個時候對應的模型叫做一元模型(Unigram ?model),即wi與它前面的0個詞相關,即wi不與任何詞相關,每一個詞都是相互獨立的,P(W)計算如下:
當k = 1時,對應的模型叫做二元模型(Bigram ?model),此時wi與它前面一個詞相關,P(W)計算如下:
同樣的,我們可以讓k = 2,叫做 trigrams,4-grams,5-grams,當k = N - 1,模型成為n元模型,即N-grams。
總的來說,N-grams有一些不足,因為語言存在一個長距離依賴關系,比如考慮下面的句子:
“The computer which I had just put into the machine room on the fifth floor crashed.”
假如我們要預測最后一個詞語crashed出現的概率,如果采用二元模型,那么crashed與floor實際關聯可能性應該非常小,相反的,這句子的主語computer與crashed的相關性很大,但是n-grams并沒有捕捉到這個信息。
參數估計
要計算出模型中的條件概率,這些條件概率也稱為模型的參數,得到這些參數的過程稱為訓練。用最大似然性估計計算下面的條件概率:
其中c(wi-1)表示wi-1出現的次數,是count的首字母c。對一小段文本看一個例子:
其中<s><\s>分別表示一個句子的開頭和結束,s即start的意思。計算這段文本的二元模型如下:
比如計算P(I | <s>)表示I作為句子開頭的概率:
再看一個例子,這個例子來自大一點的語料庫,為了計算對應的二元模型的參數,即P(wi | wi-1),我們要先計數即c(wi-1,wi),然后計數c(wi-1),再用除法可得到這些條件概率??梢钥吹綄τ赾(wi-1,wi)來說,wi-1有語料庫詞典大小(記作|V|)的可能取值,wi也是,所以c(wi-1,wi)要計算的個數有|V|^2。c(wi-1,wi)計數結果如下:
c(wi-1)的計數結果如下:
那么二元模型的參數計算結果如下:
比如計算其中的P(want | i) = 0.33如下:
那么針對這個語料庫的二元模型建立好了后,我們可以計算我們的目標,即一個句子的概率了,一個例子如下:
P(<s> I want english food </s>) = P(I|<s>) × ?P(want|I) × P(english|want) × ?P(food|english) ?× ?P(</s>|food) = ?.000031
我們再看一下該二元模型所捕捉到的一些實際信息:
實際上常常在對數空間里面計算概率,原因有兩個: 1.防止溢出,可以看到,如果計算的句子很長,那么最后得到的結果將非常小,甚至會溢出,比如計算得到的概率是0.001,那么假設以10為底取對數的結果就是-3,這樣就不會溢出。 2.對數空間里面加法可以代替乘法,因為log(p1p2) = logp1 + logp2,而在計算機內部,顯然加法比乘法執行更快!
建立N-GRAM模型這里老師推薦了開源工具包,SRILM(?http://www.speech.sri.com/projects/srilm/),以及開源的N-GRAM數據集:http://ngrams.googlelabs.com/
語言模型的評價
我們能夠建立語言模型了,一般的我們在訓練集上得到語言模型的參數,在測試集里面來測試模型的性能,那么如何去衡量一個語言模型的好壞呢?比較兩個模型A,B好壞,一種外在的評價就是將AB放入具體的任務中,然后分別得到模型的準確率,這種方式當然是最好的方式,但這種方式的缺點是過于耗時,在實際情況中往往需要花費過多時間才能得到結果。另一種方式是使用下面要介紹的困惑度,但注意困惑度并不是上述外在評價的一個好的近似,所以一般使用在試點試驗上,所謂試點試驗就是一個小規模的初步研究,以評估一些性能。
困惑度
困惑度的基本評價方式是對測試集賦予高概率值的模型更好,一個句子W的困惑度(PP)定義如下:
對于二元模型,該公式為:
可以看到,概率越大,困惑度越小,即小的困惑度等于好的模型。且當wi之間是獨立的(一元模型),且等概率為p時,公式為:
比如計算一個只包含0~9數字序列的困惑度,每個數字發生的概率是1/10。那么我們得到困惑度PP(W) = 10。這里講義并沒有詳細的講一個測試集上的困惑度是如何定義的,需要一些信息論的概念,有機會再記錄學習筆記。
數據稀疏問題
數據稀疏問題,就是由于有限的語料,產生了零概率問題,我們從前面一個例子看:
這個二元模型里面也是相當多的條件概率為0,再比如Shakespeare語料中,作為二元模型 進行訓練,結果有99.96%的條件概率為0,我們再看一個例子,在某個訓練集中:
… denied the allegations … denied the reports … denied the claims … denied the request
從這個訓練集,我們訓練得到模型,因為denied the offer在訓練集中從沒發生過,所以 P(“offer” | denied the) = 0
測試集如下: … denied the offer … denied the loan
當我們用這個模型在測試集中測試時,有P(denied the offer) = 0,模型試圖說明這個句子不太可能出現,而事實上只是它以前沒有見過而已,所以N-GRAM通常只在訓練集合和測試集很相似時預測效果才好,而這里出現的零概率問題,也導致不能計算困惑度,因為會導致分母為0。解決N-GRAM的零概率問題是很有必要的,下面討論一些方法。
平滑方法
平滑方法是用來解決上面語言模型的零概率問題,它的解決問題的基本思想就是把在訓練集中看到的概率分一點給未看到的,并保持概率和為1,我們看一個例子圖:對某個訓練集,計算P(w|denied the)后的統計圖:
經過平滑方法后,就變成如下:
下面看一些具體的平滑算法。
Laplace平滑
又稱加1平滑,加1 是由于其基本思想是保證所有計數結果至少出現一次,比如為二元模型時,計算公式如下:
這里V是語料詞匯量大小,可以想一想為什么分母是加V,因為要保證整個概率和為1,即固定w,對于某個條件概率P(wi | w)要有:
P(w1 | w) + P(w2 | w) + ... ?= ?1
即:
現在在分子上每一個計數都加1了,總共加了V個1,為了保證商為1,分母也要加V。
現在我們用這個平滑法將前面例子重新計數得到如下:
最后得到條件概率結果:
我們最開始講的平滑算法的都是把看見的概率分給了未看見的概率,我們重新計數一下,我們來對比一下到底分了多少,現在利用平滑后的概率計算新的計數:
利用這個公式,我們看下結果的對比:
所以能夠從中看到,對于語言模型,加1平滑并不是一個好的平滑方法,因為它將某些原來的計數大幅削減用于補償那些未看見的計數。 但它用于一些文本分類還是不錯的。
刪除插值
刪除插值使用線性插值的手段,將高階模型和低階模型做線性組合,例如計算三元語法時,把一元語法,二元語法和三元語法結合起來,每種語法用線性權值λ?來加權,公式如下:
還可以把每個λ看成上下文相關的函數,進一步擴展該公式為:(這里沒怎么看明白講義)
為了確定參數λ i,將原始語料中一部分作為留存數據(held-out data),即現在有三個數據集:
用最小化留存數據的困惑度來求的λ i: 1. 求出training data初始模型,并初始化λ i 2.數據集選擇留存數據,選擇λ i使得下面的概率最大化
Stupid backoff
backoff是退避的意思,回退的含義是比如要計算p(wn | wn-2,wn-1),但沒有相關的三元統計,就可以使用二元語法P(wn | wn-2)來估計,如果沒有相關的二元統計,那么我們就用一元模型P(wn)來估計。對于一些龐大的語料庫,比如Google N-gram語料庫,不能直接 拿來用,需要進行剪枝,縮小其規模,如僅使用出現頻率大于閾值的n-gram,去掉一些高階的n-grams等,另外在存儲效率上,也可以改變存儲的數據結構,改變數據類型等方法。對于這類大規模語料建立的語言模型,所用的平滑方法叫做Stupid backoff:
更好的平滑算法
前面介紹了加1平滑,效果不是很好,更一般的,我們有加k平滑,形式如下:
其中分母V仍然是語料詞匯量大小,至于為什么是加kV,可以用前面的推導證實?,F在把這個式子轉換一下,令
將m帶入到加k平滑算法中:
再得到如下公式,與一元模型概率相關(不知道這一步怎么推導過來的)
Unigram Prior平滑效果比較好,但對于語言模型來說仍然不夠好。下面依次介紹Good-Turing,Kneser-Ney,Witten-Bell,這幾種平滑算法都是用我們只出現一次的計數去估計未看見的。
Good-Turing(古德-圖靈)平滑算法
先介紹一個記號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,那么c * Nc =頻數為c的詞數
了解了這個以后,在舉一個例子來說明直觀的理解Good-Turing,假設現某人在釣魚且結果如下:
10 carp, 3 perch, 2 whitefish, 1 trout, 1 salmon, 1 eel = 18 fish
那么下一條魚是trout的概率是多少? 因為上面trout出現了一次,所以概率是1/18,那如果下一條魚是新的種類的概率是多少? 因為Good-Turing是將看過一次的計數去估計未看見的,上面N1 = 3,所以概率是3/18,如果用這樣的假設的話,只看過一次的概率就要打折分給未看見的,所以前面第一個問題的下一條魚的概率一定會小于1/18,下面看一下Good-Turing的計算公式:
所以對下一條是未看見的魚種類的概率:
那么下一條是僅看過一次的魚種類就如下計算:
可以看到,在最大似然估計下P(trout) = 1/18,現在折扣了2/3,那么對于發生了2次概率呢,比如求下一條魚是whitefish的概率?c=2時,按照古德-圖靈公式c* = 3/2,那么出現兩次詞語的概率就是3/2/18。所以對于Nk,k重新計數如下:
那么發生了k次詞語的概率計算如下:
下面對一個樣例應用圖靈-估計時,計算打折后的數據如下:
一般而言Nk > Nk+1,即發生次數少的單詞數多,比如只出現過一次的單詞就要比出現兩次的單詞多,出現兩次的單詞就要比出現3詞的單詞多,可以如下圖:
那么這種估計存在一個問題,比如按照公式計算發生高頻數的詞語,c* =(c+1)Nc+1 / Nc,由于c越大,后面就可能不連貫,即Nc+1很可能等于0,所以新的計數結果為0,可以將后面的處理為連續的平滑曲線來做計算,如下:
Kneser-Ney Smoothing
我們再看一下古德-圖靈估計的結果:
后面的折扣看上去很固定,大概都是c* = (c - 0.75)左右,即古德-圖靈的平滑的折扣是比較固定的,由此引出絕對減值法,下面看絕對減值法的一般公式: 在公式里面我們不直接計算一元模型概率P(w),我們看一個例子:
I can’t see without my reading___________?
下面一個詞的是glasses比Francisco更有可能,盡管從一元模型上來說,Francisco出現的概率很高,但它都是跟著San后面出現的,由此,并不直接計算P(w),而是計算,表示有多可能w會作為新的延續出現,對每一個詞,計算有多少不同的二元統計,即中有多少個不同的wi-1。
所以我們得到計算公式:
分母表示總共有多少個不同的二元統計,用這個公式,就可以看到比較平常的Francisco只能得到較低的概率。所以我們得到Kneser-Ney平滑算法:
其中
更一般的Kneser-Ney遞歸形式如下:
其中Ckn計算方式如下:
Continuation count就是上面介紹的計算多少個不同的統計,比如二元的wi-1,wi,那么Ckn(wi-1, wi) = |{wi-1: c(wi-1, wi)}|
原文地址: http://blog.csdn.net/a635661820/article/details/43906731
總結
以上是生活随笔為你收集整理的Statistical language model 统计语言模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LSTM简介以及数学推导(FULL BP
- 下一篇: 图解LSTM神经网络架构及其11种变体(