Infer.NETを使ってLDAを実装してみた
   @第五回自然言語処理勉強会

            坪坂正志
   m(dot)tsubosaka@gmail.com
Probabilistic Programming
• 確率モデルをプログラムの形で書く
• パラメータの推論の部分のコードはユーザが
  書かずに自動で推論が行える
• Ex:
 – BUGS (DSL)
 – Hierarchical Bayes Compiler (DSL)
 – Factorie (Scala)
 – Infer.NET (C#)

                   第5回自然言語処理勉強会        2
メリット
• 複雑な更新式を自分で計算する必要がなくなる
 – ex: 下のようなの




                第5回自然言語処理勉強会   3
• コードを見たときに元のモデルがイメージでき
  る
 – 推論アルゴリズムの結果から元のモデルを復元
   するのは難しい
 – 書いた人はわかってても引き継ぐ人は。。。




         第5回自然言語処理勉強会      4
• 変分ベイズ法、EP法、MCMCとか知らない人
  でも確率モデルが作れる
• 問題に合わせてモデルの形を変更するみた
  いなことが機械学習のエキスパートでなくても
  可能




         第5回自然言語処理勉強会      5
デメリット
• 自分でチューニングしたコードを書いたほうが
  実行時間・メモリ使用量ともに効率的
• 扱えるモデル・推論アルゴリズムがツールが
  サポートしている形式に依存する




         第5回自然言語処理勉強会    6
Infer.NETとは
• Microsoft Researchが学術用途のために公開して
  いるグラフィカルモデル上のベイズ推論を行うた
  めのフレームワーク
 – Tom Minka, John Winn, John Guiver, Anitha Kannanの
   四人で開発を行っている
 – Probabilistic Programmingを行うためのソフトウェア
 – http://research.microsoft.com/en-
   us/um/cambridge/projects/infernet/
• 商用利用禁止

                    第5回自然言語処理勉強会                  7
簡単な例
• 正規分布N(μ,1)に従うN個のデータx_iを観測した
  とする
• また平均μの事前分布として正規分布N(0,100)を
  仮定する
• PRML 2.3.6を読めばμの事後分布は



であることは分かる。
           第5回自然言語処理勉強会    8
モデルを表現するコード
1: Variable<int> N = Variable.New<int>().Named("N");
2: Range i = new Range(N).Named("i");
3: Variable<double> mean =
Variable.GaussianFromMeanAndVariance(0, 100);
4: VariableArray<double> X =
Variable.Array<double>(i).Named("X");
5: X[i] =
Variable.GaussianFromMeanAndVariance(mean, 1.0).ForEach(i);


  • 非常に簡潔かつ直接的にモデルが書けてる




                                 第5回自然言語処理勉強会                 9
推論部分
N.ObservedValue = 100;
X.ObservedValue = data; // double[] data
InferenceEngine engine = new InferenceEngine(new VariationalMessagePassing());
Console.WriteLine("mean=" + engine.Infer(mean));


• 観測した値をObservedValueに代入して、
  InferenceEngineのInferメソッドを呼ぶだけ




                                第5回自然言語処理勉強会                                     10
実行結果




• 理論値と一致する.
 – (パラメータが一つしかなく、変分近似の部分で近
   似が行われてないため)

         第5回自然言語処理勉強会    11
LDA[Blei+ 2003]
• 自然言語処理でよく用いられている文章の生
  成モデル
• 詳しくは自分の前の発表とかを参考にしてく
  ださい(http://slidesha.re/cWr4cs)




             第5回自然言語処理勉強会          12
生成モデル
• 各トピックtごとにW(語彙数)次元の単語出現確
  率ベクトルをディリクレ分布から生成
 –  ∼ Dir()
• 文章ごとにT次元のトピック確率ベクトルをディリ
  クレ分布から生成
 –  ∼ Dir()
• 各文章において以下のように単語を生成
 –  ∼ Mult( )と単語のトピックを生成する
 –  ∼ Mult( )とトピックに応じた確率で単語を生成
   する

                    第5回自然言語処理勉強会       13
パラメータベクトルの定義




• ここでSparsityはNLPでよくでてくる高次元のベクトルでもそのほと
  んどが0であるという性質を表すために用いられる
  – SparsityオブジェクトはSparsity.ApproximateWithTolerance(1.0E-6)のように
    定義される。




                        第5回自然言語処理勉強会                         14
単語生成部分の定義




• usingブロックを使ってfor文やswitch文を表現
  できる



           第5回自然言語処理勉強会      15
Break Symmetry
• モデルがトピックに関して対象なのでPhiに関
  してランダムな初期化を行う必要がある




         第5回自然言語処理勉強会      16
推論




事後分布が格納される




         第5回自然言語処理勉強会   17
実験
• BBCの記事2225本のデータセットからランダムに
  1000件の記事を選択して、トピック数8で推論を
  行った
 – データセット: http://mlg.ucd.ie/datasets/bbc.html
 – 2225件全部使おうとするとメモリが足りなかった(この
   辺SharedVariableというのを使うと解決するみたいで
   すが、今回はそこまで余力がなかった)
• 推論には1856秒かかった
• 推論された各トピックの単語選択確率 の中の
  上位数単語を次のスライドに示す

                 第5回自然言語処理勉強会                18
Topic 0          Topic 1            Topic 2       Topic 3

 take million       year two      time against      on show
 call develop     compani win     world go just    market wai
secur manag        includ sale    govern elect     mobil three
 want websit      month expect     labour get     phone good
attack london       share top     work minist     four tori star




   Topic 4          Topic 5            Topic 6       Topic 7

game first 000    number plai      back open        peopl film
plan think five     dai week        cost digit    firm best told
 current rule         chang          network      sai music year
polit mean oil      campaign        spend ask      public award
 hold earlier     brown player     receiv agre    econom trade



                        第5回自然言語処理勉強会                           19
コミュニティ抽出法への応用
• コミュニティ抽出とはグラフ上からリンクが密
  な部分を抽出する手法である
 – 確率モデルを使ったコミュニティ抽出法について
   は以下の文献が参考になる
 – 山田,無限関係モデルとその周辺
  • http://www.kecl.ntt.co.jp/as/members/yamada/IBIS20
    08_081031yamada.pdf




                  第5回自然言語処理勉強会                       20
ICMc: (Interaction Component Model for Communities)
• http://arxiv.org/abs/0803.1628
• 以下のようなグラフの生成モデルを考える
• 各トピックtごとにV(頂点数)次元の頂点出現確率ベクト
  ルをディリクレ分布から生成
 –  ∼ Dir()
• T次元のトピック確率ベクトルをディリクレ分布から生成
 –  ∼ Dir()
• 個のリンクを以下のようを生成
 –  ∼ Mult()とトピックを生成する
 –  ∼ Mult  ,  ∼ Mult( )とリンクの両端の頂点をト
   ピックに応じた確率でサンプリングする

                     第5回自然言語処理勉強会                          21
Infer.NETによる実装(モデル部分)
Variable<int> numEdges = Variable.New<int>();
Range T = new Range(numTopics);
Range E = new Range(numEdges);
Range V = new Range(numVertexes);
VariableArray<Vector> Phi = Variable.Array<Vector>(T);
Phi[T] = Variable.DirichletSymmetric(V, beta).ForEach(T);
Variable<Vector> Theta = Variable.DirichletSymmetric(T, alpha);
VariableArray<int> Srcs = Variable.Array<int>(E);
VariableArray<int> Dests = Variable.Array<int>(E);
using (Variable.ForEach(E)) {
  var topic = Variable.Discrete(Theta).Named("topic");
  using (Variable.Switch(topic)) {
     Srcs[E] = Variable.Discrete(Phi[topic]);
     Dests[E] = Variable.Discrete(Phi[topic]);
   }
}
Variable<IDistribution<Vector[]>> PhiInit = Variable.New<IDistribution<Vector[]>>();
Phi.InitialiseTo(PhiInit);
                                 第5回自然言語処理勉強会                                          22
• Karate club data(Zachary 1977) に対してトピッ
  ク数2で推論した結果のトピック帰属確率の可
  視化
               第5回自然言語処理勉強会            23
まとめ
• Infer.NETを使って、文章生成モデルのLDAを
  実装する手順を紹介した。
• 今後、個別の問題に対してモデリングを行い、
  評価して、必要があればモデルを改良すると
  いう需要は高まっていくと思われる、そのよう
  なときにInfer.NETのようなモデルを簡単に記
  述できるフレームワークが有用になるのでは
  ないかと考えている。

           第5回自然言語処理勉強会        24
参考文献
• Infer.NET users guide : Tutorial and examples : Latent
  Dirichlet allocation http://research.microsoft.com/en-
  us/um/cambridge/projects/infernet/docs/Latent%20Di
  richlet%20Allocation.aspx , 今日の話は基本ここを読
  めば実は書いてある
• John Winn and Tom Minka : Probabilistic Programming
  with Infer.NET, http://research.microsoft.com/en-
  us/um/people/minka/papers/mlss2009/index.html
• S.S.J. WANG & M.P. WAND : Using Infer.NET for
  Statistical Analyses, Working Paper at Centre for
  Statistical and Survey Methodology, 06-10, 2010


                      第5回自然言語処理勉強会                     25

Infer.NETを使ってLDAを実装してみた

  • 1.
    Infer.NETを使ってLDAを実装してみた @第五回自然言語処理勉強会 坪坂正志 m(dot)tsubosaka@gmail.com
  • 2.
    Probabilistic Programming • 確率モデルをプログラムの形で書く •パラメータの推論の部分のコードはユーザが 書かずに自動で推論が行える • Ex: – BUGS (DSL) – Hierarchical Bayes Compiler (DSL) – Factorie (Scala) – Infer.NET (C#) 第5回自然言語処理勉強会 2
  • 3.
    メリット • 複雑な更新式を自分で計算する必要がなくなる –ex: 下のようなの 第5回自然言語処理勉強会 3
  • 4.
    • コードを見たときに元のモデルがイメージでき る – 推論アルゴリズムの結果から元のモデルを復元 するのは難しい – 書いた人はわかってても引き継ぐ人は。。。 第5回自然言語処理勉強会 4
  • 5.
    • 変分ベイズ法、EP法、MCMCとか知らない人 でも確率モデルが作れる • 問題に合わせてモデルの形を変更するみた いなことが機械学習のエキスパートでなくても 可能 第5回自然言語処理勉強会 5
  • 6.
    デメリット • 自分でチューニングしたコードを書いたほうが 実行時間・メモリ使用量ともに効率的 • 扱えるモデル・推論アルゴリズムがツールが サポートしている形式に依存する 第5回自然言語処理勉強会 6
  • 7.
    Infer.NETとは • Microsoft Researchが学術用途のために公開して いるグラフィカルモデル上のベイズ推論を行うた めのフレームワーク – Tom Minka, John Winn, John Guiver, Anitha Kannanの 四人で開発を行っている – Probabilistic Programmingを行うためのソフトウェア – http://research.microsoft.com/en- us/um/cambridge/projects/infernet/ • 商用利用禁止 第5回自然言語処理勉強会 7
  • 8.
    簡単な例 • 正規分布N(μ,1)に従うN個のデータx_iを観測した とする • また平均μの事前分布として正規分布N(0,100)を 仮定する • PRML 2.3.6を読めばμの事後分布は であることは分かる。 第5回自然言語処理勉強会 8
  • 9.
    モデルを表現するコード 1: Variable<int> N= Variable.New<int>().Named("N"); 2: Range i = new Range(N).Named("i"); 3: Variable<double> mean = Variable.GaussianFromMeanAndVariance(0, 100); 4: VariableArray<double> X = Variable.Array<double>(i).Named("X"); 5: X[i] = Variable.GaussianFromMeanAndVariance(mean, 1.0).ForEach(i); • 非常に簡潔かつ直接的にモデルが書けてる 第5回自然言語処理勉強会 9
  • 10.
    推論部分 N.ObservedValue = 100; X.ObservedValue= data; // double[] data InferenceEngine engine = new InferenceEngine(new VariationalMessagePassing()); Console.WriteLine("mean=" + engine.Infer(mean)); • 観測した値をObservedValueに代入して、 InferenceEngineのInferメソッドを呼ぶだけ 第5回自然言語処理勉強会 10
  • 11.
    実行結果 • 理論値と一致する. –(パラメータが一つしかなく、変分近似の部分で近 似が行われてないため) 第5回自然言語処理勉強会 11
  • 12.
    LDA[Blei+ 2003] • 自然言語処理でよく用いられている文章の生 成モデル • 詳しくは自分の前の発表とかを参考にしてく ださい(http://slidesha.re/cWr4cs) 第5回自然言語処理勉強会 12
  • 13.
    生成モデル • 各トピックtごとにW(語彙数)次元の単語出現確 率ベクトルをディリクレ分布から生成 – ∼ Dir() • 文章ごとにT次元のトピック確率ベクトルをディリ クレ分布から生成 – ∼ Dir() • 各文章において以下のように単語を生成 – ∼ Mult( )と単語のトピックを生成する – ∼ Mult( )とトピックに応じた確率で単語を生成 する 第5回自然言語処理勉強会 13
  • 14.
    パラメータベクトルの定義 • ここでSparsityはNLPでよくでてくる高次元のベクトルでもそのほと んどが0であるという性質を表すために用いられる – SparsityオブジェクトはSparsity.ApproximateWithTolerance(1.0E-6)のように 定義される。 第5回自然言語処理勉強会 14
  • 15.
  • 16.
    Break Symmetry • モデルがトピックに関して対象なのでPhiに関 してランダムな初期化を行う必要がある 第5回自然言語処理勉強会 16
  • 17.
    推論 事後分布が格納される 第5回自然言語処理勉強会 17
  • 18.
    実験 • BBCの記事2225本のデータセットからランダムに 1000件の記事を選択して、トピック数8で推論を 行った – データセット: http://mlg.ucd.ie/datasets/bbc.html – 2225件全部使おうとするとメモリが足りなかった(この 辺SharedVariableというのを使うと解決するみたいで すが、今回はそこまで余力がなかった) • 推論には1856秒かかった • 推論された各トピックの単語選択確率 の中の 上位数単語を次のスライドに示す 第5回自然言語処理勉強会 18
  • 19.
    Topic 0 Topic 1 Topic 2 Topic 3 take million year two time against on show call develop compani win world go just market wai secur manag includ sale govern elect mobil three want websit month expect labour get phone good attack london share top work minist four tori star Topic 4 Topic 5 Topic 6 Topic 7 game first 000 number plai back open peopl film plan think five dai week cost digit firm best told current rule chang network sai music year polit mean oil campaign spend ask public award hold earlier brown player receiv agre econom trade 第5回自然言語処理勉強会 19
  • 20.
    コミュニティ抽出法への応用 • コミュニティ抽出とはグラフ上からリンクが密 な部分を抽出する手法である – 確率モデルを使ったコミュニティ抽出法について は以下の文献が参考になる – 山田,無限関係モデルとその周辺 • http://www.kecl.ntt.co.jp/as/members/yamada/IBIS20 08_081031yamada.pdf 第5回自然言語処理勉強会 20
  • 21.
    ICMc: (Interaction ComponentModel for Communities) • http://arxiv.org/abs/0803.1628 • 以下のようなグラフの生成モデルを考える • 各トピックtごとにV(頂点数)次元の頂点出現確率ベクト ルをディリクレ分布から生成 – ∼ Dir() • T次元のトピック確率ベクトルをディリクレ分布から生成 – ∼ Dir() • 個のリンクを以下のようを生成 – ∼ Mult()とトピックを生成する – ∼ Mult , ∼ Mult( )とリンクの両端の頂点をト ピックに応じた確率でサンプリングする 第5回自然言語処理勉強会 21
  • 22.
    Infer.NETによる実装(モデル部分) Variable<int> numEdges =Variable.New<int>(); Range T = new Range(numTopics); Range E = new Range(numEdges); Range V = new Range(numVertexes); VariableArray<Vector> Phi = Variable.Array<Vector>(T); Phi[T] = Variable.DirichletSymmetric(V, beta).ForEach(T); Variable<Vector> Theta = Variable.DirichletSymmetric(T, alpha); VariableArray<int> Srcs = Variable.Array<int>(E); VariableArray<int> Dests = Variable.Array<int>(E); using (Variable.ForEach(E)) { var topic = Variable.Discrete(Theta).Named("topic"); using (Variable.Switch(topic)) { Srcs[E] = Variable.Discrete(Phi[topic]); Dests[E] = Variable.Discrete(Phi[topic]); } } Variable<IDistribution<Vector[]>> PhiInit = Variable.New<IDistribution<Vector[]>>(); Phi.InitialiseTo(PhiInit); 第5回自然言語処理勉強会 22
  • 23.
    • Karate clubdata(Zachary 1977) に対してトピッ ク数2で推論した結果のトピック帰属確率の可 視化 第5回自然言語処理勉強会 23
  • 24.
    まとめ • Infer.NETを使って、文章生成モデルのLDAを 実装する手順を紹介した。 • 今後、個別の問題に対してモデリングを行い、 評価して、必要があればモデルを改良すると いう需要は高まっていくと思われる、そのよう なときにInfer.NETのようなモデルを簡単に記 述できるフレームワークが有用になるのでは ないかと考えている。 第5回自然言語処理勉強会 24
  • 25.
    参考文献 • Infer.NET usersguide : Tutorial and examples : Latent Dirichlet allocation http://research.microsoft.com/en- us/um/cambridge/projects/infernet/docs/Latent%20Di richlet%20Allocation.aspx , 今日の話は基本ここを読 めば実は書いてある • John Winn and Tom Minka : Probabilistic Programming with Infer.NET, http://research.microsoft.com/en- us/um/people/minka/papers/mlss2009/index.html • S.S.J. WANG & M.P. WAND : Using Infer.NET for Statistical Analyses, Working Paper at Centre for Statistical and Survey Methodology, 06-10, 2010 第5回自然言語処理勉強会 25