【NLP】n-gram LM & NN LM

n-gram LM

語言模型是生成模型,是一個泛泛的概念,通俗來講,就是給定一句話的前半部分,預測生成剩餘的部分。這裏主要介紹一個簡單的LM方法,n-gram。

任務描述

輸入一個句子的開頭單詞:比如 I;

輸出最有可能生成的完整的句子,比如:I love NLP.

假設S代表了整個句子,包含單詞W1,W2,…,則我們的目標是逐個單詞生成句子,使得最後的句子的概率P(S)最大。根據極大似然估計:

maxP(S)=maxP(W1,W2,...,WN)=maxP(W1)P(W2W1)P(W3W1,W2)...P(WNW1,...,WN1)\max P(S) = \max P(W_1,W_2,...,W_N)= \max P(W_1)P(W_2|W_1)P(W_3|W_1,W_2)...P(W_N|W_1,...,W_{N-1})

模型結構

n-gram模型假設當前生成的單詞只與其前面的n-1個單詞有關,即:

Bigram/2-gram: P(W1,W2,...,WN)=i=2NP(WiWi1)\text{Bigram/2-gram: } P(W_1,W_2,...,W_N) = \prod_{i=2}^N P(W_i|W_{i-1})

Trigram/3-gram: P(W1,W2,...,WN)=i=3NP(WiWi2,Wi1)\text{Trigram/3-gram: } P(W_1,W_2,...,W_N) = \prod_{i=3}^N P(W_i|W_{i-2},W_{i-1})

假設我們這裏使用3-gram,那麼問題轉換成了如何求解每個3-gram對應的概率,假設我們有一個大訓練集,裏面包含了許多句子語料,那麼我們可以根據統計來計算每個3-gram的概率:

P(W3W1,W2)=Count(W1,W2,W3)Count(W1,W2)P(W_3|W_1,W_2) = \frac{Count(W_1,W_2,W_3)}{Count(W_1,W_2)}

然後逐個生成句子的下一個單詞。

Tricks

在 n-gram LM中有一些小技巧可以幫助提升模型的能力。

Smoothing

當語料庫中語料不充分時會發生某些單詞組合“0出現”的情況,如果不做提前處理,那麼這些單詞組合對應的概率都會爲0,這顯然是不對的,因爲我們不能籠統的把未出現的單詞的概率一改歸結爲0。此外,我們也需要保證上述通過count計算概率的公式中分母不爲0。這個問題統稱爲數據稀疏問題。因此這裏引入了“smoothing” 平滑技巧。 “smoothing”有很多種類,這裏介紹幾種常見的。

  1. add-1 smoothing,V爲預料中單詞兩兩成對出現的種類數,可以把1換爲alpha,則進階成add-alpha smoothing:

P(W3W1,W2)=Count(W1,W2,W3)+1Count(W1,W2)+VP(W_3|W_1,W_2) = \frac{Count(W_1,W_2,W_3) + 1}{Count(W_1,W_2)+V}

P(W3W1,W2)=Count(W1,W2,W3)+αCount(W1,W2)+αVP(W_3|W_1,W_2) = \frac{Count(W_1,W_2,W_3) + \alpha}{Count(W_1,W_2)+\alpha V}

  1. back-off 回退, 若n-gram出現次數爲0,回退到(n-1)-gram。詳細信息參考:https://en.wikipedia.org/wiki/Katz's_back-off_model。

  2. Interpolation 插值,和回退類似,只不過回退是隻有當n-gram出現爲0時纔回退到低階gram,而插值法是直接將所有低階線性組合起來。詳細信息參考:https://blog.csdn.net/baimafujinji/article/details/51297802

Greedy Search vs Beam Search

假設我們使用3-gram,當我們已經得到各個3-gram的條件概率 P(WiWi2,Wi1)P(W_i|W_{i-2},W_{i-1}) 時,我們怎麼根據擁有的概率來選擇下一步生成的單詞呢?有兩種方法:

  1. Greedy Search,每一步都選擇概率P(WiWi2,Wi1)P(W_i|W_{i-2},W_{i-1}) 最大的Wi。這麼做其實過於絕對,因爲很可能下一步生成的單詞本身的概率較小,但是當生成整個句子後,整個句子的概率卻比較大。
  2. Beam Search,第i步選擇k個最可能的候選單詞,然後第i+1步基於k個候選單詞再生成新的單詞,再選擇k個最可能的,一直到生成句子末尾。可以參考:https://blog.csdn.net/pipisorry/article/details/78404964。

Log化乘爲加

在計算 i=2NP(WiWi1)\prod_{i=2}^N P(W_i|W_{i-1}) 時,隨着句子長度的增加,乘法會越來特多,計算量增大,我們可以使用log轉換成連加,降低計算量 i=2NlogP(WiWi1)\sum_{i=2}^N \log P(W_i|W_{i-1})

關於n-gram LM 可以參考《speech and language processing》

NN LM

任務描述

同上

模型結構

除了n-gram LM 外, 神經網絡也應用於LM。最初的NN LM只是一個簡單的前向神經網絡。結構如下:
在這裏插入圖片描述
輸入單詞wtw_t的前幾個單詞的one-hot表示,經過word embedding(也可以看作是一種look-up),接着是一個tanh非線性,最後送到softmax輸出概率P(wtwtn,....,wt1)P(w_t|w_{t-n},....,w_{t-1})。訓練網絡時的損失函數是:最小化負對數似然函數(通過交叉熵):min[P(wtwtn,....,wt1)]\min[-\sum P(w_t|w_{t-n},....,w_{t-1})]。優化方法可以使用梯度下降等。

NNLM相比於n-gram LM,優點在於:不需要整個語料庫的統計信息,並且softmax本身已經具有smoothing的作用。(注意使用softmax之前要先減去最大值,防止數值向上/下溢出。)

DL vs ML

傳統的NLP大多依賴於基於統計的ML,比如上面介紹的生成模型HMM,n-gram模型,此外比如未提到的NB模型和最大熵模型。而DL的發展也使得神經網絡逐漸在NLP中處於主導地位,比如這一節的NN LM和下一節將介紹的RNN。那麼傳統ML 和 DL之間到底是什麼關係呢?

  1. ML 適合於小數據集,而DL則需要大量的數據來訓練模型;
  2. ML需要特徵工程。而DL是一種end-to-end端到端的模型,可以理解爲一個“黑盒子”,不需要特徵工程;
  3. 由於“黑盒子”的特性,DL模型很難被理解;而傳統ML模型由於需要考慮特徵,則更易於理解(比如SVM);
  4. 由於“端到端”特性,DL的適應性強,同一個模型不需要太多的調整就可以適用於不同的任務(比如遷移學習);
  5. DL由於大量的運算量,需要GPU的加持。
  6. DL是大勢。

Word Error Rate

WER=S+D+INWER = \frac{S + D + I}{N},用來評估一個LM模型的好壞。

S:要替換的單詞的數量

D:要被刪除的單詞的數量

I:要插入的單詞的數量

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