ガウス過程回帰メモ(1)

nn番煎じ感ありますが、「ガウス過程と機械学習」を読んだのでガウス過程回帰についてメモ。かなり五月雨式ではありますが。。。 ところどころコードも挟んでます。

線形回帰と次元の呪い

1次元の入力xxについて

ϕ(x)=(1,x,x2,x3)T\phi(x) = (1, x, x^2, x^3)^{\mathrm{T}}

という特徴ベクトルを考えれば

y=w0+w1x+w2x2+w3x3y = w_0 + w_1 x + w_2 x^2 + w_3 x^3

という線形回帰モデルとして表される。線形回帰については昔書いたのでこちら参照。

これについて一般化(ϕ(x)=(1,x,x2,x3)T\boldsymbol{\phi}(x) = (1, x, x^2, x^3)^{\mathrm{T}})すると

y=wTϕ(x)y = \boldsymbol{w}^{\mathrm{T}} \boldsymbol{\phi} (x)

先程の式は4つの基底関数の重み付き和として見ることができる。 基底関数をϕh(x)=exp((xμh)2σ2)\phi_{h}(x) = \exp{\left( - \frac{\left(x - \mu_h \right)^2}{\sigma^2} \right)}(ガウス基底関数)としたとき、

Figure 1

(μh(H,...,2,1,0,1,2,...,H)\mu_h \in (-H, ..., -2, -1, 0, 1, 2, ..., H))

となる。

[code]

先ほどの基底関数に関して適当に重み付けを行い、 y=h=HHwhexp((xμh)2σ2 )y = \sum_{h=-H}^{H} w_h \exp{\left(- \frac{\left(x - \mu_h \right)^2}{\sigma^2}  \right)}

とすると、下記のようなほとんど任意の形の関数が表される。 Figure 2 この方法は動径基底関数回帰(radial basis function regression)という。

[code]

一見すると任意の関数を表現することができそうなので良さそうだが、入力x\boldsymbol{x}が1次元のとき、H=10H=10としたとき重みw\boldsymbol{w}の次元は 2H+1=212H+1=21次元。 これは基底関数の個数と同じ。

入力 x\boldsymbol{x} が2次元のとき、基底関数の個数は212=44121^2 = 441
入力 x\boldsymbol{x} が3次元のとき、基底関数の個数は213=926121^3 = 9261
入力 x\boldsymbol{x} が10次元のとき、基底関数の個数は2110=1667988097820121^10=16679880978201
これを、次元の呪い(curse of dimensionality)という。

入力 x\boldsymbol{x} が2次元、H=1H=1の例 Figure 3

[code]

ガウス過程

ということで無限次元の基底関数について無限次元の重みw\boldsymbol{w}を計算するのは不可能なので、w\boldsymbol{w}について事前分布を設け、w\boldsymbol{w}期待値をとって積分消去することを考える。

入力 x\boldsymbol{x} について x\boldsymbol{x} の特徴ベクトルを

ϕ(x)=(ϕ0(x),ϕ1(x),,ϕH(x))T\boldsymbol{\phi}(\boldsymbol{x}) = \left(\phi_0(\boldsymbol{x}), \phi_1(\boldsymbol{x}), \cdots, \phi_H(\boldsymbol{x}) \right)^{\mathrm{T}}

とするとN個の特徴ベクトルに対する線形回帰は下記のように表される。

( y^1 y^2  y^N)y^=(     ϕ0(x1)ϕ1(x1)ϕH(x1)   ϕ0(x2)ϕ1(x2)ϕH(x2)      ϕ0(xN)ϕ1(xN)ϕH(xN)  )Φ( w0 w1   wH)w\begin{aligned} \displaystyle \underbrace{ \left( \begin{array}{c}   \hat{y}_1\\   \hat{y}_2\\   \vdots \\   \hat{y}_N \end{array} \right)}_{\hat{\boldsymbol{y}}} = \underbrace{ \left(     \begin{array}{cccc}       \phi_0(\boldsymbol{x}_1) & \phi_1(\boldsymbol{x}_1) & \cdots & \phi_H(\boldsymbol{x}_1)\\       \phi_0(\boldsymbol{x}_2) & \phi_1(\boldsymbol{x}_2) & \cdots & \phi_H(\boldsymbol{x}_2)\\       \vdots & \vdots & \ddots & \vdots\\       \phi_0(\boldsymbol{x}_N) & \phi_1(\boldsymbol{x}_N) & \cdots & \phi_H(\boldsymbol{x}_N)     \end{array} \right) }_{\Phi} \underbrace{ \left( \begin{array}{c}   w_0\\   w_1\\   \vdots \\   \vdots \\   w_H \end{array} \right) }_{\boldsymbol{w}} \end{aligned}

