0

隠れマルコフモデル(Hidden Markov Model; HMM)

1348
0

投稿テストォ…(小声)

まえがき

隠れマルコフモデル(Hidden Markov Model; HMM)は,機械学習の分野から見ると一種の生成モデル ^1 (確率分布を用いて表現されたモデル)であり,次の節に挙げるように著名な応用例があり,重要なモデルであると言える.ここでは,HMMの学習法や,推論動作について述べる.

まずは,HMM動作時の様子を図???に示す.

HMM動作時の概要図 HMM動作時の概要図

HMMは観測可能な記号(Symbol)の出力と,観測不可能な隠れ状態(Hidden State)からなる.隠れ状態の遷移確率は,直前の状態に依存する性質(マルコフ性)があり,かつ,記号の出力確率は現在の隠れ状態に依存する.HMMを連続に動作させて次々に出力記号を観測すると,隠れ状態は観測できない一方,出力記号は隠れ状態に依存していることから,その観測記号列は(隠れ状態に依存した)ある隔たりを生じることになる.

従って,観測記号列こそがHMMのパラメタ(ここでは,状態数,隠れ状態の遷移確率,記号の出力確率)を推定するヒントになり,学習におけるサンプルとなる.提示されたサンプルを出力できるようなパラメタは,どの様に設定すれば良いのだろうか.これは手作業で探っていくのは現実的ではないし,第一その設定が妥当だと言える証拠はない.そこで統計学の出番である.統計学における最尤推定法は,非常に大雑把に言って,与えられたサンプル(標本)に最も合うようにパラメタを調整する手法 ^2 である.最尤推定法は生成モデルの学習の論拠となる重大な理論であり,HMMでも最尤推定法は適用され,アルゴリズムに従って,最もサンプルに合ったパラメタを推定することができる.

応用例

隠れマルコフモデルは商業的にも広く使われている.

音声認識

一番有名かつ成功した応用例と言える.発話者の音声 ^3 を観測した結果から,隠れ状態に相当する音素 ^4 の遷移を推定することで実現される.1976年から使用され始め,歴史も有る.近年は深層学習(Deep Learning)に精度面で凌駕されている[^5].

形態素解析

形態素とは,言語の意味を持つ最小単位の事を言う(トークンと言い換えても問題は無いはず…である).そして,形態素解析は言語処理において最も基本的かつ重要なタスク(トークン的な喩えをするならば,コンパイラにおける字句解析)である.英語等の単語境界が明快な言語は異なり,日本語は形態素の文字境界が曖昧 ^6 なので形態素解析は一般に難しいと言える.HMMで実現するには,観測するのは形態素候補,隠れ状態には品詞情報を与える.こちらも,昔はHMMがよく使われていたが,現在はCRF[^7]と呼ばれるより表現力の高い確率モデルに押されている.

隠れマルコフモデルの学習や推論

モデルのシンタックス

モデルの形式化を行う.ここで,c2が成立している条件下で,c1が成立する条件付き確率Pr(c1|c2)と表す.

隠れマルコフモデル(HMM)

隠れマルコフモデル(HMM)は組H=(SAVBπ)で表される.ここで,

  • S : 隠れ状態の有限集合
  • A : 遷移確率行列
  • V : 観測可能なシンボルの有限集合
  • B : 観測確率行列 ^8
  • π : 初期状態の確率分布

補遺

  • |S|=Ns|V|=Noとし,SVの要素はインデックスを付けて示す: S={s1s2sNs}V={v1v2vNo}

  • 遷移確率行列ANs×Nsの行列であり,A(i,j)成分(A)ijは時刻の更新を伴いながらsiからsjへ遷移する確率である.
    条件付き確率を用いて次の様に表される: $$\begin{eqnarray}
    (A)_{ij} = Pr(\text{時刻}t+1\text{において状態}s_{j}|\text{時刻}t\text{において状態}s_{i})\end{eqnarray}$$

  • 観測確率行列BNs×Noの行列であり,B(i,j)成分(B)ijはある時刻においてsiにいる時にシンボルvjを観測する確率である.
    条件付き確率を用いて次の様に表される: $$\begin{eqnarray}
    (B)_{ij} = Pr(\text{時刻}t\text{において}v_{j}\text{を観測}|\text{時刻}t\text{において状態}s_{i})\end{eqnarray}$$

  • πは,πisi (i=1,,Ns)が初期状態となる確率を表す.

