天天看點

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?
一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

歡迎關注“勇敢AI”公衆号,更多python學習、資料分析、機器學習、深度學習原創文章與大家分享,還有更多電子資源、教程、資料集下載下傳。勇敢AI,一個專注于人工智能AI的公衆号。

==================================================================================

一、什麼是語言模型

1.1 相關背景與認知

      對于自然語言相關的問題,比如機器翻譯,最重要的問題就是文本的序列時候不是符合我們人類的使用習慣,語言模型就是用于評估文本序列符合人類語言使用習慣程度的模型。

      語言模型所面臨的最大難題。我們為了讓機器能夠了解或者是産生符合人類語言的語言序列,一種方式是制定一個規範的人類語言範式(規範),比如陳述句需要需要有主語謂語賓語組成,定語需要放在索要修飾的名詞之前等等。但是人類語言在實際使用的時候往往沒有那麼死闆的規定,人類語言對于字、詞的組合具有非常大的靈活性·,同樣的含義,可以有許多種不同的表達方式,甚至很多的“雙關語”、“反語”是人類幽默表達的組成部分,如果完全按照字面意思了解可能會贻笑大方,故而要給一門語言制定一個完整的規則顯然是不現實的。

那怎麼辦呢?

       目前的語言模型是以統計學為基礎的統計語言模型,統計語言模型是基于預先人為收集的大規模語料資料,以真實的人類語言為标準,預測文本序列在語料庫中可能出現的機率,并以此機率去判斷文本是否“合法”,是能能被人所了解。如下例子

打個比方, 如果有這樣一段話:

        "今天我吃了蕃茄炒__ "

    對一個好的語言模型, 這句話後面出現的詞是"雞蛋"的機率可能是 30%, "洋芋"的機率是 5%, "豆腐"的機率是 5%, 但"石頭"的機率則應當幾乎為零.顯然,雞蛋的機率更高,也更加符合人類的習慣和了解方式,石頭的機率最低,因為人類的習慣不是這樣子的,這就是語言模型最直覺的了解。

      從語言模型的發展曆史看嗎,主要經曆了三個發展階段,Ngram語言模型,神經網絡語言模型,循環神經網絡語言模型。本節主要介紹一下Ngram語言模型。

二、NGram語言模型

2.1 語句的機率模型

2.1 簡單地說,語言模型就是用來計算一個句子的機率的模型,也就是判斷一句話是否是人話的機率?

那麼如何計算一個句子的機率呢?給定句子(詞語序列)

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

它的機率可以表示為:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

從上面可以看看出,因為W2的出現是與W1相關的,即在W1的條件下出現W2的機率,故而上述為一個條件機率的鍊式法則,而對于每一個詞出現的條件機率,可以通過在語料庫中統計計數的方式得出。

現在很多的應用中,需要計算一個句子的機率,一個句子是否合理,就看看它的可能性大小,這裡可能性的大小就用機率來衡量。比如下面幾個例子:

在機器翻譯中:

P(high  winds  tonite)  >  P(large  winds  tonite)

拼寫檢查中:比如這一句話:The  office  is  about  fiIeen  minuets  from  my  house

顯然 P(about  fiIeen  minutes  from)  >  P(about  fiIeen  minuets  from)

語音識别中:

比如I  saw  a  van 和eyes  awe  of  an聽上去差不多,但是P(I  saw  a  van)  >>  P(eyes  awe  of  an)

上面的幾個例子中都需要計算一個句子的機率,以作為判斷其是否合理的依據。下面将上述的内容形式化描述。

我們需要計算一個句子或序列W的機率:

 P(W)  =  P(w 1 ,w 2 ,w 3 ,w 4 ,w 5 …w n )

其中我們也需要計算一個相關的任務,比如P(w 5 |w 1 ,w 2 ,w 3 ,w 4 ),表示w 1 w 2 w 3 w 4 後面是w 5的機率,即下一個詞的機率。

像這樣計算P(W)或者P(w n |w 1 ,w 2 …w n-­‐1 )  的模型叫做語言模型( language  model簡稱LM)。

2.2 如何計算語句的機率模型

那麼如何計算P(W)呢?用機率的鍊式規則,鍊式規則常常用來評估随機變量的聯合機率,鍊式規則如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

将上面的鍊式規則計算P(W)可以寫作如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

按照鍊式規則計算方式,舉例如下:

P(“its water is so transparent”) = P(its) × P(water|its) ×  P(is|its water) ×  P(so|its water is) ×  P(transparent|its water is so)

那麼下面的問題是如何計算上面每一個機率,比如 P(transparent|its water is so),一種比較直覺的計算就是計數然後用除法:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

事實上不能用這種方式去計算條件機率,原因有兩個:

