NLP —— 圖模型(一)隱馬爾可夫模型(Hidden Markov model,HMM)

       本文簡單整理了如下內容:html

      (一)貝葉斯網(Bayesian networks,有向圖模型)簡單回顧算法

      (二)隱馬爾可夫模型(Hidden Markov model,HMM)數組

      寫着寫着仍是寫成了很規整的樣子。之後可能會修改。dom

 

(一)貝葉斯網簡單回顧

      圖模型(PGM)根據邊是否有向,能夠分爲有向圖模型和無向圖模型。函數

      待補充……學習

(二)隱馬爾可夫模型

      隱馬爾可夫模型(Hidden Markov model,HMM)屬於生成式模型,被普遍用於序列標註問題,在語音語言領域裏比較出名的應用包括語音識別、中文分詞(CWS)、詞性標註(POS)等等等等。儘管CTC多是當前更主流的語音識別方案,但這不是本文所關注的,這裏只關注這個經典模型自己。lua

      1、概述spa

      HMM的機率圖模型以下圖所示。本文簡述的是離散狀況下的隱馬爾可夫模型(連續狀況下的在 [2] 中有討論,我沒細看……):一條隱藏的馬爾可夫鏈生成的狀態隨機序列(state sequence,圖示的白色節點)$Q=(q_1,q_1,...,q_T)$ 是不可觀測的,並記全部可能狀態的集合爲 $S=\{S_1,S_2,...,S_N\}$ ;由它們產生一個可觀測的觀測隨機序列(observation sequence,圖示的深色節點)$O=(o_1,o_2,...,o_T)$ ,並記全部可能觀測的集合爲 $V=\{v_1,v_2,...,v_M\}$ 。htm

      序列的值能夠看做是隨時刻產生的,每一個時刻對應着序列的一個值。因此HMM是個雙重隨機過程(doubly embedded stochastic process),一個是狀態轉移,另外一個是由狀態釋放出觀測值。在序列標註(Sequence labelling)任務中,模型就是須要對狀態序列進行標註。blog

      根據貝葉斯公式,

$$P(Q|O)=\frac{P(O,Q)}{P(O)}=\frac{P(O|Q)P(Q)}{P(O)}$$

對於給定的序列O來講,$P(O)$ 是肯定的,因此HMM的任務就是要建模 $P(O,Q)$

      那麼問題來了:HMM做爲生成式模型,建模聯合機率分佈,那麼關於O、Q的全部可能組合都應該被枚舉出來。但實際上,若是序列的元素之間存在長距離依賴,這個任務很是困難。因此纔有了下面將會介紹的嚴格獨立性假設

      觀測序列在一個給定時刻下的觀測值 $o_t$ 能夠看做是特徵(特徵矢量),而狀態序列在那個時刻所對應的狀態值 $q_t$ 能夠看做是這個特徵表示下所對應的類別標號。

圖片來源:[1]

      1. 首先看狀態序列(不可觀)

      狀態序列的值不可觀,須要經過觀測序列來推斷。它由一階馬爾可夫鏈產生,也就是說每一時刻的狀態 $q_t$ 只依賴於前一時刻的狀態 $q_{t-1}$ :

$$P(q_t|q_1,o_1,...,q_{t-1},o_{t-1})=P(q_t|q_{t-1})$$

$$\begin{aligned}P(q_1,q_2,...,q_t)&=P(q_1)P(q_2|q_1)P(q_3|q_1,q_2)\cdots P(q_t|q_1,...,q_{t-1})\\&=P(q_1)P(q_2|q_1)P(q_3|q_2)\cdots P(q_t|q_{t-1})\end{aligned}$$

熟悉貝葉斯網的朋友們都知道,條件獨立性能夠說是很是核心的一個性質。一階馬爾可夫鏈的參數是狀態轉移機率矩陣 $A=[a_{ij}]_{N\times N}$ 和初始狀態機率向量 $\pi=(\pi_1,...,\pi_N)$:

