Skip to content

トピックモデルで単語の分散表現 – 理論編

モチベーション

伝統的に単語をベクトルで表す方法は、ボキャブラリーサイズ(扱う全単語の数)の次元数を持ち、該当インデックスだけ1で他の値が0というone-hotベクトル(1つの概念を1つの成分で表すので局所表現という)が使われていた。
次に、「もし、2つの単語が似ている文脈(つまりその周りの単語のこと)で使われているなら、その単語は似ている」というdistributional hypothesis に基いて、単語を、その単語と同時に使われる単語たちの生起回数でベクトル表現する(これは複数の成分で概念を表現しているので分散表現という)という共起表現が現れたが、この方法でもベクトルの次元が(同じくボキャブラリーサイズなので)大きくなりすぎ、かつスパース(0が多すぎる)になってしまうため問題があった。

そこで、せいぜい100〜200次元くらいの低次元ベクトルでひとつの単語の意味を表現するにはどうしたら良いか?という問が生まれ、Deep Learningの流行と相まって近年いろんな手法が生まれた。この記事では、そのやり方の一つ(にも使われる)であるトピックモデル(とLDA)を用いて単語の分散表現を作ることにトライしてみる。 今回は、トピックモデルとLDAの基礎理論について紹介する。

 

トピックモデル・LDAとは

トピックモデルは、一言で大雑把に言い表わせば文書にトピック(その文書のジャンル・カテゴリ)を教師無しで割り当てる手法である。
トピックモデルにおいては、予め指定して置かなければならない変数はトピックの数のみで、それぞれのトピックが何なのか(「政治」とか「スポーツ」とか)は指定したり登録したりする必要が無い。なぜなら、トピックというのは「政治」とか「スポーツ」とかいった人間からみたジャンルではなく、単語の分布として表わされるからだ

cited from [2]
cited from [2]
上図では1番目のTopic(黄色) が gene, dna, genetic という単語をトップに含んでいるトピック(つまり遺伝子関係のトピック)で、3番めのTopic(緑)がbrain, neuron, nerveを含んでるトピック(脳に関するトピック)を表す。左に出ているのがすべてのトピックなら、トピック数は4で、この文書は4次元のベクトルで表される。

LDA(Latent Dirichlet Allocation)とは、トピックモデルに用いられる代表的な確率モデルで、LDAそのものは文書生成モデルである。

 

基本構造:もう少し詳しく

LDAそのものは文書生成モデルである。つまり、与えられた文書がLDAによって生成されると仮定したときのその文書の生成確率を計算したいために、生成モデルを考える必要がある。
LDAでは以下の流れで文書を生成する

  1. 文書の単語数Nとトピックの数Tを決める
    例) N=4, T=2
  2. 各トピックjごとの単語の分布\bm{\phi}^{(j)}をDirichlet分布Dir(\beta)に従って決める。
  3. 各文書dにおける(単語の)トピックの分布\bm{\theta}^{(d)}をDirichlet分布(ディリクレ分布) Dir(\alpha)に従って決める
    例) 1/2 の確率でfoodカテゴリ, 1/2の確率でanimalカテゴリになる分布とする
  4. 以下の手順で文書d内のN個の単語を生成
    1. トピック分布\bm{\theta}^{(d)}に従ってd内の単語のトピックを、T個のトピックの中から1個選ぶ
      例) T1 = food, T2=animal, T3=animal, T4=food
    2. \bm{\phi}^{(j)}に従って、先の手順で選んだ各トピックに基いて文書内の単語を決める。
      例) w1=broccoli, C2=panda, C3=bird, C4=eating

Dirichlet分布はベータ分布の多変数版にあたる分布で、適当なパラメータを与えて分布を生成できるので、確率分布の確率分布として扱われる。一般式は次のように与えられる。\alpha_j がすべてのjについて\alphaに等しい時、Dir(\alpha)と表す。つまりDir(\alpha, \cdots, \alpha) = Dir(\alpha)

    \begin{eqnarray*} P(\bm{\theta}) = \frac{1}{Z}\prod_{j=1}^K \theta_j^{\alpha_j -1} \end{eqnarray*}

\alphaは文書中のトピック分布を平滑化する役割を持っていて、小さいほど(0.01~0.1)分布が際立ち、大きいほど(10〜)分布がなめらかになる(トピックごとの確率差がなくなる)。

そして、上でいう\bn{\theta}, \bm{\phi}は次の学習プロセス、従ってデータから学習することで得られる。

  1. 各文書を見ていき、その文書の中の単語をひとつづつランダムにT個のトピックのうちどれかに割り当てる。(初期値として)
  2. 各文書を見ていき、その文書dの中の単語wと各トピックtについて、以下を計算する
    • p(t|d): 文書d中のトピックtの単語数 / 文書dの全単語数。 つまり \bn{\theta}^{(d)}_j にあたる。
    • p(w|t):トピックt内での単語wの数 / トピックtの全単語数。 つまり\bn{\phi}^{(j)}_i にあたる。
  3. 手順2で計算した確率の積 p(w|t) * p(t|d) が、
    をもとに、wに新しい新しいトピックを割り当てていく。
  4. 2の確率が変化しなくなるまで2と3を十分繰り返す。

この手順で最終的に得られたp(t|d)p(w|t)は、先に説明した手順の生成モデルで文章が生成されると仮定されたときのトピック分布と単語の分布なのである。このp(t|d)が、文書を表すトピックのベクトル(次元数はトピックの数に等しい)となる。

 

LDAでどう単語の分散表現を作るのか?

LDAは、文書(単語の集合)が与えられた時に、その文書が属するトピックを推測するものだった。従って、クラスタリングなんかに用いられることが多いのだが、これを使って単語の分散表現を作ることができる。
LDAが文書に対する手法ならば、ある単語の共起表現ベクトル(一緒に使われた回数を格納したベクトル。次元数は単語数)を一つの文書(頻度と同じ数だけ単語が含まれている文章。単語順は考慮しない。)と見立て、それに対しLDAを適用すればよい。共起表現ベクトルはそのままだと次元数が巨大過ぎてスパースになりやすいが、LDAを使えば適当な次元(100~500くらい?)に次元縮約することができる。
次回記事の実践編では、pythonのライブラリgensimを用いて、この方法によって実際に分散表現を作る。

 

参考文献

[1] Griffiths, Thomas L., Mark Steyvers, and Joshua B. Tenenbaum. 2007. Topics in semantic representation. Psychological Review 114(2):211–244.

Pocket

Published in人工知能知識表現(Knowledge Representation)自然言語処理

One Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です