1. 程式人生 > >斯坦福大學自然語言處理第四課 語言模型(Language Modeling)筆記

斯坦福大學自然語言處理第四課 語言模型(Language Modeling)筆記

一、課程介紹

斯坦福大學於2012年3月在Coursera啟動了線上自然語言處理課程,由NLP領域大牛Dan Jurafsky 和 Chirs Manning教授授課:
https://class.coursera.org/nlp/

以下是本課程的學習筆記,以課程PPT/PDF為主,其他參考資料為輔,融入個人拓展、註解,拋磚引玉,歡迎大家在“我愛公開課”上一起探討學習。

二、語言模型(Language Model)

在實際應用中,我們經常需要解決這樣一類問題:如何計算一個句子的概率?如:

  • 機器翻譯:P(high winds tonite) > P(large winds tonite)
  • 拼寫糾錯
    :P(about fifteen minutes from) > P(about fifteenminuets from)
  • 語音識別:P(I saw a van) >> P(eyes awe of an)
  • 音字轉換:P(你現在幹什麼|nixianzaiganshenme) > P(你西安在幹什麼|nixianzaiganshenme)
  • 自動文摘、問答系統、... ...

以上問題的形式化表示如下:

p(S)=p(w1,w2,w3,w4,w5,…,wn)

      =p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)//鏈規則

p(S)被稱為語言模型,即用來計算一個句子概率的模型。

那麼,如何計算p(wi|w1,w2,...,wi-1)呢?最簡單、直接的方法是直接計數做除法,如下:

p(wi|w1,w2,...,wi-1) = p(w1,w2,...,wi-1,wi) / p(w1,w2,...,wi-1)

但是,這裡面臨兩個重要的問題:資料稀疏嚴重;引數空間過大,無法實用。

基於馬爾科夫假設(Markov Assumption):下一個詞的出現僅依賴於它前面的一個或幾個詞。

  • 假設下一個詞的出現依賴它前面的一個詞,則有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2

,...,wn-1)

      =p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)   // bigram

  • 假設下一個詞的出現依賴它前面的兩個詞,則有:

p(S)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn-1)

      =p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|wn-1,wn-2)  // trigram 

那麼,我們在面臨實際問題時,如何選擇依賴詞的個數,即n。

  • 更大的n:對下一個詞出現的約束資訊更多,具有更大的辨別力
  • 更小的n:在訓練語料庫中出現的次數更多,具有更可靠的統計資訊,具有更高的可靠性。

理論上,n越大越好,經驗上,trigram用的最多,儘管如此,原則上,能用bigram解決,絕不使用trigram。

2)構造語言模型

通常,通過計算最大似然估計(Maximum Likelihood Estimate)構造語言模型,這是對訓練資料的最佳估計,公式如下:

p(w1|wi-1) = count(wi1-, wi) / count(wi-1)

如給定句子集“<s> I am Sam </s>

                 <s> Sam I am </s>

                 <s> I do not like green eggs and ham </s>”

部分bigram語言模型如下所示:

c(wi)如下:

c(wi-1,wi)如下:

則bigram為:

那麼,句子“<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)

                                              =  .000031

為了避免資料溢位、提高效能,通常會使用取log後使用加法運算替代乘法運算。

log(p1*p2*p3*p4) = log(p1) + log(p2) + log(p3) + log(p4)

推薦開源語言模型工具:

推薦開源n-gram資料集:

Total number of tokens: 1,306,807,412,486

Total number of sentences: 150,727,365,731

Total number of unigrams: 95,998,281

Total number of bigrams: 646,439,858

Total number of trigrams: 1,312,972,925

Total number of fourgrams: 1,396,154,236

Total number of fivegrams: 1,149,361,413

Total number of n-grams: 4,600,926,713

  • Chinese Web 5-gram(http://www.ldc.upenn.edu/Catalog/catalogEntry.jsp?catalogId=LDC2010T06)

3)語言模型評價

語言模型構造完成後,如何確定好壞呢? 目前主要有兩種評價方法:

  • 實用方法:通過檢視該模型在實際應用(如拼寫檢查、機器翻譯)中的表現來評價,優點是直觀、實用,缺點是缺乏針對性、不夠客觀;
  • 理論方法:迷惑度/困惑度/混亂度(preplexity),其基本思想是給測試集賦予較高概率值的語言模型較好,公式如下:

由公式可知,迷惑度越小,句子概率越大,語言模型越好。使用《華爾街日報》訓練資料規模為38million words構造n-gram語言模型,測試集規模為1.5million words,迷惑度如下表所示:

4)資料稀疏與平滑技術

大規模資料統計方法與有限的訓練語料之間必然產生資料稀疏問題,導致零概率問題,符合經典的zip'f定律。如IBM, Brown:366M英語語料訓練trigram,在測試語料中,有14.7%的trigram和2.2%的bigram在訓練語料中未出現。

