[白話解析]以水滸傳爲例學習隱馬爾可夫模型

[白話解析]以水滸傳爲例學習隱馬爾可夫模型

0x00 摘要

本文將盡可能使用易懂的方式,儘量不涉及數學公式,而是從總體的思路上來看,運用感性直覺的思考來解釋隱馬爾可夫模型。而且從名著中找了個具體應用場景來幫助你們深刻這個概念。html

0x01 說明

在機器學習過程當中,會遇到不少晦澀的概念,相關數學公式不少,你們理解起來頗有困難。遇到相似狀況,咱們應該多從直覺角度入手思考,用類別或者舉例來附會,這樣每每會有更好的效果。java

我在講解論述過程當中給本身的要求是:在生活中或者名著中找一個例子,而後用本身的話語闡述出來。git

0x02 機率圖

機率圖模型是用圖來表示變量機率依賴關係的理論,結合機率論與圖論的知識,利用圖來表示與模型有關的變量的聯合機率分佈。由圖靈獎得到者Pearl開發出來。github

若是用一個詞來形容機率圖模型(Probabilistic Graphical Model)的話,那就是「優雅」。對於一個實際問題,咱們但願可以挖掘隱含在數據中的知識。機率圖模型構建了這樣一幅圖,用觀測結點表示觀測到的數據,用隱含結點表示潛在的知識,用邊來描述知識與數據的相互關係,最後基於這樣的關係圖得到一個機率分佈,很是「優雅」地解決了問題。算法

機率圖中的節點分爲隱含節點和觀測節點,邊分爲有向邊和無向邊。從機率論的角度,節點對應於隨機變量,邊對應於隨機變量的依賴或相關關係,其中有向邊表示單向的依賴,無向邊表示相互依賴關係網絡

機率圖模型分爲貝葉斯網絡(Bayesian Network)和馬爾可夫網絡(Markov Network)兩大類。貝葉斯網絡能夠用一個有向圖結構表示,馬爾可夫網絡能夠表 示成一個無向圖的網絡結構。更詳細地說,機率圖模型包括了樸素貝葉斯模型、最大熵模型、隱馬爾可夫模型、條件隨機場、主題模型等,在機器學習的諸多場景中都有着普遍的應用。機器學習

0x03 生成式模型和判別式模型的區別

如今咱們知道,機率圖能夠分紅有向圖模型和無向圖模型,顧名思義,就是圖裏面的邊是否有方向。那麼什麼樣的模型的邊有方向,而什麼樣的沒方向呢?這個很好想到,有方向的表達的是一種推演關係,也就是在A的前提下出現了B,這種模型又叫作生成式模型。而沒有方向表達的是一種「這樣就對了」的關係,也就是A和B同時存在就對了,這種模型又叫作判別式模型。函數

根據建模的到底是聯合機率分佈 P(x,y) 仍是條件機率分佈 P(y|x)。派生出生成式模型與判別式模型。學習

1. 生成式模型

生成式模型通常用聯合機率計算(由於咱們知道A的前提了,能夠算聯合機率),即經過對觀測值和標註數據計算聯合機率分佈P(x,y)來達到斷定估算y的目的。lua

生成式模型是模擬數據的生成過程,兩類隨機變量存在因果前後關係,先有因素 x,後有結果 y,這種因果關係由聯合分佈模擬:
\[ P(x,y) = P(x)P(y|x) \]
經過聯合分佈 P(x,y),生成式模型其實間接建模了 P(x):
\[ P(x) = \sum_y P(x,y) \]
須要注意的是,在模型訓練中,我學習到的是X與Y的聯合模型 P(X,Y) ,也就是說,我在訓練階段是隻對 P(X,Y)建模,我須要肯定維護這個聯合機率分佈的全部的信息參數,要對每一個label (y) 都須要建模。因此沒有什麼判別邊界。

完了以後在inference再對新的sample計算P(Y|X),導出 Y,最終選擇最優機率的label爲結果,但這已經不屬於建模階段了

這裏有兩個缺陷:

  • P(x) 很難準確估計,由於特徵之間並不是相互獨立,而是存在錯綜複雜的依賴關係。
  • P(x) 在分類中也沒有直接做用。

爲了克服這兩個問題,判別式模型出現。

2. 判別式模型

判別式模型通常用條件機率計算(由於咱們不知道前提,因此只能"假設"A條件下B的機率)。即經過求解條件機率分佈P(y|x)或者直接計算y的值來預測y。

