- Gaussian Process 연습입니다.
- scikit-learn을 비롯한 예제를 재구성하여 연습합니다.
- 여러 커널의 특징을 알아보고 사용처를 알아봅니다.
1. Data Preparation
scikit-learn: Gaussian Process Regression: basic introductory example
1.1. example data
- 지난 글과 같은 예제를 사용합니다.
- 오늘은 어제보다는 색을 많이 사용할 겁니다. 참값과 Gaussian Process 결과를 무채색으로 표현합니다.
- 관측값은 참값이라고 합시다.
1 | %matplotlib inline |

1.2. sample 추출
scikit-learn: Illustration of prior and posterior Gaussian process for different kernels

- 신뢰구간에는 다양한 가능성이 내포되어 있습니다.
- 이들 중 일부를 골라 추출할 수 있습니다.
- 5개를 골라 Gaussian Process Regression 위에 얹어봅니다.
1 | # sampling |

- 대부분 신뢰구간 안에 들어와 있지만 일부는 신뢰구간 밖으로도 나가 있습니다.
- 정상입니다.
1.3. posterior vs prior
- 지금 그린 그림은 evidence가 반영된 결과, 즉 posterior(사후확률)입니다.
- 학습을 시키지 않은 채 예측을 하고 sample curve를 뽑을 수도 있습니다.
- evidence가 반영되기 전의 prior(사전확률)입니다.
1 | # prior |

- 관측값이 반영되어 있지 않기 때문에 데이터와는 무관한 모습입니다.
- 그러나 곡선의 모양에는 우리가 선택한 RBF 커널이 드러나 있습니다.
- 학습에 커널이 반영되는만큼 데이터의 모습을 반영해 커널을 선정해야 합니다.
- scikit-learn이 지원하는 커널들의 prior와 posterior를 살펴보겠습니다.
2. Kernels
Deep Campus: 가우시안 프로세스의 개념
towardsdatascience: Understanding Gaussian Process, the Socratic Way
The Gradient, Gaussian process not quite for dummies
2.1. 커널의 정체
-
Gaussian Process의 커널은 covariance function입니다.
-
서로 다른 두 점 $x_i$와 $x_j$와의 상호 연관성을 나타냅니다.
-
이 함수를 커널 함수라고 하며, Radial basis function은 다음과 같이 정의됩니다.
$$k(x_i, x_j) = \exp\left(- \frac{d(x_i, x_j)^2}{2l^2} \right)$$ -
$x_i$와 $x_j$의 거리가 같아도 $l$이 크면 $k$가 큽니다: 먼 거리의 데이터까지 연관성을 가진다는 뜻입니다.
-
$x_i = x_j$ 일때 공분산은 최대값으로 1을 가집니다.
-
그렇다면 $x_i$과 $x_j$ 사이의 한 점은 두 점 모두와의 공분산을 최대한 높이는 방향으로 결정될텐데
-
Gaussian Process는 결정변수가 아니라 확률변수이므로 확률이 높을 뿐 조금씩 변합니다.
-
이로 인해 아무런 관찰값이 입력되지 않아도(prior) RBF의 sample 함수는 랜덤하게 매끈한 곡선을 이룹니다.
-
같은 이유로 참값으로 관측값이 지정되면(posterior) 관측값과 관측값 사이를 최대한 매끈하게 잇는 곡선의 존재 범위가 도출됩니다.
-
그렇다면, 커널 함수가 바뀌면 예측값이 바뀔 것이라는 것을 상상할 수 있으며
-
데이터의 성격에 맞는 커널 함수가 있음을 예상할 수도 있습니다.
-
최적값을 얻는 방법으로 MLE(Maximum Likelihood Estimation)이 사용됩니다.
-
log_marginal_likelihood()메소드를 사용해 결과값을 추출할 수 있습니다. -
커널 종류를 바꾸며 prior와 posterior를 관찰합니다.
-
커널을 입력받는 시각화 함수를 아래와 같이 준비합니다.
-
코드가 길어 접어두었습니다.
코드 보기/접기
1 | plt.rcParams['mathtext.fontset'] = "cm" |
2.2. Radial Basis Function
- Gaussian Process의 가장 기본이 되는 커널입니다.
- 매끈한 곡선이 우리가 알고 있는 가장 기본적인 모양입니다.
1 | kernel = 1*RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e2)) |

