自然語言處理入門學習<七>HMM模型解析
今天想先介紹在分詞、詞性標註、命名實體識別、句法依存分析都用的很多的也很古老的經典概率圖模型HMM、最大熵模型、CRF之間的關係,後續會繼續詳細介紹HMM和CRF的推理過程和具體代碼細節。
在分詞領域,很常用的一個模型叫做HMM,隱馬爾可夫模型。Jieba分詞的原理就是隱馬爾可夫模型。先舉個例子:對「我愛北京天安門」的分詞,Jieba分詞的結果就是對這個句子序列進行標註,標註結果為「我/S 愛/S 北/B京/E 天/B安/M門/E」。其中B代表一個詞的開始,M代表一個詞的中間,E代表一個詞的結束,S代表單獨成詞。有了上面這個標註結果,就可以很輕鬆的將上述句子進行分詞,「我/愛/北京/天安門」。本質上是將分詞這個任務分解成了對每個字的一個四分類的問題,有了這個基礎,
再來看看HMM這個模型能解決的問題和還存在哪些缺陷。
針對分詞這個任務,我們看HMM是如何準確預測每個字的BMES標註的。
圖1 隱馬爾科夫模型
在圖1中,「BMES」表示隱藏狀態(狀態值集合),「我愛北京天安門」表示可見狀態(觀察值集合),第一個「S」的概率P(S)叫做初始概率,從「S」到「S」的概率P(S|S)叫做狀態轉移概率,從「S」到「我」的概率叫做發射概率。以上五個基本要素的組合就是HMM的五個基本要素 λ =( S, O , π ,A,B)
S:狀態值集合,O:觀察值集合,π:初始化概率,A:狀態轉移概率矩陣,B:給定狀態下,觀察值概率矩陣
但是HMM有三個假設,即
1、有限歷史性假設,p(si|si-1,si-2,...,s1) = p(si|si-1)
2、齊次性假設,(狀態與具體時間無關),P(si+1|si)=p(sj+1,sj)
3、輸出獨立性假設,輸出僅與當前狀態有關,P(o1,...ot|s1,...st) = P(ot|qt)
即每個隱藏狀態只和前一個隱藏狀態相關,和其餘隱藏狀態都無關。
除了三個假設之外,HMM還有三個問題:
1、評估問題,已知模型參數 λ= (A, B, π),計算某個觀測序列發生的概率,即求P(O|λ)
2、解碼問題,給出觀測序列O和模型μ,怎樣選擇一個狀態序列S(s1,s2,...st+1),能最好的解釋觀測序列O
3、學習問題,如何調整模型參數 λ=(π, A, B), 使得P(O|λ)最大?
一、評估問題最簡單,如圖1中的整個觀測序列發生的概率P(O|λ)可以如下計算:
P(O|λ) = P(S)*P(我|S)*P(S|S)*P(愛|S)...*P(門|E)
將所有概率做個乘積就可以得到觀測序列發生的概率。
二、解碼問題是已經知道觀測序列「我愛北京天安門」和π、A、B這些參數(P(S),P(我|S)、P(S|S)等概率)的情況下,如何來求隱藏狀態的過程。這個問題一般通過Viterbi演算法來解決。
Viterbi演算法是求最短路徑的過程,由於不知道每個觀測狀態的隱藏狀態是什麼,所以初始化時構建籬笆網路,每種隱藏狀態都有可能,計算在每種隱藏狀態下的整個觀測序列發生的概率,概率最大的那條路徑就是每個觀測狀態對應的唯一隱藏狀態。
三、學習問題最為複雜,指的是我已經知道隱藏狀態和觀測狀態的情況下,如何求該HMM網路的模型參數λ= (A, B, π)。一般需要用EM演算法來求解這個問題,但是在實際的分詞演算法中,我們也可以通過統計的方式來得到。
如我們想要知道分詞演算法中的初始概率 π,即P(B),P(M),P(E),P(S),我們已經有了很多已經人為切好詞的句子,那隻要統計在所有句子中第一個字被標註為B的次數,和所有句子的總數就可以得到P(B)=(第一個字標註為B的句子個數)/(總的句子數),其他概率可以以此類推。
整個HMM演算法就介紹完了,該演算法最大的缺陷在於有三個假設,現實生活中很多序列任務並不能滿足這幾個假設,那如何來解決這個問題,人們又發現了最大熵模型和CRF模型,可以在一定程度上克服觀測狀態之間的獨立性,後續想先介紹完三大模型之後再來從結巴源碼來剖析HMM,未完,待續。
推薦閱讀:
※torchtext入門教程,輕鬆玩轉文本數據處理
※Learning to Skim Text 閱讀筆記
※Learning Explanatory Rules from Noisy Data 閱讀筆記4
※show and tell 代碼閱讀筆記
※第三章 自然語言理解的技術分類及比較
TAG:自然語言處理 |