mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||
信学会のノンパラメトリックベイズ講座をようやく書き終えました。
具体的な学習例(上のイメージ)や細かい図を描く必要があり, 結局連休後半からずっと
かかった気がします。
最後のページではInfinite HMM (NIPS 2001)
[pdf]
の紹介をしています。
ちょうど岡野原君がohmmをリリースした所で, やたらとタイミングがいいのですが..。
HMMはよく考えるとかなり凄いモデルですが, 上のohmmも含め, 普通のHMMは
隠れ状態の数は事前にセットしておく必要があります。
これに対し, IHMMは隠れ状態の総数すらも観測データを見るだけで決めてくれる
という驚異的なモデルで, 僕はD3の時(2003年くらい)に知って, かなり感動しました。
ただ, IHMMは理論を理解するのもそうですが, 実装がかなりややこしいので *1 僕は実際に実装はしていなかったのですが, 最近素晴らしいことに, Ghahramaniの ところにいる Van Gael がIHMMのMATLABツールキットを 公開 してくれているので今回それを使ってみました。 以下, ドキュメントに書かれていないことを含めて, 自分用も兼ねて使い方のメモ。
>> [states,stats] = iHmmSampleGibbs(y,hypers,200,1,1,ceil(rand(1,length(y))*2)); Iteration 0: K = 2, alpha0 = 0.317225, gamma = 0.742441. Iteration: 1: K = 2, alpha0 = 0.129917, gamma = 1.106346, JL = -68126.516533. Iteration: 2: K = 2, alpha0 = 0.234067, gamma = 0.560162, JL = -67684.190698. Iteration: 3: K = 2, alpha0 = 0.108580, gamma = 1.092227, JL = -67309.148779. Iteration: 4: K = 2, alpha0 = 0.333919, gamma = 0.634966, JL = -67124.438335. Iteration: 5: K = 2, alpha0 = 0.201366, gamma = 0.676564, JL = -66761.077048. :のように行います。上は2個の隠れクラスから学習を始める例。 この時, ハイパーパラメータの入った構造体 hypers をyと一緒に 渡す必要がありますが, これには H, alpha0_a, alpha0_b, gamma_a, gamma_b という フィールドが必要で, 特にHには, emission確率 p(y|k) のディリクレ事前分布の ハイパーパラメータを渡す必要があります。
function hypers = mkparam(y) % hypers = mkparam(y) % returns default hyperparameters in ihmm. L = max(y); hypers.H = ones(1,L) * 0.2; hypers.alpha0_a = 4; hypers.alpha0_b = 2; hypers.gamma_a = 3; hypers.gamma_b = 6;のような関数を作って, hypers = mkparam(y); とすると便利です。
s = Stirling1(2000,2000); save(s, 'StirlingCache.mat');としてキャッシュを増やしておけばOKです.. *2 が, スターリング数は組み合わせ的な数で, 簡単に言うと竹内関数みたいなもの なので(そこまでではありませんが), Stirling1(10000,10000); などとすると 計算が終わらなくて死ねます。
function a = snumbers1(n,m) persistent snumbers if isempty(snumbers) snumbers = load('StirlingCache.mat'); snumbers = abs(snumbers.s); end K = size(snumbers,1); if (n == m) a = 1; else if (n > K) | (m > K) a = Inf; else a = snumbers(n,m); end endiHmmHyperSample.m の snumbers(N(j,k),l) を snumbers1(N(j,k),l) に置き換えて やると, 無事大きなデータでも動くようになります。
ちなみに, van Gaelはもちろん Beam Sampler を用意してくれていて iHmmSampleBeam()を使うとビームサンプリング (状態数が無限の場合でも可能な, Slice samplingを使ったForward-Backward) ができますが, 僕が試した限りでは普通のGibbsの方が計算や収束が速かったようです。 系列がこのツールでは一つだけなので, Gibbsの方が隠れ状態を増減する機会が多く, 柔軟なのかもしれません。
LATEX = platex .tex.dvi: $(LATEX) $<とかサフィックスルールを書いておくと, make hogehoge.dvi としただけで platex hogehoge.tex を実行して dvi を作ってくれる。 が, 実は make (GNU make) には make -p で表示されるデフォルトルールがあって,
setenv TEX platexとしておくと, Makefile が何もなくても make hogehoge.dvi とすれば platex hogehoge.tex を実行してくれる。
# # default Makefile # $Id: Makefile,v 1.1 2004/05/20 04:19:29 dmochiha Exp $ # .SUFFIXES: .tex .dvi .ps .pdf LATEX = platex DVIPS = dvips PS2PDF= ps2pdf -sPAPERSIZE=a4 .tex.dvi: $(LATEX) $< .dvi.ps: $(DVIPS) $< .ps.pdf: $(PS2PDF) $<のように作っておいて, % alias make='gmake -f ~/Makefile' としておけば, 何もないところで
タイトル一覧 |