HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

【ベイズ推定って結局何なの?】

 

 

follow us in feedly

f:id:s0sem0y:20170519230518g:plain

 

 

 

はじめに 

理論的背景の1つとしてベイズがある

「ベイズ」というのは理論的背景・考え方の1つだと思ってもらって構いません。

 

従って、「自然言語処理」と「画像認識」という分野の比べ方はできても、「自然言語処理」と「ベイズ」という比べ方をするものではありません。

 

ベイズというのは考え方であり理論であり、従って特定の応用分野のみを指す言葉ではありません。「自然言語処理のベイズ的取り扱い」だとか、はたまた「ニューラルネットのベイズ的取り扱い」などのような言葉の使い方ができ、非常にカバー範囲の広いものになっています。

 

ベイズの考え方

ベイズの考え方の特徴的な点として「パラメータを確率変数として考える」ことが挙げられます。

 

さらっとベイズについて調べていると「主観確率を認める」とか「ベイズの定理を使う」などの点が目につくかもしれません。しかし「主観確率」というのはベイズの立場でも注意が必要ですし、「ベイズの定理」自体はベイズ的な取り扱いをする場合でなくとも用いられます。

 

 

パラメータを確率変数だと考えるとどのようなことができるのでしょうか(あるいはどのように考えるべきだと言えるでしょうか)。

 

この問いかけにより、ベイズ理論を用いたアルゴリズムは、よく見る機械学習の手法とは一線をかいた推論を行います。

 

今回はその特徴を分かりやすく抑えて説明したいと思います。

 

 

ベイズを使った予測の結論 

先に見通しをよくするため、ベイズ理論を使った場合の予測が結局何をしているのか、その結論を述べてしまいたいと思います。

 

機械学習とは入力xに対して出力yを行う予測器y=f(w,x)wを調整することで上手く作り上げようというものです。ベイズの考えを使った機械学習では予測器fを以下のように構築します。

 

y = f = α_1f_1 + α_2f_2 + α_3f_3 + ...

 

つまり、いろいろな予測器f_iを考えて、それらを重み係数α_iで足し合わせたものになっているのです。こう見ると非常に単純明快ですね。

 

それぞれの予測器f_iはそれぞれのパラメータw_iを有しており、f_i=f(w_i,x)という形をしています。つまり普通の機械学習ではwを上手く求めてfをただ1つだけ構築し、それを予測器として使うのですが、

 

ベイズでは、wを複数個準備してfも複数個準備し、それらを統合したものを予測器として使っているのです。

 

この際に予測器に対する重みα_iの総和は\sum_i α_i = 1となるように求めます。つまり、構築される予測器y=f(x)は、パラメータwの予測器に対する重み付き平均になっているのです。

 

α_iはパラメータw_iが予測器としてどれだけ信頼が置けるのかを反映した係数になっていれば、上記の考え方真っ当に見えます。

 

ベイズの理論ではパラメータを確率変数と考えることで、自然とこのような予測器を構築します。

 

では詳しく見ていきましょう。

 

ベイズ理論

まず「パラメータを確率変数として考える」というのがどういうことかを確認していきます。

 

以下数式が出てきますが、分かる人ならそのまま、わからない人も日本語の解説を見てそういうもんだと思って読めば納得できるように書いていきます。

 

伝統的方法 

確率変数と確率分布

データがN個、x_i,(i=1,...,N)あったとしましょう。このようなデータx_iは何らかの確率分布から現れていると考えられます。

 

確率分布から現れてくるデータは確率変数と言い、例えばコイン投げのケースであればコインの「表」や「裏」などが確率変数であると表現します。一方で、コインが表になる確率や裏になる確率について記述しているのが確率分布だと考えてください。まとめると確率変数は、確率分布から生起すると言います。

 

例えば、コインが表になる確率をpとすれば裏の確率を1-pと考えることができるので、このような場合の確率分布は

 

p(x=表)=p

p(x=裏)=1-p

 

という確率を反映した表現になっているべきで、このような分布は

 

p(x;p)=p^x(1-p)^{1-x}

 

と書き表すことができます(ベルヌーイ分布という)。ここで表や裏というのを数値的に扱うため、「x=1を表」、「x=0を裏」と対応付けています。このように対応つけることで、上記の式は

 

