Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

トピックモデル(LDA)で初学者に分かりづらいポイントについての解説

こんにちは。
信号処理で使っていた数学の知識を生かして、
機械学習関連の仕事をしている2年目の@です。

こちらは機械学習と数学 Advent Calendarの11日目の記事となります。

qiita.com

トピックモデルの学習で初学者に分かりづらいポイントについての解説をしていきます。

機械学習における数学の重要性

機械学習を利用してアプリケーションを作る際に、数学の知識は重要です。
機械学習の便利なライブラリは多くリリースされていますが、適切に使用するにはパラメータチューニングが必要だったり、
最新の手法を動かしたい場合は自分で数式を読んで理解し、開発しないといけません。

というわけなので、数学は大事です。機械学習でアプリケーションを作るみなさん数学を勉強しましょう。

トピックモデル

トピックモデルとは何か

トピックモデルは潜在的意味を推定するためのモデルです。

トピックモデルのゴールの1つとして、潜在的な意味を得ることがあります。
潜在的意味の例としては、ニュース記事のカテゴリとか、画像に何が映っているかとか、音声の音程とかです。

潜在的意味解析

潜在的意味をトピックと定義して、各トピックに応じたデータを生成する仕組みがあると仮定しています。

Latent Semantic Indexing(LSI), Latent Dirichlet Allocation(LDA)などの手法がありますが、
ここではLDAについて書きます。
LDAでは、多項分布とディリクレ分布によって各データが生成されていると仮定しています。
そして、学習データから各データが生成される仕組み(生成過程)を学習します。
文書を例にすると、「スポーツ」をトピックとして持つ文書は「ボール」などの単語から生成されている
のような「仕組み」が学習されるわけです。この「仕組み」は後述にもあるディリクレ分布や多項分布でも紹介します。

この生成過程の学習により、データのカテゴリ分けやデータの生成を行えます。

LDAやその派生により、文書のカテゴリ分けや、音声データの認識の応用に使われています。
しかし、初学者には難しく、私も勉強していて苦労しました。
そこで、自分にとって分かりづらかった部分の解説をしていきます。

分かりづらいポイント

本記事では、分かりづらいポイント2点紹介します。

1. LDAで仮定されるデータの生成過程のイメージ
 データの生成過程で、確率分布の実現値を使った計算が出てきます。
 この部分は確率を使用するような文献をあまり読んでこなかった身としては、イメージがつきませんでした。
2. データ生成過程でなぜ多項分布やディリクレ分布を使用するのか
 多項分布やディリクレ分布の定義を見ると実現値がどのような値になるのかはわかるのですが、
 それが、実際のデータにおいてどの部分にあたるのかが分かりづらいと感じました。

1. データの生成過程のイメージ

文書データを例にして説明します。
文書のトピック種別がK個で決まっていて、文書dn_d個の単語w_iからできている場合の
データ生成の過程は図1のようになります。
f:id:acro-engineer:20171210213627p:plain

[図1 LDAのデータ生成過程]

各記号の意味は次の通りです。
\alpha:文書のトピック割合を生成するディリクレ分布のパラメータ
\theta_d:文書dに各トピックkが登場する確率を表すベクトル(成分の和が1)
z_{d,k}:文書dに登場するトピックkの単語数
\beta:トピックの単語生成確率を生成するディリクレ分布のパラメータ
\phi_k:各トピックでの単語w_iが生成される確率を表すベクトル(成分の和が1)
x_{d,i}:文書dに登場する単語w_iの個数

LDAではまず、文書を単語の集まりとみています(単語数だけしか見ていない)。
「文書を書く」行為はどのようなトピックかを予め決めて、空の文書にM種類ある単語の中から
1つずつ選んで追加していく動作と考えられます。

この行為によって選ばれた合計でn_d個の単語は、n_d
単語の登場確率\phi_kをパラメータとした多項分布の実現値(=実際に選んだ値)とみなせます。

LDAでは、予め決定するトピックの単語数もn_dと文書のトピック割合\theta_d
パラメータとした多項分布の実現値とみなしています。まずは、多項分布について説明します。

多項分布

