隱性馬爾可夫鏈

我是學理科出身的程序員,一直做web,複雜的算法基本上很少用到。最近做了一個自然語言處理相關的項目,我把我的一些理解和大家分享一下。

 

1.       首先來說一下馬爾科夫鏈。

 

一個事件序列發生的概率可以用下面的概率論裏面的乘法公式展開

 

P(w1,w2,…wn) = P(w1)P(w2|w1)P(w3| w1 w2)…P(wn|w1 w2…wn-1)

 

乘法公式的證明非常有意思,它本身就是一個遞推的過程,

 

根據條件概率的定義:P(A|B) = P(AB)/ P(B)

那麼 P(AB) = P(A|B) X P(B),由此可得:

P(w1,w2,…wn) = P(w1,w2,…wn-1) X P(wn|w1 w2…wn-1)

一路往下遞推就能得到乘法公式的結果了。

 

假定任意一個事件wi的出現概率只同它前面的事件wi-1 有關(即一階馬爾可夫假設,多階的情況這裏不討論)。那麼上面那個乘法公式就變成下面的公式了:

 

P(w1,w2,…wn) = P(w1)P(w2|w1)P(w3|w2)…P(wi|wi-1)…

 

這個模型非常的簡單,但是用處的確很大。舉個例子,比如說要進行分詞,我們用馬爾科夫鏈來理解這個,假設句子中詞的構成只和上一個詞相關,那麼這就是一個馬爾可夫鏈,分詞問題變成,要尋找一個劃分 w1,w2,..wn使得 max(P(w1,w2,…wn)) 成立。一般來說 P(w2|w1) 比較小,要是 幾千個這樣小的數相乘的話,就會變成一個很小的數,在數學裏面可以在等式兩邊加個 log,這樣就得到

W = Log(P(w1,w2,…wn)) = P(w1)+P(w2|w1)+P(w3|w2)+…+P(wi|wi-1)+…現在求max (w) 就方便多了。

 

當然,接下來的工作還是有一定的難度,但是分詞的基本的思想就是這樣的。

 

2.    隱性馬爾可夫鏈。

隱性馬爾可夫鏈要複雜一點,基本的問題是這樣的:

有兩個序列,一個序列是原因,一個序列是結果。現在,我們已經知道了結果,問,這個序列的原因是什麼?如果對概率論比較熟悉,你肯定知道,由結果推導原因就是 是個貝葉斯推斷問題。的確,隱性馬爾可夫鏈 就是源於這樣的一個問題,當然它也有很多其他的用途。比如,分詞裏面一個詞的詞性的標記問題。已知的是一個詞序列,要求這個序列每個詞隱含的詞性。

用數學公式表示就是這樣的:

P (h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....), o 表示 observed(結果,你可以觀察到的 h 表示 hidden states(原因,你不能觀察到的,或者說是隱性的),t1, t2, t3 表示你觀察的時間。注意,o(t1),o(t2),o(t3).... 是已經確定的。因此 P(o(t1),o(t2),o(t3)....) 是一個常數。對 P (h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....) 用貝葉斯公式展開,

我們可以得到

P(h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....) = P(h(t1),h(t2),h(t3)……) X P (o(t1),o(t2),o(t3)....|(h(t1),h(t2),h(t3),...) / P(o(t1),o(t2),o(t3)……)

 

其中 P(o(t1),o(t2),o(t3)……) 是一個常數,我們的目的是找原因,所以,我們要求概率最大的 P(h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....) ,因此常數可以忽略。

 

我們做下面的兩個假設:

第一,   h(t1),h(t2),h(t3),... 是一個馬爾可夫鏈,也就是說,h(i) 只由 h(i-1) 決定。

第二,     i 時刻的觀察值 oi 只由第i時刻的原因 h(i) 決定(又稱爲獨立輸出假設 P(o(t1),o(t2),o(t3)....| h(t1),h(t2),h(t3)....)

= P(o(t1)|h(t1)) X P(o(t2)|h(t2)) X P(o(t3)|h(t3))...

 

這樣問題就簡單多了:

HHM = P(h(t1),h(t2),h(t3),...|o(t1),o(t2),o(t3)....)

= P(h(t1)) X P(h(t2)|h(t1))… X  P(o(t1)|h(t1)) X P(o(t2)|h(t2)) X P(o(t3)|h(t3))...

 

Max HHM

 

求解這個公式,最出名的一個算法就是 Viterbi 算法,在說這個算法之前,我們要強調的是  Max(HHM). 爲了更好的理解上面的模型,我們舉個HMM的例子。

 

周文王被關在 天牢裏面,永不見天日。但是呢,他能說出外面是晴,還是下雨。這是怎麼回事呢?根據以前的經驗,房子裏面的潮溼程度  外面的天氣有一定的關係。

 

Dry

Dryish

Damp

Soggy

Sun

0.6

0.2

0.15

0.05

Cloud

0.25

0.25

0.25

0.25

Rain

0.05

0.1

0.35

0.50

(表示 P(o(ti)|h(ti)) 的所有情況)

 

我們還知道,天氣之間的轉移矩陣如下:

 

Sun

Cloud

Rain

Sun

0.5

0.375

0.125

Cloud

0.25

0.125

0.625

Rain

0.25

0.375

0.375

(表示:P(h(ti)|h(ti-1)) 的所有情況)

 

現在某幾天他觀察到 房子裏面的乾燥程度是這樣的:

Dry Dryish Damp 問,這幾天 天氣最有可能的情況是什麼?

也就是說要求:

HHM  = P(h(t1),h(t2),h(t3)| Dry Dryish Damp)   h(t1),h(t2),h(t3)的一個組合,使得 HHM   最大。

當然,你肯定想到了,用枚舉法就可以了。當然,這個是一個 指數級的 複雜度,很簡單的就可以證明 複雜度爲 N^N.

 

下面我簡單說下用 Viterbi 算法求解的思路。它的基本思路就是遞歸。和我們前面證明乘法公式的算法一樣,求t3 可以 先求 t2,  t2 可以先求 t1, t1 當然十分的好求解了,就是

Max(P(h(t1) | Dry))h(t1) 只有三種情況,[sun,cloud,rain].然後再反推回去。所以關鍵就是推導這個遞推公式了。關於這個遞推公式的推導就留給大家自己去做了,相信,你也能夠自己發現 Viterbi 算法,不用看書上枯燥的算法描述。要注意的是,t2 的最優解,不一定是 t3的最優解。

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