手帳と試行

学んだことをアウトプットしていきます。 日々、ノートあるのみ。

事後予測分布とカーネルトリック

事後予測分布の式を、もう少し簡単にする。

事後予測分布

尤度関数として正規分布

p(y∣X,w)=Nd(y∣Xw,σ2Id)\begin{aligned} p(\bm y | \bm X, \bm w) = \mathcal N_d(\bm y | \bm X \bm w, \sigma^2 \bm I_d) \end{aligned}

を設定し、事前分布として多変量正規分布

p(w)=Nn(w∣m0,V0)∝exp⁡(−12(w−m0)TV0−1(w−m0))\begin{aligned} p(\bm w) &= \mathcal N_n(\bm w | \bm m_0, \bm V_0) \\ &\propto \exp \left( -\frac{1}{2} (\bm w - \bm m_0)^\mathsf{T} \bm V_0^{-1} (\bm w - \bm m_0) \right) \end{aligned}

を設定したとき、事後予測分布は次のようなものに帰着した。

p(y∗∣X∗,X,y)=Nd∗(y∗∣my,Vy)p(\bm y_\ast | \bm X_\ast, \bm X, \bm y) = \mathcal N_{d^\ast} (\bm y_\ast | \bm m_y, \bm V_y)
my∗∣y=K∗T(K+σ2Id)−1yVy∗∣y=K∗∗+σ2Id∗−K∗T(K+σ2Id)−1K∗\begin{aligned} \bm m_{y_\ast | y} ={}& \bm K_\ast^\mathsf{T} (\bm K + \sigma^2 \bm I_d)^{-1} \bm y \\ \bm V_{y_\ast | y} ={}& \bm K_{\ast\ast} + \sigma^2 \bm I_{d^\ast} - \bm K_\ast^\mathsf{T} (\bm K + \sigma^2 \bm I_d)^{-1} \bm K_\ast \\ \end{aligned}
{K=XV0XTK∗=XV0X∗TK∗∗=X∗V0X∗T\left\{\begin{aligned} \bm K ={}& \bm X \bm V_0 \bm X^\mathsf{T} \\ \bm K_{\ast} ={}& \bm X \bm V_0 \bm X_\ast^\mathsf{T} \\ \bm K_{\ast\ast} ={}& \bm X_\ast \bm V_0 \bm X_\ast^\mathsf{T} \\ \end{aligned}\right.

カーネルトリック

ここで、行列 K,K∗,K∗∗\bm K, \bm K_\ast, \bm K_{\ast\ast} の成分を展開して見てみよう。

K=[x1TV0x1x1TV0x2⋯x1TV0xdx2TV0x1x2TV0x2⋯x2TV0xd⋮⋮⋱⋮xdTV0x1xdTV0x2⋯xdTV0xd]K∗=[x1TV0x1∗x1TV0x2∗⋯x1TV0xd∗x2TV0x1∗x2TV0x2∗⋯x2TV0xd∗⋮⋮⋱⋮xdTV0x1∗xdTV0x2∗⋯xdTV0xd∗]K∗∗=[x1∗TV0x1∗x1∗TV0x2∗⋯x1∗TV0xd∗x2∗TV0x1∗x2∗TV0x2∗⋯x2∗TV0xd∗⋮⋮⋱⋮xd∗TV0x1∗xd∗TV0x2∗⋯xd∗TV0xd∗]\begin{aligned} \bm K ={}& \left[\begin{darray}{llcl} \bm x_1^\mathsf{T} \bm V_0 \bm x_1 & \bm x_1^\mathsf{T} \bm V_0 \bm x_2 & \cdots & \bm x_1^\mathsf{T} \bm V_0 \bm x_d \\ \bm x_2^\mathsf{T} \bm V_0 \bm x_1 & \bm x_2^\mathsf{T} \bm V_0 \bm x_2 & \cdots & \bm x_2^\mathsf{T} \bm V_0 \bm x_d \\ \vdots & \vdots & \ddots & \vdots \\ \bm x_d^\mathsf{T} \bm V_0 \bm x_1 & \bm x_d^\mathsf{T} \bm V_0 \bm x_2 & \cdots & \bm x_d^\mathsf{T} \bm V_0 \bm x_d \\ \end{darray}\right] \\ \\ \bm K_\ast ={}& \left[\begin{darray}{llcl} \bm x_1^\mathsf{T} \bm V_0 \bm x_{1^\ast} & \bm x_1^\mathsf{T} \bm V_0 \bm x_{2^\ast} & \cdots & \bm x_1^\mathsf{T} \bm V_0 \bm x_{d^\ast} \\ \bm x_2^\mathsf{T} \bm V_0 \bm x_{1^\ast} & \bm x_2^\mathsf{T} \bm V_0 \bm x_{2^\ast} & \cdots & \bm x_2^\mathsf{T} \bm V_0 \bm x_{d^\ast} \\ \vdots & \vdots & \ddots & \vdots \\ \bm x_d^\mathsf{T} \bm V_0 \bm x_{1^\ast} & \bm x_d^\mathsf{T} \bm V_0 \bm x_{2^\ast} & \cdots & \bm x_d^\mathsf{T} \bm V_0 \bm x_{d^\ast} \\ \end{darray}\right] \\ \\ \bm K_{\ast \ast} ={}& \left[\begin{darray}{llcl} \bm x_{1^\ast}^\mathsf{T} \bm V_0 \bm x_{1^\ast} & \bm x_{1^\ast}^\mathsf{T} \bm V_0 \bm x_{2^\ast} & \cdots & \bm x_{1^\ast}^\mathsf{T} \bm V_0 \bm x_{d^\ast} \\ \bm x_{2^\ast}^\mathsf{T} \bm V_0 \bm x_{1^\ast} & \bm x_{2^\ast}^\mathsf{T} \bm V_0 \bm x_{2^\ast} & \cdots & \bm x_{2^\ast}^\mathsf{T} \bm V_0 \bm x_{d^\ast} \\ \vdots & \vdots & \ddots & \vdots \\ \bm x_{d^\ast}^\mathsf{T} \bm V_0 \bm x_{1^\ast} & \bm x_{d^\ast}^\mathsf{T} \bm V_0 \bm x_{2^\ast} & \cdots & \bm x_{d^\ast}^\mathsf{T} \bm V_0 \bm x_{d^\ast} \end{darray}\right] \end{aligned}

実際には紙面の都合でこんなに丁寧に書けないため、次のように省略して書くのが通例だろう。

K=[xiTV0xj]ij∈Rd×dK∗=[xiTV0xj∗]ij∗∈Rd×d∗K∗∗=[xi∗TV0xj∗]i∗j∗∈Rd∗×d∗\begin{aligned} \bm K ={}& \left[\begin{darray}{c} \bm x_i^\mathsf{T} \bm V_0 \bm x_j \end{darray}\right]_{ij} && \in \R^{d \times d} \\ \bm K_{\ast} ={}& \left[\begin{darray}{c} \bm x_{i}^\mathsf{T} \bm V_0 \bm x_{j^\ast} \end{darray}\right]_{ij^\ast} && \in \R^{d \times d^\ast} \\ \bm K_{\ast\ast} ={}& \left[\begin{darray}{c} \bm x_{i^\ast}^\mathsf{T} \bm V_0 \bm x_{j^\ast} \end{darray}\right]_{i^\ast j^\ast} && \in \R^{d^{\ast} \times d^{\ast}} \end{aligned}

これを纏めて次のように表すことにしよう。

[KK∗K∗TK∗∗]=[xiTV0xj]ij∈R(d+d∗)×(d+d∗)\begin{aligned} \left[\begin{darray}{c} \bm K & \bm K_\ast \\ \bm K_\ast^\mathsf{T} & \bm K_{\ast\ast} \end{darray}\right] ={}& \left[\begin{darray}{c} \bm x_i^\mathsf{T} \bm V_0 \bm x_j \end{darray}\right]_{ij} \in{} \R^{(d + d^\ast) \times (d + d^\ast)} \\ \end{aligned}
カーネル関数

どうやら、同じ形の項 xiTV0xj\bm x_i^\mathsf{T} \bm V_0 \bm x_j が何度も繰り返し出現するらしい。そこで、これを

kij=k(xi,xj)=xiTV0xjk_{ij} = k(\bm x_i, \bm x_j) = \bm x_i^\mathsf{T} \bm V_0 \bm x_j

と書き直してしまおう。すると次のようになる。

[KK∗K∗TK∗∗]=[kij]ij∈R(d+d∗)×(d+d∗)\begin{aligned} \left[\begin{darray}{c} \bm K & \bm K_\ast \\ \bm K_\ast^\mathsf{T} & \bm K_{\ast\ast} \end{darray}\right] ={}& \left[\begin{darray}{c} k_{ij} \end{darray}\right]_{ij} \in{} \R^{(d + d^\ast) \times (d + d^\ast)} \\ \end{aligned}

さて、もとの定義どおりであれば

kij=xiTV0xj=∑k,lV0klxikxjlk_{ij} = \bm x_i^\mathsf{T} \bm V_0 \bm x_j = \sum_{k, l} {V_0}_{kl} x_{ik}x_{jl}

となるが、ここでちょっと変なことをする。 📄 線形回帰とカーネル法 で取り扱っているように、関数 k:Rd×Rd→Rk: \mathbb R^d \times \mathbb R^d \to \mathbb R として、もっと一般に xi\bm x_i と xj\bm x_j を入力とする関数を許す。

kij=k(xi,xj)k_{ij} = k(\bm x_i, \bm x_j)

これにより、カーネル法と似たような理屈で、非常に表現力の高い回帰モデルを作成できる。

カーネル法の命名を借りて、この関数 kk をカーネル関数 (kernel function) という。そしてカーネル関数を並べた行列 K\bm K をカーネル行列 (kernel matrix) という。

カーネル関数として要求される条件はカーネル法の場合と同じで、

  • KT=K\bm K^\mathsf{T} = \bm K
  • uTKu≥0∀u∈R\bm u^\mathsf{T} \bm K \bm u \ge 0 \quad {}^\forall \bm u \in \mathbb R

すなわちカーネル行列が半正定値行列となる必要がある。

カーネル関数には、データを滑らかにつなぐもの、周期的な曲線を描くもの、近似直線を描くものなど、色々ある。例えば次のガウスカーネルは、データを滑らかにつなぐものとして知られており、内挿によく使用される。

k(xi,xj)=exp⁡(−12σ2∥xi−xj∥22)\begin{aligned} k(\bm x_i, \bm x_j) ={}& \exp \left( -\frac{1}{2\sigma^2} \|\bm x_i - \bm x_j\|_2^2 \right) \end{aligned}

解釈のまとめ