由於語料不可能覆蓋掉所有的情況,比如語料中有“小明讀了一本書”, 那麼“小李讀了一本書”沒有在語料中出現按照MLE最大似然估計其機率就是0,這顯然是不合常理的。所以我們需要對模型進行光滑處理,就是要分一部分機率給語料中沒有出現的部分。
問題是如何分配,應該分配多少呢。(下面的課件來自nhu的NLP課程)
這種情況看上去我們分給未知部分的機率太多了24/29
更多的觀察更好的資料更小的光滑,分給未知部分23/326
一個極端的情況,這樣add one廣順 其實會認為未知事物機率更大,看到我們訓練中的資料的可能性很小。
可以看到對於大的詞典,我們分配給未知事物的機率太大了。為了減少未知事物分配的機率,我們可以將add 1改為add lamda, 0 < lamda < 1,如下面的公式B是詞典的大小,N是語料總token數目。
那麼lamda應該取多大呢?
留存估計
<<統計自然語言處理基礎>>p129。即我們觀察在訓練語料中出現了r次的ngram在更多文本比如一個預留的測試文本中出現的頻率估計。比如再訓練語料中出現2次的ngram有N2個,那麼這些type在測試文本中出現了一共T2次,那麼平均每一個type出現次數是T2/N2,機率估計就是T2/(N2*T),T是留存文本中的總token數目。比如訓練語料中出現為0的所有type,考察在測試文本中的出現次數按照上面的方法我們可以估算應該分配給未出現type的機率大小。可以參考P127表6.4。
一些常見的廣順方法
我們認為左邊的情況顯然應該更rare,因為分布更加集中,而右邊更加均勻,那麼nove events的機率更大些。
written-bell光順的主要思路是用T/N+T(T不包括N0)作為對所有未出現事物總的機率的估計。對於一個先前沒有看到的事件,使用在語料中看到這樣一個新事物的機率代替。
Good-Turing光順
使用回退
下面是《有點意思,拼音IME》中的解釋
一般的back-off模型的表示如下:
Ps(Wi|h) = Pd(Wi|h) -- C(h,Wi) > 0
bow(h).Ps(Wi|h') -- C(h,Wi) == 0
- h'是h去掉其第一個詞,對trigram (A,B,Wi)來說,h為(A,B),h'為B。
- Pd(Wi|h) < Pml(Wi|h),對最大似然估計進行打折(discount),可使用多種不同的打折方法。
- bow(h)被稱為back-off weight(回退權重),對於給定的h,bow(h)是一個常數,並且可以通過下面的方法來確定Ps(W1|h)+Ps(W2|h)+...+Ps(Wn|h) = sum_i (Ps(Wi|h)) = 1
- 上面這個式子是遞迴的,如果(h',Wi)出現次數為0,還會繼續回退,也許會回退到Wi,甚至回退到平均分配(如果Wi也未出現)
- 如果h在訓練中沒有見到,則P(Wi|h) = P(Wi|h')
Katz的back-off模型使用的是Good-Turing方法。Kneser-Ney是另一種back-off模型,其凹凸貼圖要好於Katz方法。Stanley Chen和Joshua Goodman專門寫過一篇論文,詳細比較了各種平滑方法的優劣,有興趣可以去讀一讀。
可以看到打折還是相同的打折,給未知事物和原有打折方法一樣的機率分配,但是具體分配到某個未知事物的時候不再是平均分配了,是和上層語境有關的,即和回退到上層的機率有關係的(the baby > the zygote),上層機率大的分配的也多(see the baby > see the zygote)。