1. 程式人生 > >系統學習NLP(四)--資料平滑

系統學習NLP(四)--資料平滑

轉子:https://blog.csdn.net/fuermolei/article/details/81353746

在自然語言處理中,經常要計算單詞序列(句子)出現的概率估計。但是,演算法訓練的時候,預料庫中不可能包含所有可能出現的序列,因此為了防止對訓練樣本中為出現的新序列概率估計值為零,人們發明了不少可以改善估計新序列出現的概率演算法,即資料的平滑。最常見的資料平滑演算法包括如下幾種:

  1. Add-one (Laplace) smoothing

  2. Add-k smoothing

  3. Backoff回退法

  4. Interpolation插值法

  5. Absolute discounting

  6. Kneser-Ney smoothing

  7. Modified Kneser-ney smoothing

這幾個方法實際上可以簡單的理解為三種不同的方法:第一種型別為政府給大家每人一筆或者幾筆錢(如1和2),第二種為找父母要(如3和4),最後一種就是劫富濟貧(如5-7)。下面依次簡單介紹上面的方法,具體詳細的介紹,大家可以參閱相應的論文和書籍。

資料預處理

在介紹上面幾種平滑的方法之前,這裡先給出一個簡單的的資料預處理的方法,特別是對於OOV(需要訓練的詞不在詞袋裡面)的情況特別有效,而且如果訓練的時候,如果有幾十萬的詞彙,一般不會對這幾十萬的詞彙進行全部訓練,而是需要預先做下面的處理後再進行資料的平滑和訓練。

假設訓練資料集中出現了|N|個不同的詞彙,那麼可以根據詞頻對這些詞彙進行排序,可以選擇詞頻最高的M個詞彙作為我們的詞彙集合,這樣在訓練和測試資料集中,將不屬於V的詞彙都替換成特殊的詞彙UNK,這樣可以大大減少計算量,也可以提高計算的精度。

Add-one (Laplace) smoothing

Add-one 是最簡單、最直觀的一種平滑演算法,既然希望沒有出現過的N-gram的概率不再是0,那就直接規定在訓練時任何一個N-gram在訓練預料至少出現一次(即規定沒有出現的,在語料中也出現一次),因此:Countnew(n-gram) = countold(n-gram)+1;

於是對於n-gram的模型而言,假設V是所有可能的不同的N-gram的型別個數,那麼根據貝葉斯公式有

當然這裡的n-gram的可以相應的改成uingram和bigram表示式,並不影響。其中C(x)為x在訓練中出現的次數,wi為給定的訓練資料中第i個單詞。

這樣一來,訓練語料庫中出現的n-gram的概率不再為0,而是一個大於0的較小的概率值,Add-one平滑演算法確實解決了我們的問題,但是顯然它也並不完美,由於訓練語料中未出現的n-gram數量太多,平滑後,所有未出現的佔據了整個概率分佈的一個很大的比例,因此,在自然語言處理中,Add-one給語料庫中沒有出現的n-gram分配了太多的概率空間。此外所有沒有出現的概率相等是不是合理,這也是需要考慮的。

Add-k smoothing

由Add-one衍生出來的另一種演算法就是Add-k,既然我們認為加1有點過了,那麼我們可以選擇一個小於1的正數k,概率計算公式就可以變成如下表達式:

它的效果通常會比Add-one好,但是依舊沒有辦法解決問題,至少在實踐中,k必須認為的給定,而這個值到底多少該取多少都沒有辦法確定。

Backoff回退法

 

回退模型,思路實際上是:如果你自己有錢,那麼就自己出錢,如果你自己沒有錢,那麼就你爸爸出,如果你爸爸沒有錢,就你爺爺出,舉一個例子,當使用Trigram的時候,如果Count(trigram)滿足條件就使用,否則使用Bigram,再不然就使用Unigram.

它也被稱為:Katz smoothing,具體的可以去檢視相應的書籍。

它的表示式為:

其中d,a和k分別為引數。k一般選擇為0,但是也可以選其它的值。

Interpolation插值法

插值法和回退法的思想非常相似,設想對於一個trigram的模型,我們要統計語料庫中“”“I like chinese food”出現的次數,結果發現它沒有出現,則計數為0,在回退策略中們將會試著用低階的gram來進行替代,也就是用“like chinese food”出現的次數來替代。在使用插值的時候,我們把不同階層的n-gram的模型線性疊加組合起來之後再使用,簡單的如trigram的模型,按照如下的方式進行疊加:

引數可以憑藉經驗進行設定,也可以通過特定的演算法來進行確定,比如EM演算法。對於資料一般可以分為: traning set, development set, testing set. 那麼P的概率使用training set進行訓練得出,lamda引數使用development set得到。

Absolute discounting

插值法使用的引數實際上沒有特定的選擇,如果將lamda引數根據上下文進行選擇的話就會演變成Absolute discounting。對於這個演算法的基本想法是,有錢的,每個人交固定的稅D,建立一個基金,沒有錢的根據自己的爸爸有多少錢分這個基金。比如對於bigram的模型來說,有如下公式。

D為引數,可以通過測試優化設定。

Kneser-Ney smoothing

這種演算法是目前一種標準的而且是非常先進的平滑演算法,它其實相當於前面講過的幾種演算法的綜合。它的思想實際上是:有錢的人,每個人交一個固定的稅D,大家一起建立一個基金,沒有錢的呢,根據自己的的爸爸的“交際的廣泛”的程度來分了這個基金。這裡交際的廣泛實際上是指它爸爸會有多少種不同的型別,型別越多,這說明越好。其定義式為:

其中max(c(X)-D,0)的意思是要保證最後的計數在減去一個D後不會變成一個負數,D一般大於0小於1。這個公式遞迴的進行,直到對於Unigram的時候停止。而lamda是一個正則化的常量,用於分配之前的概率值(也就是從高頻詞彙中減去的準備分配給哪些未出現的低頻詞的概率值(分基金池裡面的基金))。其表達是為:

PKN是在wi固定的情況下,unigram和bigram數目的比值,這裡需要注意的是PKN是一個分佈,它是一個非負的值,求和的話為1。

Modified Kneser-ney smoothing

這一種方法是上一種方法的改進版,而且也是現在最優的方法。上一個方法,每一個有錢的人都交一個固定的銳,這個必然會出現問題,就像國家收稅一樣,你有100萬和你有1個億交稅的量肯定不一樣這樣才是比較合理的,因此將上一種方法改進就是:有錢的每個人根據自己的收入不同交不同的稅D,建立一個基金,沒有錢的,根據自己的爸爸交際的廣泛程度來分配基金。

這裡D根據c來設定不同的值,比如c為unigram,則使用D1,c位bigram,則使用D2,如果是大於等於3階的使用D3.