隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列概率

HMM問題一:求觀測序列的概率

首先我們回顧下HMM模型的問題一。這個問題是這樣的。我們已知HMM模型的參數λ=(A,B,Π)\lambda = (A, B, \Pi)。其中A是隱藏狀態轉移概率的矩陣,B是觀測狀態生成概率的矩陣, Π是隱藏狀態的初始概率分佈。同時我們也已經得到了觀測序列O={o1,o2,...oT}O =\{o_1,o_2,...o_T\},現在我們要求觀測序列O在模型λ下出現的條件概率P(O|λ)。

暴力求解

乍一看,這個問題很簡單。因爲我們知道所有的隱藏狀態之間的轉移概率和所有從隱藏狀態到觀測狀態生成概率,那麼我們是可以暴力求解的。

我們可以列舉出所有可能出現的長度爲T的隱藏序列I={i1,i2,...,iT}I = \{i_1,i_2,...,i_T\},分佈求出這些隱藏序列與觀測序列O={o1,o2,...oT}O =\{o_1,o_2,...o_T\}的聯合概率分佈P(O,I|λ),這樣我們就可以很容易的求出邊緣分佈P(O|λ)了。

具體暴力求解的方法是這樣的:首先,任意一個隱藏序列I={i1,i2,...,iT}I = \{i_1,i_2,...,i_T\}出現的概率是:
P(Iλ)=πi1ai1i2ai2i3...aiT1    iTP(I|\lambda) = \pi_{i_1} a_{i_1i_2} a_{i_2i_3}... a_{i_{T-1}\;\;i_T}
對於固定的狀態序列I={i1,i2,...,iT}I = \{i_1,i_2,...,i_T\},我們要求的觀察序列O={o1,o2,...oT}O =\{o_1,o_2,...o_T\}出現的概率是:
P(OI,λ)=bi1(o1)bi2(o2)...biT(oT)P(O|I, \lambda) = b_{i_1}(o_1)b_{i_2}(o_2)...b_{i_T}(o_T)
    則O和I聯合出現的概率是:
P(O,Iλ)=P(Iλ)P(OI,λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT1    iTbiT(oT)P(O,I|\lambda) = P(I|\lambda)P(O|I, \lambda) = \pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}\;\;i_T}b_{i_T}(o_T)
    然後求邊緣概率分佈,即可得到觀測序列O在模型λ下出現的條件概率P(O|λ):
P(Oλ)=IP(O,Iλ)=i1,i2,...iTπi1bi1(o1)ai1i2bi2(o2)...aiT1    iTbiT(oT)P(O|\lambda) = \sum\limits_{I}P(O,I|\lambda) = \sum\limits_{i_1,i_2,...i_T}\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}\;\;i_T}b_{i_T}(o_T)
    雖然上述方法有效,但是如果我們的隱藏狀態數N非常多的那就麻煩了,此時我們預測狀態有NT種組合,算法的時間複雜度是O(TNT)階的。因此對於一些隱藏狀態數極少的模型,我們可以用暴力求解法來得到觀測序列出現的概率,但是如果隱藏狀態多,則上述算法太耗時,我們需要尋找其他簡潔的算法。

前向後向算法就是來幫助我們在較低的時間複雜度情況下求解這個問題的。

用前向算法求HMM觀測序列的概率

前向後向算法是前向算法和後向算法的統稱,這兩個算法都可以用來求HMM觀測序列的概率。我們先來看看前向算法是如何求解這個問題的。

前向算法本質上屬於動態規劃的算法,也就是我們要通過找到局部狀態遞推的公式,這樣一步步的從子問題的最優解拓展到整個問題的最優解。

在前向算法中,通過定義“前向概率”來定義動態規劃的這個局部狀態。什麼是前向概率呢, 其實定義很簡單:定義時刻t時隱藏狀態爲qiq_i, 觀測狀態的序列爲o1,o2,…ot的概率爲前向概率。記爲:
    αt(i)=P(o1,o2,...ot,it=qiλ)\alpha_t(i) = P(o_1,o_2,...o_t, i_t =q_i | \lambda)
     既然是動態規劃,我們就要遞推了,現在我們假設我們已經找到了在時刻t時各個隱藏狀態的前向概率,現在我們需要遞推出時刻t+1時各個隱藏狀態的前向概率。

