トピックモデルシリーズ 2 NB (Naive Bayes)
2014-02-17
このシリーズははじめの2ステップ(NB→UM→LDA)がとっつきにくいですがそこまで理解すれば後のモデルの拡張はそんなに難しくは感じませんでした。そのためNBから順にしっかり理解することが重要と思います。またNBとUMは文書のトピックが与えられているかそうでないかの違いしかなく、BUGSコードは全く同一のまま動きます(Stanでは離散パラメータを含みますので多少面倒になります)。今回はNBの分かりやすい説明を試みたのち、実際にStanでの実装と結果を見ていきたいと思います。はじめにこの記事の表記から。以下になっています。
右2列は定数については数値を、そうでないものについてはR内の変数名を書いています。与えられているデータ(前回の記事の data1 の w.1)は以下の図のようになっています。
文書が1-100(M)まであり、その各文書に144(V)種類の単語のいずれかが出現しています。このデータをどうモデル化するか。NBの場合は以下のようなグラフィカルモデルに従って単語が出現するとみなす、というわけです。
グラフィカルモデルはモデルに登場する各変数間の関係を表したものです。●に白文字は与えられたデータ、○に黒文字は推定すべき変数、■に白文字は与えられたハイパーパラメータです。矢印が値を決める関係を表します。大きな四角はプレートと呼ばれ、そこに繰り返しがあることを示しています。
グラフィカルモデルだけでは分かりにくいと感じたので、以下の吹き出しの順に説明していきます。
① ここではハイパーパラメータ
② ここでは
③ ここではハイパーパラメータ
④ ここでは各文書について、③で選ばれたトピックに従って、その色のV面サイコロを振り続けて単語を決めていきます。文書が変わればトピックも変わり、サイコロも変わります。
まとめますと以下の図のようになります。
以上の①~④のプロセスで文書x単語が生成されたと考えることになります。お気づきかもしれませんが、このモデルでは単語の順番や単語間の関係は単語の出現をモデル化するうえで大切ではないと考えて切り捨てていることに相当します。これでOKです。モデルとは「ある知りたいことを理解するために構築するもので現象を再現するのに本質的な仮定をいくつかあわせた仮説」であると思っています。同じ現象を見ていても、知りたいことが異なればモデルは変わります。モデルは現象を再現する十分条件を目指します。その一方で条件をどこまでそぎ落としてシンプルにできるか(必要十分条件に近づけるか)、どこまで精度が上がるか(予測があたるか)が大切で、この相反する二つをいかに両立させるかがモデル化の腕の見せ所となっています。物理系の分野だと前者に注力し、情報系の分野だと後者に注力する傾向があるように感じています。
さて次にStanでの実装にうつります。
14-15行目ではK面サイコロthetaを1個、V面サイコロphiをK個、定義しています。サイコロ(目の出る確率の合計が1)はsimplexで定義します。25行目はサイコロを振って文書のトピックを決めていることに相当します。26行目はある文書内の単語だけ繰り返したいためにOffsetを使っています。前回の記事を参照してください。27行目は文書のトピックZ[m]の色を持つV面サイコロphiを振って出現する単語を決めています。結局StanではデータからK面サイコロtheta(1個)、V面サイコロphi(K個)の形を推定することになります。
これをキックするRのコードは以下になります。読み込んでいるデータは前回の記事を参照してください。
21行目にchains=1を指定しているのは次回のUMにあわせるためです。次回に詳しく述べます。
結果は以下になります。
まずはthetaの推定値から(左: data1, 右: data2)。
点はMCMCサンプルの中央値で範囲は80%信頼区間です。横軸はトピックのインデックス・縦軸は確率です。サンプルデータはLDAを模したデータを作り方をしたのでNBのthetaは真の値と直接比較はできません。文書あたりの単語数が少ない場合でも多い場合とほぼ同様の結果になっています。これはトピックが与えられているので納得できる結果です。次にphiの推定値(左: data1, 右: data2)。
点はMCMCサンプルの中央値で範囲は80%信頼区間です。横軸は単語のインデックス・縦軸は確率です。真の値を黒の横棒で表しています。真の頻度が低いところを高めに推定し、真の頻度が高いところを低めに推定しているという結果になりました。はじめはphiのハイパーパラメータである
ちなみに無情報事前分布を設定してデータだけからハイパーパラメータも決めるフルベイズをやりたいところですが、トピックモデル全般的にパラメータが多めでデータが少なめな状況が多く、フルベイズはことごとく失敗しました。
最後にモデルのパラメータ数(Stanで出力される数です。ホントはsimplexの制限があるので実質的な数は少し減ります)や推定にかかった計算時間などは以下の通りです。
項目 | 文書あたりの単語数 | NB | UM | LDA | LDA(Freq) | PAM | GaP |
---|---|---|---|---|---|---|---|
パラメータ数 | 少/多 | 1450 | ? | ? | ? | ? | ? |
計算時間 | 少 | 5.5m | ? | ? | ? | ? | ? |
収束具合 | 少 | ○ | ? | ? | ? | ? | ? |
lp__ | 少 | -13892 | ? | ? | ? | ? | ? |
計算時間 | 多 | 30.8m | ? | ? | ? | ? | ? |
収束具合 | 多 | ○ | ? | ? | ? | ? | ? |
lp__ | 多 | -74154 | ? | ? | ? | ? | ? |
- 関連記事
- トピックモデルシリーズ 4 LDA (Latent Dirichlet Allocation)
- トピックモデルシリーズ 3 UM (Unigram Mixtures)
- トピックモデルシリーズ 2 NB (Naive Bayes)
- トピックモデルシリーズ 1 概要
- BUGS Exampleの中でおすすめリスト