はじめに
Materials Informaticsの情報を集めていると最近はそこらかしこでベイズ最適化の話題が出てきます。ベイズ最適化では、まず、予測したい系のサロゲートモデルを作成し、分散と予測値を出力させます。その後、獲得関数を計算し、次の観測地を決めるわけですが、そのときに最も一般的に用いられるのがガウス過程回帰です。今回は「ガウス過程と機械学習 (機械学習プロフェッショナルシリーズ)」で学んだ内容のメモを記載していきます。
線形回帰
\begin{aligned}
y &= w^T\Phi(x) \cdots (1) \\
&= w_0\phi_0(x) + w_1\phi_1(x) + … + w_H\phi_H(x)
\end{aligned}
行列で書くと
\left(
\begin{matrix}
y _ 1 \\
\vdots \\
y _ N
\end{matrix}
\right)
= \left(
\begin{matrix}
\phi_0(x_1) & \cdots & \phi_H(x_1) \\
\vdots & \ddots & \vdots \\
\phi_0(x_N) & \cdots & \phi_H(x_N)
\end{matrix}
\right) \cdot
\left(
\begin{matrix}
w _ 1 \\
\vdots \\
w _ H
\end{matrix}
\right)
ここで、w ∼ N(0, \lambda^2 I) から生成されたものとすると(1)はyも正規分布に従う。
これの期待値をとると、
E[y] = E[\phi w] = \phi E[w] = 0
共分散行列は、
\begin{aligned}
\Sigma &= E[yy^T] - E[y]E[y^T] \\
&= E[(\phi w)(\phi w)^T]\\
&= \phi E[ww^T]\phi^T\\
&= \lambda^2 \phi \phi^T
\end{aligned}
なので、yの分布は多変量ガウス分布に従う
y ∼ N(0, \lambda^2 \phi \phi^T) \cdots (2)
\textcolor{red}{(1)と(2)を比較すると、wの重みが期待値をとることで消えている!}
\textcolor{red}{→wを求める必要がなく、yの分布はデータ数Nに依存する\lambda^2 \phi \phi^Tのみで決まる}
ガウス過程
どんなN個の入力の集合(x_1, x_2, \cdots, x_N)についても、対応する出力y(y_1, y_2, \cdots, y_N)の同時分布が多変量ガウス分布に従う。
ガウス過程の意味
(2)の共分散行列をK = \lambda^2 \phi \phi^Tとすると以下のようになる。
K = \lambda^2 \phi \phi^T = \lambda^2 \left(
\begin{matrix}
\vdots \\
\phi(x_n)^T \\
\vdots \\
\end{matrix}
\right)
\left( \begin{matrix}
\cdots & \phi(x_n') & \cdots \\
\end{matrix}
\right)
つまり、X_nとX_n'の内積の定数倍( \lambda )が K(n,n') 要素になる
\textcolor{red}{多変量ガウス分布では2つの変数間の内積が大きい}
\textcolor{red}{ → 似た値を取りやすいことを意味する}
\textcolor{red}{ → 入力xが似ていれば出力yも似ている}
カーネルトリック
(2)を見るとyの分布は\lambda^2 \phi \phi^Tだけわかればよい。
また、 \lambda^2は定数なので \phi\phi^T がわかればよい!
なので、K_{n, n'} = \phi(x_n)^T \phi(x_n')を与えるカーネル関数を定義する。
K(x_n, x_n') = \phi(x_n)^T \phi(x_n')
例えば、X = (x_1, x_2)^T, X' = (x_1', x_2')^T とすると K(X, X') = (x_1x_1' + x_2x_2' + 1)^2 は簡単に計算できる
これを展開すると
K(X, X') = (x_1'^2, x_2'^2, \sqrt2 x_1'x_2', \sqrt2 x_1', \sqrt2 x_2', 1)となる
これは、特徴ベクトルを\Phi(x) = (x_1^2, x_2^2, \sqrt2 x_1x_2, \sqrt2 x_1, \sqrt2 x_2, 1)として、K(X, X') = \phi(X)\phi(X')となる。
ただ、\phi(X)や\phi(X')を計算する必要はなく、K(X, X')のみを解ければいい。
つまり、特徴ベクトルを直接表現することを避けて、カーネル関数だけで内積を計算できるようにする
→ これをカーネルトリックという。
よく使われるカーネル関数
・ガウスカーネル(RBFカーネル)
・指数カーネル
・Maternカーネル
ガウス過程回帰
N個の観測値(入力x \in \mathcal Xと出力y \in \mathbb{R})があるとする
D = {(x_1, y_1), (x_2, y_1), \cdots, (x_N, y_N)}
yは平均が0になるように正規化され、y = f(x)という関係があり、f ∼ GP(0, K(x, x')とする
よって、y ∼ N(0, K)
このときデータにないx^*でのy^*の値はどうなるか
→ yにy^*を含めたものを新しくy' = (y_1, y_2, \cdots, y_N, y^*)とし、x_1, x_2, \cdots, x_N, x^*から計算される(N+1)×(N+1)のK'を用いる
\left(
\begin{matrix}
y \\
y^*
\end{matrix}
\right) ∼ N
\left(
\begin{matrix}
0,
\left(
\begin{matrix}
K & K^* \\
K^{*T} & K^{**}
\end{matrix}
\right)
\end{matrix}
\right)
これを図示すると以下のようになる
![](https://storage.googleapis.com/zenn-user-upload/4a696d564be0-20240611.png)
ここで、
K^* = (k(x^*, x_1), \cdots, k(x^*, x_N)^T → 新しいデータx^*と学習データxの間の類似度
K^{**} = k(x^*, x^*) → 新しいデータx^*の自分との類似度(=1)
\left(
\begin{matrix}
y \\
y^*
\end{matrix}
\right) ∼ N
\left(
\begin{matrix}
0,
\left(
\begin{matrix}
K & K^* \\
K^{*T} & K^{**}
\end{matrix}
\right)
\end{matrix}
\right)
はyとy^*の同時分布の式なので、yが与えられたときのy^*の条件つき確率はガウス分布の要素間の上限付き確率から求められる
\left(
\begin{matrix}
y_1 \\
y_2
\end{matrix}
\right) ∼ N
\left(
\begin{matrix}
\begin{matrix}
\mu _1 \\
\mu _2
\end{matrix}
\left(
\begin{matrix}
\Sigma _{11} & \Sigma _{12} \\
\Sigma _{21} & \Sigma _{22}
\end{matrix}
\right)
\end{matrix}
\right)
のとき、ベクトルy_1が与えられたときのy_2の分布は
P(y_2 | y_1) = N(\mu _2 + \Sigma _{21}\Sigma _{11}^{-1}(y_1 - \mu _1), \Sigma_{22} - \Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12})
\mu_1, \mu_2は0なので、
P(y_2 | y_1) = N(\Sigma _{21}\Sigma _{11}^{-1}y_1, \Sigma_{22} - \Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12})
P(y^* | x^*, D) = N(K^{*T} K^{-1}y, K^{**} - K^{*T} K^{-1} K^*)
ガウス過程回帰(アルゴリズム)
入力
xtrain = [x_1, x_2, \cdots, x_N]
ytrain = [y_1, y_2, \cdots, y_N]
xtest = [x_1', \cdots, x_M']
出力:
\mu :xtestに対応するyの期待値
\nu :xtestに対応するyの分散
ガウス過程回帰のアルゴリズム
![](https://storage.googleapis.com/zenn-user-upload/a0a5d5c7f9f8-20240611.png)
ガウス過程回帰のパラメータ設定
カーネルで例えばRBFを用いていたら\theta_1 = 1, \theta_2 = 0.4, \theta_3 = 0.1と手で与えていた。これはどのように設定するべきか?
\Theta = (\theta_1, \theta_2,\theta_3)とすると
k(x, x'|\theta) = \theta _1exp \Bigl( -\frac{|x-x'|^2}{\theta_2}\Bigl) + \theta_3\delta(x, x')
あとはこのときの確率が以下で表される
P(y|X, \Theta) = N(y | 0, K_{\theta} ) = \frac{1}{2\pi^{\frac{N}{2}}} \frac{1}{|K_{\theta}|^{\frac{1}{2}}}exp \Bigl(- \frac{1}{2}y^TK_{\theta}^{-1}y\Bigl)
これの
logPをとり、
L = logP = \cdotsとしたときの
\frac{\delta L}{\delta\theta}を計算すればよい。これにはSCG法やL-BFGS法などがある。
Discussion