參考:html
https://mp.weixin.qq.com/s/NvwB9H71JUivFyL_Or_ENA編程
http://yangminz.coding.me/blog/post/MinkolovRNNLM/MinkolovRNNLM_thesis.html網絡
語言模型本質上是在回答一個問題:出現的語句是否合理。編程語言
在歷史的發展中,語言模型經歷了專家語法規則模型(至80年代),統計語言模型(至00年),神經網絡語言模型(到目前)。分佈式
專家語法規則模型函數
在計算機初始階段,隨着計算機編程語言的發展,概括出的針對天然語言的語法規則。可是天然語言自己的多樣性、口語化,在時間、空間上的演化,及人自己強大的糾錯能力,致使語法規則急劇膨脹,不可持續。post
統計語言模型測試
統計語言模型就是計算一個句子的機率大小的這種模型。形式化講,統計語言模型的做用是爲一個長度爲 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中進行更新,神經網絡訓練完成以後這一部分就是詞向量),從中取出第十、2三、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)衡量語言模型的好壞,困惑度越小則模型生成一句話時下一個詞的可選擇性越少,句子越肯定則語言模型越好。