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

一、課程介紹

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

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

課件彙總下載地址:斯坦福大學自然語言處理公開課課件彙總

二、語言模型(Language Model)

1)N-gram介紹

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

  • 機器翻譯: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

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可以更好的融入多種知識源,刻畫語言序列特點,較好的用於解決序列標註問題。

三、參考資料

  1. Lecture Slides: Language Modeling
  2. http://en.wikipedia.org
  3. 關毅,統計自然語言處理基礎 課程PPT
  4. 微軟拼音輸入法團隊,語言模型的基本概念
  5. 肖鏡輝,統計語言模型簡介
  6. fandywang,統計語言模型
  7. Stanley F. Chen and Joshua Goodman. An empirical study of smoothing techniques for language modeling. Computer Speech and 
    Language, 13:359-394, October 1999. 
  8. Thorsten Brants et al. Large Language Models in Machine Translation
  9. Gale & Sampson, Good-Turing Smoothing Without Tears
  10. Bill MacCartney,NLP Lunch Tutorial: Smoothing,2005

    P.S. :  基於本次筆記,整理了一份slides,分享下:http://vdisk.weibo.com/s/jzg7h   

   轉自: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

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