読者です 読者をやめる 読者になる 読者になる

でかいチーズをベーグルする

でかいチーズはベーグルすべきです。

研究と開発のはざま

博士を取ってからの3年間はアカデミックで仕事をしていたけど、4月から民間企業に移ることにした。転職するかどうかそうとう悩んだわけだけど、その時に研究についていろいろと考えたのでちょっと書いてみたい。

工学では研究と開発の違いなんて無い

誰もが納得するような明確な違いは無いと思う。あったら教えて欲しい。

実際、ほとんどの研究(論文)が何かを開発しているし、それが世の中の役に立たないと評価されない。逆に、ほとんどのプロダクトには新規性(もしくは他のプロダクトとの差異)がある。確かに、工学において研究と呼ばれるものは開発と呼ばれるものより平均的には基礎的なことをやっているとは思うけど、とはいえ明確な線引は出来ない。

研究を神格化しすぎる風潮があるんじゃないかな。

「研究者です」というと「すごい!」と言われることがよくある。そう言ってもらえるのは嬉しいけど、べつにすごくないよ。99%の研究者は世の中に何のインパクトも与えない研究をやって、何のインパクトも無い論文を書いてる。それってすごいのか? 一方で世の中に多大なインパクトを与えるプロダクトを開発している人だってたくさんいる。要するに何が言いたいかというと、「研究は開発よりもすごい」なんてことは一切ないし、まぁそもそも違いもないよねということ。

研究とはなにか

さて、それなら研究とはなんなのか。それは自分の捉え方次第。自分が研究だと思ったらそれは研究だ。客観的な線引は出来ないんだから、当然そうなる。

じゃあ自分自身にとって研究とはなにかと考えると、「自分がワクワクするような成果をだすこと」だ。ワクワクしなければ意味は無いし、成果が出なければ意味は無い。少なくとも自分にとっては。

わくわくするには、自分の解きたい問題、答えたい質問を見つけなくてはならない。わくわくするにはその問題を解決しなくてはならない。わくわくするにはその解決法について自分が納得しなくてはならない。自分が納得するには、他人も納得させないといけない。というか、他人が納得しない結果に自分が納得するわけがない。他人が納得しないということは、どこかに論理の飛躍がある。

要するに、「自分がわくわくする問題を見つけて、それを他人も納得するような形で解く」というのが自分の中での研究だと思う。

ビッグクエスチョンがないと研究は厳しい

自分がワクワクして、解くのに5年くらいかかる問題がないと研究を続けるのは難しい。

ビッグクエスチョンがないと、適当に問題を見つけて、あるいは誰かからもらって解決するただの問題解決屋になってしまう。問題を解決するだけならどこにいても出来る。すぐに解決できる問題に取り組むのも研究職の利点を活かしていない。すぐに解決できるなら土日に趣味でやれば良い。

研究職の良いところは、自由が多いこと*1

せっかく自由に自分がやることを決められるんだから、面白いことをやりたい。せっかく自由に使える時間があるんだから、自分の好きなことに使いたい。自分がワクワクするような問題にじっくりと取り組む。こんなに楽しい仕事はないと思う。実際、面白い問題を見つけてそれに取り組んでいる時は本当に楽しかった。

ビッグクエスチョンを見つけるには世の中のことを深く知る必要がある。

何が自分にとって面白いのかなんて、結局のところこれまで自分が作ってきた価値観の中でしか考えられない。考えても考えても思いつかないなら、ずっと思いつかないはず。視野が狭い。視野を広げていけばこれまでは思いもつかなかったような面白いことが見つかるかもしれない。視野を広げるって相当難しいと思うけど、少なくとも新しいことをやれば視野が広がって面白いことが見つかる可能性は高くなると思う。

まとめ

自分が心の底から解きたいと思える問題があるなら研究職につくのは素晴らしいと思う。自分にこんなに裁量がある仕事はそうそうない。でもそういう問題が見つかっていないなら一歩踏みとどまったほうが良い。それがないなら研究と開発の間に大きな違いはない。

