HELLO CYBERNETICS

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

確率の基本の基本

 

 

follow us in feedly

f:id:s0sem0y:20170505210626j:plain

 

 はじめに

機械学習での確率

確率というのは単純に言ってしまえば割合であって、サイコロを100回振ったら偶数の目が何回出るかを表す指標です。もしもn回出たのであれば、n/100が偶数の目が出る確率ということになります。

 

常識的に考えれば、均一なサイコロの偶数の目が出る確率は1/2ですが、それはたくさんサイコロを振った時の割合がその値に近づいていくからであって、天から「サイコロの偶数の目が出る確率は1/2である」と与えられるものではありません。

 

確率というのは実際の事象といつでも対応させて考えるもので、確率の概念は実際の事象(つまりデータ)から帰納的に得られるものです。このような事象(データ)をベースに考える確率を古典的な確率といいます。

 

古典的な確率というからには、当然現代的な確率に相当するものも存在し、数学の世界では現代的な確率が研究の対象です。

演繹的な学問である数学において、古典的な確率は扱いづらい対象であるため、確率というものを数式で定義してしまい、その数式に当てはまるものをすべて確率と呼ぶことにしてしまいます。このような確率を公理的な確率と言いますが、機械学習においては古典的な確率を知っていれば十分です。

 

今回のテーマ

本記事のテーマは、古典的な確率をベースに確率・統計の基本をおさらいします。

 

確率・統計の基本

確率と統計の考え

確率は冒頭で述べた通り、サイコロを複数回(なるべくたくさん)振った時に「偶数の目が出る割合」を表します。サイコロは1〜6の6つの事象が存在し、6つの事象のうちの3つが「偶数の目が出る」という事象にあたります。従って確率は1/2だと言えそうです。

 

この考え方は要するに、「着目している事象の場合の数 / 起こりうる全ての事象の場合の数」という計算をしていることになります。しかしこれはかなり早計です。実際にこのような計算をして良いのは、「起こりうる全ての事象」がそれぞれ独立しており、更に1つ1つの確率が等しいと保証されている時のみです。

 

サイコロで言えば、まず「1の目が出る確率」と「2の目が出る確率」と…「6の目が出る確率」は全て等しいということが言えなければならないのです。そうして初めて、「偶数の目が出る確率」というものを場合の数で考えることが可能になります。単純に考えて、サイコロの重心がずれていれば、1つ1つの事象に関して確率が等しいなんて到底考えられません。

 

何らかの事象の確率を求めようとしているときに、それの根本に値する事象(根源事象と言う)の確率を知っていなければならないというのはかなり厳しい話です。そして、それは天から与えられる物ではないため、誰にも確証がありません。

 

そのために必要になるのが統計になります。

根源事象に関する確率の情報が分かれば、かなりの精度でそれらを組み合わせた事象に関しての確率を計算することができます。従って、根源事象の確率というものをデータから上手く解釈できれば嬉しい訳です。そこで統計が使われることになります。

 

実際には根源事象に相当するものでなくとも、知りたい確率を直接統計によって知ることもできます。そして、それを知れば、他の何らかの値も計算できるかもしれません。

例えばサイコロの偶数の目が出る確率を知りたかったら、直接統計によってそれを計算し、それが分かれば偶数の目が出る確率を計算することができます。ただし、この方法の場合は、「2か4」が出る確率を計算することはできません。

何を統計によって知ろうとするかは、問題に応じて適切に設定すればいいのです。

 

本来古典的な確率は、根源事象や確率空間を定義していきますが、それが機械学習で意識される機会はそうそう無いので、これまでの説明程度の理解でも大丈夫でしょう。

 

 

 

 確率の基本

離散確率

まず確率というものと確率変数というものがあります。これらはセットです。

サイコロの目を確率変数Xとして、X=2となる確率が1/6であるというような使い方です。通常はX=1を取る確率、X=2を取る確率などと書くのが面倒なので、右辺の実現値をxと書いて、X=xとなる確率f(x)というものを考えます。

つまり

 

Xは集合\{ 1,2,3,4,5,6\} から値を取る確率変数であり、

 

X=xという実現値が得られる確率を

 

f(x)と書き、これは確率であるため和について

 

\sum_x f(x)=1 (\sum_xxのあらゆる実現値について和を取る)

 

となります。

もしもどの目も出る確率が同じなのであれば、確率関数f(x)は以下のような形になります。

 

f:id:s0sem0y:20170205140724p:plain

 

たいてい機械学習では面倒なので、Xxの区別はほとんどしません。

小文字のxが確率変数という意味でも、実現値という意味でも使われます。

 

とくに深く確率の議論をしない限りは、分けることの恩恵は無いので、以下でもxをそのように使っていきます。

 

連続確率

一方で、空中から紙切れ一枚を落としたときに、落ちる床の位置を確率変数xとしましょう。真下に落ちた時をx=0とする確率変数です。今回は簡単のため横方向しか考えないことにします。

そうすると、確率変数はxは連続的な値を取ります。サイコロのようにはいきません。

