実生活の例とPythonコードで説明される隠れマルコフモデル

実生活の例とPythonコードでわかりやすく解説される隠れマルコフモデル

著者による画像

隠れマルコフモデルは、実際の問題を解決するための確率モデルであり、週に少なくとも一度は誰もが考える問題、例えば明日の天気はどうなるか[1]から、ヒトMHCクラスII分子へのペプチドバインダの予測など、難しい分子生物学の問題にまで及びます[2]。

隠れマルコフモデルはマルコフ連鎖の近親であり、隠れた状態を持つため、ランダム変数の列の確率を決定する際にはユニークなツールとなります。

本記事では、隠れマルコフモデルを構成する異なる要素をすべて分解し、MathとPythonのコードとともに、犬のトレーニング試験の結果につながった感情の状態をステップバイステップで確認します。観測の特定のシーケンスを観測する確率や、隠れた状態のシーケンスが与えられた場合の観測シーケンスの尤度を決定するために、Forwardアルゴリズムを使用する方法も説明します。

現実世界は、最終的な結果は見ることができるが、その結果を生成した基礎となる要因は実際には観測できない現象で満ちています。天気予報を予測することもその一例であり、過去の天候観測と異なる天候結果の観測確率に基づいて、明日が雨か晴れかを判断することです。

しかし、隠れマルコフモデルを使用すると、これらの現象を確率的なシステムとしてモデル化することができます。

隠れ状態を持つマルコフモデル

隠れマルコフモデル(HMMと呼ばれる)は、ラベリング問題の連続として機能する統計モデルです。これらの問題は、自体が観測可能なイベントの進化を記述するものであり、それらは直接観測することができない内部要因に依存する隠れている[3]。

隠れマルコフモデルは、2つの異なる確率過程で構成されており、これはランダムイベントに依存する変数の列として定義される過程です。

隠れた過程観測可能な過程があります。

隠れた過程は、マルコフ連鎖のようなものであり、時間の経過とともに移動する複数の隠れた状態を連結することです。これは確率的なプロセスであり、マルコフ連鎖のすべてのパラメータ、および各シーケンスのスコアが実際には確率であるためです。

隠れマルコフモデルは、それ自体が観測可能なイベントの進化を記述し、それらは直接観測することができない内部要因に依存する隠れている[3]

他のマルコフ連鎖と同様に、次にどの状態に移るかを知るためには、現在の状態が重要であり、過去の状態の履歴は次にどこに行くかを理解するために重要ではありません。

このような短期記憶は、HMMの主な特徴の1つであり、マルコフ仮定と呼ばれ、次の状態に到達する確率は現在の状態の確率にのみ依存することを示しています。

マルコフ仮定。 (著者による画像)

HMMのもう1つの主な特徴は、各観測がそれを生成した状態にのみ依存するということです。したがって、連鎖中の他のいかなる状態からも完全に独立しています[5]。

マルコフ仮定は、次の状態に到達する確率が現在の状態の確率にのみ依存するということを述べています。

これはHMMに関する背景情報ですが、実際にどのような問題に使用されていますか?

HMMは現象の振る舞いをモデル化するのに役立ちます。モデリングやシミュレーションの実行に加えて、次のような異なるタイプの問題をこれらの現象に対して考えることもできます:

  • 尤度またはスコアリング、つまり、シーケンスを観測する確率を決定すること
  • 特定の観測を生成した最適な状態のシーケンスを復号化すること
  • 指定されたシーケンスを観測し、特定の状態の一連の状態を経由した結果となるHMMのパラメータを学習すること

実践で確認してみましょう!

HMMとしての犬の訓練パフォーマンス

今日は天気予報の心配はあまりないですが、犬が訓練レッスンを卒業する可能性があります。この時間や努力、そして犬用のおやつのすべてを考えると、成功してほしいです。