判別式模型直接跳過了 P(x),直接對條件機率 P(y|x) 建模,就是說,直接根據X特徵來對Y建模訓練。無論 x 內部存在多複雜的關係,也不影響判別式模型對 y 的判斷,因而就可以放心大膽的利用各類各樣豐富的、有關聯的特徵

具體地,個人訓練過程是肯定構件 P(Y|X) 模型裏面「複雜映射關係」中的參數,對全部的樣本只構建一個模型,確認整體判別邊界。完了再去inference一批新的sample。觀測到輸入什麼特徵,就預測最可能的label。

3. 表明

生成式模型的表明是:n元語法模型、隱馬爾可夫模型、樸素貝葉斯模型等。

判別式模型的表明是:最大熵模型、支持向量機、條件隨機場、感知機模型等

他們之間的區別是這樣的:

判別式模型是這麼工做的,他們直接將數據的Y(或者label),根據所提供的features,學習,最後畫出了一個明顯或者比較明顯的邊界(具體怎麼作到的?經過複雜的函數映射,或者決策疊加等等mechanism),這一點線性LR、線性SVM應該很明顯吧。

生成式模型是這麼工做的,他們先從訓練樣本數據中,將全部的數據的分佈狀況摸透,而後最終肯定一個分佈,來做爲個人全部的輸入數據的分佈,而且他是一個聯合分佈 P(X,Y) (注意X包含全部的特徵x_i ,Y包含全部的label)。而後我來了新的樣本數據(inference),好,經過學習來的模型的聯合分佈P(X,Y) ,再結合新樣本給的X,經過條件機率就能出來Y
\[ P(類別|特徵) = \frac {P(特徵|類別)P(類別)}{P(特徵)} \]


0x04 馬爾可夫系列概念

提到馬爾可夫就是一個值跟前面n個值有關,因此也就是條件機率,也就是生成式模型,也就是有向圖模型。

馬爾可夫假設:每一個事件的發生機率只取決於前一個事件。

馬爾可夫鏈:將知足馬爾可夫假設的連續多個事件串聯起來,就構成了馬爾可夫鏈。馬爾科夫鏈的節點是狀態,邊是轉移機率,是template CPD的一種有向狀態轉移表達。

馬爾可夫鏈的兩個假設

  • 齊次馬爾可夫假設:即t時刻的狀態只受t-1時刻狀態的影響;

  • 觀測獨立性假設:即任意時刻的觀測只受該時刻所處狀態的影響;

馬爾科夫模型 是一種無向機率圖模型,其與馬爾科夫鏈並非很同樣。馬爾科夫模型是與貝葉斯模型並列的一種機率圖模型。其做用是描述互相影響,互相做用,不存在因果關係的兩個隨機變量之間的關係。由於做用是相互的,全部馬爾科夫模型的邊是無向的,或者能夠說是雙向的。

馬爾科夫模型的強大之處在於它解除了貝葉斯模型中的因果關係,這也就使得它能夠對不少平等的東西創建相互關係。好比一幅圖片的各個像素就是平等的,可是各個像素之間能夠相互影響(天在上,地在下)。全部馬爾科夫模型被普遍的應用於圖像處理/圖像理解。

若是把事件具象爲單詞,那麼馬爾可夫模型就具象爲二元語法模型。馬爾可夫模型還能夠當作是一個關於時間t的狀態轉換過程,也就是隨機的有限狀態機,那麼狀態序列的機率能夠經過計算造成該序列全部狀態之間轉移弧上的機率乘積得出。

0x05 隱馬爾可夫模型

隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。即描述一個系統隱性狀態的轉移和隱性狀態的表現機率。系統的隱性狀態指的就是一些外界不便觀察(或觀察不到)的狀態。其難點是從可觀察的參數中肯定該過程的隱含參數。而後利用這些參數來做進一步的分析。

HMM是一種生成式模型,它的理論基礎是樸素貝葉斯,本質上就相似於咱們將樸素貝葉斯在單樣本分類問題上的應用推廣到序列樣本分類問題上。

好比,HMM是描述兩個時序序列聯合分佈 p(x,y) 的機率模型。

  • x 序列外界可見(外界指的是觀測者),稱爲觀測序列(obsevation sequence);

  • y 序列外界不可見,稱爲狀態序列(state sequence)。

