はじめに
前回の記事では、特定の分布や関係を仮定せず、与えられたデータに柔軟に対応することのできるモデルということで、ガウス過程回帰について取り上げました。
本記事ではガウス過程をさらに深堀りし、Stanなどでガウス過程を自在に扱うための土台を固めたいと思います。
本記事の構成は以下の通りとします。
特に以下2章は力を入れました。
- 「ガウス過程潜在変数モデル」 Stan等でガウス過程を様々なモデルに活用するために不可欠
- 「カテゴリカルな変数を用いたカーネル」 質的変数が入力に含まれる場合にも、ガウス過程を適用できるようにするための方法を説明
当初本記事と次回の記事はひとつの記事として公開していましたが、余りにも長すぎる記事だったので、二つに分けました。
ガウス過程の導入
まず、ガウス過程を用いたモデルについて一般化します。
入力の要素数を数を$I$とし、入力データの1サンプルを$\boldsymbol{x} = (x_1, \ldots, x_I)^T$と表記し、全入力を$N × I$行列$\boldsymbol{x}$を用いて$\boldsymbol{X} = (\boldsymbol{x}_1 ,\ldots, \boldsymbol{x}_N)^T$とおきます。また出力データを$\boldsymbol{y} = (y_1, \ldots, y_N)^T$とおきます。
ガウス過程モデルの一般式は以下になります。
$$ y(\boldsymbol{x}) = \boldsymbol{\beta}\boldsymbol{f}(\boldsymbol{x}) + \epsilon(\boldsymbol{x}) \tag{1} $$
ここで$\boldsymbol{f} = (f_1(\boldsymbol{x}), \ldots, f_l(\boldsymbol{x}))$、$\boldsymbol{\beta} = (\beta_1, \ldots, \beta_l )$はそれぞれ、ガウス過程モデルとは別で設定された特徴ベクトルとその重みです。これらはガウス過程を適用する以前からデータにあてはめられたモデルになります。
$\epsilon(\boldsymbol{x})$は右辺第一項のモデルで説明しきれなかった残差としての扱いですが、この残差がガウス過程に従うと仮定します。ガウス過程モデルは得られたデータに柔軟に近づこうとする挙動をとりますので、この性質を利用して右辺第一項で説明できなかった部分をガウス過程で補おうという目論見です。
各入力の誤差項が同じ標準偏差$\sigma$をとると設定できたとき、$\boldsymbol{\epsilon}(\boldsymbol{x}) = \left(\epsilon(\boldsymbol{x}_1), \ldots, \epsilon(\boldsymbol{x}_N)\right)$が以下のガウス過程に従うとします。
$$ \boldsymbol{\epsilon}(\boldsymbol{x}) \sim \mathrm{Normal}(0, \sigma^2\boldsymbol{K}) \tag{2} $$
上式では$\epsilon$が残差を説明するものであることから多変量正規分布の平均を0としています。また分散共分散行列$\boldsymbol{K}$は、ハイパーパラメータ${\phi}$を持つカーネル関数$k_{\phi}(\boldsymbol{x}_m, \boldsymbol{x}_n)$を要素に持つ$N$×$N$行列です($m,n = 1,\ldots,N$)。
$$ \boldsymbol{K}(m,n) = k_{\phi}(\epsilon(\boldsymbol{x}_m), \epsilon(\boldsymbol{x}_n)) \tag{3} $$
各入力の標準偏差を$\sigma$で設定している為、$\boldsymbol{K}$の$(m,n)$成分は、$\epsilon(\boldsymbol{x}_m)$と$\epsilon(\boldsymbol{x}_n)$の相関に等しくなり、
$$ k_{\phi}(\epsilon(\boldsymbol{x}_m), \epsilon(\boldsymbol{x}_n)) = \mathrm{cor}(\epsilon(\boldsymbol{x}_m), \epsilon(\boldsymbol{x}_n)) \tag{4} $$
となります。
ガウス過程では、カーネル関数によって$\boldsymbol{x}_m$と$\boldsymbol{x}_n$の距離を定める空間を決定し、入力$\boldsymbol{x}_m$と$\boldsymbol{x}_n$の距離によって出力$\epsilon(\boldsymbol{x}_m)$と$\epsilon(\boldsymbol{x}_n)$の近さを決定します。また、カーネル関数によって決まる値は、$\mathrm{cor}(\epsilon(\boldsymbol{x}_m),\epsilon(\boldsymbol{x}_n))$と解釈することができる、ということです。
ガウス過程潜在変数モデル
多変量正規分布のサンプリング
$(2)$式で用いられる多変量正規分布について、ランダムにサンプルを得る方法を紹介します。
平均0、分散共分散行列$\boldsymbol{\Sigma}$の多変量正規分布からのサンプルを得る場合、まず
$$ \boldsymbol{\Sigma} = \boldsymbol{L}\boldsymbol{L}^T \tag{5} $$
を満たす行列$\boldsymbol{L}$を求めます。$(4)$式のような行列の分解はコレスキー分解と呼ばれます。
次に、標準正規分布からの乱数$\boldsymbol{x} = (x_1, \ldots, x_N)$を生成します。
$$ \boldsymbol{x} \sim \mathrm{Normal}(0,1) \tag{6} $$
$\boldsymbol{y} = \boldsymbol{L}\boldsymbol{x}$の分布は、
に$\boldsymbol{x} = \boldsymbol{L}^{-1}\boldsymbol{y}$を代入すると、変数変換による空間の単位当たり面積の変動を調整するヤコビアン$|\partial{\boldsymbol{y}}/\partial{\boldsymbol{x}}|$は定数だから、
となります。
このことから、$\mathrm{Normal} (0,\boldsymbol{\Sigma})$に従う乱数を生成するには、標準正規分布に従う$\boldsymbol{x}$をランダムに生成し、$\boldsymbol{y}=\boldsymbol{Lx}$と変換すればよいと分かります。
ガウス過程潜在変数モデルとは
モデルの残差$\epsilon(\boldsymbol{x})$がガウス過程に従うとした$(2)$式を、先ほど紹介した多変量正規分布の乱数生成法を用いて変形すると、
$$ \boldsymbol{K} = \boldsymbol{L}\boldsymbol{L}^T $$ $$ \boldsymbol{\eta} \sim \rm{Normal}(0,1) \tag{9} $$ $$ \boldsymbol{\epsilon}({\boldsymbol{x}}) = \boldsymbol{L}\boldsymbol{\eta} $$
となります。($\boldsymbol{\eta} = (\eta_1, \ldots, \eta_n)$) このように、潜在変数$\boldsymbol{\eta}$を用いたガウス過程は、ガウス過程潜在変数モデル(Latent variable GP)と呼ばれ、出力が正規分布でないとき等に有用です。
Stanでの実装
以下、Stanマニュアルを引用してLatent variable GPの実装について軽く触れておきます。
Latent variable GPのStanでの実装は以下のようになります。
data{
int<lower=1> N;
real x[N];
vector[N] y;
}
transformed data{
real delta = 1e-9;
}
parameters {
real<lower=0> rho;
real<lower=0> alpha;
real<lower=0> sigma;
vector[N] eta;
}
model {
vector[N] f;
{
matrix[N, N] L_K;
matrix[N, N] K = cov_exp_quad(x, alpha, rho);
// diagonal elements
for (n in 1:N)
K[n, n] = K[n, n] + delta;
L_K = cholesky_decompose(K);
f = L_K * eta;
}
eta ~ std_normal();
y ~ normal(f, sigma);
}
ここで、K = cov_exp_quad(x, alpha, rho)
はガウスカーネルをつくる便利な関数で、
を要素に持つカーネル行列$\boldsymbol{K}$を作成してくれます。
また、for (n in 1:N) K[n, n] = K[n, n] + delta;
とすることで、カーネル行列の対角要素に微小な値を加えていますが、こうすることでカーネル行列の逆行列の計算を安定化させています。また、コレスキー分解はその対象が正定値行列であることが必須ですが、対角要素に微小量を加えることで、その行列が正定値行列であることを保証することができます。
式$(9)$の3式の計算は、それぞれL_K = cholesky_decompose(K);
、eta ~ std_normal();
、f = L_K * eta;
と指定しています。
上のコードでは、残差ではなく出力$\boldsymbol{y}$の平均値が$\boldsymbol{f} \sim \mathrm{Normal}(0, \boldsymbol{K}_{\phi})$に従うと設定し、y ~ Normal(f, sigma)
とすることで、平均$\boldsymbol{f}$の正規分布に従うと設定していますが、この部分をポアソン分布等他の分布にすることで、様々なモデルを構築することが出来ます。
例えば、0か1のみをとる出力$\boldsymbol{y}$にベルヌーイ分布を仮定し、$y_n=1$となる確率$\boldsymbol{p} = (p_1, \dots, p_N)$を、入力$\boldsymbol{x}_n$のガウス過程を用いて説明する場合、
$$ \boldsymbol{y} \sim \mathrm{Binomial}(\boldsymbol{p}) $$ $$ \boldsymbol{p} =\mathrm{inverselogit}(\boldsymbol{f}) \tag{11} $$ $$ \boldsymbol{f} \sim \mathrm{Normal}(\mu, \boldsymbol{K}) $$
と表現でき、これをStanで実行する場合、以下のようになります。
data{
int<lower=1> N;
real x[N];
vector[N] y;
...
}
parameters{
real mu; //muはpの期待値 観測データが近くに無い場合に漸近する値
...
}
transformed parameters{
vector[N]<lower=0, upper=1> p;
...
p = mu + f;
...
}
...
model {
mu ~ std_normal()
...
y ~ bernoulli(p);
}
ガウス過程の予測分布
ガウス過程モデルにおいて、入力$\boldsymbol{x}$に含まれない値$\boldsymbol{X}^* = (\boldsymbol{x}^*_1,\ldots,\boldsymbol{x}_N^*)$に対応する出力の値$\boldsymbol{y}^* = (y^*_1, \ldots, y^*_M)$を予測したい場合、$\boldsymbol{y}$と$\boldsymbol{y}^*$の同時分布を次のようにすればよいです。
$$
\left(
\begin{array}{ccc}
y_1 \\
\vdots \\
y_N \\
y_1^* \\
\vdots \\
y_M^*
\end{array}
\right) \sim \rm{Normal} \left(\vec{0},
\left(
\begin{array}{ccc}
\boldsymbol{K} & \boldsymbol{k}^* \\
\boldsymbol{k}^{*T} & \boldsymbol{k}^{**} \\
\end{array}
\right)\right) \tag{12}
$$
ここで、$\boldsymbol{k}^*(n,m) = k_{\phi}(\boldsymbol{x}_n, \boldsymbol{x}^*_m)$、$\boldsymbol{k}^{**}(m,m) = k_{\phi}(\boldsymbol{x}_m^*, \boldsymbol{x}^*_m)$です。
カテゴリカルな変数を用いたカーネル
前回記事も含めこれまでは連続型変数を扱うことを前提にしていましたが、連続的な値をとらず、絶対的な大小関係ももたない質的変数(カテゴリカルな変数)が入力に含まれる場合、量的変数と質的変数の両方の性質を考慮した空間を定義することのできるカーネルを設定する必要があります。しかし、質的変数には「距離」の概念が無いため、ガウスカーネル等のように、各入力の「近接性」を再現するカーネルで対応することはできません。では、どのようにカーネル関数を設定すればよいのでしょうか。
質的変数が1つの場合
まず、量的変数と質的変数を含んだ入力を$\boldsymbol{w} = (\boldsymbol{x}^T, \boldsymbol{z}^T)^T$とし、$\boldsymbol{x} = (x_1, \ldots, x_I)$を量的変数、$\boldsymbol{z} = (z_1, \ldots, z_J)$を質的変数とします。それに従い、$(1)$式、$(2)$式を
$$ y(\boldsymbol{w}) = \boldsymbol{\beta}\boldsymbol{f}(\boldsymbol{w}) + \epsilon(\boldsymbol{w}) \tag{1’} $$
$$ \epsilon(\boldsymbol{z}) \sim \mathrm{Normal}(0, \sigma^2\boldsymbol{K}) \tag{2’} $$
としておきます。
簡略のため、$m_1$個の値をとる一つの質的変数$z_1$について考えます。 $\boldsymbol{w}= (\boldsymbol{x}^T, z_1) = (\boldsymbol{x}^T, u)$($u = 1,\ldots,m_1$)における$\boldsymbol{\epsilon}(\boldsymbol{x})$を、
$$
\boldsymbol{\epsilon}^*(\boldsymbol{x}) = \left(
\begin{array}{ccc}
\epsilon_1(\boldsymbol{x}) \\
\vdots \\
\epsilon_{m_1}(\boldsymbol{x})
\end{array}
\right) \tag{13}
$$
と定義します。すると、量的変数については$\boldsymbol{\epsilon}^*(\boldsymbol{x})$の各要素内でのガウス過程で完結させ、質的変数の影響については、$\boldsymbol{\epsilon}^*(\boldsymbol{x})$の各要素間の分散共分散行列を決定すれば、量的変数・質的変数双方の差異を考慮した相関関数$\mathrm{cor}(\epsilon(\boldsymbol{w}_m),\epsilon(\boldsymbol{w}_n))$を指定できそうです。そこで、$\boldsymbol{\epsilon}^*(\boldsymbol{x})$を
$$ \boldsymbol{\epsilon}^*(\boldsymbol{x}) = \boldsymbol{A}\boldsymbol{\eta}(\boldsymbol{x}) \tag{14} $$
と推定することにします。
ここで、$\boldsymbol{\eta}(\boldsymbol{x}) = (\eta_1(\boldsymbol{x}), \ldots, \eta_{m1}(\boldsymbol{x}))^T$は量的変数における「距離」を考慮する部分で、各要素がそれぞれ独立に、標準偏差$\sigma$、相関関数$\boldsymbol{K}$のガウス過程に従って生成されるものとします。
また、$m_1×m_1$行列$\boldsymbol{A}$は質的変数の影響を考慮する部分で、単位行ベクトル$\boldsymbol{a}_u$($\boldsymbol{a}_u\boldsymbol{a}_u^T = 1$、$u = 1, \ldots, m_1$)を用いて
$$
\boldsymbol{A} = \left(
\begin{array}{ccc}
\boldsymbol{a} _ 1 \\
\vdots \\
\boldsymbol{a} _ {m1}
\end{array}
\right) \tag{15}
$$
とし、$\epsilon_i(\boldsymbol{x})$($i = 1,\ldots, m_1$)を単位行ベクトル$\boldsymbol{a}_i$の指定する重みに基づく$\boldsymbol{\eta}(\boldsymbol{x})$の要素の線形和で表現することにします。
すると、
($\eta_{i}(\boldsymbol{x}_n)$、$\eta_{i’}(\boldsymbol{x}_m)$は$i=i'$のときのみ$k_{\phi}(\boldsymbol{x}_m,\boldsymbol{x}_n)$の相関をとる)だから、2つの入力$\boldsymbol{w}_i = (\boldsymbol{x}_i^T, z_i)^T$($i=m,n$)の相関関数$\rm{cor}(\epsilon(\boldsymbol{w}_m), \epsilon(\boldsymbol{w}_n))$について、
が成り立ちます($zm,zn = 1, \ldots,m_1$)。
ここで、$\tau_{r,s} = \boldsymbol{a}^T_r\boldsymbol{a}_s$($r=zm, s=zn, r,s=1,\ldots,m_1,$)とおくと、半正定値行列$\boldsymbol{T} = \boldsymbol{A}\boldsymbol{A}^T$は、
と、$\tau_{r,s}$を$(r,s)$成分にもつ対角成分が1の行列(positive definite matrix with unit diagonal elements)になります。
以降、この性質をもつ行列をPDUDEと書きます。
以上のことから、
$$ \boldsymbol{T}(r,s)k_{\phi}(\boldsymbol{x}_m,\boldsymbol{x}_n)=\rm{cor}(\epsilon(\boldsymbol{w}_m),\epsilon(\boldsymbol{w}_n)) \tag{19} $$
は、質的変数と量的変数の影響を考慮することのできる相関関数ととらえることができます。
質的変数が2つ以上の場合
一般的なケースとして、$J$個の質的変数$\boldsymbol{z}=(z_1,\ldots,z_J)^T$の場合を考えます。
ここで、$z_j(j=1,\ldots,J)$は$1,\ldots,m_j$の値をとるものとします。すると、式$(19)$の拡張により、$\epsilon(\boldsymbol{w})$の相関は関数は以下のようになります。
$$ \prod_{j=1}^{J}\left( \tau_{z_{j,r,s}}k_{\phi}(\boldsymbol{x}_m,\boldsymbol{x}_n) \right)=\rm{cor}(\epsilon(\boldsymbol{w}_m),\epsilon{\boldsymbol{w}_n}) \tag{20} $$
$\tau_{j,r,s}$は、$J$番目のPDUDE$\boldsymbol{T}_j$の$(r,s)$成分です。
特に、$k_{\phi}(\boldsymbol{x}_m,\boldsymbol{x}_n)$に式$(10)$のガウスカーネルをもちいた場合、$(20)$式は以下のようになります。
式$(21)$は、量的変数の影響は$exp\left(-\cfrac{1}{2\rho^2}\sum_{i=1}^{I}(x_{im}-x_{in})^2\right)$で考慮し、質的変数の影響はそれとは独立に$\left(\prod_{j=1}^{J}\tau_{z_{j,r,s}}\right)$で考慮する、という構造を持っています。パラメータ$\tau_{z_{j,r,s}}$は、質的変数$z_j$について$r=z_jm$をとる入力$\boldsymbol{w}_m$と、$s=z_jn$をとる入力$\boldsymbol{w}_n$の、$z_j$のみによる共通性(相関)への影響を反映する役割を担っています。なお、式$(21)$ではshapeパラメータ$\alpha^2$を考慮していませんが、これは$(2)$式でshapeパラメータの役割を$\sigma$が受け持っている為です。
モデリングにおいては、$\tau_{z_{j,r,s}}$は正の値をとるように設定し、任意の2点の入力が無相関もしくは正の相関のみをとるようにします。
制約のあるPDUDE
前節では、PDUDEについて制約を設けない相関行列を用いていました。柔軟なモデリングにおいてはこれで問題ないのですが、質的変数が順序尺度であったり、カテゴリカルな変数であったりするということがあらかじめ自明な場合は、PDUDEに制約を持たせることで、その情報をモデルに反映させることができます。ここでは、sesがカテゴリカルな変数であることから、質的変数がカテゴリカルな場合にPDUDEに設ける制約について説明します。
結論からですが、$m$個の値をとる$z$がカテゴリカルな場合、下記の$\tau_{r,s}$を$(r,s)$成分に持つ等方性を持った$m×m$相関行列$\boldsymbol{T}$が用いられます。
$$
\tau_{r,s}= \begin{cases}
c~~~(0<c<1)~~~(r\neq{s})\\
1~~~(r=s)
\end{cases} \tag{22}
$$
$r=s$のとき、入力間の相関は$z$に関しては1、$r\neq{s}$のとき、c(一定)にする、ということです。 $\boldsymbol{T}$は以下のように分解できます。
このとき、任意の$m×1$ベクトル$\boldsymbol{a}$について、 $$ \boldsymbol{a}^T\boldsymbol{T}\boldsymbol{a}=(1-c)\boldsymbol{a}^{T}\boldsymbol{a}+c(\boldsymbol{a}^{T}1)^2>0 \tag{24} $$ だから、$\boldsymbol{T}$は正定値行列なので、PDUDEです。$\boldsymbol{T}$が正定値行列であることは結構重要で、各要素の値を出力するカーネル関数$k(\boldsymbol{z}_m,\boldsymbol{z}_n)$が何かしらの特徴ベクトル空間の内積を表現するために必要な条件です。このあたりの詳細はこちらなどを見てください。また上記$\boldsymbol{T}$の各要素を出力する関数はisotropic correlation functionと呼ばれ、isotropic correlation functionによる出力を要素に持つ行列はcompound symmetric correlation matrixと呼ばれています。
上記の$\boldsymbol{T}$をPDUDEに用いる場合、式$(21)$は下記のように変形できます。
ここで、$I[r\neq{s}]$は下記の関数になります。
$$
I[r\neq{s}]=\begin{cases}
1~~~(r\neq{s})\\
0~~~(r=s)
\end{cases} \tag{26}
$$
式$(25)$最後の項は、対数をとると
となります。よって、対数スケールにおいて、量的変数についてはL2距離を、質的変数については0~1の値をとる距離を使用していることが分かります。
以上、カテゴリカルな変数を用いたカーネルについて説明しました。参考文献はこちらになります。制約のあるPDUDEについては、今回紹介したもののほかにも順序尺度に対するPDUDE,グループ相関に対するPDUDE等紹介されています。
まとめ
今回はガウス過程みまつわる理論を深堀りしてみました。ガウス過程潜在変数モデル、カテゴリカルな変数への対応の2点が重要です。ここで紹介した内容は、次回の記事で実際のデータへ応用し、期待通り機能することを確かめたいと思います。