ガウス過程入門 ============== 多くの場合、機械学習はデータからパラメータを推定することに帰着する。これらのパラメータはしばしば多数で、比較的解釈しにくいものです — たとえばニューラルネットワークの重みのように。これに対してガウス過程は、データに適合しうる関数の高レベルな性質について直接推論するための仕組みを提供する。たとえば、これらの関数が急激に変化するのか、周期的なのか、条件付き独立性を含むのか、あるいは平行移動不変なのか、といった感覚を持つことができる。ガウス過程を使うと、データに適合しうる関数値に対するガウス分布を直接指定することで、これらの性質をモデルに容易に組み込める。 まずはいくつかの例から始めて、ガウス過程がどのように働くのかをつかもう。 次のような回帰ターゲット(出力)\ :math:`y` を、入力 :math:`x` によって添字付けされたデータセットを観測したとする。例として、ターゲットは二酸化炭素濃度の変化量であり、入力はそれらが記録された時刻かもしれない。データの特徴は何だろうか? どのくらい速く変化しているように見えるだろうか? データ点は規則的な間隔で収集されているだろうか、それとも入力が欠けているだろうか? 欠損している領域をどのように埋めると想像するか、あるいは :math:`x=25` までどのように予測するか? .. figure:: ../img/gp-observed-data.svg Observed data. ガウス過程でデータに適合させるためには、まず、どのような種類の関数が妥当だと考えるかについての事前分布を指定する。ここでは、ガウス過程からのいくつかのサンプル関数を示す。この事前分布は妥当そうに見えるだろうか? ここで見ているのはデータセットに適合する関数ではなく、入力に対してどのくらい速く変化するかといった、解の高レベルな性質が妥当かどうかである。なお、このノートブックにあるすべての図を再現するコードは、事前分布と推論に関する次のノートブックで示す。 .. figure:: ../img/gp-sample-prior-functions.svg Sample prior functions that we may want to represent with our model. データを条件づけると、この事前分布を用いて、データに適合しうる関数の事後分布を推論できる。ここでは、事後分布からのサンプル関数を示す。 .. figure:: ../img/gp-sample-posterior-functions.svg Sample posterior functions, once we have observed the data. これらの関数はそれぞれ、観測データと完全に整合しており、各観測点をぴったり通過している。これらの事後サンプルを使って予測を行うには、事後分布に含まれるあらゆる可能なサンプル関数の値を平均し、下の太い青線の曲線を作ればよいである。なお、この期待値を計算するのに実際に無限個のサンプルを取る必要はない。後で見るように、期待値は閉形式で計算できる。 .. figure:: ../img/gp-posterior-samples.svg Posterior samples, alongside posterior mean, which can be used for point predictions, in blue. また、予測にどの程度自信を持つべきかを知るために、不確実性の表現も欲しくなる。直感的には、事後サンプル関数のばらつきが大きい場所ほど不確実性も大きいはずである。なぜなら、真の関数が取りうる値の候補がより多いことを示しているからである。この種の不確実性は *epistemic uncertainty* と呼ばれ、情報不足に伴う *reducible uncertainty* である。データが増えるにつれて、この種の不確実性は消えていく。なぜなら、観測と整合する解が次第に少なくなるからである。事後平均と同様に、事後分散(事後分布におけるこれらの関数のばらつき)も閉形式で計算できる。陰影で示しているのは、平均の両側に事後標準偏差の2倍を取ったもので、任意の入力 :math:`x` に対して真の関数値を95%の確率で含む *credible interval* を作っている。 .. figure:: ../img/gp-posterior-samples-95.svg Posterior samples, including 95% credible set. 事後サンプルを取り除き、データ、事後平均、95% credible set だけを表示すると、図は少しすっきりする。データから離れるほど不確実性が増えていることに注目しよ。これは epistemic uncertainty の性質である。 .. figure:: ../img/gp-point-predictions.svg Point predictions, and credible set. データに適合させるために使ったガウス過程の性質は、\ *covariance function*\ 、別名 *kernel* と呼ばれるものによって強く制御される。ここで使った covariance function は *RBF (Radial Basis Function) kernel* と呼ばれ、次の形をしている。 .. math:: k_{\textrm{RBF}}(x,x') = \textrm{Cov}(f(x),f(x')) = a^2 \exp\left(-\frac{1}{2\ell^2}||x-x'||^2\right) この kernel の *hyperparameters* は解釈可能である。\ *amplitude* パラメータ :math:`a` は関数が変化する縦方向のスケールを制御し、\ *length-scale* パラメータ :math:`\ell` は関数の変化率(どれだけ「うねうね」しているか)を制御する。\ :math:`a` が大きいほど関数値の振幅は大きくなり、\ :math:`\ell` が大きいほど関数はよりゆっくり変化する。\ :math:`a` と :math:`\ell` を変えたときに、サンプル事前分布と事後分布の関数がどう変わるか見てみよう。 *length-scale* は、GP の予測と不確実性に特に顕著な影響を与える。\ :math:`||x-x'|| = \ell` のとき、関数値のペア間の共分散は :math:`a^2\exp(-0.5)` である。\ :math:`\ell` より大きい距離では、関数値どうしはほとんど無相関になる。つまり、ある点 :math:`x_*` で予測したいとき、入力 :math:`x` が :math:`||x-x'||>\ell` を満たす関数値は、予測に強い影響を与えない。 length-scale を変えると、サンプル事前分布・事後分布の関数や credible set がどう変わるか見てみよう。上の適合では length-scale を 2 にしている。ここでは :math:`\ell = 0.1, 0.5, 2, 5, 10` を考える。length-scale 0.1 は、考えている入力領域の範囲 25 に比べて非常に小さいである。たとえば、\ :math:`x=5` と :math:`x=10` における関数値は、このような length-scale では実質的に相関を持たない。一方、length-scale が 10 なら、これらの入力での関数値は強く相関する。以下の図では縦軸スケールが変わっていることに注意しよ。 |priorpoint1| |postpoint1| |priorpoint5| |postpoint5| |prior2| |post2| |prior5| |post5| length-scale が大きくなるにつれて、関数の「wiggliness」は減少し、不確実性も減少することがわかる。length-scale が小さいと、データ点が関数値について与える情報が少なくなるため、データから離れるにつれて不確実性は急速に増加する。 次に、length-scale を 2 に固定したまま、amplitude パラメータを変えてみよう。事前サンプルでは縦軸スケールを固定し、事後サンプルでは変化させているので、関数のスケールが大きくなる様子とデータへの適合の両方をはっきり見ることができる。 |priorap1| |postapoint1| |priora2| |posta2| |priora8| |posta8| amplitude パラメータは関数のスケールに影響するが、変化率には影響しないことがわかる。この時点で、私たちの手法の汎化性能は、これらの hyperparameters に妥当な値を与えられるかどうかに依存する、という感覚も得られる。\ :math:`\ell=2` と :math:`a=1` の値は妥当な適合を与えているように見えたが、他の値のいくつかはそうではなかった。幸いなことに、\ *marginal likelihood* と呼ばれるものを使って、これらの hyperparameters を頑健かつ自動的に指定する方法がある。これは推論に関するノートブックで改めて扱う。 では、GP とは実際には何だろうか? 先に述べたように、GP は単に、任意の入力集合 :math:`x_1,\dots,x_n` によって添字付けられた任意の関数値の集合 :math:`f(x_1),\dots,f(x_n)` が、同時多変量ガウス分布に従うと述べるものである。この分布の平均ベクトル :math:`\mu` は *mean function* によって与えられ、通常は定数またはゼロとする。この分布の共分散行列は、すべての入力 :math:`x` の組に対して kernel を評価したものである。 .. math:: \begin{bmatrix}f(x) \\f(x_1) \\ \vdots \\ f(x_n) \end{bmatrix}\sim \mathcal{N}\left(\mu, \begin{bmatrix}k(x,x) & k(x, x_1) & \dots & k(x,x_n) \\ k(x_1,x) & k(x_1,x_1) & \dots & k(x_1,x_n) \\ \vdots & \vdots & \ddots & \vdots \\ k(x_n, x) & k(x_n, x_1) & \dots & k(x_n,x_n) \end{bmatrix}\right) :label: eq_gp_prior 式 :eq:`eq_gp_prior` は GP の事前分布を指定している。観測した関数値 :math:`f(x_1), \dots, f(x_n)` が与えられたとき、任意の :math:`x` における :math:`f(x)` の条件付き分布を計算できる。この条件付き分布を *posterior* と呼び、予測に用いる。 特に、 .. math:: f(x) | f(x_1), \dots, f(x_n) \sim \mathcal{N}(m,s^2) ここで .. math:: m = k(x,x_{1:n}) k(x_{1:n},x_{1:n})^{-1} f(x_{1:n}) .. math:: s^2 = k(x,x) - k(x,x_{1:n})k(x_{1:n},x_{1:n})^{-1}k(x,x_{1:n}) である。ここで :math:`k(x,x_{1:n})` は :math:`i=1,\dots,n` に対して :math:`k(x,x_{i})` を評価して作る :math:`1 \times n` ベクトルであり、\ :math:`k(x_{1:n},x_{1:n})` は :math:`i,j = 1,\dots,n` に対して :math:`k(x_i,x_j)` を評価して作る :math:`n \times n` 行列である。\ :math:`m` は任意の :math:`x` に対する点予測として使え、\ :math:`s^2` は不確実性として使う。たとえば、\ :math:`f(x)` がその区間に入る確率が95%となる区間を作りたいなら、\ :math:`m \pm 2s` を使う。上のすべての図の予測平均と不確実性は、これらの式を使って作成された。観測データ点は :math:`f(x_1), \dots, f(x_n)` で与えられ、予測のために細かい刻みの :math:`x` 点を選んだ。 1つのデータ点 :math:`f(x_1)` を観測し、ある :math:`x` における :math:`f(x)` の値を求めたいとする。\ :math:`f(x)` はガウス過程で記述されるので、 :math:`(f(x), f(x_1))` の同時分布がガウス分布であることがわかる。 .. math:: \begin{bmatrix} f(x) \\ f(x_1) \\ \end{bmatrix} \sim \mathcal{N}\left(\mu, \begin{bmatrix} k(x,x) & k(x, x_1) \\ k(x_1,x) & k(x_1,x_1) \end{bmatrix} \right) 非対角成分 :math:`k(x,x_1) = k(x_1,x)` は、関数値がどの程度相関するか — つまり :math:`f(x)` が :math:`f(x_1)` からどれだけ強く決まるか — を教えてくれる。すでに見たように、\ :math:`x` と :math:`x_1` の距離 :math:`||x-x_1||` に比べて length-scale が大きいと、関数値は強く相関する。\ :math:`f(x_1)` から :math:`f(x)` を決める過程は、関数空間でも、\ :math:`f(x_1), f(x)` の同時分布でも可視化できる。まず、\ :math:`k(x,x_1) = 0.9`\ 、\ :math:`k(x,x)=1` となる :math:`x` を考える。これは、\ :math:`f(x)` の値が :math:`f(x_1)` の値と中程度に相関していることを意味する。同時分布では、等確率曲線は比較的細い楕円になる。 :math:`f(x_1) = 1.2` を観測したとする。 この :math:`f(x_1)` の値で条件づけるには、密度の図において 1.2 の位置に水平線を引けばよく、すると :math:`f(x)` の値は主として :math:`[0.64,1.52]` に制約されることがわかる。これを関数空間でも描いており、観測点 :math:`f(x_1)` をオレンジで、\ :math:`f(x)` に対するガウス過程予測分布の1標準偏差を青で、平均値 1.08 のまわりに示している。 |Contours of constant probability of a bivariate Gaussian density over :math:`f(x_1)` and :math:`f(x)` with :math:`k(x,x_1) = 0.9`.| |Gaussian process predictive distribution in function space at :math:`f(x)`, with :math:`k(x,x_1) = 0.9`.| 次に、より強い相関 :math:`k(x,x_1) = 0.95` があるとする。 すると楕円はさらに細くなり、\ :math:`f(x)` の値は :math:`f(x_1)` によってさらに強く決まる。1.2 に水平線を引くと、\ :math:`f(x)` の等高線は主として :math:`[0.83, 1.45]` の値を支持していることがわかる。ここでも、平均予測値 1.14 のまわりに1標準偏差を示した関数空間の図を示す。 |Contours of constant probability of a bivariate Gaussian density over :math:`f(x_1)` and :math:`f(x)` with :math:`k(x,x_1) = 0.95`.| |Gaussian process predictive distribution in function space at :math:`f(x)`, with :math:`k(x,x_1)` = 0.95.| 相関が強くなると、ガウス過程の事後平均予測は 1.2 に近づくことがわかる。また、不確実性(誤差棒)もやや小さくなっている。これらの関数値の間に強い相関があるにもかかわらず、観測したデータ点は1つだけなので、不確実性は依然としてかなり大きいままである。 この手順は、観測した点の数にかかわらず、任意の :math:`x` に対する :math:`f(x)` の事後分布を与えてくれる。\ :math:`f(x_1), f(x_2)` を観測したとしよう。ここでは、特定の :math:`x=x'` における :math:`f(x)` の事後分布を関数空間で可視化する。\ :math:`f(x)` の厳密な分布は上の式で与えられる。\ :math:`f(x)` はガウス分布に従い、平均は .. math:: m = k(x,x_{1:3}) k(x_{1:3},x_{1:3})^{-1} f(x_{1:3}) 分散は .. math:: s^2 = k(x,x) - k(x,x_{1:3})k(x_{1:3},x_{1:3})^{-1}k(x,x_{1:3}) である。 この入門ノートブックでは、\ *noise free* の観測を考えてきた。後で見るように、観測ノイズを含めるのは簡単である。データが、潜在的なノイズなし関数 :math:`f(x)` に iid Gaussian noise :math:`\epsilon(x) \sim \mathcal{N}(0,\sigma^2)` を加えたものとして生成されると仮定するなら、共分散関数は単に :math:`k(x_i,x_j) \to k(x_i,x_j) + \delta_{ij}\sigma^2` となる。ここで :math:`\delta_{ij} = 1` は :math:`i=j` のとき、そうでなければ 0 である。 ここまでで、ガウス過程を使って解の事前分布と事後分布をどのように指定できるか、そして kernel 関数がこれらの解の性質にどう影響するかについて、ある程度の直感を得た。次のノートブックでは、ガウス過程の事前分布を正確に指定する方法を示し、さまざまな kernel 関数を導入・導出し、その後、kernel の hyperparameters を自動的に学習し、予測のためのガウス過程事後分布を構成する仕組みを説明する。「関数の分布」のような概念に慣れるには時間と練習が必要であるが、GP の予測式を求める実際の手順自体は非常に単純である — そのため、これらの概念について直感的な理解を身につける練習がしやすくなっている。 要約 ---- 典型的な機械学習では、何らかの自由パラメータを持つ関数(たとえばニューラルネットワークとその重み)を指定し、そのパラメータの推定に焦点を当てるが、それらは解釈しにくいことがある。ガウス過程では、その代わりに関数に対する分布そのものについて推論するため、解の高レベルな性質について考えることができる。これらの性質は共分散関数(kernel)によって制御され、そこにはしばしば少数の非常に解釈しやすい hyperparameters がある。これらの hyperparameters には、関数がどれだけ速く(どれだけうねうねと)変化するかを制御する *length-scale* が含まれる。もう1つの hyperparameter は amplitude で、関数が変化する縦方向のスケールを制御する。 データに適合しうる多様な関数を表現し、それらをすべてまとめて予測分布に統合することは、ベイズ法の特徴的な性質である。データから離れるほど取りうる解のばらつきが大きくなるため、直感的にはデータから離れるにつれて不確実性が増していく。 ガウス過程は、取りうるすべての関数値に対して多変量正規(ガウス)分布を指定することで、関数の分布を表現する。ガウス分布は容易に操作できるので、ある関数値の分布を、他の任意の値の集合に基づいて求めることができる。言い換えると、点の集合を観測したなら、それらの点で条件づけて、他の任意の入力における関数値がどのような分布になりうるかを推論できる。これらの点の相関をどのようにモデル化するかは共分散関数によって決まり、それがガウス過程の汎化特性を定義する。ガウス過程に慣れるには時間がかかるが、扱いやすく、多くの応用があり、ニューラルネットワークのような他のモデルクラスを理解・発展させる助けにもなる。 演習 ---- 1. epistemic uncertainty と observation uncertainty の違いは何ですか? 2. 変化率と amplitude 以外に、どのような関数の性質を考慮したいだろうか。また、その性質を持つ関数の現実世界の例にはどのようなものがあるか? 3. ここで考えた RBF 共分散関数は、観測間の共分散(および相関)が入力空間(時刻、空間的位置など)での距離とともに減少すると述べている。これは妥当な仮定だろうか? なぜそう言える、あるいはそう言えないのだろうか? 4. 2つのガウス変数の和はガウスですか? 2つのガウス変数の積はガウスですか? :math:`(a,b)` が同時ガウス分布に従うとき、\ :math:`a|b`\ (\ :math:`b` が与えられたときの :math:`a`\ )はガウスですか? ガウスではないですか? 5. :math:`f(x_1) = 1.2` のデータ点を観測する演習を繰り返せよ。ただし今度は、さらに :math:`f(x_2) = 1.4` も観測したとする。\ :math:`k(x,x_1) = 0.9`\ 、\ :math:`k(x,x_2) = 0.8` とする。\ :math:`f(x)` の値について、\ :math:`f(x_1)` だけを観測したときよりも、より確信を持てるだろうか、それともより不確かだろうか? 今の :math:`f(x)` の平均と95% credible set はどうなるか? 6. 観測ノイズの推定値を増やすと、真の関数の length-scale の推定値は大きくなると思うか、それとも小さくなると思うか? 7. データから離れるにつれて、予測分布の不確実性がある点まで増加した後、増加しなくなるとする。なぜそのようなことが起こるのだろうか? .. |priorpoint1| image:: ../img/gp-priorpoint1.svg .. |postpoint1| image:: ../img/gp-postpoint1.svg .. |priorpoint5| image:: ../img/gp-priorpoint5.svg .. |postpoint5| image:: ../img/gp-postpoint5.svg .. |prior2| image:: ../img/gp-prior2.svg .. |post2| image:: ../img/gp-post2.svg .. |prior5| image:: ../img/gp-prior5.svg .. |post5| image:: ../img/gp-post5.svg .. |priorap1| image:: ../img/gp-priorap1.svg .. |postapoint1| image:: ../img/gp-postapoint1.svg .. |priora2| image:: ../img/gp-priora2.svg .. |posta2| image:: ../img/gp-posta2.svg .. |priora8| image:: ../img/gp-priora8.svg .. |posta8| image:: ../img/gp-posta8.svg .. |Contours of constant probability of a bivariate Gaussian density over :math:`f(x_1)` and :math:`f(x)` with :math:`k(x,x_1) = 0.9`.| image:: https://user-images.githubusercontent.com/6753639/206867364-b4707db5-0c2e-4ae4-a412-8292bca4d08d.svg .. |Gaussian process predictive distribution in function space at :math:`f(x)`, with :math:`k(x,x_1) = 0.9`.| image:: https://user-images.githubusercontent.com/6753639/206867367-3815720c-93c8-4b4b-80e7-296db1d3553b.svg .. |Contours of constant probability of a bivariate Gaussian density over :math:`f(x_1)` and :math:`f(x)` with :math:`k(x,x_1) = 0.95`.| image:: https://user-images.githubusercontent.com/6753639/206867797-20e42783-31de-4c50-8103-e9441ba6d0a9.svg .. |Gaussian process predictive distribution in function space at :math:`f(x)`, with :math:`k(x,x_1)` = 0.95.| image:: https://user-images.githubusercontent.com/6753639/206867800-d9fc7add-649d-492c-8848-cab07c8fb83e.svg