好比觀測 x 爲單詞,狀態 y 爲詞性,咱們須要根據單詞序列去猜想它們的詞性。

一個馬爾科夫過程是狀態間的轉移僅依賴於前n個狀態的過程。這個過程被稱之爲n階馬爾科夫模型,其中n是影響下一個狀態選擇的(前)n個狀態。最簡單的馬爾科夫過程是一階模型,它的狀態選擇僅與前一個狀態有關。這裏要注意它與肯定性系統並不相同,由於下一個狀態的選擇由相應的機率決定,並非肯定性的。

隱馬爾可夫模型之因此稱爲「隱」,是由於從外界來看,狀 態序列(例如詞性)隱藏不可見,是待求的因變量。從這個角度來說,人們也稱 y 狀態爲隱狀態(hidden state),而稱觀測 x 爲顯狀態( visible state)

「隱」指的是其中某一階的信息咱們不知道,就像是咱們知道人的祖先是三葉蟲,可是由三葉蟲經歷了怎樣的演變過程才演變到人的樣子咱們是不知道的,咱們只能經過化石資料瞭解分佈信息,若是這類資料不少,那麼就能夠利用隱馬爾可夫模型來建模,由於缺乏的信息較多,因此這一模型的算法比較複雜。

狀態與觀測之間的依賴關係肯定以後,隱馬爾可夫模型利用三個要素來模擬時序序列的發生過程----即初始狀態機率向量、狀態轉移機率矩陣和發射機率矩陣

1. 隱馬爾可夫三大問題

  • 機率計算問題:給定模型,如何有效計算產生觀測序列的機率?換言之,如何評估模型與觀測序列之間的匹配程度?
  • 預測問題:給定模型和觀測序列,如何找到與此觀測序列最匹配的狀態序列?換言之,如何根據觀測序列推斷出隱藏的模型狀態?
  • 學習問題:給定觀測序列,如何調整模型參數使得該序列出現的機率最大?換言之,如何訓練模型使其能最好地描述觀測數據?

前兩個問題是模式識別的問題:1) 根據隱馬爾科夫模型獲得一個可觀察狀態序列的機率(評價),被用來測量一個模型的相對適用性;2) 找到一個隱藏狀態的序列使得這個序列產生一個可觀察狀態序列的機率最大(解碼),即用來推測模型隱藏的部分在作什麼(「到底發生了」什麼)。第三個問題就是根據一個能夠觀察到的狀態序列集產生一個隱馬爾科夫模型(學習)。

第二個問題是隱馬爾可夫模型的核心,不少領域對隱馬爾可夫模型的應用大部分會是問題(2),好比在機器翻譯作中文對英文的翻譯時,單詞的翻譯老是有不少個意思,而詞性每每起到很重要的做用,乍一看詞性這一序列怎麼跟咱們說到的隱含的狀態序列=()很像呢!相似這樣的還有不少.......

對應的三大問題解法:

  1. 向前算法(Forward Algorithm)、向後算法(Backward Algorithm)
  2. 維特比算法(Viterbi Algorithm)
  3. 鮑姆-韋爾奇算法(Baum-Welch Algorithm) (約等於EM算法)

網上經典例子

小明如今有三天的假期,他爲了打發時間,能夠在每一天中選擇三件事情來作,這三件事情分別是散步、購物、打掃衛生(對應着可觀測序列),但是在生活中咱們所作的決定通常都受到天氣的影響,可能晴天的時候想要去購物或者散步,可能下雨天的時候不想出門,留在家裏打掃衛生。而天氣(晴天、下雨天)就屬於隱藏狀態,

那麼,咱們提出三個問題,分別對應馬爾可夫的三大問題:

  1. 已知整個模型,我觀測到連續三天作的事情是:散步,購物,收拾。那麼,根據模型,計算產生這些行爲的機率是多少。
  2. 一樣知曉這個模型,一樣是這三件事,我想猜,這三天的天氣是怎麼樣的。
  3. 最複雜的,我只知道這三天作了這三件事兒,而其餘什麼信息都沒有。我得創建一個模型,晴雨轉換機率,第一每天氣狀況的機率分佈,根據天氣狀況選擇作某事的機率分佈。

2. 隱馬爾可夫的難點/建模