観測列の生成

定義に従って,HMMの動作を改めて記述すると以下の様になる.ここで,時刻tにおける状態の実現値をqt,観測の実現値をOtとする.

  1. 初期状態分布πに基づき,初期状態q1を決定する.
  2. t=1とする.
  3. 時刻tにおける観測Otを,qtの観測確率分布に従って決定する.
  4. qtにおける遷移確率行列に従って,次の状態qt+1を決定する.
  5. tを増やし,3.に戻るか,t=Tならば停止する.

この動作を図示すると図???の様になる ^9 .この図において,横軸は時刻を表し,各時刻における状態遷移と観測が図示されている.

実際の動作は,q1から遷移を辿るパスとなり,状態列Q=(q1,,qT)と観測列O=(O1,,OT)が得られる.

HMMのもう少し厳密な動作図 HMMのもう少し厳密な動作図

観測列生成確率の効率的計算 : 前向き・後ろ向きアルゴリズム

前節で見た様に,図???のパスを辿ることによって状態列Q=(q1,,qT)と観測列O=(O1,,OT)とが生成される.そこでまず,現在のパラメタにおける,Q,Oとなる列が得られる確率Pr(Q,O|H)を計算することを考える.

t=1からt=Tまでのパスを見ていくことにより,Pr(Q,O|H)は以下の様に計算できる: Pr(Q,O|H)=Pr(q1|q0)Pr(O1|q1)Pr(q2|q1)Pr(O2|q2)Pr(qT|qT1)Pr(OT|qT)=t=1TPr(qt|qt1)Pr(Ot|qt)ここで,Pr(q1|q0)は初期状態分布πにより決定できるので,表記の一貫性保持のために以下この記法を用いる.ここから求めたい観測列の生成確率Pr(O|H)を得るには,(???式)の状態qt (t=1,,T)について和を取れば良い(周辺化):
Pr(O|H)=q1Sq2SqTSPr(Q,O|H)=q1Sq2SqTSt=1TPr(qt|qt1)Pr(Ot|qt)=q1,,qTt=1TPr(qt|qt1)Pr(Ot|qt)  (qtSqt)(???式)はt=1,,Tまでのqtの取りうる全ての状態についての和を取っており,計算量はO(NsT)となる.これではとても実用に耐えない.,この式を計算する効率的な計算アルゴリズム(前向き・後ろ向きアルゴリズム)が存在する.

その計算は動的計画法に基づいており,(???式)の変形から導く事ができる: Pr(O|H)=q1,,qTt=1TPr(qt|qt1)Pr(Ot|qt)=qTq1,,qT1t=1TPr(qt|qt1)Pr(Ot|qt)qTαT(qT)ここで登場したαt(qt) (t=1,,T)は前向きスコアと呼ばれる.αT(qT)を展開してみると,αT(qT)q1,,qT1t=1TPr(qt|qt1)Pr(Ot|qt)=qT1Pr(qT|qT1)Pr(OT|qT)q1,,qT2t=1T1Pr(qt|qt1)Pr(Ot|qt)=qT1Pr(qT|qT1)Pr(OT|qT)αT1(qT1)この様にして,再びαT1(qT1)を展開することを繰り返していくと,一般的に前向きスコアαt(qt) (t=1,,T)は次で表せる事が分かる.
αt(qt)=qt1Pr(qt|qt1)Pr(Ot|qt)αt1(qt1)従って,観測列の生成確率Pr(O|H)を計算するには,αt(qt)t=1から始めて(α0(q0)=1とする)t=Tまで計算し,最後にqTSについての和を取れば良いことになる.

この手順に従った計算アルゴリズムを前向きアルゴリズムと呼ぶ.,計算量はO(TNs2)まで改善される.また,前向きスコアαt(qt)は,時刻tでの状態がqtかつ,時刻1,,tでの出力ラベルがO1,,Otとなる確率を表していることも重要な事実である.
,前向きアルゴリズムとは逆(t=Tから初めてt=1まで)の方向で観測列の生成確率を計算する事もできる.