ここで、計画行列Φ\Phix1,xNx_1, \cdots x_Nが与えられれば定数行列となる。

重みがRidge Regressionと同様に wN(0,λ2I)\boldsymbol{w} \sim \mathcal{N}(\boldsymbol{0}, \lambda^2 \boldsymbol{\mathrm{I}}) に従うとき、 線形変換された y=Φw\boldsymbol{y} = \Phi \boldsymbol{w} もまたガウス分布に従う。 このとき、共分散行列は

Σ=E[yyT] E[y]E[y]T=E[(Φw)(Φw)T]  (E[y]=E[Φw]=ΦE[w]=0)=ΦE[wwT]ΦT=λ2ΦΦT  (E[wwT]=λ2I)\begin{aligned} \Sigma &= \mathop{\mathbb{E}}[\boldsymbol{yy}^{\mathrm{T}}] -  \mathop{\mathbb{E}}[\boldsymbol{y}] \mathop{\mathbb{E}}[\boldsymbol{y}]^{\mathrm{T}}\\ &= \mathop{\mathbb{E}}[(\Phi \boldsymbol{w})(\Phi \boldsymbol{w})^{\mathrm{T}}] \ \ (\because \mathop{\mathbb{E}}[\boldsymbol{y}] = \mathop{\mathbb{E}}[\Phi \boldsymbol{w}] = \Phi \mathop{\mathbb{E}}[\boldsymbol{w}] = \boldsymbol{0} ) \\ &= \Phi \mathop{\mathbb{E}}[\boldsymbol{ww}^{\mathrm{T}}] \Phi^{\mathrm{T}} \\ &= \lambda^2 \Phi \Phi^{\mathrm{T}}\ \ (\because \mathop{\mathbb{E}}[\boldsymbol{ww}^{\mathrm{T}}] = \lambda^2 \boldsymbol{\mathrm{I}} ) \end{aligned}

となる。したがって、y\boldsymbol{y} の分布は多変量ガウス分布

y=N(0,λ2ΦΦT)\boldsymbol{y} = \mathcal{N}\left( \boldsymbol{0}, \lambda^2 \Phi \Phi^{\mathrm{T}} \right)

となる。上記の式は、線形回帰モデルにあった重み w\boldsymbol{w} は期待値が取られて消えていることに注意。 つまり、y\boldsymbol{y} の分布はデータ数N\boldsymbol{N}に依存する共分散行列λ2ΦΦT\lambda^2 \Phi \Phi^{\mathrm{T}}によってきまることになる。

件の共分散行列をK=λ2ΦΦT\boldsymbol{\mathrm{K}} = \lambda^2 \Phi \Phi^{\mathrm{T}}x\boldsymbol{x} の特徴ベクトルをϕ(x)=(ϕ0(x),ϕ1(x),,ϕH(x))T\boldsymbol{\phi}(\boldsymbol{x}) = \left(\phi_0(\boldsymbol{x}), \phi_1(\boldsymbol{x}), \cdots, \phi_H(\boldsymbol{x}) \right)^{\mathrm{T}}とすると、(n,n)(n, n^{\prime})要素は

Knn=λ2ϕ(xn)Tϕ(xn)K_{nn^{\prime}} = \lambda^2 \boldsymbol{\phi}(\boldsymbol{x}_n)^{\mathrm{T}} \boldsymbol{\phi}(\boldsymbol{x}_{n^{\prime}})

となる。つまり、2つの変数の共分散が大きいとは、似た値を取りやすいということなので、特徴量ベクトルの内積が大きい、すなわち特徴ベクトル空間において xnx_nxnx_n が似ているなら、対応するyny_nyny_n も似た値を持つことになる。