$$a_{ij}=P(q_t=S_j|q_{t-1}=S_i),\quad \sum_{j=1}^Na_{ij}=1,\quad 1\leq i\leq N$$

$$\pi_i=P(q_1=S_i),\quad \sum_{i=1}^N\pi_i=1$$

狀態轉移。圖片來源:[2] 

      2. 接下來看觀測序列

      觀測序列服從觀測獨立性假設,也就是說每一時刻的觀測值 $o_t$ 只依賴於該時刻的狀態值 $q_t$ :

$$P(o_t|q_1,o_1,...,q_{T},o_{T})=P(o_t|q_t)$$

由此能夠引出釋放機率矩陣 $B=[b_j(k)]_{N\times M}$ :

$$b_j(k)=P(o_t=v_k|q_t=S_j),\quad \sum_{k=1}^Mb_j(k)=1,\quad 1\leq j\leq N$$

表示的是在當前時刻狀態爲 $S_j$ 的條件下觀測到到符號爲 $v_k$ 的機率。(若是不知道狀態 $q_t$ 的具體值 $S_j$ ,那 $b_j(k)$ 的下標 $j$ 就用 $q_t$ 代替;若是不知道觀測 $o_t$ 的具體值 $v_k$ ,那 $b_j(k)$ 的 $k$ 就用 $o_t$ 代替。)

      由此,這個模型的參數有三組:初始機率向量 $\pi$ 、狀態轉移機率矩陣 $A$ 以及釋放機率矩陣 $B$ 。因此能夠用 $\lambda=(\pi,A,B)$ 來表示一個HMM。

      3. HMM 的數學模型

      HMM 就是要建模 $P(O,Q)$ 。對於給定的一個HMM $\lambda$ ,下式就是 HMM 模型:

$$\begin{aligned}P(O,Q|\lambda)&=\pi_{q_1}b_{q_1}(o_1)a_{q_1q_2}b_{q_2}(o_2)\cdots a_{q_{T-1}q_T}b_{q_T}(o_T)\\&=\pi_{q_1}b_{q_1}(o_1)\prod_{t=2}^Ta_{q_{t-1}q_t}b_{q_t}(o_t)\end{aligned}$$

這其中,因爲不一樣時刻的釋放機率相互獨立,因此

$$P(O|Q,\lambda)=b_{q_1}(o_1)b_{q_2}(o_2)\cdots b_{q_T}(o_T)$$

根據一階馬爾可夫鏈,因此

$$P(Q|\lambda)=\pi_{q_1}a_{q_1q_2}a_{q_2q_3}\cdots a_{q_{T-1}q_T}$$

兩者結合就獲得了上面的式子。

      以詞性標註爲例

      若是將 $O$ 視做待標註的句子,將 $Q$ 視做標註的詞性序列,那麼 HMM 各個參數的含義爲:轉移機率 $a_{ij}$ 表示詞性 j 緊跟在詞性 i 後的機率,釋放機率 $b_j(k)$ 表示詞性 j 的條件下會出現詞語 k 的機率。

      4. HMM的三個基本問題

      前兩個屬於inference,第三個屬於learning,inference和learning都是機率圖模型的基本問題。

      (1). 計算問題(evaluation):給定一個HMM $\lambda$ 和一個觀測序列 $O$ ,如何高效計算一個觀測序列 $O$ 的機率 $P(O|\lambda)$ ?——前向算法、後向算法

      (2). 解碼問題(decoding):給定一個HMM $\lambda$ 和一個觀測序列 $O$ ,如何最大化 $P(Q|O)$,求出「最有可能」的狀態序列 $Q$ ?——維特比算法

      (3). 學習問題(training):給定若干觀測序列 $O$(對應的狀態序列 $Q$ 可能已知也可能未知),如何訓練出模型參數 $\lambda$ ,使得 $P(O|\lambda)$ 最大化?——EM算法

      2、計算問題

      給定一個HMM $\lambda$ 和一個觀測序列 $O$ ,計算一個觀測序列 $O$ 的機率 $P(O|\lambda)$ 能夠用直接計算的方式:

$$\begin{aligned}P(O|\lambda)&=\sum_{\text{all } Q} P(O,Q|\lambda)\\&=\sum_{\text{all } Q} P(O|Q,\lambda)P(Q|\lambda)\\&=\sum_{\text{all }q_1,q_2,...,q_T}\pi_{q_1}b_{q_1}(o_1)a_{q_1q_2}b_{q_2}(o_2)\cdots a_{q_{T-1}q_T}b_{q_T}(o_T)\end{aligned}$$

這個式子就是從聯合分佈求邊緣分佈,對全部可能的狀態序列求和。

      求和號裏的每一項都是 $O(2T)$ ,長度爲 $T$ 的所有可能的狀態序列有 $N^T$ 種,因此這種方式的時間複雜度是 $O(TN^T)$ ,是不可忍受的。

      顯然,在這個計算方式下,有大量的重複計算。因此引出了以下兩種簡化計算方法。

      I、前向算法(forward procedure)

      設到當前時刻 $t$ 的局部觀測序列 $o_1,o_2,...,o_t$ ,且當前狀態 $q_t$ 是狀態集合裏的第 $i$ 個狀態 $S_i$ ,定義這個機率爲前向變量 $\alpha_t(i)$ 

$$\alpha_t(i)=P(o_1,o_2,...,o_t,q_t=S_i|\lambda)$$

      首先,在初始狀況下,顯然有

$$\alpha_1(i)=\pi_ib_i(o_1),\quad 1\leq i\leq N$$

即須要初始化N個前向變量。

      而後,能夠獲得下面的概括方程:

$$\alpha_{t+1}(j)=\biggl(\sum_{i=1}^N\alpha_t(i)a_{ij}\biggr)b_j(o_{t+1}),\quad 1\leq t\leq T-1,\quad 1\leq j\leq N$$

這個式子能夠用下圖來解釋

圖片來源:[2] 

      狀況至關於:想獲得在時刻 $t+1$ 時的局部觀測序列爲 $o_1,o_2,...,o_t,o_{t+1}$ 且狀態 $q_{t+1}=S_j$ 的機率 $\alpha_{t+1}(j)$ ,如何利用此前時刻已經計算過的值

      仔細想一下,能夠從狀態轉移來入手:如今的狀況是,已經給定了狀態 $q_{t+1}=S_j$ ,可是轉移到它的狀態 $q_t$ 能夠是任意的。因此,咱們能夠先求:在時刻 $t$ 時的局部觀測序列爲 $o_1,o_2,...,o_t$ 且狀態 $q_{t+1}=S_j$ 是由狀態 $q_t=S_i$ 轉移而來的機率,即 $\alpha_t(i)a_{ij}$ ;因爲 $q_t$ 能夠是任意的,那麼對全部可能( $S_1,S_2,...,S_N$ )求和,就獲得了在時刻 $t$ 時的局部觀測序列爲 $o_1,o_2,...,o_t$ 且狀態 $q_{t+1}=S_j$ 的機率 $\sum_{i=1}^N\alpha_t(i)a_{ij}$ 。那麼再乘以 $b_j(o_{t+1})$ ,就獲得在時刻 $t+1$ 時的局部觀測序列爲 $o_1,o_2,...,o_t,o_{t+1}$ 且 狀態 $q_{t+1}=S_j$ 的機率 $\alpha_{t+1}(j)$ 。

      所以,在計算 $\alpha_{t+1}(j)$ 時,利用了前一時刻 $t$ 的計算結果,這就是計算複雜度得以下降的緣由。

      當求得全部前向變量後,就能夠按照以下方式計算一個觀測序列 $O$ 的機率 $P(O|\lambda)$ :

