Joeの精進記録

旧:競プロ練習記録

機械学習のためのGaussian Processを簡潔に

ガウス過程 (Gaussian Process; GP)を簡潔に説明します。日本語の類書や類ウェブページ?はたくさんありますが以下の差別化を図りました

  • できるだけ数式による説明を心がけます
  • 定義をスムーズにするために関数空間の観点からGPによる回帰を説明し、実は線形モデルの非線形空間への拡張でも同じ式が得られることを示します(多くの説明だと逆?)

GPは○○の性質をもつ!みたいなのをひたすら書いている本を読んだのですが、だいぶ読みにくかったので簡潔さを心がけました。

すべての説明は

http://www.gaussianprocess.org/gpml/chapters/RW.pdf

の第2章に基づいていますが、導入の順序が異なります。

定義

関数 f\colon \mathcal{X} = \mathbb{R}^d \rightarrow \mathbb{R}がGaussian Process  \mathrm{GP}(\mu, k) ( \mu\colon \mathcal{X} \rightarrow \mathbb{R},  k\colon \mathcal{X} \times \mathcal{X} \rightarrow \mathbb{R}_+)に従うとは、任意の有限個の点集合 x_1, \ldots, x_n \in \mathcal{X}について、  f(x_1), \ldots, f(x_n)が多次元正規分布 \mathcal{N}(\mu(\mathbb{x}), k(\mathbb{x}))に従うことをいう。ここで、\mu(\mathbb{x})は平均を表す n次元ベクトルで i番目の要素が \mu(x_i)になってるものであり、 k(\mathbb{x})は共分散を表す n次正方行列で (i, j)要素が k(x_i, x_j)になっているものである。

普通、共分散はデータが与えられて、そこから平均を求めて計算されるものだと思いますが、今の文脈では、共分散関数(カーネルともいう)が予め定められています。つまり、2つの xが与えられるとそれらの値 f(x)は、 f(x)の共分散が共分散関数に従うように分布する、と考えます。

イメージと補足

定義は実はこれだけです。 f(x_1), \ldots, f(x_n)が多次元正規分布に従うというのがあまりにGPの本質なのですが、この多次元正規分布としてよくあるような二次元正規分布のような平面図(もしくは立体図)をイメージしてしまうと回帰にどう役立つんだ???という気持ちになってしまうと思います。いま、観測値がわかっているデータ点が n個あるとすると、この多次元正規分布 n次元になっています。 n次元空間をイメージする代わりに、この n点の近くには存在しやすく、点から遠い場所では存在しにくいような分布を \mathcal{X} = \mathbb{R}^dについて想像してみましょう。簡単な場合として、 \mathcal{X} = \mathbb{R}としますと、以下のような図を想像できるかなと思います(回帰でよく見そうな形をしていますね!)

f:id:xuzijian629:20190621021035p:plain (図は上記pdfから)

ノイズ付きのデータからの推論

 x_1, \ldots, x_n \in \mathcal{X}の各点について、 y_i = f(x_i) + \varepsilonに従うノイズが加わったデータが観測されており、未知のデータ点 x_1^*, \ldots, x_m^*についての予測値 f(x_1^*), \ldots, f(x_m^*)を得たいとします。

データ点 \mathbb{y} = (y_1, \ldots, y_n)^T,  \mathbb{f}^* = (f(x_1^*), \ldots, f(x_m^*))^Tが、GPに従う関数 fによって生成されているとします。いま、 fに関する事前知識がないため、平均が \mathbb{0}の関数を考えます。このとき、 \mathbb{y}, \mathbb{f}^*は次の事前分布に従います。

f:id:xuzijian629:20190621022842p:plain

 \sigma_nはノイズ \varepsilonの分散で、ノイズはガウシアンだとします。ガウス分布の共分散行列は n + m次正方行列で、 (i, j)要素が k(\cdot, \cdot)なのですが、注意すべきは左上の n \times n要素部分で、この部分の対角成分には、ノイズによる分散が入ります。なぜなら、異なるデータ間におけるノイズによる共分散は0ですが、自分自身との間ではそうはいかないからです。右上、左下のブロック行列はそれぞれ、サイズ n \times m,  m \times nの行列です。

さて、これを鬼のように変形すると、 \mathbb{f}^*の分布が次のように求まります(だいぶややこしいですが省略します)。

f:id:xuzijian629:20190622045425p:plain

これで、 \mathbb{f}^*を推定することができました。この推定は、最尤推定と異なり、最頻値(この場合平均に一致)だけではなく、分散も同時に推定可能です。

線形モデルからの拡張に一致すること

GPの説明にはいつもこの話がつきまとうかなと思います。上述した話だけで本来完結するのですが、せっかくなのでこちらも説明しておきます。

線形モデルとは、入力 x \in \mathbb{R}^dに対し、出力 y \in \mathbb{R} f(x) = x^T wによって予測するモデルで、パラメータ wを学習します。

実際のデータはこれに分散 \sigma^2ガウス分布に従うノイズが加わって生成されている(つまり y = f(x) + \varepsilon)とすると、データ \mathbb{y} X = (x_1, \ldots, x_n), wから得られる条件付き確率は

f:id:xuzijian629:20190622050625p:plain

となります。最尤推定だと、これを最大化するようなパラメータ wを求めて終了ですが、いま、Bayesianの考え方をします。すなわち、もともと、パラメータが w \sim \mathcal{N}(0, \Sigma_p)という事前分布に従っていた場合、 \mathbb{y}が得られたあとの wの分布の変化はBayesの法則を使って鬼のように計算をすると

f:id:xuzijian629:20190622051009p:plain

となります(再び省略)。線形モデルで推論するときも、最尤推定とは違い、あらゆる wの可能性について、その重みをとって出力を推定します。このとき出力は

f:id:xuzijian629:20190622051929p:plain

となります。

さて、線形モデルだけではやはり性能に限界があります。というのも、データ点が超平面によって二分されるような場合しかうまく動かないです。そこで、各データ点をある関数 \phi \colon \mathbb{R}^d \rightarrow \mathbb{R}^{d'}によって高次元空間上にマップしてから、その高次元空間上で線形モデルを動かす、という方法が考えられます。すなわち f(x) = \phi(x)^T wによって出力を予想します。ここでの重み wは線形モデルでは d次元でしたが、今は高次元空間の次元 d'となっています。線形モデルのときと全く同様の議論をすることで、推論の出力は

f:id:xuzijian629:20190622051734p:plain

となります。これをさらに、変形すると(難しい)

f:id:xuzijian629:20190622052620p:plain

となりますが、これは、前のセクションの最後で見た、関数空間による定義から導かれた推論の結果に一致しています。関数空間の定義で指定されるべきカーネル関数 k\colon \mathcal{X} \times \mathcal{X} \rightarrow \mathbb{R}_+と、このセクションで指定されるべきマップ関数 \phi \colon \mathbb{R}^d \rightarrow \mathbb{R}^{d'}&  \Sigma_pの間には深いつながりがあります。具体的にはpdfの12ページ。kernel / kernel trickを御覧ください。

まとめ

正直このページでは簡潔に説明しすぎていて(式変形とかも飛ばしているし)、このページだけを読んで理解することは難しいと思います。上述したpdfのchapter 2と並列して読むことをすすめます。1, 2時間程度で理解できるのではないでしょうか。