隱馬爾可夫模型詳解

頎周發表於2020-08-10

  隱馬爾可夫模型(Hidden Markov Model, HMM)是可用於標註問題的模型,描述由隱藏的馬爾可夫鏈隨機生成觀測序列的過程,屬於生成模型。馬爾可夫鏈不懂的可以把本科的《概率論與數理統計》找回來看一下,很簡單的,就是離散狀態之間的轉換。下面直接定義基本概念,為後面的演算法做準備。 

基本概念

變數定義

  HMM各個時期會處於各種狀態,設$Q$是所有可能狀態的集合;每個狀態可以產生各種觀測,設$V$是所有可能觀測的集合。$Q,V$的定義如下:

$Q=\{q_1,q_2,\dots, q_N\},\;\;V=\{v_1,v_2,\dots,v_M\}$

  其中$N$是可能的狀態數,$M$是可能的觀測數。注意,這裡的狀態和觀測不一定是數字,也可以是各種具體的物件。

  然後定義$S$為長度為$T$的模型狀態序列,定義$O$為對應的觀測序列。

$S=(s_1,s_2,\dots,s_T),\;\;O=(o_1,o_2,\dots,o_T)$

  這兩個序列都是整數列表,其中每個整數索引對應的狀態和觀測。比如:$q_{s_2}$表示模型在時刻2時的狀態,$v_{o_5}$表示模型在時刻5時的觀測,而$s_2,o_5$並不代表那時模型的狀態和觀測本身(這裡先說清楚,不然後面容易混淆)。

  那麼這些狀態是如何初始化並相互轉換,觀測又是如何進行的呢?下面定義三個分佈:

  1、初始概率分佈。時間開始時,各個狀態出現的概率。定義為向量$\pi$:

$\begin{aligned}&\pi = [\pi_1,\pi_2,\dots,\pi_N]^T\\ &\pi_i=P(s_1=i),\;\;i = 1,2,\dots,N \end{aligned}$ 

  2、狀態轉移分佈。上一時刻到下一時刻不同狀態之間轉換的概率。定義為矩陣$A$:

$\begin{aligned} &A = [a_{ij}]_{N\times N}\\& a_{ij} = P(s_{t+1}=j|s_t=i)\end{aligned}$ 

  3、觀測概率分佈。定義某個狀態下各種觀測出現的概率。定義為矩陣$B$:

$\begin{aligned} &B = [b_{ij}]_{N\times M}\\& b_{ij} = P(o_t=j|s_t=i) \end{aligned}$ 

  隱馬爾可夫模型由以上三個分佈決定,因此可以用一個三元符號表示:

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

HMM基本假設

  從定義可知,HMM做了兩個基本假設:

  1、齊次馬爾可夫性假設。任意時刻的狀態只依賴於前一時刻的狀態,與其它時刻的狀態及觀測無關:

$P(s_t|s_{t-1},o_{t-1},\dots,s_1,o_1) = P(s_t|s_{t-1})$

  注意,以上條件概率中將除$s_{t-1}$以外的條件去掉,是因為$s_{t-1}$已知,並且沒有之後時刻的狀態或觀測作為條件。如果$s_{t-1}$未知,則可以去掉$t$時刻之前的條件中,離$t$最近的$t^-$之前的狀態和觀測(包含$t^-$時刻的觀測)。如:

$P(s_t|s_{t-2},o_{t-2},s_{t-3},s_{t-4}) = P(s_t|s_{t-2})$

  另外,假如有之後時刻的狀態,計算的概率就是後驗概率了,那麼之後時刻的狀態作為條件來說也不能去掉。但是可以去掉$t$時刻之後的條件中,離$t$最近的$t^+$之後的狀態和觀測(包含$t^+$時刻的觀測)如:

$\begin{gather}P(s_t|s_{t-2},s_{t-1},o_{t-1},o_{t+1},s_{t+2},o_{t+2},o_{t+3}) = P(s_t|s_{t-1},o_{t+1},s_{t+2})\label{}\end{gather}$

  總之,就是近的狀態已知,遠的狀態對於計算條件概率來說就沒有意義了。

  2、觀測獨立性假設。任意時刻的觀測只依賴於此刻的狀態,與其它無關:

