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

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

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

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:著者情報じゃなくても適用は可能。