p(x=1;p)=p^1(1-p)^0=p

p(x=0;p)=p^0(1-p)^1=1-p

 

と確かに最初に考えたコイン投げの確率をしっかり表現できています(a^0=1です)。

 

ともかく、データは確率分布から出てきているということです。逆にその確率分布を知ることができれば、データのことをかなり把握できたことになるため、当然データ予測にも役立てられるというわけです。

 

このコインの話の場合は、たくさんコインを投げることで「1 or 0」がたくさん得られるわけですから、これをデータx_iとすることになります。

 

 

確率分布とパラメータ

集めたデータ(1,0)から、このコインの表、裏に関する確率分布を知りたいというのが統計的な推定と呼ばれるものです。コインは裏か表しか出ないので、その二者択一を表現した分布が以下でした。

 

p(x;p)=p^x(1-p)^{1-x}

 

この形で表されると仮定すると、この分布はpを定めることで完全に形が決定されるため、この分布のパラメータはpだと表現します。すなわちpを知ることが統計的推定になります(機械学習で言えば学習に相当する)。

 

 

以下、一般に確率変数xの確率分布をパラメータθとして

 

p(x;θ)

 

と表します。

 

パラメータは唯一無二!

確率変数を観測することで、その確率分布のパラメータを知りたいのですが、

 

パラメータというのは「唯一無二」であると考えるのが普通の統計の考え方です。

 

つまり「手元のコインは表が出る確率も裏が出る確率も明確に決まっている。真実というものが存在するのだが、それを我々は知らない。だからなるべく正確に知りたい」というスタンスなのです。

 

すなわち

 

p(x;θ)

 

に関してxを実際に観測してみることで、妥当なθという未知のパラメータをただ1つ決定したいということなのです。

 

ベイズ的な考え方

パラメータは確率的に変動する

ベイズでは、パラメータに対して全く違う考えを持っています。

 

例えば、コイン投げを100回やって観測したデータから推定したパラメータと、その後、もう1度100回やりなおして推定したパラメータは同じになるでしょうか?近い値になれども、完全に一致することは難しいでしょう。

 

真実はいつも1つであり、コイン投げの背後には真のパラメータが有るかもしれません。しかし、有限このデータしか持たない我々には、結局それを知るすべはないのです。見方を変えれば、集めたデータ次第で推定されるパラメータが変わるということです。ここに着目して、

 

ベイズでは、確率分布のパラメータ自体も確率変数だと考えます。

 

 

普通の考え方では確率分布を

 

p(x;θ)

 

と表記していました。この表記では「;」より右側はパラメータという確率変数とは異なる特別な存在であることを意識しています。一方で、ベイズの扱いでは、確率変数xの確率分布は

 

p(x|θ)

 

と表現します。これは条件付き分布と呼ばれるもので、例えばp(x|y)と書けば、確率変数yの値が決定したときのxの確率を表します。例えばトランプを引くときの一枚目と二枚目だと考えればわかりやすいでしょう。

 

通常の統計でもこのように確率変数と確率変数に関して条件付き分布を考えることはします。しかし、パラメータに関してこのような表記をするのはベイズだけです(最近はベイズを意識しようがしまいが、この表記が多いと言えば多いのですが)。

 

 

 

何が変わるのか

 

ベイズ的な取り扱いでは、確率分布のパラメータθすらも、データxが確率変数であるのと同じように、確率変数だと考えてしまいます。

 

そして、我々が既に手元に持っている(確定している確率変数)はxの方です。従ってベイズ的な取り扱いではパラメータθを推定する際に

 

p(θ|x)

 

を考えます。xが分かっている時のθの確率を考えるというわけです。

 

心の中では、「このデータxが集まったということは、確率分布を決定づけるθは多分これくらいの値だろうな」と感じているわけです。正確なただ1つの真実など最初から求めていないというわけです。

 

ベイズの定理

ベイズの定理とは条件付き確率の順番を入れ替えて、計算しやすくする便利な公式です。これはベイズ的な考えでなくとも認められたものであり、広く応用されています。

普通のベイズの定理

通常、2つの確率変数x,yに関するベイズの定理は以下となっています。

 