犬のトレーニングセッションでは、あなたの四つ足の友達がいくつかのアクションやトリックを行うことが期待されており、トレーナーはそれらのパフォーマンスを観察して評価します。3回の試行のスコアを合計することにより、犬が卒業するか追加のトレーニングが必要かを判断します。トレーナーは結果しか見ることができませんが、直接観察できない要素がいくつかあります。例えば、犬が疲れているか、幸せなのか、トレーナーが嫌いなのか、周りの他の犬が気に入らないのか、などです。

これらは直接観察されないため、犬が特定の状態でのみ行う特定の行動がある場合を除き、明確にはわかりません。もし彼らが自分の感じ方を言葉で表現できるようだといいですね、将来的には可能かもしれません!

Hidden Markov Modelsを頭に入れた状態で、これはあなたの犬が試験中にどのように感じていたのかを予測しようとする絶好の機会のように思えます。彼らは疲れていたためにあるスコアを取得したのかもしれませんし、お腹がすいていたのかもしれませんし、トレーナーにイライラしていたのかもしれません。

あなたの犬はしばらくレッスンを受けており、そのトレーニング中に収集されたデータに基づいて、Hidden Markov Modelを構築するために必要なすべての構成要素を持っています。

訓練評価におけるあなたの犬のパフォーマンスをモデル化するHMMを構築するためには、次の要素が必要です:

  • 隠れた状態
  • 遷移行列
  • 観測のシーケンス
  • 観測の尤度行列
  • 初期確率分布

隠れた状態は、観察シーケンスに影響を与える観察できない要素です。あなたの犬が疲れているか幸せなのかだけを考慮します。

HMM内の異なる隠れた状態。 (著者による画像)

あなたの犬をよく知っているので、試験パフォーマンスに影響を与える観察できない要素は、単純に疲れているか幸せなことだけです。

次に、一つの状態から別の状態に移る確率を知る必要があります。これは遷移行列に捉えられます。この行列は行確率的である必要があります。つまり、連鎖内のある状態から他の状態への確率、行列の各行が1になるようにする必要があります。

遷移行列:ある状態から別の状態へ移動する確率を表します。 (著者による画像)

解決する問題の種類に関係なく、常に観測のシーケンスが必要です。マルコフ連鎖の通過結果を表す各観測。各観測は特定の語彙から描かれます。

語彙(著者による画像)

あなたの犬の試験の場合、各試行の後に得点を観察します。試験の結果は、Fail、OK、またはPerfectのいずれかです。これらは全ての観察語彙の可能な用語です。

また、観測尤度行列も必要です。これは特定の状態から生成される観測の確率です。

観測尤度行列。 (画像提供: 著者)

最後に、初期確率分布があります。これはマルコフ連鎖が各特定の隠れ状態で開始する確率です。

マルコフ連鎖では、初期状態になることのない状態もあります。これらの場合、初期確率はゼロです。そして、遷移行列内の確率と同様に、これらのすべての初期確率の合計は1になる必要があります。

初期確率(著者提供の画像)

初期確率分布は、遷移行列と観測尤度とともに、HMMのパラメータを構成します。これらは、観測と隠れ状態の系列があり、それらを生成した特定のHMMを学習しようとする場合に、求める確率です。

これらすべての要素を組み合わせると、トレーニング試験での犬のパフォーマンスを表す隠れマルコフモデルの姿が現れます。

隠れ状態とそれらの間の遷移確率。 (画像提供: 著者)

試験中、犬は3つの試行を行い、2つの試行でFailしない場合にのみ卒業します。

最終的に、もし犬にもっと訓練が必要なら、あなたは同じように世話をするでしょう。あなたの心に漂う大きな疑問は、試験中の彼らの気分はどのようなものかです。

OK — Fail — Perfectの順でスコアがOKであり、Failであり、Perfectで卒業するというシナリオを想像してみると、彼らの感情状態の連続はどうなるでしょうか?彼らは主に疲れているのか、それともずっと空腹なのか、それともその両方のミックスなのか?

このタイプの問題は、HMMが適用できるデコーディング問題のカテゴリーにぴったりと収まります。この場合、特定の観測の系列、OK — Fail — Perfectを生成した最良の状態の連続を求めることに興味があります。