*1:自由なんてないという研究者の皆さん、大変お疲れ様です。

Author Topic Model の導出と実装

またまた引き続き青いトピックモデル本から。今回は Author Topic Model を導出して実装してみる。とりあえずこのシリーズは一旦今回で最後。

トピックモデル (機械学習プロフェッショナルシリーズ)

トピックモデル (機械学習プロフェッショナルシリーズ)

出典は以下の論文。これまで実装してきたモデルと比べるとずば抜けて有名っぽい。

https://arxiv.org/ftp/arxiv/papers/1207/1207.4169.pdf

Author Topic Model

Author Topic Model (ATM) は文書に付加情報として著者情報が付いているデータのモデリングをするのに使われる*1。一つの文書に複数(一人以上)の著者がいるときに、文書中のそれぞれの単語についてどの著者が書いたのかを推定して割り当てていく。

簡単な例で説明する。スポーツと音楽と政治という3つのトピックについて書かれた文書 d があるとする(あるかな?)。また、文書 d は Alice と Bob によって書かれたとする。Alice はスポーツと音楽について執筆することが多く、Bob は政治について執筆することが多いことは分かっているとしよう。ATM は、文書 d の一つ一つの単語について、Alice と Bob のどちらが担当して書いたのか(生成したのか)を割り当てる。スポーツもしくは音楽っぽい単語なら、その単語は Alice が書いたと判定されるし、政治っぽい単語なら Bob が書いたと判定されることになる。ここまでの説明では Alice と Bob の専門(何についてよく書くか)は分かっているとしたが、実はATMはそれもデータから推定する。

こうすることで何が嬉しいかというと、Bob が政治についてよく書くということがデータから推定されれば、Bob が書いた他の文書も政治について書かれていそうだという推定が出来るようになる。まさに著者情報という付加情報をうまく使ってトピック割り当てを行っている。

ATM のグラフィカルモデルは以下の通り。

f:id:yamaguchiyuto:20170323162459p:plain

LDA と同様に、w は単語、z はトピックID、θはトピック分布、φはトピックごとの単語分布。また、a は著者集合で、y は単語ごとの著者割り当てを表す。S は著者の異なり数(全著者数)で、K はトピック数。LDA では文書ごとにトピック分布があったが、ATM では著者ごとにトピック分布がある。

生成過程は基本的に LDA と同じだけど、y と z の生成だけが異なる。y はその文書の著者集合の中から一様ランダムに選ばれる。つまり、文書 d の著者が {M_d} 人いるとすると、n 番目の単語 {w_{dn}} の著者割り当ては、

{
y_{dn} \sim \frac{1}{M_d}
}

となる。

{y_{dn}=j} が生成されたとして、文書 d の j 番目の著者を {a_{dj}} と表すことにすると、単語 {w_{dn}} のトピック割り当ては、

{
z_{dn} \sim Mul(\cdot | \theta_{a_{dj}})
}

となる。つまり、著者 {a_{dj}} のトピック分布からトピックが生成される。

導出

周辺化ギブスサンプリングのサンプリング式を導出する。ATM は各単語について隠れ変数が2つ({z_{dn}}{y_{dn}})があるので、その2つを同時にサンプリングする。いつも通り右肩の添字はその集合から添字に対応する要素を抜くことを表すとすると、

{
p(z_{dn}=k,y_{dn}=j | w_{dn}=v, A, Z^{dn}, Y^{dn}, W^{dn}, \alpha, \beta)
}

{
\propto \int p(z_{dn}=k,y_{dn}=j, w_{dn}=v, A, Z^{dn}, Y^{dn}, W^{dn}, \Theta, \Phi | \alpha, \beta) d\Theta d\Phi
}

{
\propto \int p(w_{dn}=v | \phi_k) p(\phi_k | W^{dn}, Z^{dn}, \beta) d\phi_k
}

{
\times \int p(z_{dn}=k | \theta_{a_{dj}}) p(\theta_{a_{dj}} | Z^{dn}, Y^{dn}, \alpha) d\theta_{a_{dj}}
}