\displaystyle p(x|y)=\frac{p(y|x)p(x)}{p(y)}

 

この定理は、p(x|y)は計算しにくいがp(y|x)が計算しやすい場合に応用することができます。

 

ベイズ的なベイズの定理

何も特別なことはないのですが、ベイズ的な考えでは確率分布のパラメータすらも確率変数と考えるために、下記のようにベイズの定理を使うことができます。

 

\displaystyle p(θ|x)=\frac{p(x|θ)p(θ)}{p(x)}

 

xが分かっている時のθの確率分布をこのように変換すると、分子の第一因子は通常考えられるパラメータθのときのxの確率分布です。そして第二因子p(θ)は、素のパラメータの確率分布です。この部分は、知る由もない分布であるため、通常適当な仮定を置いて計算をしてしまいます。

 

ベイズではデータもパラメータも全部確率変数であるという意識があるため、上記のような変形も平気で行うことができます。

 

通常の統計学ではp(θ)なるものは存在せず、確率変数ですら無いわけで、このような発想には至りません(許されません)。

 

s0sem0y.hatenablog.com

 

s0sem0y.hatenablog.com

 

実応用にベイズ

ここまではベイズ理論の心について見てきました。パラメータはデータによって決定される確率変数であるということでしたが、そのように考えると、実応用ではどのような変化が現れるのでしょうか。

 

機械学習の姿勢

機械学習では通常、データxに対してyを出力する関数y=f(x)を作りたいというのが基本的な考え方です。例えば今日の株価を入れたら明日の株価を予測して返してくれる関数などを作るために、過去のデータを学習させるケースなどが考えられます(それが実現できるかは別として)。

 

とりあえず、

 

y=f(w,x)

 

という関数を考え、過去のデータをよく表すようなWを決定していこうというのが通常の機械学習になります。

 

確率的な機械学習の考え

 

この時、xが確率変数で、更にyも確率変数だと考えるのは自然です。xが決まれば、yが完全にぴったり決まることは難しく、ある程度ブレがあると考えるわけです。こう考えると、私達が知りたいのは、xを知っている時に、yがどんな値を取りやすいのかの条件付き確率分布

 

p(y|x)

 

ということになります。この場合には例えば、yが平均μで分散σの正規分布だと仮定します(別に正規分布でなくてもいいが、一例として)。

 

p(y|x) = \mathcal N (μ,σ)

 

と考えるわけです。ここで平均μ=f(w,x)とすることにします。

 

確率的な機械学習では、通常の機械学習の関数f(w,x)を統計的なパラメータのどこかに潜り込ませることで問題を定式化します。

 

式は以下のようになり、

 

p(y|x) = \mathcal N (f(w,x),σ)

 

このような仮定をした場合、「本来ならばy = f(w,x)の関係があり、平均的にはxが与えられた時のyの値はf(w,x)になるはずが、何らかのノイズによって分散σだけのブレがある」と考えていることになります。

 

統計パラメータの推定(学習)

 

このようにして定めた確率分布は、パラメータを明示すれば以下のようになります。

 

p(y|x,w,σ) = \mathcal N (f(w,x),σ)

 

このように置いた確率分布のパラメータを知ることができれば、xを入力した際のyの値が確率的にわかるので、上手く予測に使えそうだということになります。これが機械学習の基本的なモチベーションです。

 

さて、これに対して最尤推定を行えばw,σは求まります(これはy=f(w,x)に対する最小二乗法の結果と全く同じものになります。つまり、2乗誤差を損失関数とした普通の機械学習と同じ)。

 

 統計的なパラメータの推定という行為が、機械学習での学習ということになってくるわけです。

 

今は正規分布を考えてきましたが、一般にはパラメータθを考えて

 

p(y|x,θ)

 

を推定する(学習する)ことができれば、上手く予測に使えるということになります。

 

ベイズによる機械学習の姿勢

ベイズでの予測器

 

ベイズで入力xに対する出力yの予測を行うというのは、数式で書くと以下のようになります。

 

p(y|x) = \sum_θ p(y|x,θ)p(θ)

 

この左辺から右辺への変形は「周辺化」(あるいは乗法定理)と呼ばれるものであり、いつでも必ず使うことができます。右辺を注意深く見てください。p(y|x,θ)というのは先程普通の機械学習の時に考えていた予測器です。これがp(θ)を掛けて足し合わされています。

 