$P(o_t|s_t,o_{t-1},\dots,s_1,o_1) = P(o_t|s_t)$ 

  這個條件概率和上面也一樣,也是近的狀態已知,遠處的狀態作為條件就無意義。

  以上兩個假設和馬爾可夫鏈的“鏈”相符,狀態條件的已知就好像把鏈條對應結點的外側鏈條砍斷(靠近$s_t$的是內側),我覺得把這種性質稱作“就近原則”也不錯(留意後面很多計算都用到)。下面是$(1)$式的示意圖:

   其中黃色結點表示已知條件,圈在虛線中的表示會影響$(1)$式概率值的狀態與觀測。

三個基本問題

  弄懂HMM狀態之間的轉換規則後,現在提出HMM的三個基本問題:

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

  2、學習。已知觀測序列$O$,估計模型$\lambda$的引數,使得在該模型下觀測到這個序列的概率$P(O|\lambda)$最大。

  3、預測,或是解碼。已知模型$\lambda$,給定觀測序列$O$,求與之對應的狀態序列$S$,使得概率$P(S|O,\lambda)$最大。 

  這三個基本問題分別闡述了HMM的基本推算方式和主要用途。下面依次介紹這三個基本問題的解法。

概率計算

  對於給定的模型引數$\lambda =(A,B,\pi)$,計算觀測序列$O= (o_1,o_2,\dots,o_T)$出現的概率,最簡單的就是把所有可能的狀態序列的概率都計算出來,然後選擇最大的那個。但是這個方法計算複雜度是極大的,高達$O(TN^T)$階,所以不可行。下面介紹兩種計算可行的演算法:前向和後向演算法。

前向演算法

  定義到達時刻$t$,觀測序列為$(o_1,o_2,\dots,o_t)$,且此時狀態為$q_i$的概率

$\alpha_t(i) = P(o_1,o_2,\dots,o_t,s_t=i|\lambda)$

  為前向概率。前向演算法就是用$\alpha_t(i)$前向遞推計算觀測序列的概率。下面是演算法的推算流程:

  1、計算初值。即當$t=1$時所有狀態的$\alpha$,一共$N$個:

$\begin{aligned}\alpha_1(i)=P(o_1,s_1=i|\lambda)=\pi_ib_{io_1},\;\;i=1,2,\dots,N\end{aligned}$

  2、遞推。對$t=2,3,\dots,T$,計算所有狀態的$\alpha$,每個$t$同樣都要計算$N$個:

$ \begin{aligned} &\alpha_t(i) \\ =& P(o_1,o_2,...,o_t,s_t=i|\lambda)\\ =& \sum\limits_{j=1}^NP(o_1,o_2,...,o_{t},s_{t-1}=j,s_t=i|\lambda) \\ =& \sum\limits_{j=1}^N P(o_t|o_1,o_2,...,o_{t-1},s_{t-1}=j,s_t=i,\lambda)P(o_1,o_2,...,o_{t-1},s_{t-1}=j,s_t=i|\lambda) \\ =& \sum\limits_{j=1}^N P(o_t|s_t=i,\lambda)P(o_1,o_2,...,o_{t-1},s_{t-1}=j|\lambda)P(s_t=i|o_1,o_2,...,o_{t-1},s_{t-1}=j,\lambda) \\ =& P(o_t|s_t=i,\lambda)\sum\limits_{j=1}^N P(o_1,o_2,...,o_{t-1},s_{t-1}=j|\lambda)P(s_t=i|s_{t-1}=j,\lambda) \\ =& b_{io_i}\sum\limits_{j=1}^N\alpha_{t-1}(j)a_{ji},\;\;i=1,2,...,N \end{aligned} $

  3、計算最後的概率:

$ \begin{aligned} P(O|\lambda) =\sum\limits_{i=1}^NP(o_1,o_2,...,o_T,s_T=i|\lambda) =\sum\limits_{i=1}^N\alpha_T(i) \end{aligned} $

  下面是書上的計算圖,便於理解:

後向演算法

  定義在$t$時刻的狀態為$q_i$的條件下,之後觀測序列為$(o_{t+1},o_{t+2},\dots,o_T)$的條件概率

$\beta_t(i) = P(o_{t+1},o_{t+2},\dots,o_T|s_t=i,\lambda)$

  為後向概率。與前向演算法類似,後向演算法是用$\beta_t(i)$後向推算概率。下面是遞推流程:

  1、定義初值:

 $\begin{aligned}&\beta_T(i)=1,\;\;i=1,2,...,N\\\end{aligned}$

  2、對$t=T-1,T-2,...,1$,計算:

$ \begin{aligned} &P(o_{t+1},...,o_T|s_t=i,\lambda)\\ =&\sum\limits_{j=1}^NP(o_{t+1},...,o_T,s_{t+1}=j|s_t=i,\lambda)\\ =&\sum\limits_{j=1}^NP(o_{t+1}|o_{t+2},...,o_T,s_{t+1}=j,s_t=i,\lambda)P(o_{t+2},...,o_T,s_{t+1}=j|s_t=i,\lambda)\\ =&\sum\limits_{j=1}^NP(o_{t+1}|s_{t+1}=j,\lambda)P(o_{t+2},...,o_T|,s_{t+1}=j,s_t=i,\lambda)P(s_{t+1}=j|s_t=i,\lambda)\\ =&\sum\limits_{j=1}^NP(o_{t+1}|s_{t+1}=j,\lambda)P(o_{t+2},...,o_T|,s_{t+1}=j,\lambda)P(s_{t+1}=j|s_t=i,\lambda)\\ =&\sum\limits_{j=1}^N a_{ij}b_{jo_{t+1}}\beta_{t+1}(j),\;\;i=1,2,...,N\\ \end{aligned} $

  3、計算結果:

$ \begin{aligned} P(O|\lambda) = \sum\limits_{i=1}^N\pi_ib_{io_1}\beta_1(i) \end{aligned} $

利用前後向演算法計算某些概率

  我們可以用$\alpha$和$\beta$計算某些概率。

  1、給定$\lambda$,計算以觀測$O$為條件,$t$時刻狀態為$q_i$的條件概率:

 $ \begin{aligned} &P(s_t=i|O,\lambda)\\ =&\frac{ P(o_1,...,o_T,s_t=i|\lambda) }{P(O|\lambda)}\\ =&\frac{ P(o_1,...,o_t,s_t=i|\lambda)P(o_{t+1},...,o_T|o_1,...,o_t,s_t=i,\lambda) }{P(O|\lambda)}\\ =&\frac{ P(o_1,...,o_t,s_t=i|\lambda)P(o_{t+1},...,o_T| s_t=i,\lambda) }{\sum\limits_{j=1}^NP(o_1,...,o_T,s_t=j|\lambda)}\\ =&\frac{ \alpha_t(i)\beta_t(i) }{\sum\limits_{j=1}^N\alpha_t(j)\beta_t(j)}\\ \end{aligned} $

  2、給定$\lambda$,計算以觀測$O$為條件,$t$時刻狀態為$q_i$,且$t+1$時刻狀態為$q_j$的條件概率:

$\begin{aligned}&P(s_t=i,s_{t+1}=j|O,\lambda)\\=&\frac{\alpha_t(i)a_{ij}b_{jo_{t+1}}\beta_{t+1}(j)}{P(O|\lambda)}\\=&\frac{\alpha_t(i)a_{ij}b_{jo_{t+1}}\beta_{t+1}(j)}{\sum\limits_{k=1}^N\sum\limits_{l=1}^NP(s_t=k,s_{t+1}=l,O|\lambda)}\\=&\frac{\alpha_t(i)a_{ij}b_{jo_{t+1}}\beta_{t+1}(j)}{\sum\limits_{k=1}^N\sum\limits_{l=1}^N\alpha_t(k)a_{kl}b_{lo_{t+1}}\beta_{t+1}(l)}\\\end{aligned}$

  具體推算過程和1類似,也用到了“鏈”的性質把多餘的條件去掉。 

  3、給定$\lambda$,以觀測$O$為條件,求某個狀態或某兩個連續狀態出現的期望(就是出現次數的期望)。直接對所有時刻的以上條件概率進行求和即可,不再詳寫。