{
= \frac{n_{kv}^{dn} + \beta}{\sum_v (n_{kv}^{dn} + \beta)} \frac{n_{a_{dj}k}^{dn} + \alpha}{\sum_k (n_{a_{dj}k}^{dn} + \alpha)}
}

となる。添字がごちゃごちゃしててわかりづらいんだけど、 {n_{kv}^{dn}} は、{z_{dn}} を除いて、トピック k が単語 v に割り当てられた数を表し、{n_{a_{dj}k}^{dn}}{z_{dn}} を除いて、著者 {a_{dj}} が割り当てられた単語に対してトピック k が割り当てられた数を表す。

実装

z と y を同時にサンプリングするので、そこの実装だけ注意。各イテレーションごとにサンプルされた Z と Y を用いて尤度を計算して、それが最も大きかった Z と Y を保存しておく。

Author Topic Model

実験

架空の著者「山田」と「鈴木」が書いた文書という想定の人工データを使って実験してみた。山田はコンピュータに関するトピックについて多く書いていて、鈴木は食べ物に関するトピックについて多く書いている。

結果を見ると、 “apple” という単語はコンピュータトピックにも食べ物トピックにも両方登場するんだけど、著者情報を使うことによって正しくトピックが割り当てられている。また、最後の文書は山田と鈴木の共著ということになっているが、文書中の単語はコンピュータに関するものだけなので、割り当てられた著者も山田だけということになった。鈴木のギフトオーサーシップが発覚した!

ATM experiment

*1:著者情報じゃなくても適用は可能。

Noisy Correspondence Topic Model の導出と実装

さらに引き続き青いトピックモデル本から。今回はノイズ有り対応トピックモデル (Noisy Correspondence Topic Model; NCTM) を導出して実装する。

トピックモデル (機械学習プロフェッショナルシリーズ)

トピックモデル (機械学習プロフェッショナルシリーズ)

出典は以下の論文。

http://www.kecl.ntt.co.jp/as/members/iwata/nips2009.pdf

Noisy Correspondence Topic Model

このモデルは Correspondence Topic Model (CTM) の拡張になっていて、CTM と同様に付加情報を考慮しながら文書のモデリングが出来る。どう拡張されているかというと、付加情報の中からノイズとノイズでないものを切り分けることが出来る。

付加情報のノイズについて、論文中でも取り上げられているソーシャルブックマークの例を使って説明する。ソーシャルブックマークでは、Webページ(文書)にタグ(付加情報)を付けることが出来る。タグの中には、文書のトピックを表すようなもの(例えば技術系のブログ記事に “TECH” とか)と、文書のトピックを表さないようなもの(例えば、"あとで読む" とか)の2種類がある。前者は文書のモデリングに役立ちそうだけど、後者は役立ちそうにないので、このモデルではノイズと呼ぶ。

ノイズでない付加情報は特定のトピックに偏って出てくるけど、ノイズである付加情報は偏り無く、全てのトピックにまんべんなく出てくる。つまり、「ノイズとは特定のトピックに偏り無く出現する付加情報」であると、(ある意味)定義していることになる。これ重要。

で、どう切り分けるかだけど、各付加情報について、それがノイズかノイズでないかを表す確率変数 {r \in {0,1}} を導入する。r が 0 のときは対応する付加情報はノイズで、1 のときはノイズでないとする。そんでその r が 0 なのか 1 なのかをデータから推定する。この r をスイッチ変数と呼ぶ。

グラフィカルモデルは以下。

f:id:yamaguchiyuto:20170322064202p:plain

CTM から変わったのはスイッチ変数の部分だけで、r は各付加情報ごとにある。生成過程も CTM とほぼおなじだけど、r は λ をパラメータとするベルヌーイ分布から生成され、λ は η をパラメータとするベータ分布から生成される。一件ごちゃごちゃしてるけど、拡張の系譜をたどると理解しやすい。

