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

俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

ベイズの定理の簡単な説明 - 日報 #153

機械学習周りの調査をしていると、
ベイズ推定の話がしょっちゅうでてきます。
(と同時に最尤法の話もでてきます。)
前職時代にMCMCを使ってガリガリベイジアン推定をしていたこともあり、
この手の話には馴染みがあるのですが、
しっかりと整理したことが実はなかったと思いだしたので、
改めてここでこの辺の話をまとめてみます。

まず、「何に興味をもてばいいのか」を明確にしないと、
すごいごちゃごちゃしちゃう話だと思うので、そこだけ最初に明言します。
よく数学の問題などで、
「コインをなげて最初に表がでて、次に裏が出る確率はいくつか?」
みたいな話があります。
賢明な人ならば、最初に表が出る確率は1/2で、続いて裏がでるのは1/2だから、

1/2 ✕ 1/2 = 1/4

と計算したり、
はたまた、コインを二回投げてでる「場合の数」を全て列挙し、

表表
表裏
裏表
裏裏

の4つの場合の数うち、表裏は1個なので、 1/4 と結論を出したりします。
ところがこの考え方、両方共ある数学特有の前提にのっとって考えています。
それは、「表も裏も出る確率は同じ、1/2」という前提です。
コインに細工がない、みたいな表現で簡易にこの前提を表現したりしています。

これ、現実的にどうなんでしょうかね。
例えば人情として「表表表表表裏表表表」みたいな結果を観測したら、
「ゆがんでんじゃね?このコイン」
って思いますよね。
これを「主観でしょ。無限回やれば偏りは消えるから」って考えるのも結構なことですが、
逆に「コインに歪みがあるかどうかを検定してくれ」って言われている職場の人だったら、
自信をもってそんなこといえませんよね。
ゆがんでんじゃねぇの?ってのは確かに主観ですが、すごい妥当な推測でもあるわけです。

これを考えるのが、ベイズであります。
「何回か観測したら、事前に想定してた確率(この場合表が出る確率1/2)が変化している」という現象を数式に表すということです。
これが僕らがもっとも興味を持っている対象です。

んなことできんの?って思いますが、できるからすげぇ話なんですね。

ではまず、簡単にベイズの式を導出するところから始めます。
確率の話は、基本「場合の数」で考えるとすごい話が楽になるので、
まずそれで考えていきます。

今すべての事象を列挙したらW個ある試行があったとします。
その内、aという結果がでるのがA個、
bという結果がでるのがB個あったとします。
また、aでかつb(a∩b)という結果がでるのがC個あるとします。
この時、それぞれの確率は、

P(a) = A/W
P(b) = B/W
P(a∩b) = C/W

超簡単です。
では続いて、bである前提で、aである確率は?
つまり世界がまずb(B個)になって、さらにaとなる(A∩B個=C個)確率をP(a|b)とかくとそれは、

P(a | b) = C/B

とかけます。
同様に、

P(b | a) = C/A
⇔ C = A ✕ P(b | a)

とかけます。
すると上の二式からCを消すと、

P(a | b) = A ✕ P(b | a) / B
⇔ P(a | b) = A/W ✕ P(b | a) / B/W
⇔ P(a | b) = P(a) ✕ P(b | a) / P(b)

となります。
この

P(a | b) = P(a) ✕ P(b | a) / P(b)

これがベイズの式、と言われます。
ものっっっすごい簡単な式変換でもとまるんですね。
んで、これが超インパクトのある式なわけです。

コインの話にもどりましょう。
いま、コインの表が出る確率がxだと仮定しましょう。
すると必然的に裏の出る確率は1-xになります。

P(表) = x
P(裏) = 1-x

その前提で、2回トスしたとき、[表裏]という結果になったとします。
(結果には[ ]をつけていきます)
このとき、

P( [表裏] ) = x(1-x)

ですね。
ただし、これは不十分な表現です。
あくまで、表が出る確率をxとした前提での確率なので、

P( [表裏] | 表が出る確率=x ) = x(1-x)

と書くのが厳密には正しいです。
この「表がでる確率=x」は長いので「B=x」と書くこととします。
すると

P( [表裏] | B=x ) = x(1-x)

こうかけますね。
これは観測の結果です。
僕らがいま最も関心があるのは、
xの値として「もっとも妥当性があるのはいくつか?」です。
これをもっと確率の問題っぽくいえば、
「コインを2回トスして、[表裏]という観測をしたあとに、そもそもコインの表がでる確率はいくつが妥当だと考えればよいのか?」
ということです。
直感的には「そりゃ表裏と平等にでたんだから、今のところコインはゆがんでなさそうだ。表が出る確率として妥当性が高いのは、1/2でしょう」と思うところです。
これを計算してみましょう。

僕らが知りたいのは [表裏]を観測した前提で、B=xとなる確率です。
つまり

P ( B=x | [表裏] )

を知りたいわけです。
ここでベイズの式が出てくるわけですね。

P(a | b) = P(a) ✕ P(b | a) / P(b)

これは P ( a | b ) という事前にbが起きたあとで a が起こる確率を、
その逆にあたる P ( b | a ) で表現できている、というのが味噌です。

僕らは

P( [表裏] | B=x ) = x(1-x)

これを知っていて、

P ( B=x | [表裏] )

これを求めたい。
([表裏]を観測した世界で、表が出る確率がxとなる確率のこと)
ベイズの式を使えば、二番目の式は、一番目の式で表現できそうです。
やってみましょう。