資料稀疏問題定義:“The problem of data sparseness, also known as the zero-frequency problem arises when analyses contain configurations that never occurred in the training corpus.  Then it is not possible to estimate probabilities from observed frequencies, and some other estimation scheme that can generalize (that configurations) from the training data has to be used. —— Dagan”。

人們為理論模型實用化而進行了眾多嘗試與努力,誕生了一系列經典的平滑技術,它們的基本思想是“降低已出現n-gram條件概率分佈,以使未出現的n-gram條件概率分佈非零”,且經資料平滑後一定保證概率和為1,詳細如下:

  • Add-one(Laplace) Smoothing

加一平滑法,又稱拉普拉斯定律,其保證每個n-gram在訓練語料中至少出現1次,以bigram為例,公式如下:

其中,V是所有bigram的個數。

承接上一節給的例子,經Add-one Smoothing後,c(wi-1, wi)如下所示:

則bigram為:

在V >> c(wi-1)時,即訓練語料庫中絕大部分n-gram未出現的情況(一般都是如此),Add-one Smoothing後有些“喧賓奪主”的現象,效果不佳。那麼,可以對該方法擴充套件以緩解此問題,如Lidstone's Law,Jeffreys-Perks Law。

  • Good-Turing Smoothing

其基本思想是利用頻率的類別資訊對頻率進行平滑。調整出現頻率為c的n-gram頻率為c*:

但是,當nr+1或者nr > nr+1時,使得模型質量變差,如下圖所示:

直接的改進策略就是“對出現次數超過某個閾值的gram,不進行平滑,閾值一般取8~10”,其他方法請參見“Simple Good-Turing”。

  • Interpolation Smoothing

不管是Add-one,還是Good Turing平滑技術,對於未出現的n-gram都一視同仁,難免存在不合理(事件發生概率存在差別),所以這裡再介紹一種線性插值平滑技術,其基本思想是將高階模型和低階模型作線性組合利用低元n-gram模型對高元n-gram模型進行線性插值。因為在沒有足夠的資料對高元n-gram模型進行概率估計時,低元n-gram模型通常可以提供有用的資訊。公式如下:

擴充套件方式(上下文相關)為:

λs可以通過EM演算法來估計,具體步驟如下:

  • 首先,確定三種資料:Training data、Held-out data和Test data;

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

如Google N-gram語料庫,壓縮檔案大小為27.9G,解壓後1T左右,面對如此龐大的語料資源,使用前一般需要先剪枝(Pruning)處理,縮小規模,如僅使用出現頻率大於threshold的n-gram,過濾高階的n-gram(如僅使用n<=3的資源),基於熵值剪枝,等等。

另外,在儲存優化方面也需要做一些優化,如使用trie資料結構儲存,藉助bloom filter輔助查詢,把string對映為int型別處理(基於huffman編碼、Varint等方法),float/double轉成int型別(如概率值精確到小數點後6位,然後乘10E6,即可將浮點數轉為整數)。

2007年Google Inc.的Brants et al.提出了針對大規模n-gram的平滑技術——“Stupid Backoff”,公式如下:

資料平滑技術是構造高魯棒性語言模型的重要手段,且資料平滑的效果與訓練語料庫的規模有關。訓練語料庫規模越小,資料平滑的效果越顯著;訓練語料庫規模越大,資料平滑的效果越不顯著,甚至可以忽略不計——錦上添花。

5)語言模型變種

  • Class-based N-gram Model

該方法基於詞類建立語言模型,以緩解資料稀疏問題,且可以方便融合部分語法資訊。

  • Topic-based N-gram Model

該方法將訓練集按主題劃分成多個子集,並對每個子集分別建立N-gram語言模型,以解決語言模型的主題自適應問題。架構如下:

  • Cache-based N-gram Model

該方法利用cache快取前一時刻的資訊,以用於計算當前時刻概率,以解決語言模型動態自適應問題。

-People tends to use words as few as possible in the article. 

-If a word has been used, it would possibly be used again in the future.

架構如下:

猜測這是目前QQ、搜狗、谷歌等智慧拼音輸入法所採用策略,即針對使用者個性化輸入日誌建立基於cache的語言模型,用於對通用語言模型輸出結果的調權,實現輸入法的個性化、智慧化。由於動態自適應模組的引入,產品越用越智慧,越用越好用,越用越上癮。

  • Skipping N-gram Model&Trigger-based N-gram Model

二者核心思想都是刻畫遠距離約束關係。

  • 指數語言模型:最大熵模型MaxEnt、最大熵馬爾科夫模型MEMM、條件隨機域模型CRF

傳統的n-gram語言模型,只是考慮了詞形方面的特徵,而沒有詞性以及語義層面上的知識,並且資料稀疏問題嚴重,經典的平滑技術也都是從統計學角度解決,未考慮語法、語義等語言學作用。

MaxEnt、MEMM、CRF可以更好的融入多種知識源,刻畫語言序列特點,較好的用於解決序列標註問題。

三、參考資料

   轉自:http://52opencourse.com/111/%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E7%AC%AC%E5%9B%9B%E8%AF%BE-%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%EF%BC%88language-modeling%EF%BC%89