なぜスイッチ変数をデータから推定できるか?

トピックモデルを1ミリもわかってなかったときはなんでこの変数をデータから推定できるのか全くわからなかったんだけど、今は1ミリくらいは分かっているので直感的に説明してみる。トピックモデル(LDAから派生したモデル群)は基本的には単語のハードクラスタリングを行っている。言い換えると、「それぞれの単語は特定のトピック(クラスタ)から出現した」という仮定を入れている。 つまり、全てのトピックからまんべんなく出現する単語というのはモデル上有りえない。

じゃあどうするか。上記のクラスタリングをする前に、その単語が「特定のトピックから出現した」のか、「トピックに関係なく出現した」のか判別する。前者と判別されたらその単語がどのトピックから出現したのかをクラスタリングする。後者と判別されたらしない。当然、ノイズは「トピックに関係なく出現した」としたほうが、つまり r=0 としたほうが、モデルのもっともらしさは高くなるので、そのように推定されることになる。

導出

周辺化ギブスサンプリングのサンプリング式を導出する。Z のサンプリングは CTM と同じなので省略。前回と同様に右肩の添字はその集合から添字に対応する要素を抜くことを表す。

Y のサンプリング

Y のサンプリングも CTM とほぼ同じなので導出は省略するけど、 文書 d の m 番目の付加情報のトピック {y_{dm}} をサンプリングするときに、{r_{dm}} が 0 か 1 かでサンプリングの式が変わる。

{r_{dm}=1} のとき、つまりノイズでないときは CTM の時と同じ。

{
p(y_{dm} = k | x_{dm} = u, r_{dm} = 1, Z, W, X^{dm}, Y^{dm}, R^{dm}, \alpha, \beta, \gamma, \eta)
}

{
\propto n_{dk} \frac{m^{dm}_{ku}+\gamma}{\sum_u (m^{dm}_{ku}+\gamma)}
}

{n_{dk}} は文書 d の単語のうちトピック k が割り当てられたものの数を表し、{m^{dm}_{ku}}{x_{dm}} を除いて、トピック k が割り当てられた付加情報 u の数を表す。

{r_{dm}=0} のとき、つまりノイズであるときは CTM の時と少し違う。

{
p(y_{dm} = k | x_{dm} = u, r_{dm} = 0, Z, W, X^{dm}, Y^{dm}, R^{dm}, \alpha, \beta, \gamma, \eta)
}

{
\propto n_{dk}
}

つまり、付加情報 {x_{dm}} がノイズであるときは、その文書においてトピック k が割り当てられた単語数のみが考慮される。ちなみに、{x_{dm}} がノイズであるときは {y_{dm}} が他の変数のサンプリング式に影響をあたえることはないので、サンプリングする必要はない。

R のサンプリング

{r_{dm}} のサンプリングをするときは、{r_{dm}=0} の事後分布と {r_{dm}=1} の事後分布を両方計算して2つの合計が 1 になるように正規化すれば良い。

{
p(r_{dm} = 1 | x_{dm} = u, y_{dm} = k, Z, W, X^{dm}, Y^{dm}, R^{dm}, \alpha, \beta, \gamma, \eta)
}

{
\propto \int p(r_{dm} = 1, x_{dm} = u, y_{dm} = k, Z, W, X^{dm}, Y^{dm}, R^{dm}, \Psi, \lambda | \alpha, \beta, \gamma, \eta) d\Psi d\lambda
}

{
\propto \int p(x_{dm} = u | r_{dm} = 1, y_{dm} = k, \psi_k)p(\psi_k|X^{dm}, Y^{dm}, R^{dm}, \gamma) d\psi_k
}

{
\times \int p(r_{dm} = 1 | \lambda )p(\lambda|R^{dm}, \eta) d\lambda
}

{
= \int \psi_{ku} p(\psi_k | X^{dm}, Y^{dm}, R^{dm}, \gamma)d\psi_k \times \int \lambda p(\lambda|R^{dm},\eta) d\lambda
}