与えられた観測の系列を生成した状態の連続をデコードする問題は、Viterbi Algorithmを利用して解決されます。ただし、前向きアルゴリズムを使用して、特定の観測の系列の確率(尤度タスク)を計算する方法を覗いてみる価値があります。これにより、Viterbi Algorithmの仕組みをより理解しやすくする準備が整います。

前向きアルゴリズム

この問題を通常のマルコフ連鎖のようにモデリングし、OK、Fail、Perfectの観測列の確率を計算する場合、望ましい結果を生成する各特定の状態を経由して連鎖をトラバースします。各ステップでは、直前の結果を観測した場合の現在の結果を観測する条件付き確率を取り、それを次の状態に移る遷移確率で乗算します。

大きな違いは、通常のマルコフ連鎖ではすべての状態が既知で観測可能であるのに対して、隠れマルコフモデルでは、観測の系列を観測するだけで、どの特定の隠れ状態の系列がトラバースされなければならなかったのかがわからないという点です。

大きな違いは、通常のマルコフ連鎖ではすべての状態が既知で観測可能であるのに対して、隠れマルコフモデルでは、観測の系列を観測するだけで、どの特定の隠れ状態の系列がトラバースされなければならなかったのかがわからないという点です。

この時点では、すべての可能なパスをたどり、最終的に等価なパスを選ぶためのルールを持つことができると考えるかもしれません。このアプローチの数学的な定義は、次のようになります

Figcaption text

それは確かに1つの戦略です!観察されたシーケンスOK、Fail、Perfectを生成する可能性のあるすべての隠れ状態の組み合わせごとに、そのシーケンスを観察する確率を計算する必要があります。

隠れ状態の数と観測された結果のシーケンスが十分に小さい場合、合理的な時間内にその計算を行うことが可能です。

Figcaption text

幸いにも、あなたが定義したHidden Markovモデルは比較的シンプルで、3つの観測結果と2つの隠れ状態を持っています。

観測シーケンスの長さLとM個の隠れ状態を持つHMMの場合、「LをMのpower L」の可能な状態があります。つまり、OK — Fail — Perfectのシーケンスに対して8つの可能なパスがあり、指数的な計算量O(M^L L)が発生します。モデルの複雑さが増すにつれて、考慮する必要があるパスの数は指数関数的に増加します。

モデルの複雑さが増すにつれて、考慮する必要があるパスの数は指数関数的に増加します。

これは、 Forward Algorithmが活躍する場所です。

Forward Algorithmは、観測シーケンス内の新しい記号の確率を計算するために、そのシーケンスを形成するすべての可能なパスの確率を計算する必要はありません[3]。

その代わりに、アルゴリズムは forward variableを定義し、その値を再帰的に計算します。

Figcaption text

それが再帰を使用することは、このアルゴリズムが可能なパスのすべての確率を計算するよりも高速である主な理由です。実際、それは「L回M二乗」の計算で、Mのpower L回L回」ではなく、シーケンスxの確率を計算することができます。

あなたの場合、2つの隠れ状態と3つの観測結果のシーケンスで、確率を計算する回数の減少は、O(MˆL L) = 2³x3 = 8×3 = 24回ではなく、O(L Mˆ2)=3×2²=3×4 = 12回です。

この計算回数の減少は、動的計画法を使用して達成されます。動的計画法は、中間情報を格納するための補助的なデータ構造を使用するプログラミング技法であり、同じ計算を複数回行わないようにします。

アルゴリズムが新しい確率を計算しようとするたびに、それがすでに計算されているかどうかを確認し、もしそうであれば、中間データ構造内のその値に簡単にアクセスできます。そうでなければ、確率が計算され、値が格納されます。

では、Viterbi Algorithmを使用したデコーディング問題に戻りましょう。

The Viterbi Algorithm

擬似コードで考えると、特定の観測シーケンスを生成する隠れ状態のシーケンスを復号化するために力ずくで進める必要がある場合、次のことを行うだけでした:

  • 所望の観測系列につながる全ての経路の順列を生成します
  • 各可能な隠れ状態の経路ごとに、Forwardアルゴリズムを使用して各観測系列の尤度を計算します
  • 確率が最も高い隠れ状態の経路を選択します