2.2. White Kernel
$$k(x_i, x_j) = noise \_ level \text{ if } x_i == x_j \text{ else } 0$$
- 단독으로 사용되기보다 다른 커널에 더해져 노이즈 레벨을 측정하는데 활용됩니다.
- 아래 예제에서는 RBF와의 합으로 사용되었으며, posterior에서 noise level = $1.13 \times 10^{-8}$에 불과합니다.
- prior의 noise level이 데이터를 만나 0에 가깝게 수렴한 것입니다.
1 | from sklearn.gaussian_process.kernels import WhiteKernel |

2.3. Radial Quadratic Kernel
$$k(x_i, x_j) = \left(1 + \frac{d(x_i, x_j)^2 }{ 2\alpha l^2}\right)^{-\alpha}$$
- RBF Kernel과 다른 거리 스케일링의 혼합 척도(scale mixture)로 볼 수 있습니다.
- prior에서는 RBF 커널에 비해 곧게 펴진 듯한 모습이지만 posterior는 RBF와 잘 구분되지 않습니다.
1 | from sklearn.gaussian_process.kernels import RationalQuadratic |

2.4. Constant Kernel
$$k(x_1, x_2) = constant\_value ;\forall; x_1, x_2$$
- 글자 그대로 상수 커널입니다.
- White Kernel과 유사하게 다른 커널과 함께 사용됩니다.
1 | from sklearn.gaussian_process.kernels import ConstantKernel |

2.5. Exp-Sine-Squared Kernel (periodic kernel)
$$k(x_i, x_j) = \text{exp}\left(-\frac{ 2\sin^2(\pi d(x_i, x_j)/p) }{ l^ 2} \right)$$
- 지수함수에 sine함수의 제곱이 포함된 형태입니다.
- 주기성을 갖는 데이터를 묘사하기 좋으며 length scale $l > 0$과 함께 periodicity $p > 0$를 매개변수로 가집니다.
- $p$는 Euclidean distance입니다.
- prior와 posterior 모두 자세히 보면 주기성을 띄고 있습니다.
1 | from sklearn.gaussian_process.kernels import ExpSineSquared |

2.6. Dot Product
$$k(x_i, x_j) = \sigma_0 ^ 2 + x_i \cdot x_j$$
- 앞에서 본 커널들은 형태는 달라도 두 점 사이의 거리 $d(x_i, x_j)$를 주요 인자로 가집니다.
- 이런 커널을 stationary kernel이라고 합니다.
- 반면 $x_i$, $x_j$ 값 자체에 의해 좌우되는 커널을 non-stationary kernel이라고 합니다.
- dot product로 정의되기 때문에 원점으로부터의 회전에는 무관하지만 transition에는 민감하게 반응합니다.
- $\sigma_0 = 0$이라면 homogeneous linear kernel, $\sigma_0 \neq 0$이라면 inhomogeneous가 됩니다.
1 | # 1st degree |

- 제곱식을 통해 다항식을 만들 수 있습니다.
1 | # 3rd degree |

2.7. Matérn Kernel
$$k(x_i, x_j) = \frac{1}{\Gamma(\nu)2^{\nu-1}}\Bigg(\frac{\sqrt{2\nu}}{l} d(x_i , x_j )\Bigg)^\nu K_\nu\Bigg(\frac{\sqrt{2\nu}}{l} d(x_i , x_j )\Bigg)$$
- RBF의 일반화된 버전입니다.
- $\nu$로 결과 함수의 smoothness를 조절하는데 $\nu$가 $\infty$에 접근할수록 RBF에 가까워집니다.
- 위 식의 $K_{\nu}(\cdot)$는 modified Bessel function, $\Gamma(\cdot)$는 gamma function입니다.
1 | from sklearn.gaussian_process.kernels import Matern |

3. 결론
- Gaussian Process는 임의의 적은 데이터로 멋진 결과물을 만들어내지만 Kernel function에 크게 좌우됩니다.
- 문제의 성격과 데이터의 특성에 맞는 적절한 Kernel 선택이 매우 중요합니다.