一起入門語言模型(Language Models)

一起入門語言模型(Language Models)

來自專欄 一起自然語言理解

語言模型(language models)起源於語音識別(speech recognition),輸入一段音頻數據,語音識別系統通常會產生多個句子作為候選,究竟哪個句子更合理?就需要用到語言模型對候選句子進行排序。如今語言模型的應用範圍早已擴展到機器翻譯、拼寫檢查、問答、文摘等眾多NLP領域。so,什麼是語言模型呢?一句話,語言模型是這樣一個模型:對於任意的單詞序列,它能夠計算出這個序列是一句話的概率。舉倆例子就明白了,比如單詞序列A:「知乎 的 文章 真 水 啊」,這個明顯是一句話,一個好的語言模型也會給出很高的概率,再看單詞序列B:「知乎 的 睡覺 蘋果 好快」,這明顯不是一句話,如果語言模型訓練的好,那麼序列B的概率就很低很低。

大概知道了語言模型是怎麼一回事,下面給出較為正式的定義。

假設我們要為中文創建一個語言模型, V 表示詞典, V={貓,狗,機器,學習,語言,模型,...}

可以想像一下, V 的維度通常非常高:幾千維、幾萬維、十幾萬維都是有可能的,這裡我們假設 V 是有限維的。

句子,即一個單詞序列,

w_{1}w_{2}w_{3}...w_{n}

其中 ngeq1forall i in {1,2,...,i-1}, w_{i} in V,而 w_{n}
otin V ,它是我們創建的句子結束符EOF,位於每個句子的末尾,表示一個句子的結束。

ok,語言模型就是這麼一回事:給定詞典 V ,能夠計算出任意單詞序列是一句話的概率 p(w_{1},w_{2},...,w_{n})

其中, pgeq 0, w_{n} 是EOF。

現在問題來了,如何用數據學習出 p(w_{1},w_{2},...,w_{n}) ? 最簡單的方法是數數,假設訓練集中共有 N 個句子,我們數一下在訓練集中 (w_{1},w_{2},...,w_{n}) 出現的次數,不妨假定為 n ,則 p(w_{1},w_{2},...,w_{n}) = frac{n}{N}

可以想像出這個模型的預測能力幾乎為0,一旦單詞序列沒有在訓練集中出現過,模型的輸出概率就是0,顯然相當不合理。

我們可以根據鏈式法則(chain rule)把p展開:

p(w_{1},w_{2},...,w_{n}) = p(w_{1})prod_{i=2}^{n}p(w_{i}|w_{1},...,w_{i-1})

然後引入一階馬爾可夫假設(first-order Markov assumption),每個詞只依賴前一個詞。p(w_{i}|w_{1},...,w_{i-1})=p(w_{i}|w_{i-1})

此時,

p(w_{1},w_{2},...,w_{n}) \ = p(w_{1})prod_{i=2}^{n}p(w_{i}|w_{1},...,w_{i-1}) \ =p(w_{1})prod_{i=2}^{n}p(w_{i}|w_{i-1})

如果引入二階馬爾可夫假設,每個詞依賴前兩個詞。 p(w_{i}|w_{1},...,w_{i-1})=p(w_{i}|w_{i-2},w_{i-1})

此時,

p(w_{1},w_{2},...,w_{n}) \ = p(w_{1})prod_{i=2}^{n}p(w_{i}|w_{1},...,w_{i-1}) \ =p(w_{1})p(w_{2}|w_{1})prod_{i=3}^{n}p(w_{i}|w_{i-2},w_{i-1})

有了馬爾可夫假設,可以方便的計算條件概率,於是,n-gram語言模型就誕生了。

以trigram語言模型為例,它使用二階馬爾可夫假設,對於 p(w_{i}|w_{i-2},w_{i-1}) ,如何學習出它的參數呢?對於p(w_{i}|w_{i-2},w_{i-1})而言,它的參數長這個樣子 p(w_{1}|w_{1},w_{2})p(w_{3}|w_{5},w_{9}) ,不難算出,這樣的參數有 |V|^3 個!其中|V|是字典長度。

首先,我們通常認為n-gram的參數 p(w_{i}|w_{i-N+1},...,w_{i-1}) 服從多項式(multinomial)分布,接下來,我們使用最大似然估計( Maximum Likelihood Estimation)來求解參數。

這裡,實際上要運用最大似然估計求解多項式分布參數,對推導過程感興趣的可以戳此鏈接MLE for Multinomial

總之, p(w_{i}|w_{i-2},w_{i-1})=frac{count(w_{i-2},w_{i-1},w_{i})}{count(w_{i-2},w_{i-1})}

其中count(*)表示*在訓練集中出現的次數。

由此可見,對於n-gram來說,參數求解就是在數數。這裡需要注意的是,由於n-gram的參數實在太多, 有這麼多|V|^{n},實際上很多參數並沒有在訓練集中出現過,也就是 count(w_{i-N+1},...,w_{i-1},w_{i}) =0,導致模型在進行預測時,大多數句子的概率都是0,為了避免這種情況發生,需要對count(*)=0的情況做一些平滑處理,最簡單的方法是所有片語出現次數加1。


推薦閱讀:

編外雜記-另一個角度的看法
NNLM最新論文調研-2-《LightRNN:Memory and Computation-Efficient Recurrent Neural Networks》

TAG:自然語言處理 | 神經網路語言模型 |