%load_ext d2lbook.tab
tab.interact_select(['mxnet', 'pytorch', 'tensorflow', 'jax'])
2.6. 確率と統計¶
機械学習は本質的に不確実性を扱う学問である。 教師あり学習では、既知の情報(特徴量)から未知の情報(ターゲット)を予測する。 目的によっては、最も起こりやすいターゲット値を予測することもあれば、ターゲットとの期待距離が最小となる値を予測することもある。 さらに、単に値を予測するだけでなく、不確実性を定量化したい場合も多い。 たとえば、患者のデータから、その人が将来心臓発作を起こす確率を知りたいことがある。 教師なし学習でも、不確実性はしばしば重要である。 ある測定値の集合が異常かどうかを判断するには、関心のある母集団でどのような値が観測されやすいかを知ることが有用である。 さらに、強化学習では、さまざまな環境で適切に行動するエージェントを設計したい。 そのためには、環境がどのように変化しうるか、また各行動に対してどのような報酬が期待されるかを推論しなければならない。
確率は、不確実性の下での推論を扱う数学の一分野である。 ある過程の確率モデルが与えられれば、さまざまな事象の起こりやすさを推論できる。 コイン投げのような反復可能な事象の頻度を確率で表すことは、比較的受け入れられやすい考え方である。 実際、頻度主義の立場では、確率は反復可能な事象にのみ適用されると考える。 これに対して、ベイズ主義の立場では、不確実性の下での推論を形式化するために、より広い意味で確率の言語を用いる。 ベイズ確率には2つの特徴がある。 (i) ダムが決壊する確率のように、反復不可能な事象にも信念の度合いを割り当てること、 (ii) 主観性を認めることである。 ベイズ確率は、新たな証拠に照らして信念をどのように更新すべきかについて明確な規則を与える一方で、異なる個人が異なる事前信念から出発することを許容する。 統計学は、データの収集と整理から出発し、そのデータを生み出した背後の過程について何を推論できるかを考える学問である。 データセットを分析して、より広い母集団を特徴づけるかもしれないパターンを探すとき、統計的思考を用いている。 確率と統計の研究に捧げられた講義、専攻、学位論文、職業、学科、企業、機関は数え切れないほどある。 本節ではそのごく一部に触れるにすぎないが、モデル構築を始めるために必要な基礎を与える。
%matplotlib inline
from d2l import torch as d2l
import random
import torch
from torch.distributions.multinomial import Multinomial
%matplotlib inline
from d2l import mxnet as d2l
from mxnet import np, npx
from mxnet.numpy.random import multinomial
import random
npx.set_np()
%matplotlib inline
from d2l import jax as d2l
import random
import jax
from jax import numpy as jnp
import numpy as np
%matplotlib inline
from d2l import tensorflow as d2l
import random
import tensorflow as tf
from tensorflow_probability import distributions as tfd
2.6.1. 簡単な例:コイン投げ¶
コインを投げる状況を考え、表(あるいは裏)がどの程度起こりやすいかを定量化したいとする。 コインが公平なら、表と裏は同じ確率で生じる。 さらに、コインを \(n\) 回投げるなら、期待される表の割合は期待される裏の割合と一致するはずである。 これを直感的に理解する一つの方法は対称性である。 \(n_\textrm{h}\) 回の表と \(n_\textrm{t} = (n - n_\textrm{h})\) 回の裏からなる任意の結果に対して、\(n_\textrm{t}\) 回の表と \(n_\textrm{h}\) 回の裏からなる同確率の結果が存在する。 これは、平均すれば投げた回数の \(1/2\) が表、\(1/2\) が裏になる場合にのみ成り立つ。 もちろん、この実験を \(n=1000000\) 回の投げで何度繰り返しても、\(n_\textrm{h} = n_\textrm{t}\) がぴったり成り立つ試行を一度も観測しないかもしれない。
形式的には、量 \(1/2\) を確率と呼び、ここでは任意の1回の投げで表が出る確からしさを表す。 確率は、関心のある結果、すなわち事象に対して \(0\) から \(1\) の間の値を割り当てる。 ここで関心のある事象は \(\textrm{heads}\) であり、対応する確率を \(P(\textrm{heads})\) と書く。 確率が \(1\) なら必ず起こることを意味し(両面が表の細工コインを想像すればよい)、確率が \(0\) なら不可能であることを意味する(たとえば両面が裏ならそうである)。 頻度 \(n_\textrm{h}/n\) と \(n_\textrm{t}/n\) は確率ではなく、むしろ統計量である。 確率はデータ生成過程の背後にある理論的な量である。 ここでは、確率 0.5 はコインそのものの物理的性質とみなせる。 これに対して統計量は、観測されたデータの関数として計算される経験的な量である。 確率的な量と統計的な量への関心は切り離せないほど密接に結びついている。 しばしば、データセットが与えられると、確率のようなモデルパラメータの推定値を生成する推定量と呼ばれる特別な統計量を設計する。 さらに、その推定量が一致性と呼ばれる望ましい性質を満たすなら、推定値は対応する確率に収束する。 そのように推定された確率は、将来遭遇するかもしれない同じ母集団からのデータの統計的性質について教えてくれる。
真の \(P(\textrm{heads})\) が分からない実際のコインを手に入れたとしよう。 この量を統計的に調べるには、(i) データを収集し、(ii) 推定量を設計する必要がある。 ここでのデータ収集は簡単である。 コインを何度も投げて、すべての結果を記録すればよい。 形式的には、ある基礎的なランダム過程から実現値を取り出すことをサンプリングと呼ぶ。 自然な推定量の一つは、観測された表の回数を総投数で割った比率である。
さて、そのコインが実際には公平、すなわち \(P(\textrm{heads}) = 0.5\)
だとしよう。
公平なコイン投げをシミュレートするには、任意の乱数生成器を使えばよい。
確率 \(0.5\) の事象をサンプルする簡単な方法はいくつかある。 たとえば
Python の random.random は区間 \([0,1]\)
の数を返し、任意の部分区間 \([a, b] \subset [0,1]\) に入る確率は
\(b-a\) に等しい。 したがって、返された浮動小数点数が 0.5
より大きいかどうかを判定すれば、0 と 1 をそれぞれ確率 0.5
で得られる。
num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(num_tosses)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails: [43, 57]
より一般には、取りうる結果の数が有限な任意の変数(コイン投げやサイコロ投げなど)からの複数回の抽出は、multinomial
関数を呼び出し、第1引数に抽出回数、第2引数に各結果に対応する確率のリストを与えることでシミュレートできる。
公平なコインを10回投げるには、確率ベクトル [0.5, 0.5]
を与え、インデックス 0 を表、インデックス 1 を裏として解釈する。
この関数は、取りうる結果の数(ここでは2)と同じ長さのベクトルを返し、最初の成分が表の回数、2番目の成分が裏の回数を表す。
fair_probs = torch.tensor([0.5, 0.5])
Multinomial(100, fair_probs).sample()
tensor([58., 42.])
fair_probs = [0.5, 0.5]
multinomial(100, fair_probs)
[07:21:03] ../src/storage/storage.cc:196: Using Pooled (Naive) StorageManager for CPU
array([46, 54], dtype=int64)
fair_probs = [0.5, 0.5]
# jax.random には多項分布が実装されていない
np.random.multinomial(100, fair_probs)
fair_probs = tf.ones(2) / 2
tfd.Multinomial(100, fair_probs).sample()
WARNING:tensorflow:From /home/ci/.local/lib/python3.10/site-packages/tensorflow_probability/python/internal/batched_rejection_sampler.py:102: calling while_loop_v2 (from tensorflow.python.ops.control_flow_ops) with back_prop=False is deprecated and will be removed in a future version.
Instructions for updating:
back_prop=False is deprecated. Consider using tf.stop_gradient instead.
Instead of:
results = tf.while_loop(c, b, vars, back_prop=False)
Use:
results = tf.nest.map_structure(tf.stop_gradient, tf.while_loop(c, b, vars))
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([49., 51.], dtype=float32)>
このサンプリング過程を実行するたびに、前回とは異なる新しい乱数が得られるかもしれない。 投数で割れば、データ中の各結果の頻度が得られる。 これらの頻度は、それらが推定しようとしている確率と同様に、合計すると \(1\) になる。
Multinomial(100, fair_probs).sample() / 100
tensor([0.5200, 0.4800])
multinomial(100, fair_probs) / 100
array([0.53, 0.47])
np.random.multinomial(100, fair_probs) / 100
array([0.48, 0.52])
tfd.Multinomial(100, fair_probs).sample() / 100
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.51, 0.49], dtype=float32)>
ここでは、シミュレートしたコインは公平であるにもかかわらず(確率
[0.5, 0.5] を自ら設定した)、表と裏の回数は一致しないかもしれない。
サンプル数がまだ少ないからである。
もしシミュレーションを自分で実装しておらず、結果だけを見ていたなら、コインが少し偏っているのか、それとも
\(1/2\)
からのずれが単にサンプルサイズの小ささによるものなのか、どのように判断すればよいだろうか。
10,000回投げをシミュレートしてみよう。
counts = Multinomial(10000, fair_probs).sample()
counts / 10000
tensor([0.4953, 0.5047])
counts = multinomial(10000, fair_probs).astype(np.float32)
counts / 10000
array([0.4952, 0.5048])
counts = np.random.multinomial(10000, fair_probs).astype(np.float32)
counts / 10000
array([0.4904, 0.5096], dtype=float32)
counts = tfd.Multinomial(10000, fair_probs).sample()
counts / 10000
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.5038, 0.4962], dtype=float32)>
一般に、コイン投げのような反復事象の平均については、反復回数が増えるにつれて推定値が真の基礎確率に収束することが保証される。 この現象の数学的定式化は大数の法則と呼ばれる。 また、中心極限定理は、多くの状況でサンプルサイズ \(n\) が増えるにつれて、これらの誤差が \((1/\sqrt{n})\) の速度で減少することを示す。 投数を1回から10,000回まで増やしたときに推定値がどのように変化するかを調べ、もう少し直感を得よう。
counts = Multinomial(1, fair_probs).sample((10000,))
cum_counts = counts.cumsum(dim=0)
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
estimates = estimates.numpy()
d2l.set_figsize((4.5, 3.5))
d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)"))
d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)"))
d2l.plt.axhline(y=0.5, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Samples')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();
counts = multinomial(1, fair_probs, size=10000)
cum_counts = counts.astype(np.float32).cumsum(axis=0)
estimates = cum_counts / cum_counts.sum(axis=1, keepdims=True)
counts = np.random.multinomial(1, fair_probs, size=10000).astype(np.float32)
cum_counts = counts.cumsum(axis=0)
estimates = cum_counts / cum_counts.sum(axis=1, keepdims=True)
counts = tfd.Multinomial(1, fair_probs).sample(10000)
cum_counts = tf.cumsum(counts, axis=0)
estimates = cum_counts / tf.reduce_sum(cum_counts, axis=1, keepdims=True)
estimates = estimates.numpy()
各実線はコインの2つの結果の一方に対応し、各実験群の後でその結果が出る確率の推定値を示している。 黒の破線は真の基礎確率を表す。 実験を重ねてデータが増えるにつれて、曲線は真の確率へと収束していく。 ここから、統計学者を悩ませるより高度な問いも見えてくる。 この収束はどの程度の速さで起こるのか。 もし同じ工場で製造されたコインをすでに多数調べていたなら、その情報をどのように取り込めるだろうか。
2.6.2. より形式的な扱い¶
ここまででもかなり多くのことを行った。 確率モデルを立て、合成データを生成し、統計的推定量を実行し、収束を経験的に評価し、誤差指標(ずれの確認)を報告した。 しかし、さらに先へ進むには、より厳密な定式化が必要である。
ランダム性を扱うとき、可能な結果の集合を \(\mathcal{S}\) と書き、これを標本空間または結果空間と呼ぶ。 各要素は異なる可能な結果である。 1回のコイン投げでは、\(\mathcal{S} = \{\textrm{heads}, \textrm{tails}\}\) である。 1回のサイコロ投げでは、\(\mathcal{S} = \{1, 2, 3, 4, 5, 6\}\) である。 2枚のコインを投げると、可能な結果は \(\{(\textrm{heads}, \textrm{heads}), (\textrm{heads}, \textrm{tails}), (\textrm{tails}, \textrm{heads}), (\textrm{tails}, \textrm{tails})\}\) である。 事象は標本空間の部分集合である。 たとえば、「1枚目のコイン投げが表である」という事象は、集合 \(\{(\textrm{heads}, \textrm{heads}), (\textrm{heads}, \textrm{tails})\}\) に対応する。 ランダム実験の結果 \(z\) が \(z \in \mathcal{A}\) を満たすとき、事象 \(\mathcal{A}\) が起こったという。 1回のサイコロ投げについて、「5が出る」(\(\mathcal{A} = \{5\}\))と「奇数が出る」(\(\mathcal{B} = \{1, 3, 5\}\))という事象を定義できる。 この場合、サイコロの目が5なら、\(\mathcal{A}\) と \(\mathcal{B}\) の両方が起こる。 一方、\(z = 3\) なら、\(\mathcal{A}\) は起こらないが、\(\mathcal{B}\) は起こる。
確率関数は事象を実数値へ写像する \({P: \mathcal{A} \subseteq \mathcal{S} \rightarrow [0,1]}\) である。 与えられた標本空間 \(\mathcal{S}\) における事象 \(\mathcal{A}\) の確率を \(P(\mathcal{A})\) と書き、次の性質を満たす。
任意の事象 \(\mathcal{A}\) の確率は非負の実数である。すなわち \(P(\mathcal{A}) \geq 0\);
標本空間全体の確率は \(1\) である。すなわち \(P(\mathcal{S}) = 1\);
互いに排反な可算個の事象列 \(\mathcal{A}_1, \mathcal{A}_2, \ldots\)(すなわち、すべての \(i \neq j\) について \(\mathcal{A}_i \cap \mathcal{A}_j = \emptyset\))に対して、それらのいずれかが起こる確率は各確率の和に等しい。すなわち \(P(\bigcup_{i=1}^{\infty} \mathcal{A}_i) = \sum_{i=1}^{\infty} P(\mathcal{A}_i)\)。
確率論のこれらの公理は、Kolmogorov (1933) によって提案され、多くの重要な帰結を直ちに導ける。 たとえば、任意の事象 \(\mathcal{A}\) または その補集合 \(\mathcal{A}'\) が起こる確率は 1 であることがすぐに従う(\(\mathcal{A} \cup \mathcal{A}' = \mathcal{S}\) だからである)。 また、\(P(\emptyset) = 0\) も証明できる。 なぜなら \(1 = P(\mathcal{S} \cup \mathcal{S}') = P(\mathcal{S} \cup \emptyset) = P(\mathcal{S}) + P(\emptyset) = 1 + P(\emptyset)\) だからである。 したがって、任意の事象 \(\mathcal{A}\) かつ その補集合 \(\mathcal{A}'\) が同時に起こる確率は \(P(\mathcal{A} \cap \mathcal{A}') = 0\) である。 非形式的に言えば、不可能な事象の確率はゼロである。
2.6.3. 確率変数¶
サイコロの目が奇数であることや、1回目のコイン投げが表であることのような事象について話すとき、確率変数の概念を用いていた。 形式的には、確率変数は基礎となる標本空間から、(場合によっては多数の)値の集合への写像である。 確率変数と標本空間はどちらも結果の集合なので、何が違うのかと思うかもしれない。 重要なのは、確率変数は生の標本空間よりもはるかに粗い表現にできることである。 たとえば、基礎となる標本空間が 0 と 1 の間の線分上の点のように無限であっても、「0.5より大きい」といった二値の確率変数を定義できる。 さらに、複数の確率変数が同じ基礎標本空間を共有することもある。 たとえば、「自宅の警報装置が鳴るかどうか」と「家に泥棒が入ったかどうか」は、どちらも同じ基礎標本空間を共有する二値の確率変数である。 したがって、ある確率変数の値を知ると、別の確率変数が取りうる値について何らかの情報が得られる。 警報が鳴ったと分かれば、家に泥棒が入った可能性が高いと考えるかもしれない。
確率変数が取りうる各値は、基礎となる標本空間の部分集合に対応する。 したがって、確率変数 \(X\) が値 \(v\) を取る事象、すなわち \(X=v\) は事象であり、\(P(X=v)\) はその確率を表す。 この記法はときに煩雑になるため、文脈が明らかな場合には記法を流用する。 たとえば、\(P(X)\) を広く \(X\) の分布、すなわち \(X\) が任意の値を取る確率を与える関数の意味で用いることがある。 また、\(P(X,Y) = P(X) P(Y)\) のような式を書くこともある。 これは、確率変数 \(X\) と \(Y\) が取りうるすべての値に対して成り立つ文を簡潔に表したものであり、すなわちすべての \(i,j\) について \(P(X=i \textrm{ and } Y=j) = P(X=i)P(Y=j)\) が成り立つという意味である。 さらに、確率変数が文脈から明らかなときには \(P(v)\) と書くこともある。 確率論における事象は標本空間の結果の集合なので、確率変数が取りうる値の範囲を指定できる。 たとえば、\(P(1 \leq X \leq 3)\) は事象 \(\{1 \leq X \leq 3\}\) の確率を表す。
離散確率変数(コイン投げやサイコロ投げのようなもの)と、連続確率変数(母集団から無作為に抽出した人の体重や身長のようなもの)の間には、微妙な違いがあることに注意しよう。 この場合、誰かの正確な身長そのものに関心を持つことはほとんどない。 さらに、十分に精密に測定すれば、地球上でまったく同じ身長の人は一人もいないだろう。 実際、十分に細かく測れば、起床時と就寝時でさえ同じ身長にはならない。 誰かの身長が 1.801392782910287192 メートルである正確な確率を問うことには、ほとんど意味がない。 むしろ通常は、誰かの身長がたとえば 1.79 メートルから 1.81 メートルの間に入るかどうかを知る方が重要である。 このような場合には、確率密度を扱う。 ちょうど 1.80 メートルである確率はないが、密度はゼロではない。 区間に割り当てられる確率を求めるには、その区間上で密度を積分しなければならない。
2.6.4. 複数の確率変数¶
ここまで読み進めるだけでも、複数の確率変数の相互作用を含む記述を避けられなかったことに気づいたはずである(\(P(X,Y) = P(X) P(Y)\) を思い出してほしい)。 機械学習の大部分は、このような関係を扱う。 ここでの標本空間は関心のある母集団、たとえば企業と取引する顧客、インターネット上の写真、あるいは生物学者に知られているタンパク質などである。 各確率変数は、異なる属性の(未知の)値を表す。 母集団から個体をサンプルするたびに、各確率変数の実現値を観測する。 確率変数が取りうる値は、重なりうる、部分的に重なりうる、あるいは完全に互いに素な標本空間の部分集合に対応するため、ある確率変数の値を知ると、別の確率変数が取りうる値についての信念を更新することになる。 患者が病院に来て、呼吸困難があり、嗅覚を失っていることが観測されたなら、呼吸困難もなく嗅覚も正常な場合よりも、COVID-19 に感染している可能性が高いと考える。
複数の確率変数を扱うとき、変数が同時に取りうる値のあらゆる組合せに対応する事象を構成できる。 これらの各組合せ(たとえば \(A=a\) かつ \(B=b\))に確率を割り当てる関数を同時確率関数と呼び、対応する標本空間の部分集合の共通部分に割り当てられた確率を返す。 確率変数 \(A\) と \(B\) がそれぞれ値 \(a\) と \(b\) を取る事象に割り当てられる同時確率は \(P(A = a, B = b)\) と書き、ここでカンマは「かつ」を意味する。 任意の値 \(a\) と \(b\) に対して、次が成り立つ。
なぜなら、\(A=a\) と \(B=b\) が起こるには、\(A=a\) が起こり、かつ \(B=b\) も起こらなければならないからである。 興味深いことに、同時確率は、これらの確率変数について確率論的な意味で知りうるすべてを教えてくれる。 また、個々の分布 \(P(A)\) と \(P(B)\) を復元することを含む多くの有用な量を導くためにも使える。 \(P(A=a)\) を復元するには、確率変数 \(B\) が取りうるすべての値 \(v\) について \(P(A=a, B=v)\) を足し合わせればよい。 すなわち、\(P(A=a) = \sum_v P(A=a, B=v)\) である。
比 \(\frac{P(A=a, B=b)}{P(A=a)} \leq 1\) は非常に重要である。 これは条件付き確率と呼ばれ、“\(\mid\)” 記号で表す。
これは、\(A=a\) が起こったという事実を条件としたときに、事象 \(B=b\) に対応する新たな確率を与える。 この条件付き確率は、標本空間のうち \(A=a\) に対応する部分だけに注目し、その上で確率の総和が 1 になるように再正規化したものと考えられる。 条件付き確率も通常の確率にほかならない。 したがって、すべての項を同じ事象で条件づけ、同じ標本空間に注目する限り、すべての公理に従う。 たとえば、互いに素な事象 \(\mathcal{B}\) と \(\mathcal{B}'\) に対して、\(P(\mathcal{B} \cup \mathcal{B}' \mid A = a) = P(\mathcal{B} \mid A = a) + P(\mathcal{B}' \mid A = a)\) が成り立つ。
条件付き確率の定義を用いると、有名な結果であるベイズの定理を導ける。 定義より、\(P(A, B) = P(B\mid A) P(A)\) かつ \(P(A, B) = P(A\mid B) P(B)\) である。 両式を組み合わせると \(P(B\mid A) P(A) = P(A\mid B) P(B)\) となるので、
この単純な式は、条件づけの向きを反転できるため、深い意味を持つ。 \(P(B\mid A)\)、\(P(A)\)、\(P(B)\) をどのように推定するかが分かれば、\(P(A\mid B)\) を推定できる。 一方を直接推定する方が他方より容易なことが多く、そのときベイズの定理が役に立つ。 たとえば、ある病気に対する症状の有病率と、病気そのものおよび症状全体の有病率が分かっていれば、症状に基づいてその人が病気である確率を求められる。 場合によっては、症状の有病率のような \(P(B)\) に直接アクセスできないこともある。 その場合には、ベイズの定理の簡略形が有用である。
\(P(A \mid B)\) は 1 に正規化されなければならない、すなわち \(\sum_a P(A=a \mid B) = 1\) であるから、次を計算できる。
ベイズ統計では、観測者は利用可能な仮説の妥当性についてのある(主観的な)事前信念を事前分布 \(P(H)\) に符号化して持ち、仮説の各クラスに対して収集された証拠の各値を観測する確率を表す尤度関数 \(P(E \mid H)\) を持つと考える。 ベイズの定理は、利用可能な証拠 \(E\) に照らして初期の事前 \(P(H)\) をどのように更新し、事後信念 \(P(H \mid E) = \frac{P(E \mid H) P(H)}{P(E)}\) を得るかを教えるものとして解釈される。 非形式的には、「事後は事前に尤度を掛けて証拠で割ったもの」と言える。 ここで証拠 \(P(E)\) はすべての仮説に共通なので、仮説全体で正規化すればよい。
\(\sum_a P(A=a \mid B) = 1\) であることから、確率変数を周辺化することもできる。 つまり、\(P(A, B)\) のような同時分布から変数を取り除ける。 実際、
独立性もまた、統計学の多くの重要な考え方の基盤をなす根本的に重要な概念である。 要するに、2つの変数は、\(A\) の値で条件づけても \(B\) に対応する確率分布が変化せず、その逆も同様であれば独立である。 より形式的には、\(A \perp B\) と書かれる独立性は、\(P(A \mid B) = P(A)\)、したがって \(P(A,B) = P(A \mid B) P(B) = P(A) P(B)\) を要求する。 独立性はしばしば妥当な仮定である。 たとえば、確率変数 \(A\) が1枚目の公平なコインを投げた結果を表し、確率変数 \(B\) が別のコインを投げた結果を表すなら、\(A\) が表だったかどうかは \(B\) が表になる確率に影響しないはずである。
独立性は、基礎分布からのデータの連続した抽出の間で成り立つとき(強い統計的結論を導けるため)、あるいはデータ中のさまざまな変数の間で成り立つとき(その独立構造を符号化したより単純なモデルを扱えるため)、特に有用である。 一方で、確率変数間の依存関係を推定すること自体が学習の目的であることも少なくない。 症状から病気の確率を推定したいのは、病気と症状が独立ではないと考えているからである。
条件付き確率も正しい確率であるため、独立と従属の概念はそれにも適用できる。 3つ目の変数 \(C\) が与えられたとき、2つの確率変数 \(A\) と \(B\) が条件付き独立であるとは、\(P(A, B \mid C) = P(A \mid C)P(B \mid C)\) が成り立つことと同値である。 興味深いことに、2つの変数は一般には独立であっても、3つ目の変数で条件づけると従属になることがある。 しばしば、2つの確率変数 \(A\) と \(B\) が3つ目の変数 \(C\) の原因に対応するときに起こる。 たとえば、骨折と肺がんは一般集団では独立かもしれないが、病院にいることを条件にすると、骨折は肺がんと負の相関を持つかもしれない。 骨折がその人が病院にいる理由を説明し尽くすため、肺がんで入院している可能性を下げるからである。
逆に、2つの従属な確率変数が3つ目の変数で条件づけると独立になることもある。 これは、もともと無関係な2つの事象に共通の原因があるときによく起こる。 小学生の間では、靴のサイズと読解力は強く相関しているが、年齢で条件づけるとこの相関は消える。
2.6.5. 例¶
理解を試してみよう。 医師が患者に HIV 検査を行うとする。 この検査はかなり正確であり、患者が健康なのに病気と報告される、すなわち健康な患者が陽性と判定される場合にのみ、1% の確率で誤る。 さらに、患者が実際に HIV に感染している場合には、見逃すことはない。 診断を \(D_1 \in \{0, 1\}\) で表し(0 は陰性、1 は陽性)、HIV の状態を \(H \in \{0, 1\}\) で表す。
条件付き確率 |
\(H=1\) |
\(H=0\) |
|---|---|---|
\(P(D_1 = 1 \mid H)\) |
1 |
0.01 |
\(P(D_1 = 0 \mid H)\) |
0 |
0.99 |
列の和はすべて 1 だが、行の和はそうではないことに注意しよう。 条件付き確率だからである。 検査結果が陽性だったときに患者が HIV に感染している確率、すなわち \(P(H = 1 \mid D_1 = 1)\) を計算しよう。 直感的には、病気の一般的な有病率に依存する。 なぜなら、それが偽陽性の数に影響するからである。 母集団では病気がかなりまれであるとし、たとえば \(P(H=1) = 0.0015\) とする。 ベイズの定理を適用するには、周辺化によって次を求める必要がある。
これより、
言い換えると、検査はかなり正確であるにもかかわらず、患者が実際に HIV に感染している確率はわずか 13.06% しかない。 このように、確率はしばしば直感に反する。 このような恐ろしい知らせを受けた患者はどうすべきだろうか。 おそらく、医師にもう一度検査してもらい、はっきりさせたいと頼むだろう。 2回目の検査は性質が異なり、1回目ほど性能はよくない。
条件付き確率 |
\(H=1\) |
\(H=0\) |
|---|---|---|
\(P(D_2 = 1 \mid H)\) |
0.98 |
0.03 |
\(P(D_2 = 0 \mid H)\) |
0.02 |
0.97 |
残念ながら、2回目の検査も陽性だった。 条件付き独立を仮定して、ベイズの定理を適用するために必要な確率を計算しよう。
これで周辺化を適用し、両方の検査が陽性となる確率を得られる。
最後に、両方の検査が陽性であるときに患者が HIV に感染している確率は
つまり、2回目の検査によって、何か問題があるという確信をかなり高められた。 2回目の検査は1回目よりかなり精度が低いにもかかわらず、それでも推定を大きく改善した。 2つの検査が互いに条件付き独立であるという仮定は、より正確な推定を得るうえで決定的であった。 極端な例として、同じ検査を2回行う場合を考えよう。 この状況では、2回とも同じ結果になると期待されるため、同じ検査をもう一度行っても追加の情報は得られない。 鋭い読者なら、診断が単純な分類器のように振る舞っており、患者が健康かどうかを判断する能力は、より多くの特徴量(検査結果)を得るにつれて高まることに気づくだろう。
2.6.6. 期待値¶
しばしば、意思決定には個々の事象に割り当てられた確率を見るだけでなく、それらを組み合わせて指針となる有用な集約量を作ることが必要である。 たとえば、確率変数が連続的なスカラー値を取るとき、平均的にどの値が期待されるかを知りたいことが多い。 この量は形式的には期待値と呼ばれる。 投資を行う場合、最初に関心を持つ量は、起こりうるすべての結果にわたって平均した期待収益かもしれない(適切な確率で重みづけしたもの)。 たとえば、50% の確率で投資が完全に失敗し、40% の確率で 2\(\times\) のリターンを生み、10% の確率で 10\(\times\) のリターンを生むとする。 期待収益を計算するには、すべてのリターンについて、それぞれの生起確率を掛けて足し合わせる。 すると期待値は \(0.5 \cdot 0 + 0.4 \cdot 2 + 0.1 \cdot 10 = 1.8\) となる。 したがって、期待収益は 1.8\(\times\) である。
一般に、確率変数 \(X\) の期待値(または平均)は次のように定義される。
同様に、密度に対しては \(E[X] = \int x \;dp(x)\) を得る。 ときには、\(x\) のある関数の期待値に関心がある。 これらの期待値は次のように計算できる。
それぞれ離散確率と密度に対する式である。 上の投資の例に戻ると、\(f\) はリターンに対応する効用(幸福度)かもしれない。 行動経済学では、人は 1 ドルを得ることによる効用よりも、お金を失うことによる不効用をより強く感じることが長く指摘されてきた。 さらに、お金の価値はしばしば準線形ではない。 10万ドルを持つこととゼロドルであることの違いは、家賃を払えるか、十分に食べられるか、質の高い医療を受けられるか、それともホームレスとして苦しむかの違いになりうる。 一方で、20万ドルと10万ドルの差による利益はそれほど劇的ではない。 このような考え方が、「お金の効用は対数的である」という決まり文句を動機づける。
総損失に対応する効用が \(-1\) で、リターン \(1\)、\(2\)、\(10\) に対応する効用がそれぞれ \(1\)、\(2\)、\(4\) だとすると、投資の期待幸福度は \(0.5 \cdot (-1) + 0.4 \cdot 2 + 0.1 \cdot 4 = 0.7\)(期待効用損失 30%)になる。 もし本当にこれが自分の効用関数なら、お金を銀行に預けておくのが最善かもしれない。
金融上の意思決定では、投資がどれだけリスクが高いかも測りたいかもしれない。 ここでは期待値だけでなく、実際の値がこの値のまわりでどれだけ変動しやすいかに関心がある。 実際の値と期待値の差の期待値をそのまま取ることはできない点に注意しよう。 差の期待値は期待値の差だからである。 すなわち、\(E[X - E[X]] = E[X] - E[E[X]] = 0\) である。 しかし、この差の任意の非負関数の期待値を見ることはできる。 確率変数の分散は、二乗差の期待値として定義される。
ここで等式は、\((X - E[X])^2 = X^2 - 2 X E[X] + E[X]^2\) を展開し、各項の期待値を取ることで得られる。 分散の平方根は、標準偏差と呼ばれる別の有用な量である。 分散と標準偏差は同じ情報を表すが(どちらか一方から他方を計算できる)、標準偏差には、元の確率変数が表す量と同じ単位で表されるという利点がある。
最後に、確率変数の関数の分散も同様に次のように定義される。
投資の例に戻ると、投資の分散を計算できる。 \(0.5 \cdot 0 + 0.4 \cdot 2^2 + 0.1 \cdot 10^2 - 1.8^2 = 8.36\) である。 どの意味でも、リスクの高い投資である。 数学的慣習として、平均と分散はしばしば \(\mu\) と \(\sigma^2\) で表されることに注意しよう。 特に、ガウス分布をパラメータ化するときによく用いられる。
スカラー確率変数に対して期待値と分散を導入したのと同様に、ベクトル値の確率変数に対しても同じことができる。 期待値は要素ごとに適用できるので簡単である。 たとえば、\(\boldsymbol{\mu} \stackrel{\textrm{def}}{=} E_{\mathbf{x} \sim P}[\mathbf{x}]\) の各成分は \(\mu_i = E_{\mathbf{x} \sim P}[x_i]\) である。 共分散はより複雑である。 これは、確率変数とその平均との差の外積の期待値として定義される。
この行列 \(\boldsymbol{\Sigma}\) は共分散行列と呼ばれる。 その効果を理解する簡単な方法は、\(\mathbf{x}\) と同じ大きさのベクトル \(\mathbf{v}\) を考えることである。 すると次が成り立つ。
したがって、\(\boldsymbol{\Sigma}\) は、\(\mathbf{x}\) の任意の線形関数の分散を単純な行列積で計算できるようにする。 非対角成分は各成分間の相関の強さを示す。 0 なら相関がなく、より大きな正の値ならより強い正の相関を意味する。
2.6.7. 議論¶
機械学習では、不確実なものが数多く存在する。 入力が与えられたときのラベルの値が不確実なこともあれば、推定されたパラメータの値が不確実なこともある。 さらには、運用時に到着するデータが学習データと同じ分布から来ているかどうかさえ不確実であることがある。
偶然的不確実性とは、問題に内在する不確実性であり、観測変数では説明できない真のランダム性によるものを指す。 認識的不確実性とは、モデルのパラメータに関する不確実性であり、より多くのデータを集めることで減らせると期待される種類の不確実性である。 コインが表になる確率については認識的不確実性を持つかもしれないが、その確率が分かった後でも、将来の任意の投げの結果については偶然的不確実性が残る。 誰かが公平なコインをどれだけ長く投げ続けても、次の投げが表になると 50% より高くも低くも確信できない。 これらの用語は機械的モデリングに由来する(この側面の不確実性定量化については、たとえば Der Kiureghian and Ditlevsen (2009) のレビューを参照されたい)。 ただし、これらの用語はやや比喩的に使われていることには注意する価値がある。 epistemic という語は知識に関するあらゆるものを指すため、哲学的な意味では、あらゆる不確実性は認識的不確実性である。
未知の確率分布からデータをサンプリングすることで、データ生成分布のパラメータを推定するために使える情報が得られることを見た。 とはいえ、これが可能になる速度はかなり遅いことがある。 コイン投げの例(および多くの他の例)では、サンプルサイズ \(n\) に対して \(1/\sqrt{n}\) の速度で収束する推定量を設計する以上のことはできない。 これは、10 個の観測から 1000 個の観測へ増やすと(通常は十分達成可能な課題である)、不確実性が 10 分の 1 に減る一方で、その次の 1000 個の観測は比較的あまり役に立たず、1.41 倍の削減しかもたらさないことを意味する。 これは機械学習における持続的な特徴である。 しばしば容易な改善はあるが、さらに改善するには非常に大量のデータ、そしてしばしば膨大な計算量が必要になる。 大規模言語モデルに関するこの事実の実証的レビューについては Revels et al. (2016) を参照されたい。
また、統計モデリングのための言語と道具も洗練された。 その過程で、条件付き確率と、統計学で最も重要な方程式の一つであるベイズの定理を学んだ。 これは、データが伝える情報を、観測 \(B\) がパラメータの選択 \(A\) にどれだけ適合するかを表す尤度項 \(P(B \mid A)\) と、そもそも特定の \(A\) の選択がどれほど妥当だったかを支配する事前確率 \(P(A)\) に分解するための有力な道具である。 特に、この規則が、検査の有効性と病気そのものの有病率(すなわち事前)に基づいて、診断に確率を割り当てるためにどのように適用できるかを見た。
最後に、特定の確率分布の効果についての最初の非自明な問いとして、期待値と分散を導入した。 確率分布には線形期待値や二次期待値以外にも多くの側面があるが、この2つだけでも分布の起こりうる振る舞いについてかなりの知識を与えてくれる。 たとえば、チェビシェフの不等式 は \(P(|X - \mu| \geq k \sigma) \leq 1/k^2\) を述べる。 ここで \(\mu\) は期待値、\(\sigma^2\) は分散、\(k > 1\) は任意に選べる信頼パラメータである。 これは、分布からのサンプルが少なくとも 50% の確率で期待値を中心とする \([-\sqrt{2} \sigma, \sqrt{2} \sigma]\) 区間内に入ることを意味する。
2.6.8. 演習¶
より多くのデータを観測することで、結果に関する不確実性を任意に小さくできる例を挙げよ。
より多くのデータを観測しても、不確実性がある水準までしか減らず、その後はそれ以上減らない例を挙げよ。なぜそうなるのか、またその水準がどこにあると予想されるかを説明せよ。
コイン投げにおける平均への収束を経験的に示した。\(n\) 個のサンプルを得た後の表の確率推定値の分散を計算せよ。
分散は観測数に対してどのようにスケールするか。
チェビシェフの不等式を用いて期待値からのずれを上界づけよ。
中心極限定理とどのように関係するか。
平均0、分散1の確率分布から \(m\) 個のサンプル \(x_i\) を得ると仮定する。平均 \(z_m \stackrel{\textrm{def}}{=} m^{-1} \sum_{i=1}^m x_i\) を計算せよ。各 \(z_m\) に対して独立にチェビシェフの不等式を適用できるか。なぜか。
確率 \(P(\mathcal{A})\) と \(P(\mathcal{B})\) を持つ2つの事象が与えられたとき、\(P(\mathcal{A} \cup \mathcal{B})\) と \(P(\mathcal{A} \cap \mathcal{B})\) の上界と下界を求めよ。ヒント:ベン図 を用いて状況を図示せよ。
\(A\)、\(B\)、\(C\) という確率変数列があり、\(B\) は \(A\) のみに依存し、\(C\) は \(B\) のみに依存すると仮定する。このとき同時確率 \(P(A, B, C)\) を簡単化できるか。ヒント:マルコフ連鎖である。
2.6.5 章 では、2つの検査結果が独立ではないと仮定せよ。特に、各検査単独の偽陽性率が10%、偽陰性率が1%であるとする。すなわち、\(P(D =1 \mid H=0) = 0.1\) かつ \(P(D = 0 \mid H=1) = 0.01\) とする。さらに、\(H = 1\)(感染)では検査結果は条件付き独立、すなわち \(P(D_1, D_2 \mid H=1) = P(D_1 \mid H=1) P(D_2 \mid H=1)\) だが、健康な患者では結果が \(P(D_1 = D_2 = 1 \mid H=0) = 0.02\) を通じて結びついていると仮定する。
ここまでの情報に基づいて、\(H=0\) のときの \(D_1\) と \(D_2\) の同時確率表を作成せよ。
1回目の検査が陽性だった後に患者が病気(\(H=1\))である確率を導出せよ。以前と同じ基準確率 \(P(H=1) = 0.0015\) を仮定してよい。
両方の検査が陽性だった後に患者が病気(\(H=1\))である確率を導出せよ。
投資銀行の資産運用担当者であり、投資先として株式 \(s_i\) を選べるとする。ポートフォリオは各株式に対する重み \(\alpha_i\) を用いて表し、その総和は 1 でなければならない。株式の平均収益率は \(\boldsymbol{\mu} = E_{\mathbf{s} \sim P}[\mathbf{s}]\)、共分散は \(\boldsymbol{\Sigma} = \textrm{Cov}_{\mathbf{s} \sim P}[\mathbf{s}]\) である。
与えられたポートフォリオ \(\boldsymbol{\alpha}\) の期待収益を計算せよ。
ポートフォリオの収益を最大化したいなら、投資をどのように選ぶべきか。
ポートフォリオの分散を計算せよ。
分散に上限制約を課しつつ収益を最大化する最適化問題を定式化せよ。ノーベル賞を受賞したマルコヴィッツのポートフォリオである (Mangram, 2013)。これを解くには二次計画法ソルバが必要であり、本書の範囲を大きく超える。