All possible hidden state sequences that generate the observation sequence OK — Fail — Perfect (Image by Author)

特定のHMMでは、OK — Fail — Perfect の結果に至る可能な経路は8つあります。さらに1つの観測を追加すると、可能な隠れ状態の経路が倍増します! Forwardアルゴリズムについて説明したのと同様に、指数関数的に複雑なアルゴリズムになり、パフォーマンスの限界に達します。

その点で、Viterbiアルゴリズムが役に立ちます。

HMMの隠れ状態の系列をトラバースする際、各ステップで確率vt(j)は、観測を見た後でHMMが隠れ状態jにあり、jに至るもっともらしい状態をトラバースしている確率です。

Viterbi path to hidden state j on time step t. (Image by Author)

特定の観測系列を生成する隠れ状態の系列を解読する鍵は、最も確率の高い経路という概念です。最も確率の高い経路、またはViterbiパスとも呼ばれる経路は、与えられた任意の隠れ状態に至るすべての経路の中で最も尤度が高い経路です。

特定の観測系列を生成する隠れ状態の系列を解読する鍵は、Viterbiパスを使用することです。与えられた任意の隠れ状態に至る最も確率の高い経路。

ForwardアルゴリズムとViterbiアルゴリズムとの間には類似点があります。Forwardアルゴリズムは、到達したい状態に至るすべての経路を考慮して到達の尤度を合計しますが、Viterbiアルゴリズムはすべての可能性を探索する必要がありません。特定の状態に至る最も確率の高い経路に焦点を当てます。

犬の試験でOK — Fail — Perfectのスコアに至る隠れ状態の系列を解読する課題に戻ると、Viterbiアルゴリズムを手作業で実行すると次のようになります。

Viterbi paths and decoded sequence. (Image by Author)

Viterbiアルゴリズムのもう一つの特徴は、確率を比較するために、与えられた任意の隠れ状態に至るすべての経路を追跡する方法を持つ必要があることです。これを行うために、ダイナミックプログラミングアルゴリズムの典型的な補助データ構造であるバックポインタを各隠れ状態に追跡します。これにより、過去にトラバースされた任意のViterbiパスの確率に簡単にアクセスできます。

バックポインタは、観測系列に至る最も確率の高い経路を特定する鍵です。

犬の試験の例では、Viterbiパスv3(Happy)とv3(Tired)を計算する際に、確率が最も高いパスを選択し、後方にバックトラックして現在地に至るまでのすべての経路を追跡します。

PythonでのViterbiアルゴリズム

これらすべてを手作業で行うと時間がかかり、エラーも発生しやすいです。重要な桁を見落とすと、最初からやり直してすべての確率を再チェックしなければならないかもしれません!

良いニュースは、hmmlearnのようなソフトウェアライブラリを活用できることです。わずか数行のコードで、試験でOK — Fail — Perfectで卒業する犬の隠れ状態の系列を正確にこの順序で解読することができます。

from hmmlearn import hmm
import numpy as np

## Part 1. 特定のパラメータを持つHMMの生成と試験のシミュレーション
print("パラメータでHMMモデルをセットアップ")
# モデルのトレーニングのために使用するinit_paramsは、モデルを初期化するために使用されるパラメータです
# s -> 開始確率
# t -> 遷移確率
# e -> 出力確率
model = hmm.CategoricalHMM(n_components=2, random_state=425, init_params='ste')

# 初期確率
# 疲れている状態で始まる確率 = 0
# 幸せな状態で始まる確率 = 1
initial_distribution = np.array([0.1, 0.9])
model.startprob_ = initial_distribution
print("ステップ1. 完了 - 初期分布が定義されました")

# 遷移確率
#        tired    happy
# tired   0.4      0.6
# happy   0.2      0.8
transition_distribution = np.array([[0.4, 0.6], [0.2, 0.8]])
model.transmat_ = transition_distribution
print("ステップ2. 完了 - 遷移行列が定義されました")

