2017年9月23日土曜日

生成モデルと識別モデル


機械学習の話です。
分類問題における生成モデルと識別モデルの違いについて、説明のしかたが色々あるようですので、まとめてみます。

まとめ


分類問題の解き方は、2つではなく、3つに分類されます。シンプルな順に、
  • 識別関数
  • 識別モデル
  • 生成モデル
という3つのアプローチが考えられます。

識別関数は、確率は関係なく、入力空間に識別面を直接引く方法です。2クラスなら、いい感じに分割できそうな面を線形・非線形を問わず引き、面で区切られたの一方の領域にあるサンプルをクラスA、もう一方をクラスBとする、という方法です。

識別モデルは、事後確率\(P(C_i|x)\)を直接モデル化する方法です。入力サンプル\(x\)に対応する事後確率をモデルを使って計算してから、最も事後確率が高いクラスを識別したクラスとします(\(C_i\)は\(i\)番目のクラスです)。

生成モデルは、事前確率\(P(C_i)\)と確率密度関数\(P(x|C_i)\)をモデル化し、それをベイズの定理を使って事後確率\(P(C_i|x)\)を計算し、最も事後確率が高いクラスを識別したクラスとする方法です。確率密度関数をつかって、クラス\(C_i\)に属するサンプルをいくらでも生成できることから、生成モデルと呼ばれます。

これでは簡略化しすぎていて分からないという場合は、全文をどうぞ。

生成モデル・識別モデル


ここでは、識別関数を明示的に含まない場合の説明をします。

NAISTの講義「ビッグデータのための機械学習」のスライド
http://ahclab.naist.jp/lecture/2015/bda/3rd_oct23/bda2015_3rd.pdf
の10ページ目の定義では、

予測モデルを確率モデルで表すと \[P(t|x)\] 与えられた\(x\)からクラス\(t\)を識別するので識別モデル

予測モデルをベイズの定理で変形して \[P(t|x)=\frac{P(x|t)P(t)}{P(x)} \propto P(x|t)P(t) \] \(P(x|t)\), \(P(t)\)に対して分布を仮定
仮定した分布から\(P(t)\)が決定され\(P(x|t)\)が生成されるので生成モデル

[1]によると、ベイズの定理では、\(P(t)\)は事前確率、\(P(t|x)\)は事後確率、\(P(x|t)\)は確率密度関数と呼ばれます。確率密度関数\(P(x|t)\)は、クラスtに属するxの生起確率を表します。

これらの言葉を使うと、識別モデルは事後確率を直接モデル化しているといえます。一方、生成モデルは事前確率と確率密度関数\(P(x|t)\)を使って事後確率を間接的にモデル化しているといえます。

識別モデル、生成モデルの説明は、最初に記載したものと同じです。

同様の説明が、
http://techtipshoge.blogspot.jp/2017/01/blog-post.html
にも見られます。

一方、識別関数を識別モデルに含めている説明もみられます。
http://www.r.dl.itc.u-tokyo.ac.jp/node/33
によると

教師あり学習で観測データを分類するにあたって、まず観測データの属性を適当に組み合わせた判別関数を生成する。未知のデータは、この判別関数で分類する。これを識別モデルという。

一方、観測データを生成する確率分布を想定し、観測データからその確率分布を推定する方法を生成モデルと呼ぶ。
観測データを生成する確率分布を想定するかしないかのみで、生成モデルと識別モデルを定義しています。

同様に、
https://www.nii.ac.jp/userdata/karuizawa/h23/111104_3rdlecueda.pdf
のp. 9 (図は省略)によると、

識別モデル
  • データのクラス境界を直接学習
  • データの生成過程は考慮せず、所与のデータで問題を直接解く
生成モデル
  • クラスごとの生成モデルを確率分布として学習
  • クラス事後確率により識別(クラス境界は結果として得られる)
元の資料を見たほうが分かりやすいですが、省略した図を言葉で説明すると、2クラス分類問題の場合、
  • 識別モデル
    クラス1は\(f(x;\theta)>0\)、クラス2は\(f(x;\theta)<0\)、識別境界は\(f(x;\theta)=0\)
  • 生成モデル
    クラス1は\(p(x|\omega_1)\)の分布、クラス2は\(p(x|\omega_2)\)の分布で、\(P(\omega_1|x) > P(\omega_2|x)\)のときクラス1、\(P(\omega_1|x) < P(\omega_2|x)\)のときクラス2、識別境界は\(P(\omega_1|x) = P(\omega_2|x)\)