1.直接這樣計算會導緻參數空間過大。一個語言模型的參數就是所有的這些條件機率,試想按上面方式計算P(w 5 |w 1 ,w 2 ,w 3 ,w 4 ),這裡w i都有一個詞典大小取值的可能,記作|V|,則該模型的參數個數是|V|^5,而且這還不包含P(w4 | w1, w2, w3)的個數,可以看到這樣去計算條件機率會使語言模型參數個數過多而無法實用。

2.資料稀疏嚴重。我的了解是像上面那樣計數計算,比如計數分子its water is so transparen,在我們所能見的文本中出現的次數是很小的,這樣計算的結果是過多的條件機率會等于0,因為我們根本沒有看到足夠的文本來統計!

為什麼呢?

對于第二個問題,假設一個語料庫中單詞的數量為|V|個,一個句子由n個詞組成,那麼每個單詞都可能有|V|個取值,那麼由這些詞組成的n元組合的數目為|V|n  種,也就是說,組合數會随着n的增加而呈現指數級别的增長,随着n的增加,預料資料庫能夠提供的資料是非常有限的,除非有海量的各種類型的語料資料,否則還有大量的n元組合都沒有在語料庫中出現過(即由n個單詞所組成的一些句子根本就沒出現過,可以了解為很多的n元組所組成的句子不能被人很好地了解)也就是說依據最大似然估計得到的機率将會是0,模型可能僅僅能夠計算寥寥幾個句子。怎麼解決呢?

2.3 馬爾科夫模型

為了解決參數空間過大的問題。引入了馬爾科夫假設:随意一個詞出現的機率隻與它前面出現的有限的一個或者幾個詞有關。

上面的計算方式是通過馬爾科夫假設進行簡化的,馬爾可夫假設是指假設第wi個詞語隻與它前面的k個詞語相關,這樣我們就得到前面的條件機率計算簡化如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

這樣我們的P(W)計算簡化如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

當k = 0時,這個時候對應的模型叫做一進制模型(Unigram  model),即wi與它前面的0個詞相關,即wi不與任何詞相關,每一個詞都是互相獨立的,P(W)計算如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

當k = 1時,對應的模型叫做二進制模型(Bigram  model),此時wi與它前面一個詞相關,P(W)計算如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

同樣的,我們可以讓k = 2,叫做 trigrams,4-grams,5-grams,當k = N - 1,模型成為n元模型,即N-grams。

NGram的不足:

  1. 總的來說,N-grams有一些不足,因為語言存在一個長距離依賴關系,比如考慮下面的句子:
  2. “The      computer which I had just put into the machine room on the fifth floor      crashed.”
  3. 假如我們要預測最後一個詞語crashed出現的機率,如果采用二進制模型,那麼crashed與floor實際關聯可能性應該非常小,相反的,這句子的主語computer與crashed的相關性很大,但是n-grams并沒有捕捉到這個資訊。

如果一個詞的出現與它周圍的詞是獨立的,那麼我們就稱之為unigram也就是一進制語言模型:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

如果一個詞的出現僅依賴于它前面出現的一個詞,那麼我們就稱之為bigram:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

假設一個詞的出現僅依賴于它前面出現的兩個詞,那麼我們就稱之為bigram:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

一般來說,N元模型就是假設目前詞的出現機率隻與它前面的N-1個詞有關。而這些機率參數都是可以通過大規模語料庫來計算,比如三元機率有:

在實踐中用的最多的就是bigram和trigram了,高于四元的用的非常少,由于訓練它須要更龐大的語料,并且資料稀疏嚴重,時間複雜度高,精度卻提高的不多。

下面我們詳細介紹一下一進制語言模型,二進制語言模型來幫助大家了解語言模型。

三、參數估計

要計算出模型中的條件機率,這些條件機率也稱為模型的參數,得到這些參數的過程稱為訓練。用最大似然性估計計算下面的條件機率:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

其中c(wi-1)表示wi-1出現的次數,是count的首字母c

3.1 一進制Unigram

一進制語言模型中,我們的句子機率定義為:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

,在這裡,這個式子成立的條件是有一個假設,就是條件無關假設,我們認為每個詞都是條件無關的。

那好,剛剛說了語言模型是得到一個句子的機率,此時我們句子的機率計算公式已經有了,那麼如何估計

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

這些值呢?

     首先介紹一下,這裡的參數種類是一種 P(wn),但是參數執行個體有V個(V是我們的詞典大小)我們應該如何得到每個參數執行個體的值。用的是極大似然估計法。

比如我們說我們的訓練語料是下面這個簡單的語料。

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

那麼我們的字典為:“星期五早晨,我特意起了個大早為的就是看天空。” 22個不同詞,每個詞語的機率直接用極大似然估計法估計得到。

如:p(星)=1/27,p(期)=1/27,一直算到後面的空為1/27.