再びPr(O|H)を変形すると,Pr(O|H)=q1,,qTt=1TPr(qt|qt1)Pr(Ot|qt)=q1Pr(q1|q0)Pr(O1|q1)q2,,qTt=2TPr(qt|qt1)Pr(Ot|qt)q1β1(q1)βt(qt) (t=1,,T)を後ろ向きスコアと呼ぶ.β1(q1)を展開すると,β1(q1)q2,,qTt=2TPr(qt|qt1)Pr(Ot|qt)=q2Pr(q2|q1)Pr(O2|q2)q3,,qTt=3TPr(qt|qt1)Pr(Ot|qt)=q2Pr(q2|q1)Pr(O2|q2)β2(q2)前向きアルゴリズムの時と同様にして,βt(qt)βt(qt)=qt+1Pr(qt+1|qt)Pr(Ot+1|qt+1)βt+1(qt+1)を満たす事がわかる.Pr(O|H)の計算には,βt(qt)t=Tから始めて(βT(qT)=1とする)t=1まで計算し,最後にq1Sについての和を取れば良い.この手順を後ろ向きアルゴリズムと呼ぶ.

そして後ろ向きスコアβt(qt)は時刻tにおいて状態がqtである時,その後の出力系列がOt+1,,OTとなっている確率を表している事が,前向きスコアの時と同様重要である.

Pr(O|H)の計算については,上記の結果から次の式が成り立つ.
Pr(O|H)=qTαT(qT)=q1β1(q1)=qtαt(qt)βt(qt)  (t=1,,T)下段の等式のαt(qt)βt(qt)に注目すると,これは全体の観測列はOだが,途中の時刻tで状態qtを通過する確率を表している.

この結果は次節の学習の際に重要な役割を果たす.

HMMの学習 : Baum-Weltchアルゴリズム

一番の関心点:HMMを学習することを考えてみる.学習は概要で述べた通り最尤推定法の考え方に基づく.仮に,隠れ状態の遷移情報がサンプルとして与えられれば,遷移確率Pr^(sj|si)と観測確率Pr^(vk|si)はベイズの定理を用いて次の式(経験確率)で推定できる:
Pr^(sj|si)=Pr^(si,sj)Pr^(si)=AijuvAuv(uAiuuvAuv)1=AijuAiuPr^(vk|si)=Pr^(si,vk)Pr^(si)=BikuBiuここでAijは状態siからsjの遷移が起こった頻度(回数)であり,Bijは状態sivkを観測した頻度である.そして各式の分母では,siに入る全ての頻度を足しあわせている.考え方はサイコロのある目が出る確率を経験から求める時と全く同一である.

この式により,最もサンプルに適合した遷移確率と観測確率を計算できるが,実際には状態は観測できないため直接これらの値を計算出来ない.しかしながら,HMMで用いられるBaum-Welch(バウム-ウェルチ)アルゴリズムは,適当な初期状態(遷移確率,観測確率の組)から初め,上式を推定し,推定値を新たな状態として,状態がある値に収束するまで再推定を繰り返すアルゴリズム ^10 である.

まずサンプルの表記から始める.今,サンプルとして観測系列がM個与えられたとする: Xl=X1l,,X|Xl|l  l=1,,Mサンプルの観測系列の長さは各lで異なっても良く,上式においてXlの長さを|Xl|と表記している.この時,サンプルXlに対する,時刻t1からtへの状態遷移(qt1=siかつqt=sj)が発生する確率ηl(i,j,t)(=Pr(qt1=siqt=sj|HXl))は次の式で計算できる:
ηl(i,j,t)=αt1(si)Pr(sj|si)Pr(Xtl|si)βt(sj)Pr(Xl|H)ηl(i,j,t)の分子は観測列がXlとなる条件下で,qt1=siqt=sjとなる確率である.αt1(si)によって時刻t1までの観測列がX1l,,Xt1lかつ,時刻t1において状態がsiとなる確率を計算でき,またβt(sj)によって状態sjから始まって,時刻t+1以降の観測系列がXt+1l,,X|Xl|lとなる確率を計算できる.

一方ηl(i,j,t)の分母は現在のパラメタにおけるXlの生成確率 ^11 であり,前向き・後ろ向きアルゴリズムで計算できる(例えば,前向きならばq|Xl|α|Xl|(q|Xl|)).よって,分子を分母で割ることで観測列Xlが与えられた条件下での状態遷移(qt1=siかつqt=sj)の発生確率Pr(qt1=siqt=sj|HXl)が計算できる.ここで,式にある遷移確率や観測確率は現在の推定値を用いれば良い.