P ( B=x | [表裏] ) = P( B=x ) ✕ P( [表裏] | B=x ) / P( [表裏] )
⇔ P ( B=x | [表裏] ) = x(1-x) ✕ P( B=x ) / P( [表裏] )

さて、困ったことが2つあります。
P( B=x ) と
P( [表裏] ) を求めないといけないのです。
でも後者はすごく楽です。
これは「コインがゆがんでようとなかろうと、関係なく、[表裏]がでる確率」のことを言っているので、
単純に場合の数から計算して1/4となります。
というかもうこれは絶対に定数になるのでαとかおいちゃいましょう。
問題は前者です。
P( B=x )
これの意味は「B=xとなる確率」をいってます。
もっと言うと、
「表がでる確率がxとなる確率」ということです。
恐怖ですね。何言ってっか分かりません。
xに適当な数値をいれてみます。

「表がでる確率が1となる確率」=「毎回表になる歪みまくってるコインである確率」
「表がでる確率が1/2となる確率」=「なんの歪みもないコインである確率」
「表が出る確率が0となる確率」=「毎回裏がでるように完全に歪んだコインである確率」

こんな設定どこにもしてません。
普通に誠意ある人が作ったコインなら、何の歪みも無いコインである確率が90%くらいで、
たまたまミスって表しかでない、裏しかでないようなコインになっちゃうのが1%くらいで、、、
と主観で決めるしかありません。
これがベイズ推定の弱点です。
ここがまったくもって主観なんですね。
今回はたまたま「どんなコインに仕上がるかはすべて同確率=βとする」としちゃいましょう。
つまり、マジで適当な奴が作ったコインなんで、どんなコインに仕上がるかすべて同確率ということです。

こうすると

P( B=x ) = β

とxによらない値(定数)になるので、これでグッと楽になりました。
(もっとちゃんとしたい人は確率密度関数を参照)
ベイズの式に戻ると、

P( B=x | [表裏] ) = x(1-x) ✕ P( B=x ) / P( [表裏] )
P( B=x | [表裏] ) = x(1-x) ✕ β/α P( B=x | [表裏] ) = x(1-x) ✕ η

となるわけです。
これは嬉しい式が求まりました。
左辺 P( B=x | [表裏] ) とは「[表裏]を観測したあとに、B=xである確率」を示しており、
右辺ではそれが x(1-x) ✕ η となると言ってるわけです。
この右辺は x = 1/2 で極大値を取ります。
よって、 B=1/2 となる確率がもっとも大きい、すなわち、
「表が出る確率が1/2となるのがもっともらしい!」
といえるわけです。
[表裏]という事実を観測したので、このコインは表が出る確率が1/2っぽいな。と思う。
直感に沿ってますね。

では、話を極端な方に持って行きましょう。
続いてまたコインをトスしたら今度は[表]となりました。
つまり全部で[表裏表]となったんです。

いま、同様に計算すると、

P( B=x | [表裏表] ) = x^2(1-x) ✕ P( B=x ) / P( [表裏表] )

となります。
ここでベイジアン推定という極めて突飛な方法が飛び出ます。
この右辺のP( B=x ) を前回と同じように「全て同じ値β」とはみなさないのです。
なぜなら、すでに僕らはP( B=x )についての妥当な推測 P( B=x | [表裏] ) = x(1-x) ✕ η を知っているからです。
そもそも主観で決めていたP( B=x )なのだから、より妥当な推測値を当てはめることに何の抵抗もありません。
よって、P( B=x )に x(1-x) ✕ ηを代入します。

P( B=x | [表裏表] ) = x^2(1-x) ✕ x(1-x) ✕ η / P( [表裏表] )
P( B=x | [表裏表] ) = x^3(1-x)^2 ✕ θ

これは x = 0.6 くらいで極大になります。 ( 0 < x < 1 の範囲で )
つまり、表が出る確率が少し高いコインだ、という意識に「更新」されたわけです。

もっと行きましょう。
さらにもう一回コイントスをしたらまた[表]がでたとします。

P( B=x | [表裏表表] ) = x^3(1-x) ✕ P( B=x ) / P( [表裏表表] )

P( B=x )としてさっき学んだ、P( B=x | [表裏表] ) = x3(1-x)2 ✕ θ を代入します。

P( B=x | [表裏表表] ) = x^3(1-x)^2 ✕ x^3(1-x)^2 ✕ γ
P( B=x | [表裏表表] ) = x^6(1-x)^4 ✕ γ

これの極大値は大体 x = 0.67 くらいになります。
さらに表が出る確率が少し高いコインだ、という意識が濃くなりました。
さらに表がでたら、、、とどんどん「更新」を繰り返していくことで、
このコインが「表ばっかりでるやつなのか。そうでないのか。」という検証に定量的評価を与えることができるようになります。

最後に用語のはなしですが、
この P(B=x)のことを事前確率とよび、
P( B=x | [表裏表表] ) のことを事後確率と呼びます。
ベイズの考え方は、
事前確率を事後確率で更新していく、
ということを表現しています。
もっといえば、事後確率によって、主観的であった事前確率を妥当なものに更新していく、と言った感じでしょうか。
式をみてもわかるように、 P(B=x)にある値をかけた値を事後確率とよんでいます。
(ちなみにこのある値のことを尤度などと呼びますが、もう面倒くせぇので説明しねぇ)

あぁなんか疲れた。
なんでこんな話したのか忘れたけど、
要は「そんな難しい話じゃねぇよ。計算がちょう面倒なだけで」ってことをいいたかったんです。
そんな俺と一緒に働いてくださるイケメンを目下大募集中ですよ!

www.wantedly.com
www.wantedly.com