Viterbiアルゴリズム

Viterbi アルゴリズムは、HTMM において入力配列 s が与えられた時、s を生成する最適パス π* を推測するアルゴリズムである。

このことを数式で表すと、次のようになる。

\[ \pi ^{*} = argmax_{\pi} P(s,\pi | \theta) \]

すなわち、遷移確率が A および文字出力確率が E のとき(θ = (A, E))に、パス π を通り配列 s を出力する確率 P(s,π|θ) を最大にするパス π を、π* と表している。

確率 P を最大にするパス π を求めるために、まず、最大確率に関する漸化式をたてる。

開始状態 0 を出発して、i 番目の状態に達した時を考える。i 番目の状態を状態 k とし、生成された配列は s[1...i] とし、s[1...i] を生成する最大確率を vk(i) とおく。すると、vk(i) は次のように書き表せる。

\[ v_{k}(i) = max_{\pi}\left\{ a_{01} \prod^{i-1}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \]

次に、i+1 番目の状態を考える。i+1 番目の状態を状態 l とおくと、上式と同様に、vl(i+1) は次のように表せる。

\[ v_{k}(i) = max_{\pi}\left\{ a_{01} \prod^{i}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \]

ここで、両式を用いて漸化式を作る。

\[ \begin{eqnarray} v_{l}(i+1) &=& max_{\pi}\left\{ a_{01} \prod^{i}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \\ &=& max_{\pi}\left\{ e_{l}(s[i+1])a_{kl} \cdot a_{01} \prod^{i-1}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \\ &=& max_{\pi}\left\{ e_{l}(s[i+1])a_{kl} \cdot v_{k}(i)\right\} \\ &=& e_{l}(s[i+1]) max_{\pi}\{a_{kl}v_{k}(i)\} \end{eqnarray} \]

このように最大確率 v(i) は漸化式で書き表すことができる。したがって、Viterbi のアルゴリズムはダイナミックプログラミングを利用して、計算することができる。HMM の状態数が m で、長さ n の配列 s を出力する確率が最大となるパスを、Viterbi アルゴリズムで求めると O(nm2) の時間を必要とする。