$$\begin{aligned}P(O|\lambda)&=P(o_1,o_2,...,o_T|\lambda)\\&=\sum_{j=1}^NP(o_1,o_2,...,o_T,q_T=S_j|\lambda)\\&=\sum_{j=1}^N\alpha_{T}(j)\end{aligned}$$

      在一個給定的時刻 $t+1$ ,若是給定 $j$ ,那麼求取 $\alpha_{t+1}(j)$ 的時間複雜度爲 $O(N)$ ;因爲 $j$ 存在N種可能,因此求取在時刻 $t+1$ 的所有 $\alpha_{t+1}(j)$ 的時間複雜度爲 $O(N^2)$ 。又由於有T個時刻,因此時間複雜度爲 $O(TN^2)$ ,相比於 $O(TN^T)$ 下降了不少。

      II. 後向算法(backward procedure)

      後向算法須要定義後向變量 $\beta_t(i)$ :當前狀態 $q_t$ 是狀態集合裏的第 $i$ 個狀態 $S_i$ 的條件下,從時刻 $t+1$ 到 $T$ 的局部觀測序列 $o_{t+1},o_{t+2},...,o_T$ 的機率:

$$\beta_t(i)=P(o_{t+1},o_{t+2},...,o_T|q_t=S_i,\lambda)$$

      初始狀況:$\beta_T(i)=1,\quad 1\leq i\leq N$

      概括方程:$\beta_t(i)=\sum_{j=1}^Na_{ij}b_j(o_{t+1})\beta_{t+1}(j),\quad T-1\geq t\geq 1,\quad 1\leq i\leq N$

      終止:$P(O|\lambda)=\sum_{i=1}^N\pi_ib_i(o_1)\beta_1(i)$

      時間複雜度與前向算法相同。

      前向算法和後向算法有個統一寫法:

$$P(O|\lambda)=\sum_{i=1}^N\sum_{j=1}^N\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j),\quad 1\leq t\leq T-1$$

當 $t=1$ 時爲前向算法,$t=T-1 $ 時爲後向算法。

      III. 一些機率的計算

      利用前向變量和後向變量,能夠求解一些狀況下某個時刻處在某種狀態下的機率。

      1. 給定模型 $\lambda$ 和一個觀測序列 $O$ ,求在時刻 $t$ 時狀態 $q_t$ 爲 $S_i$ 的機率 $\gamma_t(i)$ :根據貝葉斯公式,有

$$\begin{aligned}\gamma_t(i)&=P(q_t=S_i|O,\lambda)\\&=\frac{P(q_t=S_i,O|\lambda)}{P(O|\lambda)}\\&=\frac{P(q_t=S_i,O|\lambda)}{\sum_{j=1}^NP(q_t=S_j,O|\lambda)}\\&=\frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N\alpha_t(j)\beta_t(j)}\end{aligned}$$

      顯然有 $\sum_{i=1}^N\gamma_t(i)=1$ 。

      咱們來看一下前向變量和後向變量相乘爲何是 $P(q_t=S_i,O|\lambda)$ :爲了簡單起見,記前向變量等於 P(A, B) ,後向變量等於 P(C|B) ,兩者相乘就是 P(B)P(A|B)P(C|B) ,由於 A 和 C 獨立因此等於 P(B)P(A, C|B)=P(A, B, C) 。

      2. 給定模型 $\lambda$ 和一個觀測序列 $O$ ,求在時刻 $t$ 時狀態 $q_t$ 爲 $S_i$ 且在下一時刻 $t+1$ 的狀態 $q_{t+1}$ 爲 $S_j$ 的機率:

$$\begin{aligned}\xi_t(i,j)&=P(q_t=S_i,q_{t+1}=S_j|O,\lambda)\\&=\frac{P(q_t=S_i,q_{t+1}=S_j,O|\lambda)}{P(O|\lambda)}\\&=\frac{P(q_t=S_i,q_{t+1}=S_j,O|\lambda)}{\sum_{i=1}^N\sum_{j=1}^NP(q_t=S_j,q_{t+1}=S_j,O|\lambda)}\\&=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{i=1}^N\sum_{j=1}^N\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}\end{aligned}$$