これが冒頭で述べた、パラメータの重み付き平均で予測を行うという意味です。

 

普通の機械学習ではxが入力された時yの出力確率p(y|x)が、ただ1つのパラメータθによって

 

p(y|x) = p(y|x,θ)

 

と構築できると考えていました。

 

しかし、そもそもベイズ理論ではたかだか有限のデータで真のパラメータを知るなんてことは無理だと考えていることを思い出してください。ですから、パラメータθをただ1つ求めて、そのパラメータθで予測を行うというのは、ある自信過剰で傲慢な態度だとも取れるわけです。

 

そこでθは確率変数だと考えるわけですから、p(θ)を考えることができ、このp(θ)は、あるパラメータθ_1に関して、どれだけそれが正しいパラメータであるかの確率p(θ_1)を表していることになります。

 

だから、予測モデルp(y|x,θ_1)p(θ_1)くらいの重み付けで使うことにして、

 

p(y|x) = p(y|x,θ_1) p(θ_1) + p(y|x,θ_2) p(θ_2) + ...

 

という形で重み付けを行って、実応用ではp(y|x)を予測に使おうということになるわけです。

 

ベイズでの学習

 

では予測器を構築するために私達が知らなければならないのは何でしょうか。

 

p(y|x) = \sum_θ p(y|x,θ)p(θ)

 

この形を見た時に、私達が推定しなければならないθの確率分布であるp(θ)です。これがわかれば、適当なθ_iを使った予測器に対して、その確率p(θ_i)を重み付けして予測器を作ることができる、というストーリーです。

 

さあ、ベイズではパラメータθは手元のデータxによって推定されるものであると考えていたわけですから、p(θ)自体を手元のデータxによる条件付き分布p(θ|x)で近似してしまおうと考えることができます。

 

ベイズの定理によって、

 

\displaystyle p(θ|x)=\frac{p(x|θ)p(θ)}{p(x)}

 

とすることができます。右側を求めてやることができれば、晴れて手元にデータxがある場合のパラメータθの確率が分かることになります。これを求めるのが、ベイズにおける学習です。

 

主観確率

さて、学習したいp(θ|x)についてもう一度見てみましょう。

 

\displaystyle p(θ|x)=\frac{p(x|θ)p(θ)}{p(x)}

 

これは大変なことです。なんと右辺にp(θ)が出てきています。私達はp(θ)を知りたいがために、p(θ|x)で近似することを考え、そしてそれをベイズの定理で変形してきました。これは困ってしまいます。

 

仕方がないので、p(θ)を適当に置いてしまいましょう。このときθの値に心当たりがあれば、その知識を分布に反映させます。そうでもなければ計算がしやすいように置いてしまいます(これが主観確率と呼ばれ、批判される原因となりました)。

 

ベイズ更新

なんと、これから本当に知りたいp(θ)p(θ|x)で近似した挙句、これを求めるためにp(θ)を適当に置くというとんでもない状態になってしまいました(通常、これを事前分布という)。

 

しかし、データxが十分に沢山あれば、この事前分布の影響は非常に小さくなることが知られています。また、仮にp(θ)を定数として置いてしまえば

 

\displaystyle p(θ|x) ∝ p(x|θ)

 

であり、これは最尤推定でθを求める時の姿勢となにも変わりません(ただし、最尤推定のようにθをただ1つに決めるつもりはない)。ですから、実はやっていることのおかしさに比べて、理論上それほど変な事にもならないのです。

 

むしろ実は良い効用が考えられます。

 

\displaystyle p(θ|x)=\frac{p(x|θ)p(θ)}{p(x)}

 

を求める際にp(θ)を適当に仮定して、上記を求めてしまい。また、有用なデータxが集まったら、今度は上記で求まったp(θ|x)を事前分布p_0(θ)として活用して

 

\displaystyle p(θ|x)=\frac{p(x|θ)p_0(θ)}{p(x)}

 

のように再推定することができるのです。これをベイズ更新と言います。

 

 

他の手法との違い

 

ベイズ推定

信頼のできるp(θ|x)が得られたら、p(θ|x)p(θ)の近似と考え

 