{
\propto \frac{M^{dm}_{ku} + \gamma}{\sum_u (M^{dm}_{ku} + \gamma)} (M^{dm}_1 + \eta)
}

{M^{dm}_{ku}}{x_{dm}} を除いて、トピック k が付加情報 u に割り当てられた回数を表し、{M^{dm}_1}{x_{dm}} を除いて、ノイズでない付加情報の数を表す。

また同様に、

{
p(r_{dm} = 0 | x_{dm} = u, y_{dm} = k, Z, W, X^{dm}, Y^{dm}, R^{dm}, \alpha, \beta, \gamma, \eta)
}

{
\propto \frac{M^{dm}_{0u} + \gamma}{\sum_u (M^{dm}_{0u} + \gamma)} (M^{dm}_0 + \eta)
}

{M^{dm}_{0u}}{x_{dm}} を除いて、付加情報 u がノイズであると判別された回数を表し、{M^{dm}_0}{x_{dm}} を除いて、ノイズである付加情報の数を表す。

実装

{r_{dm}}が 0 か 1 かでサンプリングとかの処理を変える必要があるので、その辺を注意。

Noisy Correspondence Topic Model

実験

CTM と NCTM を比較した。ノイズと判別されるべきの付加情報 “TOREAD” を加えて、それがちゃんと NCTM によってノイズと判別されるかを見てみる。結果を見ると、NCTM は “TOREAD” をしっかりとノイズと判別するため、他の単語及び付加情報にうまくトピックを割り当てることが出来ている。一方で CTM は “TOREAD” にトピック 0 (ipadとかと同じトピック) を割り当ててしまっているせいで、4番目の文書の単語 “apple” にトピック 0 を割り当ててしまっている。

NCTM experiment

Correspondence Topic Model の導出と実装

引き続き青いトピックモデル本から、対応トピックモデル(Correcpondence Topic Model; CTM)を実装した。サンプリング式の導出が詳しく載っていなかったので、詳しめに導出してみる。

トピックモデル (機械学習プロフェッショナルシリーズ)

トピックモデル (機械学習プロフェッショナルシリーズ)

CTM の出典は以下の論文。

http://www.cs.columbia.edu/~blei/papers/BleiJordan2003.pdf

Correspondence Topic Model

前回書いた結合トピックモデル(Joint Topic Model; JTM)と同じで、文書のモデリングをするときに文書についている付加情報も考慮するモデル。

JTMとCTMが違うのは以下の点だけ。ある文書 d について、付加情報のトピック y を生成するときに、JTMでは単語のトピック z とは独立に生成されるんだけど、CTMでは y は同じ文書 d の単語のトピック z のどれかから 選ばれる。つまり、文書 d に含まれるどの単語にも割り当てられていないトピック k はその文書内の付加情報には割り当てられない。

こうすることで、CTMはある文書の単語と付加情報とに全然関係ないばらばらのトピックが割り当てられることを防ぐ。

CTMのグラフィカルモデルは以下。

f:id:yamaguchiyuto:20170321125538p:plain

通常通り、白まるが非観測の確率変数で灰色のまるが観測された確率変数、黒い小さなまるがパラメータ(確率変数でない)を表す。生成過程を全部書くのは面倒くさいので簡単に説明すると、w, z, θ, φの生成過程はLDAと同じ。yの生成過程だけ特殊で、

{
y_{dm} \sim Cat(\frac{n_{d1}}{n_d}, \cdots, \frac{n_{dK}}{n_d})
}

Cat()はカテゴリカル分布(n=1の多項分布)、{n_d}は文書 d の単語数、{n_{dk}}は文書 d のなかでトピック k が割り当てられた単語の数。つまり、文書 d の単語に多く割り当てられたトピックほど {y_{dm}} に割り当てられる確率が高くなる。

ちなみに、元論文では w の生成が多項分布じゃなくてガウシアンになってたので、青いトピックモデル本に載ってるモデルとは違うっぽい。今回は青いトピックモデル本のとおり、多項分布で行く。