圖片來源:[2]

      3. 這兩個值的關係

$$\gamma_t(i)=\sum_{j=1}^N\xi_t(i,j)$$

      3、解碼問題

      給定一個HMM $\lambda$ 和一個觀測序列 $O$ ,如何最大化 $P(Q|O)$,求出「最有可能」的狀態序列 $Q$ ?

      換句話說,怎樣能夠快速地從 $N^T$ 個序列裏找到機率最大的那一個:

$$\begin{aligned}\max_{q_1,q_2,...,q_T}P(q_1,q_2,...,q_T|O,\lambda)&=\max_{q_1,q_2,...,q_T}\frac{P(q_1,q_2,...,q_T,O|\lambda)}{P(O|\lambda)}\\&=\max_{q_1,q_2,...,q_T}{P(q_1,q_2,...,q_T,O|\lambda)} \end{aligned}$$

      I. 近似算法

      很直觀的思路是:在每一個時刻 $t$ 都選擇當前時刻下機率最大的狀態 $q_t^*$ ,進而組成狀態序列,儘管這個狀態序列並不能保證總體上是機率最大的。

      在時刻 $t$ 時最可能的狀態在狀態集合 $S$ 中的序號是 $i=\arg\max_{1\leq i\leq N}\gamma_t(i)$ ,進而 $q_t^*=S_i$ 。

      此外,這種方法還有個問題就是,不能保證兩個相鄰時刻的狀態間存在轉移機率。也就是說,這種方法所獲得的狀態序列可能根本就不是個合法序列。

      II. 維特比算法(Viterbi algorithm)

      維特比算法是一種動態規劃方法。動態規劃的基礎是貝爾曼最優性原理(Bellman's Principle of Optimality)多級決策過程的最優策略有以下性質——不論初始狀態和初始決策如何,其他的決策對於初始決策所造成的狀態來講,一定也是一個最優策略。

      在解碼問題裏就是說:若是最優狀態序列 $q_1^*,q_2^*,...,q_{T}^*$ 在時刻 $t$ 的狀態 $q_t^*$ 已知爲 $S_i$ ,那麼從 $q_t^*$ 到 $q_T^*$ 的局部狀態序列必定是全部可能的狀態序列裏最優的。通俗一點說,已知最優路徑 P ,那麼咱們在路徑上選擇一個節點,從起點到該節點的這段局部路徑P1必定是全部可能的局部路徑裏最優的;一樣地,從這個節點到終點的局部路徑P2必定是全部可能的局部路徑裏最優的。既然有了這個性質,且看維特比算法是如何求解出最優狀態序列的:

      維特比算法就是利用如下的方法求解最優序列:從起始時刻 $t=1$開始,遞推地找出在時刻 $t$ 的狀態爲 $S_i$ 的各個可能的狀態序列中的最大機率,一直求解到時刻 $t=T$ 的狀態爲 $S_i$ 的最大機率,並獲得時刻 $T$ 的狀態 $S_j$ ;而後向前回溯求得其餘時刻的狀態。

      定義以下維特比變量 $\delta_t(i)$ :可以輸出已知的觀測序列 $o_1,...,o_t$ 、且在時刻 $t$ 的狀態 $q_t$ 爲 $S_i$ 的全部局部狀態序列 $q_1,q_2,...,q_{t-1},S_i$ 中,機率最大的序列 $q_1^*,q_2^*,...,q_{t-1}^*,S_i$ 所對應的機率值爲

$$\delta_t(i)=\max_{q_1,q_2,...,q_{t-1}}P(q_1,q_2,...,q_{t-1},q_t=S_i,o_1,...,o_t|\lambda)$$

      首先,初始狀況下,有

$$\delta_1(i)=\pi_ib_i(o_1),\quad 1\leq i\leq N$$

$$\psi_1(i)=S_0$$

第二個式子在下面立刻介紹。

      而後,能夠獲得遞歸關係

$$\delta_{t}(i)=\biggl(\max_{1\leq j\leq N}[\delta_{t-1}(j)a_{ji}]\biggl)b_i(o_{t}),\quad 2\leq t\leq T,\quad 1\leq i\leq N$$

$$\psi_t(i)=\arg\max_{S_j,1\leq j\leq N}[\delta_{t-1}(j)a_{ji}], \quad 2\leq t\leq T,\quad 1\leq i\leq N$$

這個遞歸關係和前向算法很相似:如今已知時刻 $t$ 的狀態 $q_t$ 爲 $S_i$ ,須要求解 $\delta_{t}(i)$ ,如何利用已經求解過的(即時刻 $t$ 以前的)值。同前向算法同樣,依然是從狀態轉移入手:時刻 $t-1$ 的狀態 $S_j$ 並非任取的( $1\leq j\leq N$ ),對於 $\delta_{t}(i)$ 所對應的最優局部狀態序列 $q_1^*,q_2^*,...,q_{t-1}^*,S_i$ 來講,它是惟一的。那麼,爲了獲得 $\delta_{t}(i)$ ,就須要肯定出 $S_j$ ,也就是 $S_i$ 由誰轉移而來。也就是說,須要所有的 $\delta_{t-1}(j)$( $1\leq j\leq N$ ),而後找出 $\delta_{t-1}(j)a_{ji}b_i(o_{t})$ 最大的一個。由 $S_i$ 釋放出 $o_t$(觀測序列的每一個值都是已知的)的機率 $b_i(o_{t})$ 爲固定值,因此無需考慮,就獲得了上面的遞推式。$\psi_t(i)$ 是記錄前一時刻狀態的數組:對於在時刻 $t$ 的狀態 $q_t$ 爲 $S_i$ 的機率最大的局部狀態序列 $q_1^*,q_2^*,...,q_{t-1}^*,S_i$ ,記錄其在時刻 $t-1$ 的狀態 $q_{t-1}^*$ 的狀態值 $S_j$ 。有了這個信息,就能夠不斷向前回溯。

      那麼能夠獲得最終時刻的狀態:只有計算到最終時刻 $T$ 的 $\delta_T(i)$ ,才知道最優序列 $q_1^*,...,q_T^*$ 的機率(此前的機率無論多大,由於沒有轉移到最後一個狀態,因此都是局部的)以及其在最終時刻的狀態 $q_T^*$ ,才能進一步回溯求解此前每一個時刻的狀態

$$i=\arg\max_{1\leq i\leq N}\delta_T(i)$$

$$q_T^*=S_i$$

      最後須要回溯,獲得每一個時刻的狀態

$$q_{t}^*=\psi_{t+1}(q_{t+1}^*),\quad T-1\geq t \geq 1$$

      維特比算法的時間複雜度和前向算法、後向算法相同,爲 $O(TN^2)$ 。

      若是我上面說的仍是抽象、不夠清楚,能夠看看 [3] 的例題10.3,把整個過程跟着走一遍,很快就懂了。

      在具體實現過程當中,爲避免多個很小的數相乘致使浮點數下溢,因此能夠取對數使相乘變爲相加。

      4、學習問題

      此前兩個問題,計算問題和解碼問題,都是在已知模型參數 $\lambda$ 和觀測序列 $O$ 的狀況下,去推斷狀態序列 $Q$ 。

      如今的問題是,已知若干個長度相同的觀測序列和對應的狀態序列 $\{(Q_1,O_1),(Q_2,O_2),...\}$(對應的狀態序列也可能未知),如何訓練模型參數。

      I. 監督學習

      在有標註數據(對應的狀態序列已知)的狀況下,可使用極大似然估計。此時,給定一個觀測序列 $O$ 和對應的狀態序列 $Q$ ,模型參數有如下的頻數估計的形式:

$$\begin{aligned}\overline\pi_i&=frequency\text{ in state }S_i\text{ at time }1\\&=\delta(q_1,S_i)\end{aligned}$$

$$\begin{aligned}\overline a_{ij}&=\frac{\text{#}transitions\text{ from state }S_i\text{ to state }S_j}{\text{#}transitions\text{ from state }S_i}\\&=\frac{\sum_{t=1}^{T-1}\delta(q_t,S_i)\delta(q_{t+1},S_j)}{\sum_{t=1}^{T-1}\delta(q_t,S_i)}\end{aligned}$$

$$\begin{aligned}\overline b_{j}(k)&=\frac{frequency\text{ in state }S_j\text{ and observing symbol }v_k}{frequency\text{ in state }S_j}\\&=\frac{\sum_{t=1}^{T}\delta(q_t,S_j)\delta(o_{t},v_k)}{\sum_{t=1}^{T}\delta(q_t,S_j)}\end{aligned}$$

式中的 $\delta(\cdot,\cdot)$ 是克羅內克函數(Kronecker),$\delta(x,y)=1\text{ if }x=y\text{ else }0$ 。跟示性函數 $I(\cdot)$ 有點像,示性函數是括號內的條件爲真則1,爲假則0。

      II. 無監督學習

      無監督學習HMM模型參數的motivation是狀態序列的獲取是有很大代價的,因此在這種狀況下須要根據觀測序列直接訓練模型。

      狀態序列 $Q$ 做爲隱變量的狀況下,能夠用EM算法來訓練HMM。基本思路是,首先將模型參數隨機初始化爲 $\lambda^{(0)}=(\pi^{(0)},A^{(0)},B^{(0)})$(須要知足各自的限制條件,就是三個求和式),而後在模型 $\lambda_0$ 下獲得該模型下的隱變量的指望值,將上面有監督學習的所有頻數都替換爲指望頻數。

      用於HMM訓練的EM算法被稱爲Baum-Welch算法(前向-後向算法),模型參數有如下的更新式:

$$\overline\pi_i^{(n+1)}=P(q_1=S_i|O,\lambda)=\gamma_1(i)$$

$$\overline a_{ij}^{(n+1)}=\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\gamma_t(i)}$$

$$\overline b_{j}^{(n+1)}=\frac{\sum_{t=1}^{T}\gamma_t(j)\delta(o_t,v_k)}{\sum_{t=1}^{T}\gamma_t(j)}$$

這個式子是迭代更新的:由於等式右端的式子是在模型 $\lambda^{(n)}=(\pi^{(n)},A^{(n)},B^{(n)})$ 下計算出的,進而獲得新一次迭代的參數值,如此不斷迭代更新。

      推導並不複雜,[3] 寫的很詳細。須要注意的是, [3] 的式(10.33)寫成 $Q(\lambda,\overline\lambda)=\sum_QP(O,Q|\overline\lambda)\log P(O,Q|\lambda)$ 比較合適,原來的寫法有歧義。以前寫過博客簡單梳理了一下EM算法

      關於什麼時候停機:用下面的對數運算的方式來判斷某個參數是否已經收斂

$$|\log P(O|\lambda^{(n+1)})-\log P(O|\lambda^{(n)})|<\epsilon$$

因爲EM算法中存在求和操做(Viterbi算法只有乘積操做),因此不能簡單地使用取對數來避免浮點數下溢,採用的方式是設置一個比例係數,將機率值乘以它來放大;當每次迭代結束後,再把比例係數取消掉,繼續下一次迭代。

 

 

 

 

參考:

[1] An Introduction to Conditional Random Fields for Relational Learning

[2] A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition

[3] 《統計學習方法》

[4] 《統計天然語言處理》

[5] 漫談Hidden Markov Model 

[6] 52NLP的關於HMM的系列文章

[7] 知乎:基於CTC等端到端語音識別方法的出現是否標誌着統治數年的HMM方法終結?

相關文章
相關標籤/搜索