于是我們就需要存儲我們學習得到的模型參數,一個向量,22維,每個次元儲存着每個單詞的機率值。

那麼有同學就需要問了,來了一句話,我們應該怎麼估計呢?下面我舉一個簡單的例子來模拟一下如何用語言模型估計一句話的機率,比如:

p(我看看早晨的天空)=p(我)*p(看)*p(看)*p(早)*p(晨)*p(的)*p(天)*p(空)=1/27*1/27*1/27*....*1/27就能夠直接運算出來。

于是我們得出,隻要将每句話拆開為每個單詞然後用累積形式運算,這樣我們就能算出每句話的機率來了。

但是這樣是不是就解決我們所有的問題呢?并沒有,下面我們介紹二進制語言模型。

3.2二進制Bigram

我們再看一個Bigram的例子,這個例子來自大一點的語料庫,為了計算對應的二進制模型的參數,即P(wi | wi-1),我們要先計數即c(wi-1,wi),然後計數c(wi-1),再用除法可得到這些條件機率。可以看到對于c(wi-1,wi)來說,wi-1有語料庫詞典大小(記作|V|)的可能取值,wi也是,是以c(wi-1,wi)要計算的個數有|V|^2。c(wi-1,wi)計數結果如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

c(wi-1)的計數結果如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

那麼二進制模型的參數計算結果如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

比如計算其中的P(want | i) = 0.33如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

那麼針對這個語料庫的二進制模型建立好了後,我們可以計算我們的目标,即一個句子的機率了,一個例子如下:

P(<s> I want english food </s>) = P(I|<s>) ×  P(want|I) × P(english|want) ×  P(food|english)  ×  P(</s>|food) =  .000031

這個數已經很小了

我們再看一下該二進制模型所捕捉到的一些實際資訊:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

實際上常常在對數空間裡面計算機率,原因有兩個:

1.防止溢出,可以看到,如果計算的句子很長,那麼最後得到的結果将非常小,甚至會溢出,比如計算得到的機率是0.001,那麼假設以10為底取對數的結果就是-3,這樣就不會溢出。

2.對數空間裡面加法可以代替乘法,因為log(p1p2) = logp1 + logp2,而在計算機内部,顯然加法比乘法執行更快!

四、困惑度

什麼是Perplexity(困惑度)?

“困惑度”這一概念最初的來源是資訊論,在資訊論中,perplexity(困惑度)用來度量一個機率分布或機率模型預測樣本的好壞程度。它也可以用來比較兩個機率分布或機率模型。(譯者:應該是比較兩者在預測樣本上的優劣)低困惑度的機率分布模型或機率模型能更好地預測樣本。可以從三個不同的方面去解釋困惑度(殊途同歸)

1.機率分布的困惑度 

2.機率模型的困惑度 

3.每個分詞的困惑度

4.1 機率分布困惑度

定義離散機率分布的困惑度如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

 其中H(p)是機率分布p的熵,x是樣本點。是以一個随機變量X的困惑度是定義在X的機率分布上的(X所有”可能”取值為x的部分)。(譯者:x不能包含零測集的點,不然p(x)logp(x)沒定義)

一個特殊的例子是k面均勻骰子的機率分布,它的困惑度

k。一個擁有k困惑度的随機變量有着和k面均勻骰子一樣

的不确定性,并且可以說該随機變量有着k個困惑度的

值(k-ways perplexed)。(在有限樣本空間離散随機

變量的機率分布中,均勻分布有着最大的熵)

困惑度有時也被用來衡量一個預測問題的難易程度。

但這個方法不總是精确的。例如:

在機率分布B(1,P=0.9)中,即取得1的機率是0.9

,取得0的機率是0.1。可以計算困惑度是:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

同時自然地,我們預測下一樣本點的政策将是:預測其取值為1,那麼我們預測正确的機率是0.9。而困惑度的倒數是1/1.38=0.72而不是0.9。(但當我們考慮k面骰子上的均勻分布時,困惑度是k,困惑度的倒數是1/k,正好是預測正确的機率)

困惑度是資訊熵的指數。

4.2 機率模型困惑度

用一個機率模型q去估計真實機率分布p,那麼可以通過測試集中的樣本來定義這個機率模型的困惑度。

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

其中測試樣本x1, x2, …, xN是來自于真實機率分布p的觀測值,b通常取2。是以,低的困惑度表示q對p拟合的越好,當模型q看到測試樣本時,它會不會“感到”那麼“困惑”。

我們指出,指數部分是交叉熵。

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

其中 p^p^ 表示我們對真實分布下樣本點x出現機率的估計。比如用p(x)=n/N

4.3 分詞的困惑度