學習

  如果給你觀測序列和對應的狀態序列,那麼直接用各種轉移出現的頻率來估計$\lambda=(A,B,\pi)$即可,這很簡單,就不講了。而如果只給你觀測序列,正如上面基本問題中定義的那樣,就不能直接計算了,需要使用EM演算法(點選連結)來迭代計算,就是所謂的Baum-Welch演算法(實際上就是EM演算法的應用)。

Q函式

  因為只有觀測序列,其未知的狀態序列就可以看做隱變數。假設用於訓練的觀測序列集合為:

$\mathbb{O} = \{O_1,O_2,\dots,O_{|\mathbb{O}|}\}$

  其中任意觀測序列$O_i$的長度都為$T$。

  然後假定隱變數狀態序列的所有可能性集合為:

$\mathbb{S} = \{\left.S=(s_1,s_2,\dots,s_T)\right|s_t = 1,2,\dots,N,\;\;t = 1,2,\dots,T\}$

  於是可以定義第k次迭代的$Q$函式:

 $\displaystyle Q(\lambda,\lambda^k) = \sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P(S|O,\lambda^k)\log P(S,O|\lambda)$

  這裡$Q$函式的定義與《統計學習方法》上定義的不同,為了更嚴謹,我把所有觀測資料都算上了。

  代入待優化引數,然後進行分解:

$ \begin{aligned} Q\left(\lambda,\lambda^k\right) &= \sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P\left(S|O,\lambda^k\right) \log \left(\pi_{s_1}b_{s_1o_1}a_{s_1s_2}b_{s_2o_2}\dots a_{s_{T-1}s_T}b_{s_To_T}\right)\\ &= \sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P\left(S|O,\lambda^k\right) \left(\log \pi_{s_1}+\sum\limits_{t = 1}^{T-1}\log a_{s_ts_{t+1}}+\sum\limits_{t = 1}^T\log b_{s_to_t}\right) \end{aligned} $

  可以看到待優化式子分解為三個不同待優化變數的求和,因此可以將它們分開分別進行優化。

優化π

  首先對$\pi$的優化式進行整理,將每個優化變數$\pi_i$的係數合併:

$ \begin{gather}  \begin{aligned} & \sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P\left(S|O,\lambda^k\right) \log \pi_{s_1}\\ =& \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N \sum\limits_{\{S|S\in \mathbb{S},s_1=i\}}P(S|O,\lambda^k) \log \pi_i\\ =& \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N\sum\limits_{1\le s_2,\dots,s_T \le N}P\left(s_1=i,s_2,s_3,\dots,s_T|O,\lambda^k\right) \log \pi_i\\ =& \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N P\left(s_1=i|O,\lambda^k\right) \log \pi_i\\ \end{aligned}\label{} \end{gather} $

  上式第一個等號成立是因為$\sum\limits_{\mathbb{S}}$和$\sum\limits_{i=1}^N \sum\limits_{\{S|S\in \mathbb{S},s_1=i\}}$是等價的。

  注意到等式約束$\sum\limits_{i=1}^N\pi_i=1$為仿射函式,並且上式為凸函式,因此這是一個帶等式約束的凸優化(滿足KKT條件(點選連結)即可)。寫出拉格朗日函式:

$ \begin{aligned} L(\pi,\gamma) = \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N P\left(s_1=i|O,\lambda^k\right) \log \pi_i + \gamma\left(\sum\limits_{i=1}^N\pi_i-1\right) \end{aligned} $ 

  對每個$\pi_i$求導並等於0、化簡,再聯立等式約束,得KKT條件:

$ \left\{ \begin{aligned} & \frac{\partial L}{\partial\pi_i}=\sum\limits_{\mathbb{O}}\frac{1}{\pi_i} P\left(s_1=i|O,\lambda^k\right) +\gamma=0,\;\;i=1,2,\dots,N\\ &\sum\limits_{i=1}^N\pi_i=1 \end{aligned} \right. $

  將分母的$\pi_i$乘過去然後求和計算$\gamma$:

$\displaystyle\sum\limits_{\mathbb{O}} \sum\limits_{i=1}^N P\left(s_1=i|O,\lambda^k\right) +\sum\limits_{i=1}^N\gamma\pi_i=0$

$|\mathbb{O}| +\gamma=0$

$\gamma=-|\mathbb{O}| $

  其中$|\mathbb{O}|$是用於訓練的觀測序列數。再計算$\pi_i$:

$ \begin{gather}\begin{aligned} & \pi_i = \frac{1}{|\mathbb{O}|}\sum\limits_{\mathbb{O}} P\left(s_1=i|O,\lambda^k\right) \end{aligned} \label{}\end{gather} $

優化a

  $a$的優化式:

$ \begin{aligned} & \sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P\left(S|O,\lambda^k\right)\sum\limits_{t = 1}^{T-1}\log a_{s_to_{t+1}}\\ \end{aligned} $

  和$\pi_i$一樣,也要先將每個$a_{ij}$的係數合併。為了容易理解,先對單個的$a_{s_ts_{t+1}}$進行整理:

$ \begin{aligned} & \sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P\left(S|O,\lambda^k\right)\log a_{s_to_{t+1}}\\ =& \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N\sum\limits_{j=1}^N\sum\limits_{\{S|S\in\mathbb{S},s_t=i,s_{t+1}=j\}}P\left(S|O,\lambda^k\right)\log a_{ij}\\ =& \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N\sum\limits_{j=1}^NP\left(s_t=i,s_{t+1}=j|O,\lambda^k\right)\log a_{ij}\\ \end{aligned} $

  再加上$t$的求和,得到整理後的$a$的優化式:

$ \begin{aligned} & \sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N\sum\limits_{j=1}^N\sum\limits_{t=1}^{T-1}P\left(s_t=i,s_{t+1}=j|O,\lambda^k\right)\log a_{ij}\\ \end{aligned} $

  類似於優化$\pi$,列出具有$N$個等式約束$\sum\limits_{j=1}^Na_{ij}=1$的拉格朗日函式:

$ \begin{aligned} L(a,\gamma) =\sum\limits_{\mathbb{O}}\sum\limits_{i=1}^N\sum\limits_{j=1}^N\sum\limits_{t=1}^{T-1}P\left(s_t=i,s_{t+1}=j|O,\lambda^k\right)\log a_{ij} +\sum\limits_{i=1}^N\gamma_i\left(\sum\limits_{j=1}^Na_{ij}-1\right) \end{aligned} $

  列出KKT條件:

$ \left\{ \begin{aligned} &\frac{\partial L}{\partial a_{ij}} =\frac{1}{a_{ij}}\sum\limits_{\mathbb{O}}\sum\limits_{t=1}^{T-1}P\left(s_t=i,s_{t+1}=j|O,\lambda^k\right) +\gamma_i =0,\;\;i,j=1,2,\dots,N\\ &\sum\limits_{j=1}^Na_{ij}=1,\;\;i=1,2,\dots,N \end{aligned}\right. $

  求和計算得$\gamma$:

$\displaystyle \gamma_i = -\sum\limits_{\mathbb{O}}\sum\limits_{t=1}^{T-1}P\left(s_t=i|O,\lambda^k\right) $

  再算$a_{ij}$:

$ \begin{gather}\begin{aligned} a_{ij}  =\frac{\sum\limits_{\mathbb{O}}\sum\limits_{t=1}^{T-1}P\left(s_t=i,s_{t+1}=j|O,\lambda^k\right)}{\sum\limits_{\mathbb{O}}\sum\limits_{t=1}^{T-1}P\left(s_t=i|O,\lambda^k\right)}\\ \end{aligned}  \label{}\end{gather} $

優化b

   同樣先將每個$b_{ij}$的係數進行合併:

$ \begin{gather} \begin{aligned} &\sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}P\left(S|O,\lambda^k\right) \sum\limits_{t = 1}^T\log b_{s_to_t}\\ =&\sum\limits_{\mathbb{O}}\sum\limits_{\mathbb{S}}\sum\limits_{t = 1}^TP\left(S|O,\lambda^k\right) \log b_{s_to_t}\\ =&\sum\limits_{j=1}^M\sum\limits_{i=1}^N\sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} \sum\limits_{\{S|S\in \mathbb{S},s_t=i\}} P\left(S|O,\lambda^k\right) \log b_{ij}\\ =&\sum\limits_{j=1}^M\sum\limits_{i=1}^N\sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} P\left(s_t=i|O,\lambda^k\right) \log b_{ij}\\ \end{aligned} \label{}  \end{gather} $

  列出包含約束的拉格朗日函式:

$ \begin{gather} \begin{aligned} L(b,\gamma)=&\sum\limits_{j=1}^M\sum\limits_{i=1}^N\sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} P\left(s_t=i|O,\lambda^k\right) \log b_{ij} +\sum\limits_{i=1}^N\gamma_i\left(\sum\limits_{j=1}^Mb_{ij}-1\right) \\ \end{aligned}\label{}  \end{gather} $

  這裡說明一下,$b$和$\pi,a$不同,$b_{ij}$是否為0是與訓練資料集$\mathbb{O}$直接相關的。比如在$\mathbb{O}$沒有出現觀測$v_3$,那我們可以直接將所有$b_{i3}$估計為0,這是符合常理的。而在$(6)$式中,因為不存在$o_t=3$的$O$,所以$\log b_{i3}$也不存在,於是對$\log b_{i3}$求導也沒法求,就不能參與優化了,直接估計為0即可。另外,$\pi,a$是與隱變數狀態序列相關的,而隱變數我們是要考慮所有可能的情況的,所以所有$\pi_i,a_{ij}$都可以參與優化。

  下面對非0的$b_{ij}$進行求導並令其為0,聯立約束列出KKT條件:

$ \left\{ \begin{aligned} &\frac{\partial L}{\partial b_{ij}} =\frac{1}{b_{ij}}\sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} P\left(s_t=i|O,\lambda^k\right) + \gamma_i =0,\;\; i=1,2,\dots,N,\;\;j=1,2,\dots,M \\ &\sum\limits_{j=1}^Mb_{ij}= 1,\;\;i=1,2,\dots,N \end{aligned}\right. $

 

  計算$\gamma$:

$ \displaystyle\sum\limits_{j = 1}^M \sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} P\left(s_t=i|O,\lambda^k\right) + \gamma_i = 0  $

$ \displaystyle \gamma_i = -\sum\limits_{\mathbb{O}} \sum\limits_{t = 1}^T P\left(s_t=i|O,\lambda^k\right) $

  計算優化$b$:

$ \displaystyle b_{ij}= \frac{\sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} P\left(s_t=i|O,\lambda^k\right)  } {\sum\limits_{\mathbb{O}} \sum\limits_{t = 1}^T P\left(s_t=i|O,\lambda^k\right)} $

  算上訓練資料$\mathbb{O}$中不包含某觀測$v_j$,使得$b_{ij}=0$的情況(其實上式已經包含了,但是我不確定是看做0還是看做不存在,為了嚴謹還是顯式寫出來好了):