# 観測確率
#        Fail    OK      Perfect
# tired   0.3    0.5       0.2
# happy   0.1    0.5       0.4
observation_probability_matrix = np.array([[0.3, 0.5, 0.2], [0.1, 0.5, 0.4]])
model.emissionprob_ = observation_probability_matrix
print("ステップ3. 完了 - 観測確率行列が定義されました")

# 100,000回のトライアル、つまり適性テストのシミュレーションを実行
trials, simulated_states = model.sample(100000)

# シミュレーションされたトライアルのサンプルを出力
# 0 -> Fail
# 1 -> OK
# 2 -> Perfect
print("\nシミュレーションされたトライアルのサンプル - モデルのパラメータに基づく")
print(trials[:10])

## Part 2 - 観測列がOK - Fail - Perfectという隠れ状態列につながる
## 隠れ状態列をデコードする
# データをトレーニングセットとテストセットに分割(50/50の割合)
X_train = trials[:trials.shape[0] // 2]
X_test = trials[trials.shape[0] // 2:]
model.fit(X_train)

# 3つのトライアル(OK、Fail、Perfect)とそれに対応するスコアが与えられた試験を予測します(1、0、2)
exam_observations = [[1, 0, 2]]
predicted_states = model.predict(X=[[1, 0, 2]])
print("試験のスコアOK、Fail、Perfectに対応する隠れ状態遷移を予測する:\n 0 -> 疲れている , " "1 -> 幸せ")
print(predicted_states)

数秒で、手計算の結果と一致する出力が得られます。エラーの可能性が少なく、はるかに速いです。

コードの実行結果。 著者のイメージ

結論

隠れマルコフモデルの魅力は、1960年代に作成されたこの統計ツールが、天気予報から文章中の次の単語を見つけるまでのさまざまな現実世界の問題に対して非常に強力で適用可能であることです。

この記事では、HMMのさまざまなコンポーネントについて学ぶ機会があり、それらがさまざまなタスクにどのように適用されるか、およびフォワードアルゴリズムとビタビアルゴリズムの類似点を見つけることができました。指数関数的な計算の数に対処するために動的計画法を使用する、非常に似たアルゴリズムです。

手計算を行うかどうか、またはTensorFlowコードにパラメータをプラグインするかどうかにかかわらず、HMMの世界に深く潜り込むのをお楽しみいただければ幸いです。

読んでいただき、ありがとうございました!

参考文献

  1. D. Khiatani and U. Ghose, “Weather forecasting using Hidden Markov Model,” 2017 International Conference on Computing and Communication Technologies for Smart Nation (IC3TSN), Gurgaon, India, 2017, pp. 220–225, doi: 10.1109/IC3TSN.2017.8284480.
  2. Noguchi H, Kato R, Hanai T, Matsubara Y, Honda H, Brusic V, Kobayashi T. Hidden Markov model-based prediction of antigenic peptides that interact with MHC class II molecules. J Biosci Bioeng. 2002;94(3):264–70. doi: 10.1263/jbb.94.264. PMID: 16233301.
  3. Yoon BJ. Hidden Markov Models and their Applications in Biological Sequence Analysis. Curr Genomics. 2009 Sep;10(6):402–15. doi: 10.2174/138920209789177575. PMID: 20190955; PMCID: PMC2766791.
  4. Eddy, S. What is a hidden Markov model?. Nat Biotechnol 22, 1315–1316 (2004). https://doi.org/10.1038/nbt1004-1315
  5. Jurafsky, Dan and Martin, James H.. Speech and language processing : an introduction to natural language processing, computational linguistics, and speech recognition. Upper Saddle River, N.J.: Pearson Prentice Hall, 2009.
  6. Baum, Leonard E., and Ted Petrie. “Statistical Inference for Probabilistic Functions of Finite State Markov Chains.” The Annals of Mathematical Statistics 37, no. 6 (1966): 1554–63.

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more