Your SlideShare is downloading. ×
Infer.netによるldaの実装
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Infer.netによるldaの実装

1,436
views

Published on

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,436
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Welcome to the probabilistic world
  • 2.  某企業でデータマイニングのコンサルタン トをしてます 前職はシステムエンジニアです さらに言うと元々は某国立大学の非常勤研 究員 (いわゆるポス毒です)
  • 3.  Microsoft Research Cambridge開発の統計 モデルを.NETに構築するためのライブラ リ 統計モデルを実装するためのスイスアー ミーナイフ ライセンスはMicrosoft Researchの独自形 式で現時点では商業利用可のライセンスは 存在しない。
  • 4.  自然科学において理論を説明するための具 体的なもの 確率モデルとは統計理論を用いて理論構築 を行う
  • 5.  さいころ • 各面が均一に出る (ある面の出る確率は1/6) • 期待値は3.5 (確率と確率変数をかけた総和) 2項分布 • n=1の場合を特にベルヌーイ分布と言う。 多項分布 正規分布 ポアソン分布 などなど
  • 6.  public class FirstExample { public static void Main() { Variable<bool> firstCoin = Variable.Bernoulli(0.5).Named("firstCoin"); Variable<bool> secondCoin = Variable.Bernoulli(0.5).Named("secondCoin"); Variable<bool> bothHeads = (firstCoin & secondCoin).Named("bothHeads"); InferenceEngine ie = new InferenceEngine(); if (!(ie.Algorithm is VariationalMessagePassing)) { Console.WriteLine("Probability both coins are heads: "+ie.Infer(bothHeads)); bothHeads.ObservedValue=false; Console.WriteLine("Probability distribution over firstCoin: " + ie.Infer(firstCoin)); } else Console.WriteLine("This example does not run with Variational Message Passing"); } } first example of Infer.NET from Microsoft Research
  • 7.  Probability both coins  最初は2枚のコインが are heads: 両方とも表となる確率 Bernoulli(0.25)  次はどちらか若しくは Probability distribution 両方が裏となった場合 over firstCoin: に最初のコインが表と Bernoulli(0.3333) なる条件付確率
  • 8.  Latent Dirchlet Allocation (潜在的ディリク レ配分法) 元々は文章からの話題の推定に用いられた 2003年にD.M.Blei, A.Y.Ng, M.I.Jordanが提 案
  • 9.  Latent 潜在的 Dirchlet ディリクレ Allocation 配分法
  • 10.  「今何を見ている?ガンダムAGEだよ… えー、今なら、モーレツ宇宙海賊だよ。」 この文章を人間が見れば、この話題がアニ メであることは洞察できる。アニメという 言葉は出てこないにもかかわらず つまるところ、裏に隠れた話題と結びつい て、この場合だとアニメの番組名が文章中 で頻出している
  • 11.  予測 • 例えばSEOにお金をつぎ込めばショッピングサイ トでお客は買い物をするのかどうか? セグメンテーション • マーケットを分割して最適化を行うLDAはこの中ではセグメンテーションに資すると考えられる
  • 12.  潜在したトピックという情報を抽出する 用途としてはトピックによる文章の分類な どに応用できるほか、最近だと購買履歴を ベースに消費者のセグメンテーションを行 うといった研究事例が報告されている pLSAを改良した文章集合の生成モデル 文章はk個の話題に応じて発生した語で構 成 語の背後に話題という観測できない情報を 置く
  • 13.  LDAではαとβという2つのパラメータを用 いてモデルから生成されているとしている 分布θがディリクレ分布Dir(α)に基づいて選 ばれる クラスタ数Nになるまで繰り返す • znが多項分布Mult(θ)に基づいて選ばれる。 • wnが確率p(wn|zn,β)で選ばれる 従って、LDAを解くことというのはパラメータαとβを推定すること
  • 14.  現実的に解こうとすると変分ベイズEMア ルゴリズムやGibbs Samplerなどを使う必 要がある 当然、そのアルゴリズムを熟知し適切な実 装を行う必要がある つまり、実装技術+数学的な知識が両方な いと困難
  • 15.  確率モデルをプログラムの形で書く パラメータの推定の部分はユーザが書かず に自動的に推論 複雑な更新式を自分で書き下す必要がない 変分ベイズ法やMCMCとかを知らなくて も確率モデルができてしまう プログラムの効率的には自分で最適化した コードには及ばないInfer.NETを使ってLDAを実装してみた第5回 自然言語処理勉強会
  • 16.  if (!(ie.Algorithm is VariationalMessagePassing)) { Console.WriteLine("Probability both coins are heads: "+ie.Infer(bothHeads)); bothHeads.ObservedValue=false; Console.WriteLine("Probability distribution over firstCoin: " + ie.Infer(firstCoin)); } 基本的にはObservedValueをセットして、ie.Infer を呼ぶだけ first example of Infer.NET from Microsoft Research
  • 17.  Range D = new Range(NumDocuments).Named("D"); Range W = new Range(SizeVocab).Named("W"); Range T = new Range(NumTopics).Named("T"); NumWordsInDoc = Variable.Array<int>(D).Named("NumWordsInDoc"); Range WInD = new Range(NumWordsInDoc[D]).Named("WInD"); // Surround model by a stochastic If block so that we can compute model evidence Evidence = Variable.Bernoulli(0.5).Named("Evidence"); IfBlock evidenceBlock = null; // We cannot calculate evidence in the power-plate version if (!UsePowerPlate) evidenceBlock = Variable.If(Evidence); Theta = Variable.Array<Vector>(D); Theta.SetSparsity(ThetaSparsity); Theta.SetValueRange(T); ThetaPrior = Variable.Array<Dirichlet>(D).Named("ThetaPrior"); Theta[D] = Variable<Vector>.Random(ThetaPrior[D]); Phi = Variable.Array<Vector>(T); Phi.SetSparsity(PhiSparsity); Phi.SetValueRange(W); PhiPrior = Variable.Array<Dirichlet>(T).Named("PhiPrior"); Phi[T] = Variable<Vector>.Random(PhiPrior[T]); Words = Variable.Array(Variable.Array<int>(WInD), D).Named("Words"); WordCounts = Variable.Array(Variable.Array<double>(WInD), D).Named("WordCounts" LDAModel.cs
  • 18.  int numDocs = wordsInDoc.Length; NumDocuments.ObservedValue = numDocs; int[] numWordsInDoc = new int[numDocs]; int[][] wordIndices = new int[numDocs][]; double[][] wordCounts = new double[numDocs][];
  • 19.  NumWordsInDoc.ObservedValue = numWordsInDoc; Words.ObservedValue = wordIndices; WordCounts.ObservedValue = wordCounts; ThetaInit.ObservedValue = GetInitialisation(numDocs, NumTopics, ThetaSparsity); ThetaPrior.ObservedValue = new Dirichlet[numDocs]; for (int i = 0; i < numDocs; i++) ThetaPrior.ObservedValue[i] = Dirichlet.Symmetric(NumTopics, alpha); PhiPrior.ObservedValue = new Dirichlet[NumTopics]; for (int i = 0; i < NumTopics; i++) PhiPrior.ObservedValue[i] = Dirichlet.Symmetric(SizeVocab, beta); if (UsePowerPlate) Engine.OptimiseForVariables = new IVariable[] { Theta, Phi }; else Engine.OptimiseForVariables = new IVariable[] { Theta, Phi, Evidence }; postTheta = Engine.Infer<Dirichlet[]>(Theta); postPhi = Engine.Infer<Dirichlet[]>(Phi);
  • 20.  Infer.NETにおいては問題の解き方は定義 されない モデルを定義してそれを基に推論する
  • 21.  FLXMCmvnorm <- function(formula=.~., diagonal=TRUE) { z <- new("FLXMC", weighted=TRUE, formula=formula, dist = "mvnorm", name="model-based Gaussian clustering") require("mvtnorm") z@defineComponent <- expression({ logLik <- function(x, y) dmvnorm(y, mean=center, sigma=cov, log=TRUE) predict <- function(x, ...) matrix(center, nrow=nrow(x), ncol=length(center), byrow=TRUE) new("FLXcomponent", parameters=list(center = center, cov = cov), df=df, logLik=logLik, predict=predict) }) z@fit <- function(x, y, w){ para <- cov.wt(y, wt=w)[c("center","cov")] para$df <- (3*ncol(y) + ncol(y)^2)/2 if(diagonal){ para$cov <- diag(diag(para$cov)) para$df <- 2*ncol(y) } with(para, eval(z@defineComponent)) } z }
  • 22.  実際問題、マイニングの現場においては現 実のビジネスを理解して、それを元にモデ リングを行い データを投入して確認し、モデルを修正す るという反復的な作業が基本です そのため、モデルを簡単に記述できるフ レームワークは非常に有用性が高いと思わ れる
  • 23.  using (Variable.ForEach(D)){ using (Variable.ForEach(WInD)) { var topic = Variable.Discrete(Theta[D]); using (Variable.Switch(topic)) Words[D][WInD] = Variable.Discrete(Phi[topic]); }} usingを使ってForEachが書ける switchも同様にusingで
  • 24.  確率モデルをコードで記述 EMアルゴリズムといった解き方を記述す るのではない プログラムの実行効率はよくチューニング されたライブラリには及ばない 反復作業が必要なモデリングにおいては有 効です
  • 25.  D.M.Blei, A.Y.Ng, M.I.Jordan, "Latent Dirichlet Allocation" JMLR, vol.3, pp.993-1022 (2003) Infer.NET users guide: Tutotials and examples: Latent Dirichlet allocation http://research.microsoft.com/en- us/um/cambridge/projects/infernet/docs/Latent%20Diri chlet%20Allocation.aspx Infer.NETを使ってLDAを実装してみた(第5回 自然言語 処理勉強会) LDA 入門(第5回 自然言語処理勉強会) 汪金芳、手塚集、上田修功、田栗正章、樺島祥介、甘 利俊一、竹村彰通、竹内啓、伊庭幸人 『計算統計 I ― 確率計算の新しい手法』11巻〈統計科学のフロンティ ア〉、2003年。ISBN 4000068512。
  • 26. もっと先を…<<予測>>したくはないか、少年