在自然語言進行中,困惑度是用來衡量語言機率模型優劣的一個方法。一個語言機率模型可以看成是在整過句子或者文段上的機率分布。(譯者:例如每個分詞位置上有一個機率分布,這個機率分布表示了每個詞在這個位置上出現的機率;或者每個句子位置上有一個機率分布,這個機率分布表示了所有可能句子在這個位置上出現的機率)

比如,i這個句子位置上的機率分布的資訊熵可能是190,或者說,i這個句子位置上出現的句子平均要用190 bits去編碼,那麼這個位置上的機率分布的困惑度就是2^(190)。(譯者:相當于投擲一個2^(190)面篩子的不确定性)通常,我們會考慮句子有不同的長度,是以我們會計算每個分詞上的困惑度。比如,一個測試集上共有1000個單詞,并且可以用7.95個bits給每個單詞編碼,那麼我們可以說這個模型上每個詞有2^(7.95)=247 困惑度。相當于在每個詞語位置上都有投擲一個247面骰子的不确定性。

在Brown corpus (1 million words of American English of varying topics and genres) 上報告的最低的困惑度就是247per word,使用的是一個trigram model(三元文法模型)。在一個特定領域的語料中,常常可以得到更低的困惑度。

要注意的是,這個模型用的是三元文法。直接預測下一個單詞是”the”的正确率是7%。但如果直接應用上面的結果,算出來這個預測是正确的機率是1/247=0.4%,這就錯了。(譯者:不是說算出來就一定是0.4%,而是說這樣算本身是錯的)因為直接預測下一個詞是”the“的話,我們是在使用一進制文法,而247是來源于三元文法的。當我們在使用三元文法的時候,會考慮三元文法的統計資料,這樣做出來的預測會不一樣并且通常有更好的正确率。

4.4語言模型的評價

我們能夠建立語言模型了,一般的我們在訓練集上得到語言模型的參數,在測試集裡面來測試模型的性能,那麼如何去衡量一個語言模型的好壞呢?比較兩個模型A,B好壞,一種外在的評價就是将AB放入具體的任務中,然後分别得到模型的準确率,這種方式當然是最好的方式,但這種方式的缺點是過于耗時,在實際情況中往往需要花費過多時間才能得到結果。另一種方式是使用下面要介紹的困惑度,但注意困惑度并不是上述外在評價的一個好的近似,是以一般使用在試點試驗上,所謂試點試驗就是一個小規模的初步研究,以評估一些性能。

困惑度

困惑度的基本評價方式是對測試集賦予高機率值的模型更好,一個句子W的困惑度(PP)定義如下:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

對于二進制模型,該公式為:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

可以看到,機率越大,困惑度越小,即小的困惑度等于好的模型。且當wi之間是獨立的(一進制模型),且等機率為p時,公式為:

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

比如計算一個隻包含0~9數字序列的困惑度,每個數字發生的機率是1/10。那麼我們得到困惑度PP(W) = 10。這裡講義并沒有詳細的講一個測試集上的困惑度是如何定義的,需要一些資訊論的概念。

這節的核心就是句子機率越大,語言模型越好,迷惑度越小。

4.5 常見模型的困惑度

深度學習之前,傳統的基于統計算法的語言模型,在測試時困惑度大多都在 80以上 (人工語言處理的困惑度的理論最低點大約在 10-20 之間).一方面是算法的局限,另一方面是來自教育訓練語句數量規模的限制.

2013年,以 Ciprian Chelba 為首的來自谷歌的團隊推出了一個叫做"十億單詞基準"(One Billion Word Benchmark) 的語料庫.這個語料庫包含了接近十億個英文單詞組成的不同語句, 用來教育訓練和測試不同的算法模型. 這個資料規模, 是先前流行的所謂 "Penn Treebank" 的包含四百五十萬英文單詞的語料庫的大約兩百倍.

Chelba 的團隊, 使用一個包含二百億個自由參數的循環神經網絡的模型, 模型的訓練消耗了十天的時間, 把困惑度下降到了 51 左右. (同期使用傳統的統計算法, 最佳結果是 67)

2016年二月, 以 Rafal Jozefowicz 為第一作者的谷歌大腦的團隊, 發表論文, "探索語言模型的極限" (Exploring the limits of language modeling). 該團隊, 使用了 RNN/ LSTM 和所謂 "字母層面的卷積神經網絡" (Character-Level Convolutional Neural Network) 的技術結合的模型, 在"十億單詞基準"的測試上把困惑度降低到了 30. 而相應的模型自由參數的數目降到了隻有十億 (相當于 Chelba 團隊的模型的百分之五), 計算量大大降低.

更有意思的是,當把十個經過微調的不同參數的LSTM模型綜合起來,取其均值, 對測試資料驗證時, 其困惑度最低達 23.7.

機器越來越懂人話, 越來越會說人話了.

一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?
一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?
一文詳解NGram語言模型以及困惑度perplexity什麼是Perplexity(困惑度)?

繼續閱讀