其實對於HMM來講,若是提早知道全部隱含狀態之間的轉換機率和全部隱含狀態到全部可見狀態之間的輸出機率,作模擬是至關容易的。可是應用HMM模型時候呢,每每是缺失了一部分信息的,如何應用算法去估計這些缺失的信息,就成了一個很重要的問題。這些東西就是HMM要解決的問題。

觀察到的狀態序列與隱藏過程有必定的機率關係。咱們使用隱馬爾科夫模型對這樣的過程建模,這個模型包含了一個底層隱藏的隨時間改變的馬爾科夫過程,以及一個與隱藏狀態某種程度相關的可觀察到的狀態集合。

咱們使用一個隱馬爾科夫模型(HMM)對這些例子建模。這個模型包含兩組狀態集合和三組機率集合:

  • 隱藏狀態:一個系統的(真實)狀態,能夠由一個馬爾科夫過程進行描述。
  • 觀察狀態:在這個過程當中‘可視’的狀態。
  • pi向量:包含了(隱)模型在時間t=1時一個特殊的隱藏狀態的機率(初始機率)。
  • 狀態轉移矩陣:包含了一個隱藏狀態到另外一個隱藏狀態的機率
  • 混淆矩陣:包含了給定隱馬爾科夫模型的某一個特殊的隱藏狀態,觀察到的某個觀察狀態的機率。

所以一個隱馬爾科夫模型是在一個標準的馬爾科夫過程當中引入一組觀察狀態,以及其與隱藏狀態間的一些機率關係。

0x06 水滸傳中的隱馬爾可夫應用

水滸傳中,梁中書突圍大名府就是個 能夠被改造以便於說明的 隱馬爾可夫(HMM)案例。

卻說梁中書正在衙前醉了閒坐,初聽報說,尚自不甚慌;次後沒半個更次,流星探馬,接連報來,嚇得魂不附體,慌忙快叫備馬。說言未了,只見翠雲樓上,烈焰沖天,火光奪月,十分浩大。梁中書見了,急上得馬,卻待要去看時,只見兩條大漢,推兩輛車子,放在當路,便去取碗掛的燈來,望車子上點着,隨即火起。梁中書要出東門時,兩條大漢口稱:「李應、史進在此!」手拈朴刀,大踏步殺來。把門官軍,嚇得走了,手邊的傷了十數個。杜遷、宋萬卻好接着出來,四個合作一處,把住東門。梁中書見不是頭勢,帶領隨行伴當,飛奔南門。南門傳說道:「一個胖大和尚,掄動鐵禪杖;一個虎面行者,掣出雙戒刀,發喊殺入城來。」梁中書回馬,再到留守司前,只看法珍、解寶手拈鋼叉,在那裏東撞西撞;急待回州衙,不敢近前。王太守卻好過來,劉唐、楊雄兩條水火棍齊下,打得腦漿迸流,眼珠突出,死於街前。虞候押番,各逃殘生去了。梁中書急急回馬奔西門,只聽得城隍廟裏,火炮齊響,轟天震地。鄒淵、鄒潤手拿竹竿,只顧就房檐下放起火來。南瓦子前,王矮虎、一丈青殺未來。孫新、顧大嫂身邊掣出暗器,就那裏協助。銅寺前,張青、孫二孃入去,爬上鰲山,放起火來。此時北京城內百姓黎民,一個個鼠攛狼奔,一家家神號鬼哭,四下裏十數處火光亙天,四方不辨。
  卻說梁中書奔到西門,接着李成軍馬,急到南門城上,勒住馬,在鼓樓上看時,只見城下兵馬擺滿,旗號上寫道:「大將呼延灼。」火焰光中,抖擻精神,施逞驍勇;左有韓滔,右有彭玘,黃信在後,催動人馬,雁翅通常橫殺未來,隨到門下。梁中書出不得城去,和李成躲在北門城下,望見火光明亮,軍馬不知其數,倒是豹子頭林沖,躍馬橫槍,左有馬麟,右有鄧飛,花榮在後,催動人馬,飛奔未來。再轉東門,一連火把叢中,只見沒遮攔穆弘,左有杜興,右有鄭天壽,三籌步軍好漢當先,手拈朴刀,引領一千餘人,殺入城來。梁中書徑奔南門,捨命奪路而走。吊橋邊火把齊明,只見黑旋風李逵,左有李立,右有曹正。李逵渾身脫剝,咬定牙根,手雙斧,從城濠裏飛殺過來。李立、曹正,一齊俱到。李成當先,殺開條血路,奔出城來,護着梁中書便走。只見左手下殺聲震響,火把叢中,軍馬無數,倒是大刀關勝,拍動赤兔馬,手舞青龍刀,徑搶梁中書。李成手舉雙刀,前來迎敵。那