導出

周辺化ギブスサンプリングを導出する。以下のように {Z = \{z_{dn}\}}{Y = \{y_{dm}\}} のサンプリングをする。

Zのサンプリング

右肩の添字は、その集合から対応する添字の要素を除いたものとする。例えば、{Z^{dn}}{Z} から {z_{dn}} を除いたものとする。

{
p(z_{dn} = k | w_{dn} = v, Z^{dn}, W^{dn}, X, Y, \alpha, \beta, \gamma)
}

{
\propto \int p(z_{dn} = k, w_{dn} = v, Z^{dn}, W^{dn}, X, Y, \Theta, \Phi | \alpha, \beta, \gamma) d \Theta d\Phi
}

{
\propto \int p(w_{dn} = v | \phi_k) p(\phi_k | Z^{dn}, W^{dn}, \beta) d \phi_k
}

{
\times \int p(z_{dn} = k | \theta_d, y_d, z^{n}_d) p(\theta_d | z^n_d, y_d, \alpha) d \theta_d
}

ここで、一つ目の積分はLDAと同じで、{\frac{n^{dn}_{kv}+\beta}{\sum_v (n^{dn}_{kv}+\beta)}} となる。ただし、{n^{dn}_{kv}}{z_{dn}} を除いて、トピック k が単語 v に割り当てられた回数を表す。

2つめの積分について見ていくと、

{
\int p(z_{dn} = k | \theta_d, y_d, z^{n}_d) p(\theta_d | z^n_d, y_d, \alpha) d \theta_d
}

{
\propto \int p(z_{dn} = k | \theta_d, y_d, z^{n}_d)p(\theta_d, z^n_d, y_d | \alpha) d \theta_d
}

{
= \int p(z_{dn} = k, \theta_d, z^n_d, y_d | \alpha) d \theta_d
}

{
= \int p(y_d|z^n_d, z_{dn}=k)p(z_{dn} = k | \theta_d)p(\theta_d|z^n_d, \alpha) d \theta_d
}

{
= p(y_d|z^n_d, z_{dn}=k) \int p(z_{dn} = k | \theta_d)p(\theta_d|z^n_d, \alpha) d \theta_d
}

ここで、積分の中身はLDAと同じで {\frac{n^n_{dk} + \alpha}{\sum_k (n^n_{dk} + \alpha)}} となり、また

{
p(y_d|z^n_d, z_{dn}=k) = \left(\frac{n^n_{d1}}{n^n_d}\right)^{M_{d1}}\left(\frac{n^n_{d2}}{n^n_d}\right)^{M_{d2}}\cdots\left(\frac{n^n_{dk}+1}{n^n_d}\right)^{M_{dk}}\cdots\left(\frac{n^n_{dK}}{n^n_d}\right)^{M_{dK}}
}

{
 = \left(\frac{n^n_{dk}+1}{n^n_{dk}}\right)^{M_{dk}} \left(\frac{n^n_{d1}}{n^n_d}\right)^{M_{d1}}\left(\frac{n^n_{d2}}{n^n_d}\right)^{M_{d2}}\cdots\left(\frac{n^n_{dk}}{n^n_d}\right)^{M_{dk}}\cdots\left(\frac{n^n_{dK}}{n^n_d}\right)^{M_{dK}}
}

{
 = \left(\frac{n^n_{dk}+1}{n^n_{dk}}\right)^{M_{dk}} p(y_d|z^n_d)
}

{
\propto \left(\frac{n^n_{dk}+1}{n^n_{dk}}\right)^{M_{dk}}
}

となる。ただし、{n^n_{dk}} は単語 {z_{dn}} を除いて、文書 d 内の単語にトピック k が割り当てられた回数を表す。また、{n^n_{d} = \sum_k n^n_{dk}} 。さらに、{M_{dk}} は文書 d の付加情報のうちトピック k が割り当てられた回数を表す。

以上より、まとめると

{
p(z_{dn} = k | w_{dn} = v, Z^{dn}, W^{dn}, X, Y, \alpha, \beta, \gamma)
}