從下圖可以看出,我們可以基於時刻t時各個隱藏狀態的前向概率,再乘以對應的狀態轉移概率,即αt(j)aji\alpha_t(j)a_{ji}就是在時刻t觀測到o1,o2,…ot,並且時刻t隱藏狀態qjq_j, 時刻t+1隱藏狀態qiq_i的概率。如果將想下面所有的線對應的概率求和,即j=1Nαt(j)aji\sum\limits_{j=1}^N\alpha_t(j)a_{ji}就是在時刻t觀測到o1,o2,…ot,並且時刻t+1隱藏狀態qi的概率。繼續一步,由於觀測狀態ot+1只依賴於t+1時刻隱藏狀態qi, 這樣[j=1Nαt(j)aji]bi(ot+1)[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}]b_i(o_{t+1})就是在在時刻t+1觀測到o1,o2,…ot,ot+1,並且時刻t+1隱藏狀態qiq_i的概率。而這個概率,恰恰就是時刻t+1對應的隱藏狀態i的前向概率,這樣我們得到了前向概率的遞推關係式如下:
    αt+1(i)=[j=1Nαt(j)aji]bi(ot+1)\alpha_{t+1}(i) = \Big[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}\Big]b_i(o_{t+1})
    在這裏插入圖片描述
    我們的動態規劃從時刻1開始,到時刻T結束,由於αT(i)\alpha_T(i)表示在時刻T觀測序列爲o1,o2,...oTo_1,o_2,...o_T,並且時刻T隱藏狀態qi的概率,我們只要將所有隱藏狀態對應的概率相加,即i=1NαT(i)\sum\limits_{i=1}^N\alpha_T(i)就得到了在時刻T觀測序列爲o1,o2,...oTo_1,o_2,...o_T的概率。

前向算法。

輸入:HMM模型λ=(A,B,Π),觀測序列o1,o2,...oTo_1,o_2,...o_T
輸出:觀測序列概率P(O|λ)

  1. 計算時刻1的各個隱藏狀態前向概率:α1(i)=πibi(o1),  i=1,2,...N\alpha_1(i) = \pi_ib_i(o_1),\; i=1,2,...N
  2. 遞推時刻2,3,…T時刻的前向概率:
    αt+1(i)=[j=1Nαt(j)aji]bi(ot+1),  i=1,2,...N\alpha_{t+1}(i) = \Big[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}\Big]b_i(o_{t+1}),\; i=1,2,...N
  3. 計算最終結果:
    P(Oλ)=i=1NαT(i)P(O|\lambda) = \sum\limits_{i=1}^N\alpha_T(i)
    從遞推公式可以看出,我們的算法時間複雜度是O(TN2)O(TN^2),比暴力解法的時間複雜度O(TNT)O(TN^T)少了幾個數量級

HMM前向算法求解實例

這裏我們用隱馬爾科夫模型HMM(一)HMM模型中盒子與球的例子來顯示前向概率的計算。
觀察集合是:
    V={}M=2V=\{紅,白\},M=2
    我們的狀態集合是:
    Q={123}N=3Q =\{盒子1,盒子2,盒子3\}, N=3
    而觀察序列和狀態序列的長度爲3.
     初始狀態分佈爲:
     Π=(0.2,0.4,0.4)T\Pi = (0.2,0.4,0.4)^T
     狀態轉移概率分佈矩陣爲:
     A=(0.50.20.30.30.50.20.20.30.5)A = \left( \begin{array} {ccc} 0.5 & 0.2 & 0.3 \\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 &0.5 \end{array} \right)
      觀測狀態概率矩陣爲:
      B=(0.50.50.40.60.70.3)B = \left( \begin{array} {ccc} 0.5 & 0.5 \\ 0.4 & 0.6 \\ 0.7 & 0.3 \end{array} \right)
      球的顏色的觀測序列:
      O={}O=\{紅,白,紅\}
      時刻1是紅色球,隱藏狀態是盒子1的概率爲:
      α1(1)=π1b1(o1)=0.2×0.5=0.1\alpha_1(1) = \pi_1b_1(o_1) = 0.2 \times 0.5 = 0.1
      隱藏狀態是盒子2的概率爲:
      α1(2)=π2b2(o1)=0.4×0.4=0.16\alpha_1(2) = \pi_2b_2(o_1) = 0.4 \times 0.4 = 0.16
      隱藏狀態是盒子3的概率爲:
      α1(3)=π3b3(o1)=0.4×0.7=0.28\alpha_1(3) = \pi_3b_3(o_1) = 0.4 \times 0.7 = 0.28
      現在我們可以開始遞推了,首先遞推時刻2三個狀態的前向概率:
      時刻2是白色球,隱藏狀態是盒子1的概率爲:
α2(1)=[i=13α1(i)ai1]b1(o2)=[0.10.5+0.160.3+0.280.2]×0.5=0.077\alpha_2(1) = \Big[\sum\limits_{i=1}^3\alpha_1(i)a_{i1}\Big]b_1(o_2) = [0.1*0.5+0.16*0.3+0.28*0.2 ] \times 0.5 = 0.077
    隱藏狀態是盒子2的概率爲:
α2(2)=[i=13α1(i)ai2]b2(o2)=[0.10.2+0.160.5+0.280.3]×0.6=0.1104\alpha_2(2) = \Big[\sum\limits_{i=1}^3\alpha_1(i)a_{i2}\Big]b_2(o_2) = [0.1*0.2+0.16*0.5+0.28*0.3 ] \times 0.6 = 0.1104
    隱藏狀態是盒子3的概率爲:
α2(3)=[i=13α1(i)ai3]b3(o2)=[0.10.3+0.160.2+0.280.5]×0.3=0.0606\alpha_2(3) = \Big[\sum\limits_{i=1}^3\alpha_1(i)a_{i3}\Big]b_3(o_2) = [0.1*0.3+0.16*0.2+0.28*0.5 ] \times 0.3 = 0.0606
    繼續遞推,現在我們遞推時刻3三個狀態的前向概率:
    時刻3是紅色球,隱藏狀態是盒子1的概率爲:
α3(1)=[i=13α2(i)ai1]b1(o3)=[0.0770.5+0.11040.3+0.06060.2]×0.5=0.04187\alpha_3(1) = \Big[\sum\limits_{i=1}^3\alpha_2(i)a_{i1}\Big]b_1(o_3) = [0.077*0.5+0.1104*0.3+0.0606*0.2 ] \times 0.5 = 0.04187
    隱藏狀態是盒子2的概率爲:
α3(2)=[i=13α2(i)ai2]b2(o3)=[0.0770.2+0.11040.5+0.06060.3]×0.4=0.03551\alpha_3(2) = \Big[\sum\limits_{i=1}^3\alpha_2(i)a_{i2}\Big]b_2(o_3) = [0.077*0.2+0.1104*0.5+0.0606*0.3 ] \times 0.4 = 0.03551
    隱藏狀態是盒子3的概率爲:
α3(3)=[i=13α3(i)ai3]b3(o3)=[0.0770.3+0.11040.2+0.06060.5]×0.7=0.05284\alpha_3(3) = \Big[\sum\limits_{i=1}^3\alpha_3(i)a_{i3}\Big]b_3(o_3) = [0.077*0.3+0.1104*0.2+0.0606*0.5 ] \times 0.7 = 0.05284
    最終我們求出觀測序列:O={紅,白,紅}的概率爲:
P(Oλ)=i=13α3(i)=0.13022P(O|\lambda) = \sum\limits_{i=1}^3\alpha_3(i) = 0.13022

用後向算法求HMM觀測序列的概率

熟悉了用前向算法求HMM觀測序列的概率,現在我們再來看看怎麼用後向算法求HMM觀測序列的概率。

後向算法和前向算法非常類似,都是用的動態規劃,唯一的區別是選擇的局部狀態不同,後向算法用的是“後向概率”,那麼後向概率是如何定義的呢?

定義時刻t時隱藏狀態爲qi, 從時刻t+1到最後時刻T的觀測狀態的序列爲ot+1,ot+2,...oTo_{t+1},o_{t+2},...o_T的概率爲後向概率。記爲:
βt(i)=P(ot+1,ot+2,...oTit=qi,λ)\beta_t(i) = P(o_{t+1},o_{t+2},...o_T| i_t =q_i , \lambda)
    後向概率的動態規劃遞推公式和前向概率是相反的。現在我們假設我們已經找到了在時刻t+1時各個隱藏狀態的後向概率βt+1(j),現在我們需要遞推出時刻t時各個隱藏狀態的後向概率。如下圖,我們可以計算出觀測狀態的序列爲ot+2,ot+3,...oTo_{t+2},o_{t+3},...o_T, t時隱藏狀態爲qi, 時刻t+1隱藏狀態爲qj的概率爲aijβt+1(j)a_{ij}\beta_{t+1}(j), 接着可以得到觀測狀態的序列爲ot+1,ot+2,...oTo_{t+1},o_{t+2},...o_T, t時隱藏狀態爲qi, 時刻t+1隱藏狀態爲qj的概率爲aijbj(ot+1)βt+1(j)a_{ij}b_j(o_{t+1})\beta_{t+1}(j), 則把下面所有線對應的概率加起來,我們可以得到觀測狀態的序列爲ot+1,ot+2,...oTo_{t+1},o_{t+2},...o_T, t時隱藏狀態爲qi的概率爲j=1Naijbj(ot+1)βt+1(j)\sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j),這個概率即爲時刻t的後向概率。