p(y|x) = \sum_θ p(y|x,θ)p(θ) ≒ \sum_θ p(y|x,θ)p(θ|x)

 

で予測を行うのがベイズ推定です。

機械学習ではθによって予測器を構築し、そのθを求めることが学習だったのですが、θを1つに決めるのでは信頼ならないので、p(θ)で予測器p(y|x,θ)を重み付けしようというのがベイズ推定のモチベーションです。

 

 

MAP推定

MAP推定もθを確率変数と考えるベイズの考えを使ったものですが、信頼のできるp(θ|x)が得られたら、確率p(θ|x)が最大となるθ_{MAP}を使って、予測器を

 

p(y|x) = p(y|x,θ_{MAP})

 

と構築します。

 

MAP推定の観点からすれば、ベイズ推定というのは、最も信頼できるθ_{MAP}以外も予測器の構築に参加させたものであると見ることができます。

 

これは良いことなのか悪いことなのか微妙に感じるかもしれません。

 

しかし、p(θ|x)が平坦な形をしているときは、θ_{MAP}というのは他のθと信頼度に大差がないことになります。にもかかわらずそれだけを使うのは変です。

 

また、分布に多峰性がある場合には更に顕著になります。θ_{MAP}と異なるパラメータに際立って信頼性の高い、全く別のθが存在することになるわけですから、それを使うのと使わないのとではかなり差が出てしまいます。

 

最尤推定

最尤推定は尤度p(x|θ)を最大化するθ_{ML}を使い予測器を構築します。MAP推定との違いは、ベイズの定理を見るとよくわかります。

 

\displaystyle p(θ|x)=\frac{p(x|θ)p(θ)}{p(x)} ∝ p(x|θ)p(θ)

 

となっており、MAP推定は尤度p(x|θ)に事前分布p(θ)を掛けた形となっているので、違いはp(θ)によって生まれてくることになります。

 

MAP推定にしても最尤推定にしても、確率が最大となるθを求める場合には対数をとる方が計算が楽(かつ、対数を取らない場合と結果は同じ)なので

 

\log p(x|θ)+\log p(θ)

 

がMAP推定の目的関数となり、\log p(θ)がMAP推定では正則化項の役割を果たすことになります。

 

すなわち最尤推定というのは、データを完全に信頼し、更にそこから唯一のパラメータが決まると考え、正則化も用いず学習を行うことに相当し、実世界のデータに対しては大抵過学習を起こします。

 

 

最後に 

まとめ

ベイズ推定はいろいろなパラメータで構築される予測器を、重み付け平均にして予測器を構築します。

 

p(y|x) = \sum_θ p(y|x,θ)p(θ)

 

p(θ)は手元にあるデータxで決めることにし

 

p(y|x) = \sum_θ p(y|x,θ)p(θ|x)

 

を予測器とするのでした。

 

これに対して、重み付け平均を取ることをやめて、p(θ|x)を最大にするθ_{MAP}のみで予測器を構築するのが、MAP推定による機械学習であり

 

p(y|x) = p(y|x,θ_{MAP})p(θ_{MAP})

 

が予測器となります。

 

これに対して、p(θ|x)なんていうθを確率変数だと見たやり方をせず、データxの方が真のパラメータθによってp(x|θ)から生起しているのだと考え、p(x|θ)を最大化するθ_{ML}で真のパラメータを近似し、これを使って予測器を

 

p(y|x) = p(y|x,θ_{ML})

 

とするのが最尤推定を用いた機械学習です。

 

 

 

ベイズ推定を更に学ぶ場合

 

普通は、最尤推定から始まって、MAP推定へと進み、ベイズ推定へと更に進化していく姿を見ていきます。しかし、このようにベイズ推定のモチベーションを予め把握して全体を見てみると、MAP推定や最尤推定が、むしろベイズ推定の簡素化したものであることがわかります。

 

そうであればベイズ推定はもっと世の中に出回っても良いのではないかと思えてくるはずです。

 

ベイズ推定の困難さ

性能の高さは申し分ないのですが、一方で数理的な難しさが立ちはだかります。最尤推定やMAP推定は、最大となる点を求めるだけでよく、実質「確率分布」を意識する必要はありません。学習は単に最大化問題となるだけのことです。そして、それによって求まったただ1つのθを予測器に使います。

 