李成無意戀戰,撥馬便走。左有宣贊,右有郝思文,兩肋裏撞來。孫立在後,催動人馬,併力殺來。正鬥間,背後遇上小李廣花榮,拈弓搭箭,射中李成副將,翻身落馬。李成見了,飛馬奔走,未及半箭之地,只見右手下鑼鼓亂鳴,火光奪目,倒是霹靂火秦明躍馬舞棍,引着燕順、歐鵬,背後楊志,又殺未來。李成且戰且走,折軍大半,護着梁中書,衝路走脫。

突圍有四個選擇:東南西北四門。每一個門都有不一樣的梁山好漢。如今梁中書面對的梁山好漢就構成了一條人名鏈。

好比去南門,碰見武松,再去東門,碰見史進,再去北門,碰見林沖,再去西門,碰見宋江。 那麼能獲得以下一串好漢名字:武松,史進,林沖,宋江

這串好漢名字叫作可見狀態鏈。可是在隱馬爾可夫模型中,咱們不只僅有這麼一串可見狀態鏈,還有一串隱含狀態鏈。在這個例子裏,這串隱含狀態鏈就是梁中書選擇門的序列: 南門,東門,北門,西門

後續咱們就圍繞 梁中書 碰見如下各位好漢來講明: 武松,史進,林沖,宋江

1. 狀態轉移矩陣

狀態轉移矩陣包含了一個隱藏狀態到另外一個隱藏狀態的機率。通常來講,HMM中說到的馬爾可夫鏈實際上是指隱含狀態鏈,由於隱含狀態(城門)之間存在轉換機率(transition probability)。

好比,梁中書在西門突圍失敗以後,下一個狀態是南門,東門,北門,西門的機率都是1/4。這樣設定是爲了容易說清楚。可是咱們實際上是能夠隨意設定轉換機率的。好比,咱們能夠這樣定義規則以下:

* 順時針以下:東門 ----> 南門 ----> 西門 ----> 北門 ---> 東門 ---> ...  

* 已經到達某門,再次選擇此門的機率是1/8,好比 東門 ---> 東門 (不大可能再次原地突圍)

* 已經到達某門,若是順時針或者逆時針選擇下一個門的機率是3/8, 好比 東門 ----> 南門 或者 東門 ----> 北門
  
* 已經到達某門,選擇 正對門 的機率是1/8, 好比 東門 ----> 西門 (不大可能選擇穿過大名府去對面城門突圍)

狀態轉移矩陣以下:
\[ A= \left\{ \begin{matrix} \frac18 & \frac38 & \frac18 & \frac38\\ \frac38 & \frac18 & \frac38 & \frac18\\ \frac18 & \frac38 & \frac18 & \frac38\\ \frac38 & \frac18 & \frac38 & \frac18\\ \end{matrix} \right\} \]

2. 混淆矩陣

混淆矩陣:包含了給定隱馬爾科夫模型的某一個特殊的隱藏狀態,觀察到的某個觀察狀態的機率。即儘管可見狀態之間沒有轉換機率,可是隱含狀態和可見狀態之間有一個機率叫作輸出機率(emission probability)。

水滸傳真實總結出的四個門對應的梁山好漢是:

* 水滸傳真實總結
   
 * 南門: 武松,魯智深,呼延灼,韓滔,彭杞,黃信,李逵,李立,曹正,關勝,宣贊,郝思文,孫立,秦明,燕順、歐鵬,楊志。
 * 東門:李應,史進,穆弘,杜興,鄭天壽
 * 北門:林沖,馬麟,鄧飛,花榮
 * 西門:梁山好漢大部軍馬。
   
 * 真實中,北門碰見林沖的機率是1/4, 南門碰見武松的機率是1/17。

但這些是肯定的機率,無法說明咱們的HMM模型。

因此咱們須要從梁中書/吳學究的角度改造。假設吳學究派兵部署時候,給每一個好漢分配到每一個門是有必定機率的,也就是說,梁中書在去了某門以後,遇到某一好漢是有必定機率的。

