深入浅出讲解语言模型
轉載自??深入淺出講解語言模型
深入淺出講解語言模型
1、什么是語言模型呢?
簡單地說,語言模型就是用來計算一個句子的概率的模型,也就是判斷一句話是否是人話的概率?
那么如何計算一個句子的概率呢?給定句子(詞語序列)
它的概率可以表示為:
可是這樣的方法存在兩個致命的缺陷:
參數空間過大:條件概率P(wn|w1,w2,..,wn-1)的可能性太多,無法估算,不可能有用;
數據稀疏嚴重:對于非常多詞對的組合,在語料庫中都沒有出現,依據最大似然估計得到的概率將會是0。
?
2、馬爾科夫假設
為了解決參數空間過大的問題。引入了馬爾科夫假設:隨意一個詞出現的概率只與它前面出現的有限的一個或者幾個詞有關。
如果一個詞的出現與它周圍的詞是獨立的,那么我們就稱之為unigram也就是一元語言模型:
如果一個詞的出現僅依賴于它前面出現的一個詞,那么我們就稱之為bigram:
假設一個詞的出現僅依賴于它前面出現的兩個詞,那么我們就稱之為trigram:
一般來說,N元模型就是假設當前詞的出現概率只與它前面的N-1個詞有關。而這些概率參數都是可以通過大規模語料庫來計算,比如三元概率有:
在實踐中用的最多的就是bigram和trigram了,高于四元的用的非常少。
因為訓練它須要更龐大的語料,并且數據稀疏嚴重,時間復雜度高,精度卻提高的不多。
下面我們詳細介紹一下一元語言模型,二元語言模型來幫助大家理解語言模型。
?
3、一元語言模型
一元語言模型中,我們的句子概率定義為:
?
,在這里,這個式子成立的條件是有一個假設,就是條件無關假設,我們認為每個詞都是條件無關的。
那好,剛剛說了語言模型是得到一個句子的概率,此時我們句子的概率計算公式已經有了,那么如何估計??
這些值呢?
首先介紹一下,這里的參數種類是一種 ?,但是參數實例有V個(V是我們的詞典大小)
我們應該如何得到每個參數實例的值。
用的是極大似然估計法。
比如我們說我們的訓練語料是下面這個簡單的語料。
那么我們的字典為:“星期五早晨,我特意起了個大早為的就是看天空。” 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就能夠直接運算出來。
于是我們得出,只要將每句話拆開為每個單詞然后用累積形式運算,這樣我們就能算出每句話的概率來了。
但是這樣是不是就解決我們所有的問題呢?并沒有,下面我們介紹二元語言模型。
?
4、二元語言模型
介紹二元語言模型之前,我們首先來看兩句話,he eats pizza與he drinks pizza,我們需要用語言模型來判斷這兩句話出現的概率。
好,那么我們現在用一元語言模型來分別計算這兩個句子的概率大小。
p(he eats pizza) = p(he)*p(eats)*p(pizza)
p(he drinks pizza) = p(he)*p(drinks)*p(pizza)
我們可以看出,其實通過一元語言模型的計算公式,我們看不出上面兩個句子的概率有多大差別。
但是我們很明顯知道第一句話比第二句話的概率要大的多,因為正確的表達應該就是吃披薩,而不是喝披薩。
但是由于我們用了一元語言模型,假設每個詞都是條件無關的,這樣的話就會導致我們考慮不到兩個詞之間的關系搭配。
比如在這個例子中,很明顯應該判斷的是p(pizza|eats)與p(pizza|drinks)的概率大小比較。
這也就是二元語言模型需要考慮的問題。
我們需要計算p(pizza|eats)與p(pizza|drinks)的概率,我們首先給出二元語言模型的定義
下面我們舉出一個例子(例子來源于https://class.coursera.org/nlp/):
這個例子來自大一點的語料庫,為了計算對應的二元模型的參數,即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)計數結果如下:
c(wi-1)的計數結果如下:
那么二元模型的參數計算結果如下:
比如計算其中的P(want | i) = 0.33如下:
那么針對這個語料庫的二元模型建立好了后,我們可以計算我們的目標,即一個句子的概率了,一個例子如下:
P(<s> I want english food </s>) = P(I|<s>) × ?P(want|I) × P(english|want) × ?P(food|english) ?× ?P(</s>|food) = 0.000031
那么我們就能通過一個二元語言模型能夠計算所需要求的句子概率大小。
二元語言模型也能比一元語言模型能夠更好的get到兩個詞語之間的關系信息。
比如在p(pizza|eats)與p(pizza|drinks)的比較中,二元語言模型就能夠更好的get到它們的關系,比如我們再看一下該二元模型所捕捉到的一些實際信息:
?
圖片來自于:http://blog.csdn.net/a635661820/article/details/43906731(圖片放大看比較能看清楚紅色字)
總結
以上是生活随笔為你收集整理的深入浅出讲解语言模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界先祖硬币怎么获得
- 下一篇: 音乐之都是哪个国家 音乐之都介绍