一方でベイズ推定は確率分布によって予測器に重み付けを行うので、確率分布を計算しなければなりません。MAP推定では

 

\displaystyle p(θ|x)=\frac{p(x|θ)p(θ)}{p(x)}

 

の分母はθを含まないのでどうでもよかったのですが、ベイズ推定では分母を計算する必要があるのです。分母の計算自体も周辺化

 

p(x)=\sum_θp(x|θ)p(θ)

 

によって実行します。

考えうる全てのパラメータの和になっています。計算量の問題が尋常ではありません。

 

これは予測器についても同様です。今回は分かりやすく

 

p(y|x) = \sum_θ p(y|x,θ)p(θ)

 

という重み付けの式を使いました。しかしパラメータθというのは離散値ではありません。1かもしれないし1.0001かもしれないし1.0002かもしれないのです。微小な変化の和を取るのは積分になります。実際の予測器は厳密には

 

p(y|x) = \int_θ p(y|x,θ)p(θ)dθ

 

なのです。もちろんベイズの定理の分母も同じ事情です。計算機は如何にしてこの無限小の和を実行するというのでしょうか(もちろん、実際には離散化するしかなく、Σの式を使うことになる)。

 

現実的な解決方法

 

いま立ちふさがっている

 

p(y|x) = \int_θ p(y|x,θ)p(θ)dθ

 

p(x)=\int_θp(x|θ)p(θ)dθ

 

はいずれもθによる積分であり、しかも

 

\int_θfp(θ)dθ

 

の形をしています。これはp(θ)に関するfの期待値と言います。困難な部分はこの期待値計算にあるわけです。

 

p(θ)p(y|x,θ)p(x|θ)も簡単な分布なら、手で積分計算をしてしまえるかもしれません。そうでなければ、期待値計算が上手くできる手法が必要になります。

 

ざっくり言えば、手計算を手助けするのが「変分ベイズ近似」であり、計算機による期待値のシミュレーションをなるべく正確に行おうというのが「サンプリング法」になります。

 

 

ベイズを実践的に使いたい場合は、上記のいずれかの勉強を進めると良いかもしれません(これがまた難しいのである。多分プログラムで見ることのできるサンプリング法の方が直感的にわかりやすい。変分法の方は数学苦手ならゲロ吐く)。

 

 

 以下のブログでは、主にベイズ機械学習に関しての記事が書かれています。更にベイズを勉強してみたい方は是非参考にしてみてください。

machine-learning.hatenablog.com

 

 

補足

今回はどんな予測器を作っているのかという話から開始し、それをベイズ推定が実際に達成するところを見てきました。つまり、予測器を話の中心に置いてきたのですが、実際には予測器の重み付けに使うp(θ)を求めること自体も苦労するのです。

 

p(θ)は事前分布で適当に置くと言いましたが、当然適当に置いた分布にも何らかのパラメータγが必要であり、それをハイパーパラメータと呼びます。そうなると、あるハイパーパラメータの元でのp(θ|γ)を求めるという学習の作業が必要であり、これに関してもp(γ)p(θ|γ)を重み付けするということが考えられます(ここまでして完全なベイズと言える)。

 

(待った、そうしたらハイパーパラメータの確率分布p(γ)にも事前分布が必要で…更にまた…ってなってしまう。 → 階層ベイズモデルです。とにかく観測して手元にあるデータ以外は全部確率変数なんです。なのでそれらには全て確率分布を考えることができて、あとはベイズの定理や乗法定理、加法定理でゴニョゴニョやってくわけです。そうこうしているうちに、ベイズの狙いや意義が分からない場合は、意味不明になっていくのです)

 

不正確か

機械学習ではy = f(w,x)という予測器を考えて、当然本来なら入力データxとそのラベルデータt(離散なら分類、連続なら回帰)からwを学習するわけですので、x,tが手持ちデータであるすれば、予測器は

 

p(y|x,t)

 

(過去データによって予測値yが決まる)という表記が最も正確です。

 

(まあベイズの心が伝われば良いのだ)

 

関連記事 

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com

 

 

s0sem0y.hatenablog.com