そして,状態siからsjへの遷移が起こる頻度の,サンプルXlにおける推定値A^ijlは,全ての時間での確率を足しあわせた期待値(頻度なので,各確率の重み付けは1)で計算できる: A^ijl=t=1|Xl|ηl(i,j,t)この期待値を用いて,遷移確率の更新式が得られる: Pr^(sj|si)=A^ijluA^iulこの式を各サンプルl=1,,Mを与えて逐次計算していき,収束を判定すれば良いことになる.,全てのサンプルを見せて ^12 から期待値を計算(l=1MA^ijlを頻度A^ijとする)しても同様に推定値を計算できる.

この様に,全てのサンプルを見せて一気に学習する手法をバッチ学習(Batch Learning)と呼び,一方ひとつのサンプルを見せながら逐次推定値を計算していく手法をオンライン学習(Online Learning)と呼ぶ.サンプル数Mが多い場合(特に,ビッグデータ(笑))やメモリ容量の問題があるときにはオンライン学習が適している ^13
.この場合はまず,サンプルXlに対する,時刻tで状態siにいる確率の推定値γl(i,t)を考える:
γl(i,t)=αt(si)βt(si)Pr(Xl|H)この式の考え方もηl(i,j,t)と殆ど同じであり,分子において,観測列がXlとなる条件下で,時刻tにおいて状態siにいる確率を計算している.そして観測の期待値B^ikは全ての時間における,時刻tにおける観測Xtlvkの時のγl(i,t)についての和となる:
B^ik=t=1Xtl=vk|Xl|γl(i,t)この期待値を用いて,遷移確率の時と同様に観測確率の更新式が得られる: Pr^(vk|si)=B^ikluB^iul上記の議論と同様に,全サンプルに対しても計算することもできる.

HMMの推論 : Viterbiアルゴリズム

仮に今HMMが学習され,次はHMMを推論に用いたいとする.即ち,長さTの観測列X=X1,,XTを見た時の内部状態の遷移列Q^=q^1,,q^Tを適切に推定したいとする.

適切な列とは,観測列Xを与える確率が最も高い遷移列であるといえるので,数式で表すと,次の最大化問題を考えることになる: Q^=argmaxQ Pr(QX|H)Viterbi(ビタビ,ヴィタビ,ビタービなど諸説)アルゴリズムは動的計画法の一種であり,Q^を次の2ステップに分けて求めることができる ^14 :

1. 前向きに最大確率と,その確率を与える直前時刻の状態を記録

2. 末尾から後ろ向きに最大確率を与える状態の記録を辿り,逆順に最適列を求める.

時刻tにおける状態qtSの最大確率[^15]をm(qt,t),またm(qt,t)を与える直前時刻の状態をs(qt,t)と表す.

上の第1ステップは,次の様に表すことができる: m(qt,t)={πiPr(X1|q1)  s.t. q1=sit=1maxqt1[m(qt1,t1)Pr(qt|qt1)Pr(Xt|qt)]t=2,,Ts(qt,t)=argmaxqt1 [m(qt1,t1)Pr(qt|qt1)Pr(Xt|qt)]  t=2,,Tこれを全ての状態qtSについて,t=1からt=Tまで動かせば第1ステップは終了する.

次の第2ステップは簡単で,まずq^T=argmaxqT m(qT,T)とし,あとはその最大確率を与える系列をq^t=s(q^t+1,t+1)によって,t=T1からt=1まで辿れば良い.

またその最大確率値はmaxqTm(qT,T)で求められる.

[^5]: 但し,全てのDeep Learningに言えることだが,学習がとにかく遅い.

[^7]: Conditional Random Field.邦訳で条件付き確率場.元は統計力学の文脈で用いられていたが,現在機械学習の生成モデルの分野において大きな地位を占める.

[^15]: 実装上の注意事項: 確率の積をPCで計算させるとアンダーフローを起こしがちである.その為,確率の対数値をとってから計算し,後で戻す処理がよく行われる.

お兄さん許して!脚注が壊れるわ…(しんみり)

投稿日:20201113
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

怪文書

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. まえがき
  2. 応用例
  3. 隠れマルコフモデルの学習や推論
  4. モデルのシンタックス
  5. 観測列の生成
  6. 観測列生成確率の効率的計算 : 前向き・後ろ向きアルゴリズム
  7. HMMの学習 : Baum-Weltchアルゴリズム
  8. HMMの推論 : Viterbiアルゴリズム