nlp中的傳統語言模型與神經語言模型

weixin_34252090發表於2018-11-03

總有一些專有名詞聽上去“很屌”,瞭解了其概念後,便覺得:“哦,原來是這麼簡單的小知識點”。語言模型就是這樣一個名詞,作為nlp基礎元件之一,在諸多的上層應用中都有重要應用。

簡言之,語言模型就是給一個句子(詞序列)分配一個概率。這個概率表示這句話“合理程度”。舉個例子:

你兒子在我手上,快點把錢叫出來。 prob=0.80
# 這樣一個句子,非常“通順”,就得到一個很高的概率值。
川普在廁所裡擺滿了多個藝員。 prob=0.20
# 這樣一個句子,非常“怪異”,也可能是有別字、語病的,就得到一個很低的概率值。

把語言模型(詞序列-->概率)寫成公式,就得到了
.
上述公式使用了鏈式法則,即當前第n個詞用哪一個,完全取決於前n-1個詞。有了上面的公式,我們就可以基於訓練語料,計算一個句子的概率值了。這裡面有一個問題,每一個詞都取決於前n-1個詞,這使得計算複雜度猛增。為了簡化,採用了Markov-Assumption,即當前要選擇的詞僅僅依賴於前一個詞。有的同學可能會說,對於文字序列,每個當前詞僅取決於前一個詞,這樣會不會過於簡單?是的,太簡單了,所以傳統的語言模型往往採用了k階Markov-Assumption,,寫成公式:
.

很自然的,我們就可以通過對語料的統計,得出一個句子的概率。
傳統的語言模型也是這麼做的,假設表示詞序列在語料中出現的次數。那麼,對於一個詞“word”,運用公式就可以得到:

然後對計算得到的多個連乘,就得到了句子的概率。

這裡有個問題,即分母的等於0,怎麼辦?
有兩種處理方法,1. 平滑技術 2. back-off,又出現了兩個看起來很“屌”的詞彙,其原理其實非常簡單。

  1. 平滑技術
    既然分母有可能等於0,那我們就加一個常數,不讓其等於0,比如在分母處+1,這就是所謂的平滑。如下所示:

    平滑的技術有很多種,大多論文集中在1990-2000年之間,就不詳細介紹了。最常見的叫做平滑,即

    其中,是詞表大小,是(0,1]之間的常數。

  2. back-off
    退一步海闊天空,這可能就是back-off的由來吧,既然為0
    ,那就想辦法估計一個值出來。這裡我們直接給出最佳的“非神經網路語言模型”中使用到的辦法,如下所示,看起來很複雜,其實原理很簡單。

    若為0,則我們使用後一項估計,最後一項是用k-1元gram去估計k元ngram的值。

平滑和back-off的變種很多,詳見這篇論文:An Empirical Study of Smoothing Techniques for Language Modeling
非神經網路的最佳語言模型如下:

語言模型的評價--perplexity 困惑度
語言模型的變種有很多,如何評價語言模型的好壞呢?
公式如下:

其中,
困惑度值, 就是說一個詞序列越不合理,其困惑度越大,即讓你越困惑。。。這裡有個疑問,為什麼用上述公式,其本質是什麼,留給大家思考。

傳統語言模型的缺點是什麼?

  1. 平滑技術 or back-off,這類方法屬於人工設計規則,設計規則紛繁複雜,哪一種適合什麼樣的語料,難有定論。困惑度可以用於評價各種規則,但困惑度本身並不是一個完美的評價方法。
  2. 詞表為V的n-gram數目是,如果n每增加1,要計算的n-gram至少會倍增。
  3. 基於極大似然估計的語言模型缺少對上下文的泛化,比較“死板”。比如,原語料中出現白汽車、黑汽車,而沒有黃汽車,該語言模型就會影響對黃汽車的概率估計。當然,某些具體的nlp應用中,這種“死板”反而是一種優勢,這種語言模型的靈活性低,但能夠降低了recall,提升precision。舉個例子,比如,原語料中出現了黑馬、白馬,這時出現藍馬的概率就很低。而對於靈活的語言模型,很有可能藍馬的概率也偏高。

neural language model 神經語言模型

基於神經網路的語言模型能解決上述三個問題,其模型的數學表示式,簡寫如下:

以k元文法為例,前k-1個詞作為特徵,softmax預測最後一個詞。詞表可能很大,比如1000000,這時可以使用heiraichle softmax,能夠有效提升效果、節省預測時間。當然,還有一種NEC方法,通過一系列的二分類問題替換交叉熵目標函式。

例項總結

在機器翻譯任務中,傳統的語言模型和神經語言模型同時使用,會提升翻譯質量,模型之間似乎在互相補充。綜上所述,神經語言模型的泛化能力更好,傳統方法泛化能力差。紅馬、藍馬的例子中,我們看到泛化能力好,也不一定是優點。在合適的場景下,選擇適合的語言模型就ok了。在開發文字糾錯的應用過程中,我們採用了傳統的語言模型,因為神經語言模型的泛化能力過強,會帶來錯別字大量誤判,反而降低了系統的表現。

相關文章