1回でM種類の値からどれか1つを選ぶという試行があり、それをn_d回繰り返すときに、
M種類の値がそれぞれ出現する回数を表現するベクトルは多項分布に従います。

パラメータとして、試行回数n_dM種類の値がそれぞれ出る確率pを持つ。
確率変数X=(x_1, \ldots, x_M)n_dp=(p_1, \ldots, p_M)をパラメータとする多項分布に従うとき、確率質量関数f(x_1, \ldots, x_M; n, p_1, \ldots, p_M)
f(x_1, \ldots, x_M; n, p_1, \ldots, p_M)=\left\{ \begin{array}{ll}
    \frac{n!}{x_1! \cdots x_M!}p^{x_1}_1 \cdots p^{x_M}_M & \Bigl(\sum^{M}_{m=1}x_m=n_d\Bigr) \\
    0 & (otherwise)
  \end{array} \right. \qquad where \ \sum^{k}_{i=1}p_i=1
となります。
例えば、x_1は単語1を追加した個数、p_1M種類の単語から単語1を選ぶ確率です。

多項分布では、それぞれの値が出る確率と試行回数がパラメータとなっています。
さて、今度はこのパラメータを決めることが必要です。
それぞれの値が出る確率はディリクレ分布から生成しています。

ディリクレ分布

単体(※1)上の確率分布で、長さNのベクトルをパラメータとして持っています。
※1.成分の和が1になる長さNのベクトルを集めた集合

確率変数X=(x_1, \ldots, x_k)\alpha=(\alpha_1, \ldots, \alpha_k)をパラメータとするディリクレ分布に従うとき、確率密度関数g(X; \alpha)
g(X; \alpha)=\frac{\Gamma(\sum^{k}_{i=1}\alpha_i)}{\prod^{k}_{i=1}\Gamma(\alpha_i)}\prod^{k}_{i=1}x^{\alpha_i-1}_{i} \qquad where \ \sum^{k}_{i=1}x_i=1 \ \mathrm{and} \ \forall i \in \{1, \ldots, k\} \ \alpha_i>0, x_i \geq 0
となる。
例えば、x_1はある文書中でトピック1の単語が登場する確率になります。

ディリクレ分布の実現値から成分の和が1になるベクトルが得られるため、
このベクトルを多項分布のパラメータp=(p_1, \ldots, p_M)として使用します。

このように、ディリクレ分布によって多項分布のパラメータを設定するため、
Latent Dirichlet Allocation(LDA)という名前がついているようです(※2)。
※2.潜在的(Latent)なパラメータをディリクレ分布(Dirichlet)によって割り当てている(Allocation)。

まとめると、文書データの生成は次のように行われます。

1. 文書のトピック割合をディリクレ分布から生成する・・・①
2. 各トピックの単語選択確率をディリクレ分布から生成する・・・②
3. 文書の単語数と①をパラメータとした多項分布から、トピックごとの単語数を生成する・・・③
4. ③と②から各単語の使用回数を生成する → 文書データと等しい。

2. なぜ多項分布やディリクレ分布を使用するのか

LDAでは、「文書を書く」過程を単語選択の連続と考えているため、
M種類の値から1つ選ぶ動作を繰り返した結果としての多項分布の実現値を使用しています。

ディリクレ分布については、多項分布のパラメータを得るために使用していますが、
他の分布からでもよいのではないかと思われるかもしれません。

なぜディリクレ分布なのかという部分について完全には理解していませんが、
理由の1つとしてパラメータ推定を行う際に計算を簡単にするためというものがあります。
ディリクレ分布は多項分布の共役事前分布となっているため、計算上都合がいい場面が多くあります。

まとめ

トピックモデルでは他の手法と違い、データをどう分類するかを学習するのではなく、
分類先からどのようにデータが生成されるかの仕組みを学習するという考え方となっています。
その仕組みを数学的に表現するために、多項分布だったり、ディリクレ分布だったりが登場しています。

引き続き、パラメータの学習(最適化問題を解く部分)についても勉強していきます。

Acroquest Technologyでは、キャリア採用を行っています。


  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

【データ分析】
機械学習開発体制強化!エンジニアをWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com