PRML 読書会 #16 独立成分分析など+隠れマルコフモデル

すっかりブログに書くのが遅れてしまったが、「パターン認識と機械学習(PRML)」読書会(第16回)に 例によってのこのこ行ってきた。お疲れ様でした>各位。
今回の範囲は 12.4 章(独立成分分析 〜 GTM )と、13.1〜13.2 の隠れマルコフモデル(Hidden Markov Model, HMM)。


まず読書会で使われていた資料。今回なんかブログ書いてる人少ない……?

13.2 隠れマルコフモデル by showyou さん
http://d.hatena.ne.jp/showyou/20100717/1279403121
13.2.1-2 フォワード・バックワードアルゴリズム by nokuno さん
http://d.hatena.ne.jp/nokuno/20100717/1279340498
13.2.3 HMMの積和アルゴリズム by takmin さん
http://d.hatena.ne.jp/takmin/20100717/1279377231


10日以上たってしまってるので、わずかに憶えている範囲で箇条書き。

  • 12.4 は前回読書会の前に予習済ませたっきりだったので、すっかり忘れてて困った。しかも PRML は通り一辺倒の紹介しかしてないので、疑問が出てきても参照できる資料が無くて、議論が空中に漂ってしまう感じ。「カーネル多変量解析」持って行けば良かった。
  • HMM でスケーリングって本当にいるの? いる。系列が長くなると、α(z_n) が倍精度で表しうる値(10^-300 近辺)よりも小さくなってつぶれる。更新式 (13.36) を見ればわかるが、単純に log とってもダメ。状態数 50 だと系列長が 100 あたりからもうヤバい。まあ、スケーリング入れても、計算量のオーダーが増えるわけではないので大丈夫……。
  • 自己回帰 HMM とか input-output HMM とか、何に使うんだろうねえ……。これらにフィットする具体的な問題が思い浮かばないなあ。
  • functional HMM の訳語は「階乗隠れマルコフモデル」でいいのかなあ。


先だって HMM を Python で実装してみた。

前回読書会の直後だったので、「ずるい! 早すぎ!!」「しかもなんで Python !?」と複数の方から言われてしまったが(苦笑)、自然言語処理勉強会@東京で話さしてもらった「系列ラベリングを使って本文抽出」を最初 HMM でやろうとしていたので、とっとと実装する必要があった、というのが真相。
本文抽出のほうは結局、CRF を使ったわけだが、CRF のフォワード・バックワードの実装とかは HMM でやっといたのが大いに役に立った。


個人的には、HMM は確率モデルとしての完成形の一つという印象。
状態空間モデルは DAG でキッチリ組み上げられており、つまり同時分布は、一つ一つは平易な条件付き確率の積になっている。非独立な可変長の観測値を扱うことができるのに、モデルから導出される(近似ではない)条件付き独立性により、系列長に対してリニアな時間で推論&ラベリングできる。
にいちゃんあんた隙がないねえ*1、な感じ。実装していても楽しかった。


もちろんそこそこの長さの系列(例えば Alice in Wonderland とか)を食わせようと思ったら、きちんと理解しないととてもとても実装なんて出来ないわけだが、PRML にしては大変珍しいことに(失言)、13章の隠れマルコフはとても丁寧にわかりやすく書かれている。
式の展開も、「なんでここだけこんなに手取り足取りなのwww」と読書会で突っ込まれていたくらい。


また実装した場合のコードの規模は、PRML に書かれてる範囲をフルフルに取り込むと以下のような感じになるが、それでも 200 行を超えない程度。

そんなこんなで、PRML をここまで読んできた人なら、HMM の実装を目標にするのもありだと思う。


1年と少し続いてきた PRML 読書会も、次回 9/11 でいよいよ最終回(になるはず)。
思えば、この読書会に参加する前は正規分布も満足に扱えず……的な話は何回かしているので、まあいいか。ほんと PRML と読書会のおかげ。
最終回にふさわしく、スペシャルゲストにもご参加いただけるようなので、とても楽しみ。

*1:まあ、実際の問題を解くために適用したら、隙がぽろぽろ出てくるわけだが(笑)。