咱們這裏是簡化版本,只給定幾位好漢:武松,史進,林沖,宋江

* 如下爲吳學究派兵時候,每一個好漢分配到每一個門的機率
   
 * 南門:武松 1/2,史進 1/4,林沖 1/8,宋江 1/8
 * 東門:武松 1/4,史進 1/2,林沖 1/8,宋江 1/8
 * 北門:武松 1/8,史進 1/8,林沖 1/2,宋江 1/4
 * 西門:武松 1/8,史進 1/8,林沖 1/4,宋江 1/2
   
 * 就咱們的例子來講,梁中書在北門 遇到武松的機率是1/8,碰見史進的機率是1/8,碰見林沖的機率是1/2,......

混淆矩陣以下:
\[ B = \left\{ \begin{matrix} \frac12 & \frac14 & \frac18 & \frac18\\ \frac14 & \frac12 & \frac18 & \frac18\\ \frac18 & \frac18 & \frac12 & \frac14\\ \frac18 & \frac18 & \frac14 & \frac12\\ \end{matrix} \right\} \]
在狀態轉移矩陣及混淆矩陣中的每個機率都是時間無關的——也就是說,當系統演化時這些矩陣並不隨時間改變。實際上,這是馬爾科夫模型關於真實世界最不現實的一個假設。

3. pi向量(初始機率)

梁山大部軍馬在西門偷襲李成,梁中書去西門可能性甚小,去東門可能性最大

* 南門: 1/4
* 東門:7/16
* 北門:1/4
* 西門:1/16

pi向量以下:
\[ pi= \left\{ \begin{matrix} \frac14 \\ \frac7{16} \\ \frac14 \\ \frac1{16} \\ \end{matrix} \right\} \]

0x07 水滸傳HMM對應的三類問題

1. 序列機率過程 --- 估計(Evaluation)

機率計算問題:給定模型,如何有效計算產生觀測序列的機率。即根據隱馬爾科夫模型獲得一個可觀察狀態序列的機率(評價)。

結合咱們水滸傳的例子,就是已經知道門有幾種(隱含狀態數量),每種門是什麼(轉換機率),根據"選門以後看到哪位好漢"的結果(可見狀態鏈),我想知道看到這個結果的機率。

好比連續三次,看到的人分別是:武松,史進,林沖。那麼根據模型,計算產生這些行爲的機率是多少。

1.1 直接計算法(窮舉搜索)

列舉全部可能的狀態序列,而後計算每種狀態序列狀況下的觀測序列機率,最後求和。時間複雜度很是高,對於每個t,都有N種隱藏狀態,那整個序列T的全部可能就是N的T次方,而後求和又是T的全部複雜度。

1.2 前向算法(基本動態規劃思想)

咱們使用前向算法(forward algorithm)來計算給定隱馬爾科夫模型(HMM)後的一個觀察序列的機率,並所以選擇最合適的隱馬爾科夫模型(HMM)。

這個算法採用了DP思想,減小計算量,即每一次直接引用前一個時刻的計算結果以免重複計算,跟Viterbi同樣的技巧相應地,其時間複雜度與T成線性關係。

給定一個隱馬爾科夫模型(HMM),咱們將考慮遞歸地計算一個觀察序列的機率。咱們首先定義局部機率(partial probability),它是到達網格中的某個中間狀態時的機率。對於最後的觀察狀態,其局部機率包括了經過全部可能的路徑到達這些狀態的機率。因而可知,對於這些最終局部機率求和等價於對於網格中全部可能的路徑機率求和,也就求出了給定隱馬爾科夫模型(HMM)後的觀察序列機率。

注:窮舉搜索的時間複雜度是2TN^T,前向算法的時間複雜度是N^2T,其中T指的是觀察序列長度,N指的是隱藏狀態數目。

2. 序列標註過程 --- 解碼(Decoding)

預測問題:給定模型和觀測序列,如何找到與此觀測序列最匹配的狀態序列?換言之,如何根據觀測序列推斷出隱藏的模型狀態?對於一個特殊的隱馬爾科夫模型(HMM)及一個相應的觀察序列,咱們經常但願能找到生成此序列最可能的隱藏狀態序列

結合咱們水滸傳的例子就是,知道門有幾種(隱含狀態數量),每種門是什麼(轉換機率),根據"選門以後看到哪位好漢"的結果(可見狀態鏈),我想知道每次選中的是哪一個門(隱含狀態鏈)。

