1. 程式人生 > >隱馬爾科夫模型(HMM)原理詳解

隱馬爾科夫模型(HMM)原理詳解

  隱馬爾可夫模型(Hidden Markov Model,HMM)是可用於標註問題的統計學習模型,描述由隱藏的馬爾可夫鏈隨機生成觀測序列的過程,屬於生成模型。HMM在語音識別、自然語言處理、生物資訊、模式識別等領域都有著廣泛的應用。

一、 HMM模型的定義

    HMM模型是關於時序的概率模型,描述由一個隱藏的馬爾可夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測隨機序列的過程。隱藏的馬爾可夫鏈隨機生成的狀態的序列稱為狀態序列(state sequence);每個狀態生成一個觀測,再由此產生的觀測的隨機序列,稱為觀測序列(observation sequence。序列的每一個位置可以看作是一個時刻。

    HMM模型由初始概率分佈、狀態轉移概率分佈、觀測概率分佈確定。設$Q$是所有可能的狀態的集合,$V$是所有可能的觀測的集合,即:

$Q=\left\{q_{1}, q_{2}, \cdots, q_{N}\right\}, \quad V=\left\{v_{1}, v_{2}, \cdots, v_{M}\right\}$

  其中,$N$是可能的狀態數,$M$是可能的觀測數。記$I$是長度為$T$的狀態序列,$O$是對應的觀測序列,即:

$I=\left(i_{1}, i_{2}, \cdots, i_{T}\right), \quad O=\left(o_{1}, o_{2}, \cdots, o_{T}\right)$

  記$A$為狀態轉移概率矩陣:

$A=\left[a_{i j}\right]_{N \times N}$

  其中,$a_{i j}=P\left(i_{t+1}=q_{j} | i_{t}=q_{i}\right), \quad i=1,2, \cdots, N ; j=1,2, \cdots, N$,即在時刻$t$處於狀態​$q_{i}$的條件下在時刻$t+1$轉移到狀態​$q_{j}$的概率。

    記$B$觀測概率矩陣:

$B=\left[b_{j}(k)\right]_{N \times \mu}$

  其中,$b_{j}(k)=P\left(o_{t}=v_{k} | i_{t}=q_{j}\right), \quad k=1,2, \cdots, M ; j=1,2, \cdots, N$,$N$是在時刻$t$處於狀態$q_{j}$的條件下生成觀測$v_{k}$的概率。

    記$\pi $為初始狀態概率向量:

$\pi=\left(\pi_{i}\right)$

  其中,$\pi_{i}=P\left(i_{1}=q_{i}\right), \quad i=1,2, \cdots, N$,表示時刻$t=1$處於狀態$q_{i}$的概率。

    因此,HMM模型$\lambda$可以用三元符號表示,即:

$\lambda=(A, B, \pi)$

  $A, B, \pi$稱為HMM模型的三要素。

   舉例說明

  假設有4個盒子,每個盒子都有紅白兩種顏色的球,球的數量如下:

  盒子        1        2        3        4
  紅球數      5        3        6        8
  白球數      5        7        4        2

  按下面的方法抽取球:
  開始時,從4個盒子中等概率地抽取一個,再從盒子中隨機抽一個球,記錄顏色後放回。然後從當前盒子轉移到下一個盒子,如果當前為盒子1,下一個盒子一定是2;如果當前為盒子2或3,以概率0.4和0.6轉移到左邊或右邊的盒子;如果當前為盒子4,各以0.5概率停留在盒子4或轉移到盒子3。轉移後,再從盒子中隨機抽一個球,記錄顏色後放回。
  現在假設我們要連續地抽5次。抽取結果如下:

$O$=( 紅 , 紅 , 白 , 白 , 紅 )

  這個例子中有兩個隨機序列:
  盒子序列(狀態序列)和球顏色序列(觀測序列)。前者是隱藏的,後者是可觀測的。
  則狀態集合$Q$和觀測集合$V$為:

$Q$=(盒子1,盒子2,盒子3,盒子4),   $V$=(紅,白)

  狀態序列和觀測序列長度T=5。
  開始時,從4個盒子中等概率地抽取一個,則初始概率分佈$\pi $為:

$\pi=(0.25,0.25,0.25,0.25)^{\mathrm{T}}$  

  狀態轉移概率分佈$A$為(由盒子轉移規則得出):

  觀測概率分佈$B$為(由每個盒子紅白球比例計算得出):

二、兩個基本假設和三個基本問題

  隱馬爾可夫模型做了兩個基本假設:

  • 齊次馬爾可夫性假設,即假設隱藏的馬爾可夫鏈在任意時刻t的狀態只依賴於其前一時刻的狀態,與其他時刻的狀態及觀測無關,也與時刻t無關,即:
    $P\left(i_{t} | i_{t-1}, o_{t-1}, \cdots, i_{1}, o_{1}\right)=P\left(i_{t} | i_{t-1}\right), \quad t=1,2, \cdots, T$
  • 觀測獨立性假設,即假設任意時刻的觀測只依賴於該時刻的馬爾可夫鏈的狀態,與其他的觀測和狀態無關,即:
    $P\left(o_{t} | i_{T}, o_{T}, i_{T-1}, o_{T-1}, \cdots, i_{t+1}, o_{t+1}, i_{t-1}, i_{t-1}, \cdots, i_{1}, o_{1}\right)=P\left(o_{t} | i_{t}\right)$

  隱馬爾可夫模型有3個基本問題: 

  1、概率計算問題  給定模型λ和觀測序列$O$,計算在模型$\lambda $下觀測序列$O$出現的慨率$P(O\mid \lambda)$。

  2、學習問題  已知觀測序列$O$,估計模型$\lambda $的引數,使得在該模型下觀測序列概率$P(O\mid \lambda)$最大。即用極大似然估計的方法估計引數。

  3、預測問題,也稱為解碼問題  已知模型λ和觀測序列$O$,求對給定觀測序列條件概率$P(I\mid O)$最大的狀態序列。即給定觀測序列,求最有可能的對應的狀態序列。

 三、概率計算問題:概率計算方法 

     概率計算即給定模型$\lambda=(A, B, \pi)$和觀測序列$O=\left(o_{1}, o_{2}, \cdots, o_{T}\right)$,計算在模型$\lambda $下,觀測序列$o$出現的概率$P(O | \lambda)$。

  3.1 直接計演算法

     直接計演算法是通過列舉所有可能的長度為$T$的狀態序列$I=\left(i_{1}, i_{2}, \cdots, i_{T}\right)$,求各個狀態序列I II和觀測序列$O=\left(o_{1}, o_{2}, \cdots, o_{T}\right)$的聯合概率$P(O, I | \lambda)$,然後對所有可能的狀態序列求和,得到$P(O | \lambda)$。

    狀態序列$I=\left(i_{1}, i_{2}, \cdots, i_{T}\right)$的概率為:

$P(I | \lambda)=\pi_{i_{1}} a_{i_{1} i_{2}} a_{i_{2} i_{3}} \cdots a_{i_{T-1} i_{T}}$

  對固定的狀態序列$I=\left(i_{1}, i_{2}, \cdots, i_{T}\right)$,觀測序列$O=\left(o_{1}, o_{2}, \cdots, o_{T}\right)$的概率為$P(O | I, \lambda)$:

$P(O | I, \lambda)=b_{i_{1}}\left(o_{1}\right) b_{i_{2}}\left(o_{2}\right) \cdots b_{i_{T}}\left(o_{T}\right)$

  $O$和$I$同時出現的l聯合概率為:

  對所有可能的狀態序列$I$求和,得到觀測序列$O$的概率$P(O | \lambda)$,即:

  但是,通過這種計算方式的計算量非常大,其複雜度為$O\left(T N^{r}\right)$,因此是不可行的。在真實情況下,一般採用更有效的演算法,即前向-後向演算法。

  3.2 前向演算法

    前向概率:給定隱馬爾可夫模型$\lambda$,定義到時刻$t$部分觀測序列為$o_{1}, o_{2}, \cdots, o_{t}$且狀態為$q_{i}$的概率為前向概率,記作:
          $\alpha_{t}(i)=P\left(o_{1}, o_{2}, \cdots, o_{t}, i_{t}=q_{i} | \lambda\right)$

    觀測序列概率的前向演算法:

  1、輸入:隱馬爾可夫模型$\lambda $,觀測序列$O$;

  2、輸出:觀測序列概率$P(O | \lambda)$

  3、初值:

          $\alpha_{1}(i)=\pi_{i} b_{i}\left(o_{1}\right), \quad i=1,2, \cdots, N$
  4、遞推:對$t=1,2, \cdots, T-1$,

          $\alpha_{t+1}(i)=\left[\sum_{j=1}^{N} \alpha_{t}(j) a_{j i}\right] b_{i}\left(o_{t+1}\right), \quad i=1,2, \cdots, N$

  5、終止:

          $P(O | \lambda)=\sum_{i=1}^{N} \alpha_{T}(i)$

    前向演算法之所以可以提高HMM的觀測序列概率計算速度,是因為在每一個時刻計算時,都可以直接引用上一個時刻的計算結果,因此,其時間複雜度是$O(\left(N^{2} T\right)$,比直接計演算法小很多。

  3.3 後向演算法

    後向概率:給定隱馬爾可夫模型$\lambda$,定義在時刻$t$狀態為$q_{i}$的條件下,從t+1到T的部分觀測序列為$o_{t+1}, o_{t+2}, \cdots, o_{T}$的概率為後向概率,記作

            $\beta_{t}(i)=P\left(o_{t+1}, o_{t+2}, \cdots, o_{T} | i_{t}=q_{i}, \lambda\right)$

    觀測序列概率的後向演算法:

  1、輸入:隱馬爾可夫模型$\lambda $,觀測序列$O$;

  2、輸出:觀測序列概率$P(O | \lambda)$

  3、初值:

            $\beta_{T}(i)=1, \quad i=1,2, \cdots, N$

  4、遞推:對$t=T-1, T-2, \cdots, 1$,
            $\beta_{t}(i)=\sum_{j=1}^{N} a_{i j} b_{j}\left(o_{t+1}\right) \beta_{t+1}(j), \quad i=1,2, \cdots, N$

  5、終止:$P(O | \lambda)=\sum_{i=1}^{N} \pi_{i} b_{i}\left(o_{1}\right) \beta_{1}(i)$

    根據前向概率和後向概率的定義,可以將觀測序列概率$P(O | \lambda)$統一寫成:
            $P(O | \lambda)=\sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{t}(i) a_{i j} b_{j}\left(o_{t+1}\right) \beta_{t+1}(j), \quad t=1,2, \cdots, T-1$

  3.4 一些概率值與期望的計算

    給定模型$\lambda$和觀測O,在時刻t處於狀態$q_{i}$的概率,記:
            $\gamma_{t}(i)=P\left(i_{t}=q_{i} | O, \lambda\right)=\frac{P\left(i_{t}=q_{i}, O | \lambda\right)}{P(O | \lambda)}$

  由前向概率和後向概率的定義可知:
            $\alpha_{t}(i) \beta_{t}(i)=P\left(i_{t}=q_{i}, O | \lambda\right)$

  因此有:
            $\gamma_{t}(i)=\frac{\alpha_{t}(i) \beta_{t}(i)}{P(O | \lambda)}=\frac{\alpha_{t}(i) \beta_{t}(i)}{\sum_{j=1}^{N} \alpha_{t}(j) \beta_{t}(j)}$

    給定模型$\lambda$和觀測O,在時刻t處於狀態$q_{i}$且在時刻t+1處於狀態$q_{j}$的概率,記為:
            $\xi_{t}(i, j)=P\left(i_{t}=q_{i}, i_{t+1}=q_{j} | O, \lambda\right)$

  可以通過前向後向概率計算:
            $\xi_{i}(i, j)=\frac{P\left(i_{t}=q_{i}, i_{t+1}=q_{j}, O | \lambda\right)}{P(O | \lambda)}=\frac{P\left(i_{t}=q_{i}, i_{t+1}=q_{j}, O | \lambda\right)}{\sum_{i=1}^{N} \sum_{j=1}^{N} P\left(i_{t}=q_{i}, i_{t+1}=q_{j}, O | \lambda\right)}$

​  而
            $P\left(i_{t}=q_{i}, i_{t+1}=q_{j}, O | \lambda\right)=\alpha_{t}(i) a_{i j} b_{j}\left(o_{t+1}\right) \beta_{t+1}(j)$

  因此有
            $\xi_{t}(i, j)=\frac{\alpha_{t}(i) a_{i j} b_{j}\left(o_{t+1}\right) \beta_{t+1}(j)}{\sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{t}(i) a_{i j} b_{j}\left(o_{t+1}\right) \beta_{t+1}(j)}$

四、學習演算法

    HMM的學習演算法是指對模型的引數$\pi$、A、B進行估計,一般根據訓練資料是包括觀測序列和對應的狀態序列還是隻包括觀測序列,可以分別由監督學習和非監督學習實現。

  4.1 監督學習方法

    假設已給訓練資料集包含S個長度相同的觀測序列和對應的狀態序列$\left\{\left(O_{1}, I_{1}\right),\left(O_{2}, I_{2}\right), \cdots,\left(O_{s}, I_{s}\right)\right\}$,那麼可以利用極大似然估計法來估計隱馬爾可夫模型的引數。具體的方法如下:

  1、轉移概率$a_{i j}$的估計:設樣本中時刻t處於狀態i ii時刻t+1轉移到狀態j的頻數為$A_{i j}$,那麼狀態轉移概率$a_{i j}$的估計是:

            $\hat{a}_{i j}=\frac{A_{y}}{\sum_{j=1}^{N} A_{i j}}, \quad i=1,2, \cdots, N ; j=1,2, \cdots, N$

  2、觀測概率$b_{j}(k)$的估計:設樣本中狀態為$jb$並觀測為k的頻數是$B_{j k}$,那麼狀態為j觀測為k的概率$b_{j}(k)$的估計為:

            $\hat{b}_{j}(k)=\frac{B_{j k}}{\sum_{k=1}^{M} B_{j k}}, \quad j=1,2, \cdots, N_{i} \quad k=1,2, \cdots, M$

  3、初始狀態概率$\pi_{i}$的估計:$\hat{\pi}_{i}$為S個樣本中初始狀態為$q_{i}$的頻率。

  4.2  非監督學習方法——Baum-Welch演算法

    由於監督學習需要大量的標註資料,需要耗費很多的人力物力,因此,有時會採用非監督學習方法來進行引數估計。假設給定訓練資料集只包含S個長度為T的觀測序列$\left\{O_{1}, O_{2}, \cdots, O_{s}\right\}$而沒有對應的狀態序列,我們將觀測序列看作觀測資料O,而狀態序列看作不可觀測的隱資料I,這樣一來,HMM模型就可以看作是一個含有隱變數的概率模型:
            $P(O | \lambda)=\sum_{I} P(O | I, \lambda) P(I | \lambda)$

  因此,可以採用EM演算法來進行引數估計。

  1、確定完全資料的對數似然函式:所有觀測資料寫成$O=\left(o_{1}, o_{2}, \cdots, o_{T}\right)$,所有隱資料寫成$I=\left(i_{1}, i_{2}, \cdots, i_{T}\right)$,完全資料為$ (O, I)=\left(o_{1}, o_{2}, \cdots, o_{T}, i_{1}, i_{2}, \cdots, i_{T}\right)$,完全資料的對數似然函式是$\log P(O, I | \lambda)$。

  2、E步:求Q函式

            $Q(\lambda, \overline{\lambda})=\sum_{I} \log P(O, I | \lambda) P(O, I | \overline{\lambda})$

  其中,$\overline{\lambda}$是HMM模型引數的當前估計值,$\lambda$是要極大化的HMM模型引數。

  因此,Q函式可以寫為:

  3、M步:分別對引數進行極大化,第1項可以寫為:

            $\sum_{I} \log \pi_{i_{b}} P(O, I | \overline{\lambda})=\sum_{i=1}^{N} \log \pi_{i} P\left(O, i_{1}=i | \overline{\lambda}\right)$

  根據$\sum_{i=1}^{N} \pi_{i}=1$,利用拉格朗日乘子法,寫出拉格朗日函式:
            $\sum_{i=1}^{N} \log \pi_{i} P\left(O, i_{1}=i | \overline{\lambda}\right)+\gamma\left(\sum_{i=1}^{N} \pi_{i}-1\right)$

  對其求偏導並令其為0可得:

            $\pi_{i}=\frac{P\left(O, i_{1}=i | \overline{\lambda}\right)}{P(O | \overline{\lambda})}$

  用$\gamma_{t}(i)$, $\quad \xi_{i}(i, j)$表示可以寫為:
            $\pi_{i}=\gamma_{1}(i)$

  同理,對轉移概率和觀測概率進行求偏導可得:
            $a_{i j}=\frac{\sum_{i=1}^{T-1} \xi_{i}(i, j)}{\sum_{i=1}^{T-1} \gamma_{i}(i)}$

            $b_{j}(k)=\frac{\sum_{t=1, o_{k}=v_{k}}^{T} \gamma_{t}(j)}{\sum_{t=1}^{T} \gamma_{t}(j)}$

五、預測演算法

    預測演算法是指當給定模型$\lambda$和觀測序列O,求概率最大的狀態序列。一般有兩種演算法:近似演算法和維特比演算法。

  5.1 近似演算法

    近似演算法的思想是,在每個時刻t tt選擇在該時刻最有可能出現的狀態$i_{t}^{*}$,從而得到一個狀態序列$I^{*}=\left(i_{1}^{*}, i_{2}^{*}, \cdots, i_{T}^{*}\right)$,將它作為預測的結果。

    給定HMM模型$\lambda$和觀測序列O,在時刻t處於狀態$q_{i}$的概率$\gamma_{t}(i)$為:
            $\gamma_{t}(i)=\frac{\alpha_{t}(i) \beta_{t}(i)}{P(O | \lambda)}=\frac{\alpha_{t}(i) \beta_{t}(i)}{\sum_{j=1}^{N} \alpha_{t}(j) \beta_{t}(j)}$

  在每一個時刻t最有可能的狀態:
            $i_{t}^{*}=\arg \max _{1 \leqslant i \leqslant N}\left[\gamma_{t}(i)\right], \quad t=1,2, \cdots, T$

  從而得到狀態序列

            $I^{*}=\left(i_{1}^{*}, i_{2}^{*}, \cdots, i_{T}^{*}\right)$

    雖然近似計算思想簡單,但是預測的序列可能有實際不發生的部分,即有可能出現轉移概率為0的相鄰狀態,沒法保證整體上的狀態序列是最有可能的。

  5.2 維特比演算法

    維特比演算法則通過動態規劃求概率最大的路徑,每一條路徑即對應著一個狀態序列。維特比演算法從時刻t=1開始,遞推地計算在時刻t狀態為$i$的各條部分路徑的最大概率,直到得到時刻t=T狀態為$i$的各條路徑的最大概率,時刻t=T的最大概率記為最優路徑的概率$P^{*}$,最優路徑的終結點$i_{T}^{*}$也同時得到,之後,從終結點開始,由後向前逐步求得結點$i_{T-1}^{*}, \cdots, i_{1}^{*}$,最終得到最優路徑$I^{*}=\left(i_{1}^{*}, i_{2}^{*}, \cdots, i_{T}^{*}\right)$。

    首先定義兩個變數$\delta$和$\psi$,定義在時刻t狀態為$i$的所有單個路徑$\left(i_{1}, i_{2}, \cdots, i_{t}\right)$中概率最大值為

            $\delta_{t}(i)=\max _{i_{1}, i_{2}, \cdots,_{t-1}} P\left(i_{t}=i, i_{t-1}, \cdots, i_{1}, o_{t}, \cdots, o_{1} | \lambda\right), \quad i=1,2, \cdots, N$

  由定義可得$\delta$的遞推公式:


    定義在時刻t狀態為i的所有單個路徑$\left(i_{1}, i_{2}, \cdots, i_{t-1}, i\right)$中概率最大的路徑的第t−1個結點為:
            $\psi_{t}(i)=\arg \max _{1 \leqslant j \leqslant N}\left[\delta_{t-1}(j) a_{j i}\right], \quad i=1,2, \cdots, N$

    維特比演算法:

  1、輸入:模型$\lambda=(A, B, \pi)$和觀測$O=\left(o_{1}, o_{2}, \cdots, o_{T}\right)$

  2、輸出:最優路徑$I^{*}=\left(i_{1}^{*}, i_{2}^{*}, \cdots, i_{T}^{*}\right)$ 

  3、初始化:

              $\delta _{1}(i)=\pi _{i}b_{i}(o_{1})$,  $i=1,2,\cdots ,N$

              $\psi _{1}(i)=0$,          $i=1,2,\cdots ,N$

  4、遞推,對$t=2,3, \cdots, T$

  5、終止:
  6、最終路徑回溯。對$t=T-1, T-2, \cdots, 1$

            $i_{t}^{*}=\psi_{t+1}\left(i_{t+1}^{*}\right)$

  求得最優路徑$I^{*}=\left(i_{1}^{*}, i_{2}^{*}, \cdots, i_{T}^{*}\right)$

 

參考

《統計學習方法(第2版)》 李航 著

https://blog.csdn.net/linchuhai/article/details/91542210

https://blog.csdn.net/zgcr654321/article/details/9263