在這裏插入圖片描述
這樣我們得到了後向概率的遞推關係式如下:
βt(i)=j=1Naijbj(ot+1)βt+1(j)\beta_{t}(i) = \sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j)
    現在我們總結下後向算法的流程,注意下和前向算法的相同點和不同點:

輸入:HMM模型λ=(A,B,Π),觀測序列O=(o1,o2,…oT)
    輸出:觀測序列概率P(O|λ)
    1) 初始化時刻T的各個隱藏狀態後向概率:
βT(i)=1,  i=1,2,...N\beta_T(i) = 1,\; i=1,2,...N
    2) 遞推時刻T−1,T−2,…1時刻的後向概率:
βt(i)=j=1Naijbj(ot+1)βt+1(j),  i=1,2,...N\beta_{t}(i) = \sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j),\; i=1,2,...N
    3) 計算最終結果:
P(Oλ)=i=1Nπibi(o1)β1(i)P(O|\lambda) = \sum\limits_{i=1}^N\pi_ib_i(o_1)\beta_1(i)
    此時我們的算法時間複雜度仍然是O(TN2)O(TN^2)

HMM常用概率的計算

利用前向概率和後向概率,我們可以計算出HMM中單個狀態和兩個狀態的概率公式。

1)給定模型λ和觀測序列O,在時刻t處於狀態qi的概率記爲:
γt(i)=P(it=qiO,λ)=P(it=qi,Oλ)P(Oλ)\gamma_t(i) = P(i_t = q_i | O,\lambda) = \frac{P(i_t = q_i ,O|\lambda)}{P(O|\lambda)}
    利用前向概率和後向概率的定義可知:
P(it=qi,Oλ)=αt(i)βt(i)P(i_t = q_i ,O|\lambda) = \alpha_t(i)\beta_t(i)
    於是我們得到:
γt(i)=αt(i)βt(i)j=1Nαt(j)βt(j)\gamma_t(i) = \frac{ \alpha_t(i)\beta_t(i)}{\sum\limits_{j=1}^N \alpha_t(j)\beta_t(j)}
    2)給定模型λ和觀測序列O,在時刻t處於狀態qi,且時刻t+1處於狀態qj的概率記爲:
ξt(i,j)=P(it=qi,it+1=qjO,λ)=P(it=qi,it+1=qj,Oλ)P(Oλ)\xi_t(i,j) = P(i_t = q_i, i_{t+1}=q_j | O,\lambda) = \frac{ P(i_t = q_i, i_{t+1}=q_j , O|\lambda)}{P(O|\lambda)}
    而P(it=qi,it+1=qj,Oλ)P(i_t = q_i, i_{t+1}=q_j , O|\lambda)可以由前向後向概率來表示爲:
P(it=qi,it+1=qj,Oλ)=αt(i)aijbj(ot+1)βt+1(j)P(i_t = q_i, i_{t+1}=q_j , O|\lambda) = \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)
    從而最終我們得到ξt(i,j)\xi_t(i,j)的表達式如下:
ξt(i,j)=αt(i)aijbj(ot+1)βt+1(j)r=1Ns=1Nαt(r)arsbs(ot+1)βt+1(s)\xi_t(i,j) = \frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum\limits_{r=1}^N\sum\limits_{s=1}^N\alpha_t(r)a_{rs}b_s(o_{t+1})\beta_{t+1}(s)}
    3) 將γt(i)\gamma_t(i)ξt(i,j)\xi_t(i,j)在各個時刻t求和,可以得到:

在觀測序列O下狀態i出現的期望值t=1Tγt(i)\sum\limits_{t=1}^T\gamma_t(i)
    在觀測序列O下由狀態i轉移的期望值t=1T1γt(i)\sum\limits_{t=1}^{T-1}\gamma_t(i)
    在觀測序列O下由狀態i轉移到狀態j的期望值t=1T1ξt(i,j)\sum\limits_{t=1}^{T-1}\xi_t(i,j)
    上面這些常用的概率值在求解HMM問題二,即求解HMM模型參數的時候需要用到。我們在這個系列的第三篇來討論求解HMM參數的問題和解法。

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