どうやって分布からパラメタを推定する?KernelABCはいかが?

02/10/2021

A8バナー広告

この記事で書くこと

  • パラメタ推定タスクの話
  • ABC(approximate Bayesian computation)の話
  • Kernel ABCのPythonコード

そもそもパラメタ推定とは?

すっごい簡単に書くと「予測モデルのパラメタを推定すること」です。

で、誰がそんなことしたいの??予測モデルって何??何に対して推定?教師有り学習と何が違うの??などなど、いろんな疑問が湧いてきそうです(初見のぼくは少なくともそうだった)

ひとつづつ、確認していきましょう。

誰がパラメタ推定したい?予測モデルって何?

パラメタ推定をさかんにやっている分野は主にシュミレータ分野です。気候シュミレーションとか生産工程シュミレーションとか、がよく引き合いに出されます。

なので、パラメタ推定したい人はシュミレーション分野の研究してる人。シュミレーションを使う人。ということになります。

予測モデルとは、シュミレーションのことです。シュミレーションは、パラメタを受け取って、値を出力する機械と言えます。なので、これは関数と表現できます。

パラメタ推定は非線形な挙動をする関数 OR パラメタ数が多い関数に対して有効(だとぼくは思ってます)。
もし、関数が線形 AND パラメタ数が少ないならば、回帰で解けば十分です。

気候シュミレーションや生産管理シュミレーションはとてもじゃないけど、線形な関数とは思えません。

何に対してパラメタ推定する?

パラメタ推定タスクの枠組みを図に書き出してみました。

青枠が、いま利用可能、つまり、手に持っているものです。
緑枠が、得たい値です。

観測データは何らかの現象で発生しています。その現象を関数とみなすことができるでしょう。現象が関数ならば、関数はパラメタを持っているはずです。

上の図でもう少しパラメタ推定タスクを定義してみましょう。

シュミレーション関数(青枠)と候補のパラメタとその出力値(青枠)と観測値(青枠)の3つの道具を使い、そして真のパラメタ(緑枠)を推定するタスク。真パラメタとは、観測値(青枠)を生成した(はず)のパラメタを意味する。

ABC(approximate Bayesian computation)

ABCはパラメタ推定の1手法です。こいつの歴史は古く、1997年のTavareの論文が初出です。

ABCのアイディアは極めて単純です。ABCの気分を書くとこうなります。

まずパラメタをなんでもいいからシュミレーション関数につっこんでみるんや。すると、シュミレーション関数から値が出るやろ?それを観測データと比較すればええねん。シュミレーション関数の出力と観測データが十分に似てれば、パラメタは妥当ってことやー

ね、極めて単純なアイディアでしょ?

この説明をもう少し定義してみましょう。

まずパラメタをなんでもいいからシュミレーション関数につっこんでみるんや(事前分布の設定)。すると、シュミレーション関数から値が出るやろ?(シュミレーション関数の実行)それを観測データと比較すればええねん。(観測データとシュミレーションデータの距離計算)シュミレーション関数の出力と観測データが十分に似てれば(距離のしきい値)、パラメタは妥当ってことやー

アイディアが単純なだけに問題も多いです。例えば問題をあげると、こんな問題が指摘されてます。

なんでもパラメタを・・・ってそんないい加減な。収束までに時間かかるだろうに(パラメタ生成する事前分布の選び方問題 &計算量の問題)

パラメタが高次元空間だったらどうすんの?どっちの方向に勾配を転がす気?(探索問題)

シュミレーション関数と観測データの比較をするって言うけどさ、出力が高次元空間だったらどうすんの?ユークリッド距離じゃ不足と思うけど(距離関数の計測方法の問題)

などなど・・・素朴なABCには問題が山積みです、実用に使うためには。

そこでカーネルですよ

よく言われてることですが、カーネル空間では非線形っぽいデータ構造を線形っぽく扱えます。例えば、SVMの説明では下のような図がよく掲載されますよね。

https://medium.com/analytics-vidhya/how-to-classify-non-linear-data-to-linear-data-bb2df1a6b781

少し思い返すと、SVMをはじめて触れたときは意味不明な話でした。なんだかカーネルとかいうわけのわからないやつを使うと、線形分離できる空間になるらしい、、、というのが当時の精一杯の理解でした(いや、今も大して理解レベルは変わってないかも)

この「カーネル空間に移せば(写像すれば)うまく行く」って話は他のアルゴリズムにも言えることです。PCAやら線形回帰やら。

じゃあ、ABCもカーネル空間で解いたらいいんじゃね?というのが"Kernel Approximate Bayesian Computation for Population Genetic Inferences, 2013″です。

細かい説明をできないのですが、すんげー雑にいうと、こうなります。「」みたいな気持ちです。

なんとなく用意したパラメタがあるやろ。パラメタをカーネル空間に移すんや(写像)。んで、カーネル空間上のパラメタに重みをくっつけててやるんや。重みが真のパラメタ方向に位置をずらしてくれるんやでー

この操作を端的に説明してるのが、以下のスライドの50ページ目です。

E^hatが推定されたパラメタになります。びっくりするくらいに線形和で表現されてます。カーネル空間すごいー(棒読み)

自分の理解のために実装してみました。

実行してみると、こうなります。なかなか近い値を推定していんじゃないでしょうか。