好比連續三次,看到的人分別是:武松,史進,林沖。那麼這三次每次選的是哪一個門?

我如今要在給定的觀測序列下找出一條隱狀態序列,條件是這個隱狀態序列的機率是最大的那個

2.1 Viterbi 算法

可使用Viterbi 算法(Viterbi algorithm)肯定(搜索)已知觀察序列及HMM下最可能的隱藏狀態序列。

維特比算法致力於尋找一條最佳路徑,以便能最好地解釋觀測到的序列。咱們能夠經過列出全部可能的隱藏狀態序列而且計算對於每一個組合相應的觀察序列的機率來找到最可能的隱藏狀態序列。最可能的隱藏狀態序列是使下面這個機率最大的組合:

      Pr(觀察序列|隱藏狀態的組合)

這個思想的基礎是這樣的,若是從p1到pN存在一條最好的路是k,若是這條路k通過了p‘,則p’到pN必定是最優的,若是不是最優的,就存在另一條路k‘,他的p’到pN更好,那這條路就不是k了,矛盾。因此咱們只要找到最大機率的最後一個結點,而後一步一步向前就能求出來最優路徑。

具體在應用中,維特比算法對於網格中的每個單元(cell)都計算一個局部機率,同時包括一個反向指針用來指示最可能的到達該單元的路徑。咱們首先定義局部機率,它是到達網格中的某個特殊的中間狀態時的機率。這些局部機率與前向算法中所計算的局部機率是不一樣的,由於它們表示的是時刻t時到達某個狀態最可能的路徑的機率,而不是全部路徑機率的總和。當完成整個計算過程後,首先在終止時刻找到最可能的狀態,而後經過反向指針(這個指針指向最優的引起當前狀態的前一時刻的某個狀態)回溯到t=1時刻,這樣回溯路徑上的狀態序列就是最可能的隱藏狀態序列了。

3. 學習問題(Learning)

學習問題:給定觀測序列,如何調整模型參數使得該序列出現的機率最大?換言之,如何訓練模型使其能最好地描述觀測數據?即根據一個能夠觀察到的狀態序列集產生一個隱馬爾科夫模型(學習)。

結合咱們水滸傳的例子就是,知道門有幾種(隱含狀態數量),不知道每種門是什麼(轉換機率),觀測到不少次"選門以後看到哪位好漢"的結果(可見狀態鏈),我想反推出每種門是什麼(轉換機率)。

好比連續三次,梁中書看到的人分別是:武松,史進,林沖。而其餘什麼信息都沒有。要創建一個模型,找出各類門之間轉換機率,固然也有這些門外他遇到好漢的機率分佈。

不少時候咱們只有可見結果,不知道HMM模型裏的參數,咱們須要從可見結果估計出這些參數,這是建模的一個必要步驟。

這個問題,也是與HMM相關的問題中最難的,根據一個觀察序列(來自於已知的集合),以及與其有關的一個隱藏狀態集,估計一個最合適的隱馬爾科夫模型(HMM),也就是肯定對已知序列描述的最合適的(pi,A,B)三元組。

3.1 監督學習算法——頻數/總數就是機率

首先監督學習算法,就是數據足夠,而後人工標註好,其實你只須要統計出來各類頻數就能夠了。
好比分詞的時候:
統計B到E的頻數,B到M的頻數什麼的都能求出來,轉移矩陣A有了。每一個字分別爲BEMS的頻數,觀測矩陣B有了
樣本中第一個字爲B和S分別的機率。初始機率PI有了。而後就解決問題了,其實分詞就是這樣的,在人工標註好的數據集上統計就行了。

3.2 非監督學習算法——鮑姆-韋爾奇算法

沒有標註的狀況下,你只有一堆句子(假設句子長短一致,都是T個字),這時候矩陣A和B不可以直接被(估計)測量,學習這些參數,就要用EM算法對於HMM參數學習問題的適配版——Baum-Welch算法。

參數學習算法又叫前向後向算法。要是計算整個序列的機率,前向就解決了。要是計算整個序列某個子序列出現的機率,那就必需要二者一塊兒來算了。

0x08 參考代碼

UMDHMM(Hidden Markov Model Toolkit):

Hidden Markov Model (HMM) Software: Implementation of Forward-Backward, Viterbi, and Baum-Welch algorithms.
這款屬於輕量級的HMM版本。UMDHMM主頁:http://www.kanungo.com/software/software.html

