參考:
https://mp.weixin.qq.com/s/NvwB9H71JUivFyL_Or_ENA
http://yangminz.coding.me/blog/post/MinkolovRNNLM/MinkolovRNNLM_thesis.html
語言模型本質上是在回答一個問題:出現的語句是否合理。
在歷史的發展中,語言模型經歷了專家語法規則模型(至80年代),統計語言模型(至00年),神經網絡語言模型(到目前)。
專家語法規則模型
在計算機初始階段,隨着計算機編程語言的發展,歸納出的針對自然語言的語法規則。但是自然語言本身的多樣性、口語化,在時間、空間上的演化,及人本身強大的糾錯能力,導致語法規則急劇膨脹,不可持續。
統計語言模型
統計語言模型就是計算一個句子的概率大小的這種模型。形式化講,統計語言模型的作用是為一個長度為 m 的字符串確定一個概率分布 P(w1; w2; :::; wm),表示其存在的可能性,其中 w1 到 wm 依次表示這段文本中的各個詞。
計算機借助於統計語言模型的概率參數,可以估計出自然語言中每個句子出現的可能性,而不是簡單的判斷該句子是否符合文法。常用統計語言模型,包括了N元文法模型(N-gram Model)統計語言模型把語言(詞的序列)看作一個隨機事件,並賦予相應的概率來描述其屬於某種語言集合的可能性。給定一個詞匯集合 V,對於一個由 V 中的詞構成的序列 S = ⟨w1, · · · , wT ⟩ ∈ Vn,統計語言模型賦予這個序列一個概率 P(S),來衡量 S 符合自然語言的語法和語義規則的置信度。
統計語言模型用簡單的方式,加上大量的語料,產生了比較好的效果。統計語言模型通過對句子的概率分布進行建模,統計來說,概率高的語句比概率低的語句更為合理。在實現中,通過給定的上文來預測句子的下一個詞, 如果預測的詞和下一個詞是一致(該詞在上文的前提下出現的概率比其它詞概率要高),那么上文+該詞出現的概率就會比上文+其他詞詞的概率要更大,上文+該詞更為合理。
較為常用的,當n=1時,我們稱之為unigram(一元語言模型);當n=2時,我們稱之為bigram(二元語言模型);當n=3時,我們稱之為trigram(三元語言模型)。
下面具體講解下統計語言模型N-gram
具體N-gram的理解參考:
https://www.cnblogs.com/ljy2013/p/6425277.html
https://blog.csdn.net/songbinxu/article/details/80209197
N-gram模型是一種典型的統計語言模型(Language Model,LM),統計語言模型是一個基於概率的判別模型.統計語言模型把語言(詞的序列)看作一個隨機事件,並賦予相應的概率來描述其屬於某種語言集合的可能性。給定一個詞匯集合 V,對於一個由 V 中的詞構成的序列S = ⟨w1, · · · , wT ⟩ ∈ Vn,統計語言模型賦予這個序列一個概率P(S),來衡量S 符合自然語言的語法和語義規則的置信度。用一句簡單的話說,統計語言模型就是計算一個句子的概率大小的這種模型。
上面參數空間過大參考朴素貝葉斯。
為了解決第一個問題N-gram模型基於這樣一種假設,當前詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。這些概率可以通過直接從語料中統計N個詞同時出現的次數得到。常用的是二元的Bi-Gram(N=2)和三元的Tri-Gram(N=3).Bi-Gram所滿足的假設是馬爾科夫假設。
一般常用的N-Gram模型是Bi-Gram和Tri-Gram。分別用公式表示如下:
Bi-Gram: P(T)=p(w1|begin)*p(w2|w1)*p(w3|w2)***p(wn|wn-1)
Tri-Gram: P(T)=p(w1|begin1,begin2)*p(w2|w1,begin1)*p(w3|w2w1)***p(wn|wn-1,wn-2)
注意上面概率的計算方法:P(w1|begin)=以w1為開頭的所有句子/句子總數;p(w2|w1)=w1,w2同時出現的次數/w1出現的次數。以此類推。
對於其中每項的計算舉個例子:
由上可見Bi-Gram計算公式中的begin一般都是加個<s>標簽。
N-gram存在的問題:
舉一個小數量的例子進行輔助說明:假設我們有一個語料庫(注意語料庫),如下:
老鼠真討厭,老鼠真丑,你愛老婆,我討厭老鼠。
想要預測“我愛老”這一句話的下一個字。我們分別通過 bigram 和 trigram 進行預測。
1)通過 bigram,便是要對 P(w|老)進行計算,經統計,“老鼠”出現了3次,“老婆”出現了1次,通過最大似然估計可以求得P(鼠|老)=0.75,P(婆|老)=0.25, 因此我們通過 bigram 預測出的整句話為: 我愛老鼠。
2)通過 trigram,便是要對便是要對 P(w|愛老)進行計算,經統計,僅“愛老婆”出現了1次,通過最大似然估計可以求得 P(婆|愛 老)=1,因此我們通過trigram 預測出的整句話為: 我愛老婆。顯然這種方式預測出的結果更加合理。
問題一:隨着 n 的提升,我們擁有了更多的前置信息量,可以更加准確地預測下一個詞。但這也帶來了一個問題,當N過大時很容易出現這樣的狀況:某些n-gram從未出現過,導致很多預測概率結果為0,這就是稀疏問題。實際使用中往往僅使用 bigram 或 trigram。(這個問題可以通過平滑來緩解參考:https://mp.weixin.qq.com/s/NvwB9H71JUivFyL_Or_ENA)
問題二:同時由於上個稀疏問題還導致N-gram無法獲得上下文的長時依賴。
問題三:n-gram 基於頻次進行統計,沒有足夠的泛化能力。
總結:統計語言模型就是計算一個句子的概率值大小,整句的概率就是各個詞出現概率的乘積,概率值越大表明該句子越合理。N-gram是典型的統計語言模型,它做出了一種假設,當前詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。它其中存在很多問題,再求每一個詞出現的概率時,隨着N的提升,能夠擁有更多的前置信息量,可以使得當前詞的預測更加准確,但是當N過大時會出現稀疏問題,導致很多詞的概率值為0,為解決這一問題,因此常用的為bigram 或 trigram,這就導致N-gram無法獲得上文的長時依賴。另一方面N-gram 只是基於頻次進行統計,沒有足夠的泛化能力。
神經網絡語言模型
2003年 Bengio 提出,神經網絡語言模型( neural network language model, NNLM)的思想是提出詞向量的概念,代替 ngram 使用離散變量(高維),采用連續變量(具有一定維度的實數向量)來進行單詞的分布式表示,解決了維度爆炸的問題,同時通過詞向量可獲取詞之間的相似性。
結合下圖可知它所建立的語言模型的任務是根據窗口大小內的上文來預測下一個詞,因此從另一個角度看它就是一個使用神經網絡編碼的n-gram模型。
它是一個最簡單的神經網絡,僅由四層構成,輸入層、嵌入層、隱藏層、輸出層。(從另一個角度看它就是一個使用神經網絡編碼的n-gram模型)
輸入是單詞序列的index序列,例如單詞‘這’在字典(大小為∣V∣)中的index是10,單詞‘是’的 index 是23,‘測’的 index 是65,則句子“這是測試”通過‘這是測’預測‘試’,窗口大小內上文詞的index序列就是 10, 23, 65。嵌入層(Embedding)是一個大小為∣V∣×K的矩陣(注意:K的大小是自己設定的,這個矩陣相當於隨機初始化的詞向量,會在bp中進行更新,神經網絡訓練完成之后這一部分就是詞向量),從中取出第10、23、65行向量拼成3×K的矩陣就是Embedding層的輸出了。隱層接受拼接后的Embedding層輸出作為輸入,以tanh為激活函數,最后送入帶softmax的輸出層,輸出概率,優化的目標是使得待預測詞其所對應的softmax值最大。
缺點:因為這是通過前饋神經網絡來訓練語言模型,缺點顯而易見就是其中的參數過多計算量較大,同時softmax那部分計算量也過大。另一方面NNLM直觀上看就是使用神經網絡編碼的 n-gram 模型,也無法解決長期依賴的問題。
RNNLM
它是通過RNN及其變種網絡來訓練語言模型,任務是通過上文來預測下一個詞,它相比於NNLM的優勢在於所使用的為RNN,RNN在處理序列數據方面具有天然優勢,RNN 網絡打破了上下文窗口的限制,使用隱藏層的狀態概括歷史全部語境信息,對比 NNLM 可以捕獲更長的依賴,在實驗中取得了更好的效果。RNNLM 超參數少,通用性更強;但由於 RNN 存在梯度彌散問題,使得其很難捕獲更長距離的依賴信息。
Word2vec中的CBOW 以及skip-gram,其中CBOW是通過窗口大小內的上下文預測中心詞,而skip-gram恰恰相反,是通過輸入的中心詞預測窗口大小內的上下文。
Glove 是屬於統計語言模型,通過統計學知識來訓練詞向量
ELMO 通過使用多層雙向的LSTM(一般都是使用兩層)來訓練語言模型,任務是利用上下文來預測當前詞,上文信息通過正向的LSTM獲得,下文信息通過反向的LSTM獲得,這種雙向是一種弱雙向性,因此獲得的不是真正的上下文信息。
GPT是通過Transformer來訓練語言模型,它所訓練的語言模型是單向的,通過上文來預測下一個單詞
BERT通過Transformer來訓練MLM這種真正意義上的雙向的語言模型,它所訓練的語言模型是根據上下文來預測當前詞。
以上部分的詳細介紹在NLP之預訓練篇中有講到
語言模型的評判指標
具體參考:https://blog.csdn.net/index20001/article/details/78884646
Perplexity可以認為是average branch factor(平均分支系數),即預測下一個詞時可以有多少種選擇。別人在作報告時說模型的PPL下降到90,可以直觀地理解為,在模型生成一句話時下一個詞有90個合理選擇,可選詞數越少,我們大致認為模型越准確。這樣也能解釋,為什么PPL越小,模型越好。
一般用困惑度Perplexity(PPL)衡量語言模型的好壞,困惑度越小則模型生成一句話時下一個詞的可選擇性越少,句子越確定則語言模型越好。