識別モデルの\(f(x;\theta)\)は、\(x\)と\(\theta\)の同時分布の形で記載されています(;は、その後ろの変数がパラメータであることを示しています)。また、パラメータは\(\theta\)のみです。一方、識別モデルはクラスごとにパラメータ\(\omega_i\) (\(i\)はクラス番号)の確率密度関数が存在しています。図には明記されていませんが、これに事前確率を掛けて得られる事後確率が\(P(\omega_i|x)\)で、これをクラス間で比較することで、分類問題を解きます。

同じような説明が http://lang.sist.chukyo-u.ac.jp/classes/AI/2017/AI-11.pptx にも見られます。

  • 識別モデル
    • 正事例と負事例を区別するための境界線を訓練データから直接的に求めようとする.
  • 生成モデル
    • 分類対象となるデータがどのような確率モデルから生成されたかをモデル化し,そのモデルに基づいて分類を行う.
数式なしの説明なので、こちらのほうが分かりやすいかもしれません。

生成モデル・識別モデル・識別関数


最初に記載した3つに分ける方法です。
http://www.ieice.org/~asn/201501_sogo/201503_tutorial_hino.pdfのp.19によると
  • 生成モデル:あるクラス\(y\)が確率\(p(y)\)で選ばれ、そのクラスから特徴量\(x\)が確率\(p(x|y)\)で生成されたという考え方: \[p(y|x)=\frac{p(x|y)p(y)}{p(x)}\] 例 naïve Bayes
  • 識別モデル:事後確率\(p(y|x)\)を、学習データ\(D\)から直接推定するアプローチ
    例 ロジスティック回帰、CRF(Conditional Random Field)
  • 識別関数:事後確率のことは考えず、直接的に出力を当てる機械\(f\)を設計するアプローチ
    例 SVM、ニューラルネットワーク
生成モデルと識別モデルの説明は、NAISTの講義資料と同様です。 なお、モデルの作り方によるのかもしれませんが、ニューラルネットワークは識別関数というよりは識別モデルでしょう。例えば、最終層をソフトマックスにして多クラス分類ができるように構成すると、ニューラルネットワークの各クラスの出力は事後確率になります。 さらに次のページに
\[p(y,x), p(y|x), {\rm or }\ f:x \mapsto y \]
  • 生成モデル:クラス事後確率を求めるのにBayesの定理を用い,結果として同時分布をモデル化しているのと等価
    メリット  データの周辺分布を求めることができて,それを外れ値検出などにも利用できる.
    デメリット 高次元の特徴量に対する条件付き密度を十分な精度で求めるのが困難
  • 識別モデル:クラス事後確率を直接モデル化
    メリット  生成モデルより計算資源を節約できる(識別に必要な事後確率を直接求めているから)
    デメリット 事後確率以外の情報は得られない
  • 識別関数:入力からクラスラベルに直接写像する関数を求める
    メリット  分布の推定を伴わないのでデータ数が少しですむ
    デメリット 出力に確率としての解釈が与えられない
のように、各手法の特徴も記載されています。学習が難しい順に、生成モデル・識別モデル・識別関数となります。同様に、得られる情報が多い順は、生成モデル・識別モデル・識別関数となります。

PRML[2]にも記載があります。適当に抜粋・意訳すると、

分類問題は推論と決定の2段階に分けられる。推論段階では事後確率\(p(C_k|x)\)を計算し、それに基づき決定段階でクラスを決める。また識別関数を使うとこれらを一括で行うことができる。これらは次の3つの方法で実現できる。
  • 生成モデル
    各クラスのクラス条件付き密度 \(p(x|C_k)\)と事前確率\(p(C_k)\)を計算する。その後、ベイズの定理 \[ p(C_k|x)=\frac{p(x|C_k)p(C_k)}{p(x)} \] で事後確率\(p(C_k|x)\)を計算する。同時確率\(p(x,C_k)\)を直接計算し、正規化することで事後確率を求めることもできる。
  • 識別モデル
    事後確率\(p(C_k|x)\)を直接モデル化するアプローチ。
  • 識別関数
    入力\(x\)を直接クラスのラベルへ変換する識別関数\(f(x)\)を見つけるアプローチ。 例えば2クラス問題なら、クラス\(C_1\)は\(f=0\)、クラス\(C_2\)は\(f=1\)とする。 確率は出てこない。
です。言いたいことは同じですね。

参考文献


[1] わかりやすいパターン認識, ISBN4-274-13149-1, 1998
[2] Pattern Recognition and Machine Learning, ISBN 978-0-387-31073-2, p. 43, 2006

0 件のコメント :