前向算法程序(forward.c)

/* 函數參數說明:
  *phmm:已知的HMM模型;T:觀察符號序列長度;
  *O:觀察序列;**alpha:局部機率;*pprob:最終的觀察機率
 */
void Forward(HMM *phmm, int T, int *O, double **alpha, double *pprob) {
  int i, j;   /* 狀態索引 */
  int t;    /* 時間索引 */
  double sum; /*求局部機率時的中間值 */

  /* 1. 初始化:計算t=1時刻全部狀態的局部機率alpha: */
  for (i = 1; i <= phmm->N; i++)
    alpha[1][i] = phmm->pi[i]* phmm->B[i][O[1]];
  
  /* 2. 概括:遞歸計算每一個時間點,t=2,... ,T時的局部機率 */
  for (t = 1; t < T; t++) {     
      for (j = 1; j <= phmm->N; j++) {
      sum = 0.0;
      for (i = 1; i <= phmm->N; i++)
        sum += alpha[t][i]* (phmm->A[i][j]);
      alpha[t+1][j] = sum*(phmm->B[j][O[t+1]]);
    }
  }

  /* 3. 終止:觀察序列的機率等於T時刻全部局部機率之和*/
  *pprob = 0.0;
  for (i = 1; i <= phmm->N; i++)
    *pprob += alpha[T][i];
}

維特比算法程序(viterbi.c)

void Viterbi(HMM *phmm, int T, int *O, double **delta, int **psi,int *q, double *pprob)
{
  int i, j; /* state indices */
  int t; /* time index */
  int maxvalind;
  double maxval, val;

  /* 1. Initialization */
  for (i = 1; i <= phmm->N; i++){
    delta[1][i] = phmm->pi[i] * (phmm->B[i][O[1]]);
    psi[1][i] = 0;
  }

  /* 2. Recursion */
  for (t = 2; t <= T; t++)   {     
       for (j = 1; j <= phmm->N; j++){
      maxval = 0.0;
      maxvalind = 1;
      for (i = 1; i <= phmm->N; i++) {
        val = delta[t-1][i]*(phmm->A[i][j]);
        if (val > maxval){
          maxval = val;
          maxvalind = i;
        }
      }
      delta[t][j] = maxval*(phmm->B[j][O[t]]);
      psi[t][j] = maxvalind;
    }
  }

  /* 3. Termination */
  *pprob = 0.0;
  q[T] = 1;
  for (i = 1; i <= phmm->N; i++){
    if (delta[T][i] > *pprob){
      *pprob = delta[T][i];
      q[T] = i;
    }
  }

  /* 4. Path (state sequence) backtracking */
  for (t = T - 1; t >= 1; t--)
    q[t] = psi[t+1][q[t+1]];
}

0x09 參考

[2] 如何用簡單易懂的例子解釋隱馬爾可夫模型?[Online]

[3] 」相親記「之從EM算法到Baum-Welch算法[Online]

Itenyh版-用HMM作中文分詞一:序

HMM學習最佳範例一:介紹

條件隨機場的簡單理解

HMM隱馬爾可夫模型詳解

3.二元語法與中文分詞.md

」相親記「之從EM算法到Baum-Welch算法

(https://github.com/NLP-LOVE/Introduction-NLP/blob/master/chapter/3.%E4%BA%8C%E5%85%83%E8%AF%AD%E6%B3%95%E4%B8%8E%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D.md)

https://github.com/NLP-LOVE/Introduction-NLP/blob/master/chapter/3.%E4%BA%8C%E5%85%83%E8%AF%AD%E6%B3%95%E4%B8%8E%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D.md

如何輕鬆愉快地理解條件隨機場(CRF)?

一文讀懂機器學習機率圖模型

十5、一篇文章讀懂拿了圖靈獎和諾貝爾獎的機率圖模型

機器學習 —— 機率圖模型(貝葉斯網絡)

貝葉斯網絡,看完這篇我終於理解了(附代碼)!

機率圖模型理解

機率圖模型體系:HMM、MEMM、CRF

HMM算法學習——本身動手實現一個簡單的HMM分詞(java)

HMM學習最佳範例六:維特比算法1

wiki上一個比較好的HMM例子

https://hunch.net/

https://eps.leeds.ac.uk/computing

相關文章
相關標籤/搜索