K=λ2ΦΦT=λ2( ϕ(xn)T)Φ( ϕ(xn))ΦT\boldsymbol{\mathrm{K}} = \lambda^2 \Phi \Phi^{\mathrm{T}} = \lambda^2 \underbrace{ \left(  \begin{array}{c} \vdots\\ \boldsymbol{\phi}(\boldsymbol{x}_n)^{\mathrm{T}}\\ \vdots \end{array} \right) }_{\Phi} \underbrace{ \left(  \begin{array}{ccc} \cdots & \boldsymbol{\phi}(\boldsymbol{x}_{n'}) & \cdots \end{array} \right) }_{\Phi^{\mathrm{T}}}

参考書の中には、「ガウス過程の直感的な性質として入力 x\boldsymbol{x} が似ていれば、出力 yy も似ている」という旨が書かれていましたが、まさしくこのこと言っているのだと感じた。

参考書と同様に観測データ y\boldsymbol{y} は予め平均を引いておけば平均を 0\boldsymbol{0} にできるので下記のガウス過程を扱う。

yN(0,K)\boldsymbol{y} \sim \mathcal{N} \left(\boldsymbol{0}, K\right)

カーネルトリック

上の式によれば、y\boldsymbol{y} の分布は共分散行列 KK の要素、

Knn=λ2ϕ(xn)Tϕ(xn)K_{nn^{\prime}} = \lambda^2 \boldsymbol{\phi}(\boldsymbol{x}_n)^{\mathrm{T}} \boldsymbol{\phi}(\boldsymbol{x}_{n^{\prime}})

だけで定まることがわかる。この値については結果さえ求まれば、ϕ(xn)\boldsymbol{\phi}(\boldsymbol{x}_n) を明示的に求める必要はない(!!!!)。 KnnK_{nn^{\prime}} の値を与える関数を

xnx_nxnx_n のカーネル関数(kernel function)とよび

k(xn,xn)=ϕ(xn)Tϕ(xn)k(\boldsymbol{x}_n, \boldsymbol{x}_{n'}) = \boldsymbol{\phi}(\boldsymbol{x}_n)^{\mathrm{T}} \boldsymbol{\phi}(\boldsymbol{x}_{n'})

と書く。

特徴ベクトルϕ(x)\boldsymbol{\phi}(\boldsymbol{x})を直接表現することを避け、カーネル関数だけで内積を計算することをカーネルトリック(kernel trick)と呼ぶ。

ガウス過程の定義

Definition 3.4 (ガウス過程の正確な定義) どんな自然数NNについても、入力 x1,x2,,xNX\boldsymbol{x}_1, \boldsymbol{x}_2, \cdots, \boldsymbol{x}_N \in \mathcal{X} に対応する出力のベクトル

f=(f(x1),f(x2),f(xN))\boldsymbol{\mathrm{f}} = (f(\boldsymbol{x}_1), f(\boldsymbol{x}_2), \cdots f(\boldsymbol{x}_N))

が平均

μ=(μ(x1),μ(x2),,μ(xN))\boldsymbol{\mu} = (\mu(\boldsymbol{x}_1), \mu(\boldsymbol{x}_2), \cdots, \mu(\boldsymbol{x}_N))

Knn=k(xn,xn)K_{nn'} = k(\boldsymbol{x}_n, \boldsymbol{x}_{n^{\prime}})

を要素とする行列Kを共分散行列とするガウス分布 N(μ,K)\mathcal{N}(\boldsymbol{\mu}, \boldsymbol{\mathrm{K}}) に従うとき、 ff はガウス過程に従うといい、これを

fGP(μ(x),k(x,x))f \sim GP(\mu(\boldsymbol{x}), k(\boldsymbol{x}, \boldsymbol{x}^{\prime}))

と書く。

ガウス過程からのサンプル

入力 x\boldsymbol{x} の間の類似度を図るためによく使われるガウスカーネル(Gaussian kernel)

k(x,x)=θ1exp(xx2θ2)k(\boldsymbol{x}, \boldsymbol{x}^{\prime}) = \theta_1 \exp \left( - \frac{|\boldsymbol{x} - \boldsymbol{x}^{\prime}|^2}{\theta_2} \right)

についてサンプルを行ってみると下記のようなサンプルが得られる。 Figure 4 また、このときのKKを可視化すると、 Figure 5 となっており、近いデータ間の共分散が大きくなっていることがわかる。

[code]


Written by@Minato Sato
Senior Software Engineer - Embedded AI

GitHubTwitterFacebookLinkedIn

© 2023 Minato Sato. All Rights Reserved