{
\propto (n^n_{dk} + \alpha) \frac{n^{dn}_{kv}+\beta}{\sum_v (n^{dn}_{kv}+\beta)} \left(\frac{n^n_{dk}+1}{n^n_{dk}}\right)^{M_{dk}}
}

Yのサンプリング

{
p(y_{dm} = k | x_{dm} = u, Z, W, X^{dm}, Y^{dm}, \alpha, \beta, \gamma)
}

{
= \int p(x_{dm}=u|y_{dm}=k, \Psi)p(y_{dm} = k|z_d)p(\Psi |X^{dm}, Y^{dm}, \gamma) d\Psi
}

{
= p(y_{dm} = k|z_d) \int p(x_{dm}=u|y_{dm}=k, \Psi)p(\Psi |X^{dm}, Y^{dm}, \gamma) d\Psi
}

{
\propto n_{dk} \int p(x_{dm}=u|y_{dm}=k, \Psi)p(\Psi |X^{dm}, Y^{dm}, \gamma) d\Psi
}

{
\propto n_{dk} \frac{n^{dm}_{ku}+\gamma}{\sum_u (n^{dm}_{ku}+\gamma)}
}

{n^{dm}_{ku}}{x_{dm}} を除いて、トピック k が割り当てられた付加情報 u の数を表す。

実装

{z_{dn}} をサンプリングするときに、{y_d} には割り当てられているのに {z^n_d} に割り当てられていないトピックがある場合は必ずそのトピックをサンプルするようになっているんだけど(式参照)、その場合0除算が発生してしまわないように場合分けをする。

Correspondence Topic Model

実験

適当なデータを作って Joint Topic Model と Correcpondence Topic Model を比較した。JTM は最後の文書で単語にはトピック 1 (windowsトピック)を割り当てているのに、付加情報(カテゴリ)にはトピック 0 (ipadトピック)を割り当ててしまっている。CTM はそうはならず、単語にも付加情報にも同じトピックが割り当てられている。

CTM experiments

Joint Topic Modelを実装した

LDAの簡単な拡張になっている Joint Topic Model を実装した。青いトピックモデル本で紹介されてた。この本はいろんなモデルが載ってるのでいいね。

トピックモデル (機械学習プロフェッショナルシリーズ)

トピックモデル (機械学習プロフェッショナルシリーズ)

実装したあとで気づいたけど既にnzw君が実装して実験してたのでこちらも参考に。

nzw0301.github.io

Joint Topic Model

Joint Topic Model (JTM) はLDAとほとんど同じなんだけど、文書に付加情報(カテゴリとか)がついてる場合、それも使うことができる。

どんな付加情報を扱えるかというと、基本的にはカテゴリ変数だけ。生成過程を見ると分かるように、付加情報の生成にはカテゴリカル分布が使われているので、何かしらの数値(レビュー文書のレーティングとか)が付加情報としてついていてもこのモデルではうまく扱えない(理論上は)。

このモデルが応用されている例として、対訳文書のモデリングをしてる以下の論文がある。

http://dirichlet.net/pdf/mimno09polylingual.pdf

この論文では文書として言語Aの文書、付加情報として言語Bの文書をモデルに与えて、両方の情報を用いてトピック推定をしている。JTMは複数の付加情報を同時にモデリングできるので、言語C, D, E, …の文書を同時にモデルに与えることも出来る。

実装

周辺化ギブスサンプリングで実装。ほとんどLDAと同じ。Z(トピック割り当て)のサンプリングの式がちょっと違うだけ。

Joint Topic Models

実験

JTMとLDAを比較してみた。PCもしくはFOODというカテゴリが与えられている文書がうまくモデリング出来るかを比較した。結果を見ると、JTMはカテゴリ情報をうまく使って、全く同じ単語が出現している文書にもうまくトピックを割り当てることが出来ている。LDAではカテゴリ情報が与えられていないので当然そういうことは出来ない。

JTM experiments