一起入門語言模型(Language Models)
來自專欄 一起自然語言理解
語言模型(language models)起源於語音識別(speech recognition),輸入一段音頻數據,語音識別系統通常會產生多個句子作為候選,究竟哪個句子更合理?就需要用到語言模型對候選句子進行排序。如今語言模型的應用範圍早已擴展到機器翻譯、拼寫檢查、問答、文摘等眾多NLP領域。so,什麼是語言模型呢?一句話,語言模型是這樣一個模型:對於任意的單詞序列,它能夠計算出這個序列是一句話的概率。舉倆例子就明白了,比如單詞序列A:「知乎 的 文章 真 水 啊」,這個明顯是一句話,一個好的語言模型也會給出很高的概率,再看單詞序列B:「知乎 的 睡覺 蘋果 好快」,這明顯不是一句話,如果語言模型訓練的好,那麼序列B的概率就很低很低。
大概知道了語言模型是怎麼一回事,下面給出較為正式的定義。
假設我們要為中文創建一個語言模型, 表示詞典,
可以想像一下, 的維度通常非常高:幾千維、幾萬維、十幾萬維都是有可能的,這裡我們假設 是有限維的。
句子,即一個單詞序列,
其中 , ,而 ,它是我們創建的句子結束符EOF,位於每個句子的末尾,表示一個句子的結束。
ok,語言模型就是這麼一回事:給定詞典 ,能夠計算出任意單詞序列是一句話的概率
其中, 是EOF。
現在問題來了,如何用數據學習出 ? 最簡單的方法是數數,假設訓練集中共有 個句子,我們數一下在訓練集中 出現的次數,不妨假定為 ,則 。
可以想像出這個模型的預測能力幾乎為0,一旦單詞序列沒有在訓練集中出現過,模型的輸出概率就是0,顯然相當不合理。
我們可以根據鏈式法則(chain rule)把p展開:
然後引入一階馬爾可夫假設(first-order Markov assumption),每個詞只依賴前一個詞。
此時,
如果引入二階馬爾可夫假設,每個詞依賴前兩個詞。
此時,
有了馬爾可夫假設,可以方便的計算條件概率,於是,n-gram語言模型就誕生了。
以trigram語言模型為例,它使用二階馬爾可夫假設,對於 ,如何學習出它的參數呢?對於p(w_{i}|w_{i-2},w_{i-1})而言,它的參數長這個樣子 、 ,不難算出,這樣的參數有 個!其中|V|是字典長度。
首先,我們通常認為n-gram的參數 服從多項式(multinomial)分布,接下來,我們使用最大似然估計( Maximum Likelihood Estimation)來求解參數。
這裡,實際上要運用最大似然估計求解多項式分布參數,對推導過程感興趣的可以戳此鏈接MLE for Multinomial
總之,
其中count(*)表示*在訓練集中出現的次數。
由此可見,對於n-gram來說,參數求解就是在數數。這裡需要注意的是,由於n-gram的參數實在太多, 有這麼多,實際上很多參數並沒有在訓練集中出現過,也就是 =0,導致模型在進行預測時,大多數句子的概率都是0,為了避免這種情況發生,需要對count(*)=0的情況做一些平滑處理,最簡單的方法是所有片語出現次數加1。
推薦閱讀:
※編外雜記-另一個角度的看法
※NNLM最新論文調研-2-《LightRNN:Memory and Computation-Efficient Recurrent Neural Networks》