初めての経験ベイズ

今日の自然言語処理特論は言語モデルから一旦離れて*1、ベイズ入門なお話。ベイズについては多少知っているので、その辺はもう書かない。

新しく出てきたものの中に経験ベイズの話があった。経験ベイズを考える状況としては

  • ベイズ的なフレームワークで考えている
  • 事前分布を何かおいてやらないといけない
  • しかし、無情報事前分布のようなものだとベイジアンな意味があまりない*2
  • なにかしら意味のある事前分布とそのパラメータを決めてあげたい

というような状況で経験ベイズが発動する。経験ベイズというのは一言で言えばデータの尤度のことで
\int P(D|\theta) P(\theta; \tau) d \theta = P(D;\tau)
のこと。ここで、事前分布を母数\tauで決まる分布P(\theta;\tau)としている。尤度をこのような母数を含む形で書いてやれば、最尤法により母数を推定することができ、事前分布の推定された母数が手に入る。ベイジアンなのに、最尤推定が出てくるというなんとも変な感覚である。

経験ベイズの例として、単語出現dfのモデル化の話が出てきた。一文章中に、何回「政治」という言葉が登場したかを横軸に、その文章数を縦軸にしたものをポアソン分布でモデル化したい。こいつをそのまま最尤推定してあげると全然だめで、「政治」が4回以上登場する文章の数はほとんど0になってしまう。しかし、単語というのは「バースト性」という性質を持っているらしく、出てこないときはちっとも出てこないが、出てくるときはわーっと出てくるという性質があり、10回以上登場する文章数もちらほらある。うまくモデル化できなかったバースト性以外の原因のとしては、単語はトピックごとに偏って出現するという性質がある。トピックというのは「小説」とか「新聞」といった具合だ。

最尤推定では、こうした要因に負けてしまうので、階層的ベイズ的な考え方で処理することにしよう、というのが階層モデルの発想。例えば文章数をポアソン分布でモデル化するにしても、各文章ではその母数\lambdaは異なるだろう、そいつも考慮に入れてあげよう。どうやって考慮に入れるかというと、混合分布を使って。といった感じである。

各文章ではポアソン分布に従うと考えているので、p(k|\lambda) = \pi(k;\lambda)としておき、文章ごとに\lambdaが異なる(すなわち分布している)と考えると、p(\lambda) = \phi(\lambda; \theta)とできる。こいつを混合してやると
p(k) = \int p(k | \lambda) p(\lambda) d \lambda = \int p(k, \lambda) d \lambda
とできる。

この辺でtwo poissonとかnegative binomialの話が出てきたんだけど、ちょっと忘れてしまった><とりあえず覚えていることは

  • 積分が解析的にできそうな事前分布を選択する
  • 積分が解析的にできなさそうな事前分布を選択したときは、MCMCなどでその分布に従う乱数を生成して、積分計算をしてやる

という付近。来週からはUM、DM、LDAなど、どこかで聞いた恐しい名前が出てくるらしいので、gkbrしているところ。

自然言語処理概論 (ライブラリ情報学コア・テキスト)

自然言語処理概論 (ライブラリ情報学コア・テキスト)

*1:来週戻ってくるための準備なんだけど

*2:こともないけど