國立高等經濟大學NLP學習筆記(2):語言建模(Language modeling)

這周講核心的NLP方法。

2.1 語言建模:全是計數問題(Language modeling: it's all about counting!)

2.1.1 N-gram語言模型(N-gram language models)

我們從語言模型開始講解。

什麼是語言模型呢?語言模型就是計算序列單詞(sequence words)或句子出現概率的模型,我們稱之爲language models或LMs。

假設你看到了一些句子的起始單詞,那該如何預測接下來的單詞,你會如何繼續你的句子,搭配的單詞是否聽起來順暢,我們人對此往往會有很好的判斷,但怎麼讓機器擁有和人一樣好的判斷呢?我們可以預測在前一個詞出現的情況下,後一個詞出現的概率,首先我們需要一些數據,也就是語料,如下圖所示:

上圖來自於Coursera國立高等經濟大學NLP該小節PPT。

假設我們現在需要預測的是house出現在this is the之後的概率,直覺上我們知道這個概率值就等於在語料中this is the house出現的次數佔this is the X出現次數的比例,這也是極大似然估計的結果。上圖中有四個語句,this is the X出現四次,而this is the house出現一次,所以house出現在this is the之後的概率爲1/4,而this is the house我們稱爲4-grams。什麼是n-grams呢?

n-grams指連續n個單詞所組成的語料中的一些片段,比如this is爲2-grams,this is the house爲4-grams。但其實將n-gram model中的model去掉之後,n-gram即可以代表n個單詞組成的片段,也可以代表n-gram語言模型。

知道了有些詞出現的條件概率,有時候我們需要判斷整句話出現的概率,或者說有1000個單詞的句子,這樣做並不簡單,因爲這整句話可能並不出現在文本中,所以我們不能簡單的count去計算整句話出現的概率,但我們可以在單詞條件概率的基礎上計算句子出現的概率。

計算一個句子出現的概率時,可以使用鏈式法則(chain rule),但是最後一項會有些複雜,因爲它的條件很長,且我們無法計算,因爲要用頻率代替概率,首先需要很大的語料庫,而語句在不斷創新,且有些特定語句可能根本就不存在。那我們可以避免這種情況嗎,當然是可以的,我們可以使用馬爾科夫假設(markov assumption),馬爾科夫假設是說你不必考慮所有歷史,僅考慮前n-1個term就可以了,這個n在這裏指n-grams中的n,如下圖所示:

如果按照鏈式法則,最後一個概率值要考慮前k-1個單詞,而這(k-1)-grams可能在語料中就不存在,且實際情況中,一個單詞的出現可能僅跟其前幾個單詞有緊密聯繫,太過久遠的歷史不僅沒有用處且不便於計算。

所以這裏我們提出了馬爾科夫假設,即計算第i個單詞出現的條件概率時,不必考慮前i-1個單詞,只需要考慮前n-1個單詞,而n在這裏就是n-grams中的n(有些博客將n看作是第n個單詞,這肯定是不對的,那就無區別於鏈式法則)。

下面來看一個2-grams的應用實例,如下圖所示:

按照馬爾科夫假設,因爲我們使用的是bigram語言模型,所以計算單詞出現的條件概率時,僅考慮該單詞的前一個單詞,如上圖所示。根據語料,我們計算this is the house這句話出現的概率如上圖所示,最終的結果是1/24,但是這樣的結果有什麼問題呢?

其實,這樣計算我們會存在兩種問題,但我們可以解決它們:

首先,在計算開頭單詞出現的概率時我們可以不必考慮語料中所有單詞,因爲有些單詞根本就不可能作爲句子首單詞,而this、that作爲句首單詞出現的概率更高些,解決方法如下圖所示:

即我們可以先在語料中每一個句子的句首都加上一個假的符號(fake token),然後計算this出現在fake token之後的條件概率,這樣做結果就由原來的1/24變爲現在的1/4,結果更加準確。同時,有的同學應該已經發現了,這是在bigram的情況下,所以句首我們加了一個fake token,根據馬爾科夫假設,如果是n-grams,我們就需要在句首加(n-1)個fake token,不要忘記了。

但是這個結果還存在一個問題,我們需要結束符號(end-symble)使所有句子擁有同一個概率分佈。如果沒有結束符號,不同長度的所有句子概率總和均爲1。因爲句子長度無限制,所以該模型將定義無限多個概率分佈,即每個句子長度有一個分佈。如下圖所示:

上面的解釋也許比較抽象,接下來是我自己的想法,我們可以這樣想,在沒有結尾符時,P(this)=P(_this)=P(this|_),表示以this開頭的所有句子,同理,P(that)就表示以that開頭的所有句子,就像我們之前學過的概率公式一樣,即P(A)=P(A\overline{B})+P(AB),自然P(this)+P(that)=1,因爲它已包含所有情況。同理,P(this is)=P(_this is),表示以this is開頭的所有句子,所以只要這裏bigram的情況是完備的,所有概率和爲1,這又是一個概率分佈。所以,如果沒有結束符,我們將會有無數個概率分佈。

而加上結束符之後,概率表示的意義就改變了,P(this)=P(_this_)=P(this|_)P(_|this),此時它僅表示this這個1-gram,這時,所有各式長度的句子合起來構成了一個總體,概率和爲1,是一個概率分佈。也可借下圖理解:

如上圖所示,左側dog表示所有以dog開始的句子,區別於右下角的cat_,僅表示cat這個1-gram,所有這些句子形式組成了一個概率分佈。

最後再總結一下bigram模型,如下圖所示:

如上圖所示,基於馬爾科夫假設,在bigram模型中,每個單詞出現的條件概率僅依賴於前一個單詞,上式中k表示句子長度,而k+1是指加上了end-symble。

估計條件概率時,我們使用極大似然估計結果,分子表示w_{i-1}w_{i}這個bigram出現的頻數,分母表示以w_{i-1}開頭的語料中出現的所有bigram的頻數和,其實,也就是w_{i-1}這個1-gram出現的頻數,所以概率估計結果可化簡爲上圖所示形式。

2.1.2  Perplexity

上一小節我們介紹n-gram模型主要介紹了特例2-gram模型,這一小節我們將上小節得到的結論推廣到n-gram模型,如下圖所示:

如上圖所示,2-gram僅考慮前一個單詞,n-gram則考慮前n-1個單詞。n-gram模型該如何計算呢?如下圖所示:

計算方法本質上還是極大似然估計,這裏我們使用對數似然估計。這裏提一下,在展示和計算語言模型概率時,我們傾向於使用對數形式,因爲我們知道概率值在0-1之間,多個概率的乘積會越來越小,會造成數值下溢(numerical underflow),所以我們最好在對數空間內存儲和計算某個句子出現的概率,在需要時再通過指數轉換爲原概率值。

上圖中N是語料長度,如同上小節中k,加一自然是因爲結束符。

模型計算解決了,我們如何怎麼選擇n-grams中的n呢?即我們該如何評價不同的語言模型呢?

一般在語言模型中令n=5是最好的,但這個取決於你的語料大小和你的具體任務,所以最重要的是如何評估和比較不同的模型來選擇最好的。有兩種方法,外在評估(extrinsic evaluation)和內在評估(intrinsic evalution)。外在評估是指用一些系統去評估我們的模型效果,比如語音識別系統,我們將擬合好的多種模型運用在語音識別上,通過準確性等去判斷哪個模型效果最好,但實際上我們一般沒有時間或者資源去搭建這整個系統,所以我們也需要內在評估方法,即直接評估模型本身,我們將語料分爲訓練集和開發集,在開發集上計算perplexity指標來選擇最優模型。

什麼是perplexity指標?

首先我們根據訓練集語料計算測試集語句出現的概率(這裏的測試集是開發集的作用,在吳老師深度學習筆記中講過這一點),然後perplexity等於概率開N次方的倒數。這裏對於訓練集、開發集和測試集的劃分多說一點,首先開發集和測試集的數目一定要能夠達到其作用,能夠給出一定置信度,這是基本的,我們之前在深度學習筆記中也說過了,但一般劃分比例爲,訓練集:開發集:測試集=8:1:1。

我們使用不同模型基於訓練集去計算測試集語句出現的概率,哪個模型計算出來的概率越大哪個模型就越好,爲什麼?我的想法是,因爲訓練集和測試集取自同一語料,所以屬於同一分佈,測試集語句出現的概率越大越表示該模型更能準確表現訓練集中各個連接單詞之間的聯繫。所以對應於概率越大越好,perplexity越小越好。

注意,在計算perplexity時,構造的n-gram模型不能知道測試集或測試集詞彙表的任何先驗知識。任何有關測試集的知識都會導致perplexity指標被人爲地降低。兩種語言模型的perplexity只有在使用相同的詞彙時纔是可比的。

perplexity指標的提升代表着內在的改善,但內在的改善並不能保證語言處理任務(如語音識別或機器翻譯)的性能提高,也就是外在的改善。然而,由於perplexity常常與這種改進相關,它通常被用作對算法的快速檢查。但是,在結束對模型的評估之前,模型在perplexity方面的改進應該總是通過實際任務的端到端評估來確認纔可以。

有時測試集語料中會包含訓練集語料中不存在的詞,語料之外的單詞會產生什麼問題,我們又該如何處理呢?看下面這個例子:

我們要預測this is the malt這句話出現的概率,使用bigram模型,發現訓練集中不存在malt這個詞,所以malt出現在the之後的概率計算結果爲0,所以this is the malt這句話出現的概率也自然爲0,這樣來看,perplexity的值趨近於無窮大。

現在出現這個問題的原因是測試集中包含有訓練集中不存在的詞,我們該怎麼解決這個問題呢?如下圖所示:

我們可以直接將存在測試集中但不在訓練集中的詞使用<UNK>代替,或者建立一個詞彙表,將詞語按照出現頻數排序,將低於某一個頻數的所有詞使用<UNK>代替,然後將<UNK>作爲正常詞進行統計。

<UNK>模型的正確選擇確實會對perplexity之類的度量指標有影響。一個語言模型可以通過選擇一個小詞彙量和高概率分配<UNK>來達到低perplexity值。爲什麼這樣說呢?我的想法是‘小詞彙量’和‘高概率分配<UNK>’會使語料中存在大部分<UNK>,而我們將<UNK>作爲同一個詞處理,相比於以前頻數稀少的精確詞,使用<UNK>增大計算概率,也起到了一定的泛化效果,所以會降低perplexity值。

所以基於這個原因,perplexity值只應在具有相同詞彙的語言模型中進行比較。

之前因爲測試集中含有訓練集中不包含的詞語,導致概率計算爲0,現在還有另一種情況也能導致這樣的結果,如下圖所示:

這是因爲在bigram模型中,我們需要計算測試集語料中bigram出現的頻數,雖然訓練集包含了測試集中所有單詞,但它可能不包含測試集中出現的bigram,所以在計算概率時還是會導致概率爲0,perplexity趨於無窮大。這種情況我們該如何解決呢?詳見下節平滑技術。

2.1.3 平滑(smoothing)

平滑的思想在於將一些概率從高頻的bigram轉移到低頻的bigram。即爲了防止語言模型對從未見到過的bigram分配零概率,我們必須從一些更頻繁的事件中去掉一些概率值,並將其提供給我們從未見過的事件。

平滑技術方法如下:

主要有以上五種平滑方法,而我們最常使用的就是最後一種方法,Kneser-Ney平滑法。接下來我們就具體介紹一下這幾種方法。

首先介紹一下Add-one(add-k)平滑法,如下圖所示:

Add-one平滑法也稱拉普拉斯平滑法(Laplace Smoothing)。如上圖所示,分子加1,分母加V,V表示詞彙表中單詞的個數,這樣做既達到了平滑的目的,也保證了概率和爲1。爲什麼分母是加V呢?分母中的V要跟分子中的1對應,分子中加了多少次1,分母中V就等於多少,以保證概率和爲1。那分子中加了多少次1呢?在n-gram算法中,跟在w_{i-n+1}^{i-1}後的w_{i}可以是詞彙表中任何一個單詞,不論他存在不存在,我們都將其頻數加1。這就是Add-one平滑法。

Add-k平滑法在Add-one平滑法上做了一點改進,將1變爲了k(0.5? 0.05? 0.01?),所以分母也自然由加V變爲了加Vk,k在這裏屬於超參數,需要我們根據開發集和評價指標選擇最優參數值。

接下來介紹backoff平滑法,如下圖所示:

上圖看起來比較複雜,但其實backoff的思想就是‘退而求其次’。假設我們現在使用3-gram模型,在計算概率時發現訓練集中沒有w_{i-2}w_{i-1}w_{i}組合,那我們就不再計算P(w_{i}|w_{i-2}w_{i-1}),而是改爲計算P(w_{i}|w_{i-1}),如果P(w_{i}|w_{i-1})都不能計算,那我們只能計算P(w_{i})

換句話說,如果我們對於一個高階N-gram計數爲0,我們只能“退避”到一個低階N-gram。

注意,上圖中的\widetilde{p}\alpha是用來保證概率歸一化的,該方法也稱爲Katz backoff。其思想類同與add-one平滑法,因爲add-one平滑法其實是將一些概率由高頻詞組轉移到低頻詞組以保證概率不爲0,但同時爲了保證概率和爲1,分母加上V,對於那些高頻詞組,分子加1可能不會產生太大影響,但分母加V就不同了,會降低概率值,這也是爲什麼說概率由高頻詞組轉移到低頻詞組。這裏Katz backoff想法類似,對於頻數存在的詞組(c>0),也不能使用本身計算得到的概率值,而是要稍微減少該概率值,因爲在backoff方法中,我們會退而求其次用低階N-gram得到概率代替高階的概率,所以如果不對這兩種概率同時做改變,我們就不能得到概率和爲1的結果。所以在Katz backoff中,我們需要同時使用\widetilde{p}\alpha來保證概率歸一化。

注意上式中左側\widehat{p}和右側綠\widehat{p}是相同的,下圖也許更清晰:

上圖摘自斯坦福大學Speech and Language Processing。

即這是一個循環的過程,如果低階詞組頻數仍爲0,那就繼續下降階數,直至到達1-gram。

Katz backoff通常與一個稱爲Good-Turing的平滑方法結合。該組合算法Good-Turing backoff對估計Good-Turing平滑度和\widetilde{p}還有\alpha都有相當詳細的計算。

相比之下,在Interpolation平滑法中,我們總是混合來自所有n-gram模型的概率估計,假設我們現在對3-gram模型使用Interpolation平滑法,那就是對3-gram、2-gram和1-gram進行加權和組合,如下圖所示:

Interpolation平滑法有兩種形式,一種是如上圖所示,簡單對三種模型作加權平均,還有一種是稍微複雜一點的,考慮到前文的影響,如下圖所示:

就是我可以根據一些關於前文的先驗信息對三個lambda的大小有所判斷,但是不論是簡單形式,還是這個稍微有些複雜的形式,lambda的值都要通過開發集調試。

接下來介紹最常用的Kneser-Ney平滑法,在介紹之前,我們先介紹一下absolute discounting,如下圖所示:

這是一個有意思的思想,church和gale兩人在同時比較了訓練集和開發集中bigram發現,在訓練集中同count值的bigram在開發集中的平均count值總是比訓練集少0.75,這是一個固定值呀(fixed)。

將這個思想應用於bigrams上,同時加上Interpolation平滑法的思想,我們得到interpolated absolute discounting,如下圖所示:

我們可以對所有count值取d=0.75,或者特別對count=1的值取d=0.5。

Kneser-Ney discounting在這個基礎上做了改進,對低階的1-gram的分佈用更復雜的方法去處理,如下圖所示:

以前的1-gram分佈P(w_{i})表示的是w_{i}這個詞出現的概率,Kneser-Ney discounting方法認爲這樣做是不夠準確的,我們更多地是要關注這個單詞前文的差異性,怎麼理解呢?舉個栗子,比如這句話I can’t see without my reading . 現在有兩種選擇glasses和Kong,直覺上肯定是選擇glasses,但是如果單計算某個詞出現的概率,Kong不一定輸於glasses,因爲Hong Kong是固定搭配,出現次數很多,但是一旦離開了Hong Kong這個背景,我們就很難再其他地方看到Kong了,而glasses則不一樣,所以glasses相比Kong有一個更廣闊的分佈,所以在這個先驗知識下,這裏填空我們就果斷選擇glasses而不是Kong。

顯然,一個單詞前文類型越豐富,填空處爲該詞的概率就越大,如下圖所示:

P_{CONTINUATION}(w)形式可如上圖所示,分子表示w前單詞類型個數,分母表示所有bigram組合數,P_{CONTINUATION}(w)也有另外一種形式,詳見學習資料。

可見,在這種定義下,Kong這個詞雖頻繁出現,但只有一種背景詞Hong,所以Kong的P_{CONTINUATION}值很低。

對於bigram模型,最終的Interpolated Kneser-Ney平滑法如下圖所示:

一般的遞歸公式如下圖所示:

表現最好的Kneser-Ney平滑法版本是modified Kneser- Ney smoothing,它不是隻有一個d,而是對不同的n-gram有不同的d對應。

 

學習資料:CourseraNLP課程斯坦福Speech and Language Processing

 

 

版權聲明:尊重博主原創文章,轉載請註明出處https://blog.csdn.net/kkkkkiko/article/details/82015589

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章