確率関数f(x)も例えばf(1)=0.2f(1.01)=0.19のような具合ですぐ隣(少数の部分)でも値を取るような関数になっていなければなりません。

 

つまりxは連続的な値を取り、確率関数f(x)は連続関数になります。

 

x[-∞ ∞] の区間から値を取る確率変数であり

 

f(x)は連続関数になり、その和は1で無ければならないので

 

\int_x f(x)dx=1

 

となります。積分になることに注意してください。

f(x)の下の部分の面積が1になるということです。

ここで、xが連続的な値を取る場合は、f(x)のことを確率密度関数と言います。

 

機械学習では、確率関数と言ってしまう場合もあれば、離散なのに確率密度関数という場合もありますし、密度関数と言う場合もあります。

ちなみに英語では「p.d.f. (probability density function)」と訳されます。

 

確率密度関数としては以下のようなものがあります。

紙を空中から落としたら大体揺れながら真ん中に落ちるけども、少しずれることも多いという感じです。

f:id:s0sem0y:20170205143652p:plain

実際には、xは連続的な値で、確率が蜜に詰まっているのでf(x)は以下のように塗りつぶされます。青い部分の面積(確率の総和)が1になります。

 

f:id:s0sem0y:20170205143649p:plain

 

 

多次元の確率

多次元の確率も、確率の基本的な概念からスタートすれば簡単です。

同じように紙を空中から落とすとしましょう。落ちる床の位置を(x,y)という2次元で表現すれば、x,yは両方共確率変数です。そして確率密度関数はf(x,y)と表されます。

例えば、紙切れを空中から落として、落ちる位置x=2,y=3f(x,y)=0.12と計算されたりすることになります。では当然x=2,y=3.01でもfは値を持つわけで、x=2.01,y=3でも値を持つはずです。

x,yの両方が取りうる値の組み合わせ全てを網羅して確率の和を取った場合に1とならなければならないのですが、これは連続確率変数ですから二重積分になります。

しかし何も驚くこと無く、単にすべてのパターンを足しあわせているだけです。

 

x,yはいずれも[-∞ ∞ ]から値を取る確率変数であり、

 

f(x,y)は全ての取りうるパターンの和が1となるので

 

\int_y \int_x f(x,y)dxdy=1となります。

 

機械学習では例えばD多次元の場合はベクトルを使って複数の確率変数を格納してしまい

 

{\bf x}=(x_1,x_2,...,x_D)

 

と確率変数をおいて

 

\int_{\bf x} f({\bf x})d{\bf x}=1

 

という具合で書いてしまいます。これは基本に立ち返れば

 

\int_{x_1} \int_{x_2} ... \int_{x_D} f(x_1,x_2,...,x_D)dx_1dx_2...dx_D=1

 

ということと一緒です。確率変数の全ての取りうるパターンでの確率の和を計算していることに違いはありません。しかし、やはり書いてみると面倒なので、ベクトルの形にしてしまうほうが記述は楽でしょう。

 

 

期待値

期待値は頻出です。

期待値は簡単に言えば、確率変数の実現値の「重み付き平均」であり、重みとして確率(密度)を使います。単に平均と言う場合もありますが、それは、たくさん試行を繰り返した時の確率変数の平均的な値になるからです。

 

xが出る確率をf(x)とすれば

 

\sum_x xf(x)

 

と言った具合に計算されます。

この値に何の意味があるのかというと、ギャンブルを想像すると分かりやすいでしょう。

均一なサイコロを投げて6が出れば3000円もらえて、それ以外ならば1500円がもらえるゲームがあったとします。さて2000円でこれにチャレンジできたとすればするでしょうか。

損しても500円、得をすれば1000円です。このようなときに期待値を使います。

 

確率変数はもらえるお金の方であり、3000円となる確率は1/6で100円となる確率は5/6です。期待値は

 

\frac{1}{6}*3000+\frac{5}{6}*1500=500+1250=1750

 

となります。

これはかなりの数、このゲームにチャレンジしたときに、1回あたりにもらえるお金の平均値になります。このゲームの主催者からしたら、10000人がチャレンジしくれれば、買ったり負けたりあるにしても、1回ごとに平均1750円を渡すことになり、ゲームの参加料が2000円であれば、終わったときには250×10000=2500000円くらい儲けることになります。

 

もちろん参加者側からしたら1回勝負なので、期待値はそれほどあてにならないかもしれませんが、それでも目安にはなるでしょう。

 

連続的な確率変数の場合は

 

\int_x xf(x)dx

 

という計算をすることになります。理屈は同じです。たくさん試行したら平均的にxがどんな値になるかを示すことになります

 

機械学習においては、損失関数の値の期待値がなるべく少なくなるような学習を行います。

 

ということは損失関数の値を確率変数であるとしているわけです。

学習には適当に集めたデータを使うわけで、データは確率的に得られたものであり、損失関数はそのデータに依存するため、そのように考えます。

 

以下、かなり難しいですが、損失関数の期待値を考えることで得られるバイアス-バリアンス分解について、いつか理解できると良いでしょう。

s0sem0y.hatenablog.com