\begin{gather}  b_{ij}=\left\{ \begin{aligned} &\frac{\sum\limits_{t = 1}^T \sum\limits_{\{O|O\in \mathbb{O},o_t=j\}} P\left(s_t=i|O,\lambda^k\right)  } {\sum\limits_{\mathbb{O}} \sum\limits_{t = 1}^T P\left(s_t=i|O,\lambda^k\right)}, &\exists O\in \mathbb{O}, j\in O \\ &0,& \forall O\in \mathbb{O}, j\notin O \end{aligned}\right.  \label{}\end{gather}

迭代

  綜上,使用EM演算法迭代計算HMM引數的步驟如下:

  0、初始化$\lambda^0 = (\pi^0,A^0,B^0)$,各取為符合約束的隨機值。

  1、第$k$次迭代,在$\lambda^{k-1}$的基礎上分別使用$(3),(4),(7)$式對$\pi,a,b$進行優化,得到$\lambda^k$。

  2、判斷終止條件,滿足即完成迭代,否則回到第一步執行下一次迭代。

預測

  預測問題最直觀的方式,就是直接選擇每個時刻最有可能出現的狀態$s_t^*$,從而預測整個狀態序列,即:

$ \begin{aligned} &s_t^* = \arg\max\limits_{1\le i \le N} \frac{\alpha_t(i)\beta_t(i)}{\sum\limits_{j=1}^N\alpha_t(j)\beta_t(j)},\;\;t=1,2,...,T\\ &S = (s_1^*,s_2^*,...,s_T^*) \end{aligned} $

  但這並不是整體最優的,而且它並不能剔除因為狀態轉移概率為0而不可能出現的狀態序列。為了整體最優並且符合狀態轉移概率矩陣,我們通常使用維特比演算法來預測狀態序列。

維特比演算法

  維特比演算法實際上就是動態規劃,在遞推的過程中保持步步最優,從而最終達到全域性最優的目的。

  定義在$t$時刻以內,且$t$時刻狀態為$q_i$的所有狀態序列的出現概率的最大值為:

$ \begin{gather}  \begin{aligned} \delta_t(i) = \max_{s_1,...,s_{t-1}}P(s_t=i,s_{t-1},...,s_1,o_t,...,o_1|\lambda),\;\;i=1,2,...,N \end{aligned} \label{}\end{gather} $

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

$ \begin{aligned} &\delta_{t+1}(i) \\ =& \max_{s_1,...,s_t}P(s_{t+1}=i,s_t,...,s_1,o_{t+1},...,o_1|\lambda)\\ =& \max_{s_t}\max_{s_1,...,s_{t-1}}P(s_{t+1}=i,s_t,...,s_1,o_{t+1},...,o_1|\lambda)\\ =& \max_{1\le j\le N}\max_{s_1,...,s_{t-1}}P(s_{t+1}=i,s_t=j,s_{t-1},...,s_1,o_{t+1},...,o_1|\lambda)\\ =& \max_{1\le j\le N}\max_{s_1,...,s_{t-1}}\left[P(o_{t+1}|s_{t+1}=i,\lambda)P(s_{t+1}=i,s_t=j,s_{t-1},...,s_1,o_t,...,o_1|\lambda)\right]\\ =& P(o_{t+1}|s_{t+1}=i,\lambda)\max_{1\le j\le N}\max_{s_1,...,s_{t-1}}\left[P(s_{t+1}=i|s_t=j,\lambda)P(s_t=j,s_{t-1},...,s_1,o_t,...,o_1|\lambda)\right]\\ =& P(o_{t+1}|s_{t+1}=i,\lambda)\max_{1\le j\le N}\left[P(s_{t+1}=i|s_t=j,\lambda)\max_{s_1,...,s_{t-1}}P(s_t=j,s_{t-1},...,s_1,o_t,...,o_1|\lambda)\right]\\ =& b_{io_{t+1}}\max_{1\le j\le N}a_{ji}\delta_t(j) \end{aligned} $

  以上算的是概率,並沒有獲取狀態編號。所以再定義:

$ \begin{gather}  \begin{aligned} \Psi_t(i) = \arg\max_{1\le j\le N} \left[\delta_{t-1}(j)a_{ji}\right],\;\;i=1,2,...,N \end{aligned} \label{}\end{gather} $

  用來回溯獲取狀態序列。

  維特比演算法用已知觀測序列預測狀態序列過程如下:

  1、初始化。直接計算$\delta_1(i)$。

  2、對$t=2,3,...,T$,使用遞推公式計算$\delta_t(i)$,使用$(9)$式計算$\Psi_t(i)$。

  3、使用$\Psi_t(i)$回溯,獲取最大概率狀態序列。

參考資料

  李航《統計學習方法》

相關文章