Gaussian Processes in Machine Learning
[cite]10.1007/978-3-540-28650-9_4[/cite]
기계학습 분야에서 supervised learning (지도 학습) 이나 classification 문제는 중요한 요소입니다. 이러한 문제를 풀기 위해서는 그 편리함 때문에 전통적으로 parametric model을 사용해 왔으나, 데이터셋이 복잡해질 경우 실제로는 잘 작동하지 않는 경우가 많습니다.
1 Gaussian Processes
정의 : Gaussian process는 랜덤 변수의 집합으로, 각 랜덤 변수는 각자의 joint Guassian distribution을 갖는다.
우리에게 익숙한 Gaussian distribution은 mean vector와 variance matrix로부터 정의가 됩니다. 이를 일반화하여 생각하면 확장된 개념을 생각해볼 수 있습니다. Gaussian Process는 mean function $ m(x) $과 covariance 함수 $ k(x, x') $ 로부터 정의됩니다. 따라서 ussian distribution은 벡터들에서 놀지만 Gaussian processs는 함수들에서 놀고 있습니다. 이러한 Gaussian process는 아래와 같이 표현됩니다.
$$f \sim GP(m, k)$$
Gaussian distribution에서 뽑아 낸 랜덤 변수는 벡터이지만, Gaussian process에서는 랜덤 함수 $ f(x) $가 뽑혀져 나오며 이 함수는 제각각 각자의 평균과 분산을 갖습니다.
이해를 돕게 위하여 Gaussian process의 단순한 예를 들고 샘플을 계산해보도록 하겠습니다.
$$f \sim GP(m, k), \ \text{where} \ m(x) = \frac{1}{4} x^2, k(x, x') = \exp(-\frac{1}{2} (x - x')^2)$$
본래는 연속인 무한한 $ x $에서 샘플을 얻는 것이 가능하지만, 단순화하여 N개의 위치 $ x_1, ... x_n $ 위치에서만 고려해보겠습니다. x가 주어지면 위의 mean function과 covariance function을 이용하여 벡터 형식의 Gaussian distribution을 계산할 수 있습니다.
$$\mu_i = m(x_i) = \frac{1}{4} x_i^2,\ i=1, ..., n$$
$$\Sigma_{ij} = k(x_i, x_j) = \exp(-\frac{1}{2} (x_i - x_j)^2),\ i, j = 1, ..., n$$
이제 이것으로 구성된 Gaussian distribution $ f \sim N(\mu, \Sigma) $으로부터 랜덤 벡터를 생성합니다. 평균으로 $\mu$ 에 covariance 행렬로부터 계산된 노이즈를 더하여 샘플을 계산해 낼 수 있습니다. 이렇게 계산한 샘플들이 바로 x에 따라 평균과 분산이 다르게 결정되는 Gaussian distribution으로부터 나온 것입니다.
2 Posterior Gaussian Process
앞에서 우리는 함수에서 노는 Gaussian process가 어떤 식으로 정의되는지 알아보았습니다. 그 Gaussian process를 a prior로 삼아 Bayesian inference를 해보도록 하겠습니다. Prior는 트레이닝 데이터와는 관계가 없습니다. 즉, 종속적이지 않습니다. 하지만 그 특성을 나타낼 수는 있습니다. 그 예로 앞에서 본 함수로 정의되는 Gaussian process는 quadratic에 가까운 모양새를 보여줍니다.
여기에 트레이닝 데이터를 더하면, posterior를 계산해낼 수 있습니다. 즉, 아직 관측되지 않은 케이스에 대하여 prediction이 가능한 것입니다.
먼저 트레이닝 케이스의 알고 있는 함수의 결과 값을 $ \mathbf{f} $라고 하고, 테스트 케이스의 함수 값을 $ \mathbf{f_*} $이라고 정의해봅시다. 그리고 그 각각의 입력 값은 $ \mathbf{X, X_*} $입니다. 그러면 이 두 케이스의 joint distribution은 다음과 같이 쓸 수 있습니다.
$$\begin{bmatrix} \mathbf{f} \\ \mathbf{f_*} \end{bmatrix} \sim N ( \begin{bmatrix} \mu \\ \mu_* \end{bmatrix}, \ \begin{bmatrix} \Sigma & \Sigma_* \\ \Sigma_*^T & \Sigma_{**} \end{bmatrix})$$
여기서 $ \mu = m(x_i) $ 로 트레이닝 데이터에 의해 계산되는 벡터입니다. $ \Sigma, \Sigma_*, \Sigma_{**} $는 각각 트레이닝 데이터 - 트레이닝 데이터, 트레이닝 데이터 - 테스트 케이스 입력, 테스트 케이스 입력 - 테스트 케이스 입력 쌍을 함수 $ k(x_i, x_j) $를 이용하여 계산되는 covariance 행렬입니다.
우리는 이미 $ \mathbf{f} $를 알고 있기 때문에 $ \mathbf{f_* | f} $은 위의 식을 이용하여 다음과 같이 표현할 수 있습니다.
$ \mathbf{f_* | f} = \sim N(\mu_* + \Sigma_*^T \Sigma^{-1}(\mathbf{f} - \mu), \ \Sigma_{**} - \Sigma_*^T \Sigma^{-1} \Sigma_*) $
이것이 바로 트레이닝 데이터가 주어졌을 때의 posterior입니다. 이를 Gaussian process에 그대로 적용시켜보면,
$$f | D \sim GP(m_D, k_D) \\
m_D(x) = m(x) + \Sigma(X, x)^T \Sigma^{-1} (\mathbf{f - m}) \\
k_D(x, x') = k(x, x') - \Sigma(X, x)^T \Sigma^{-1} \Sigma(X, x')$$
앞에서와 같이 $ \Sigma(X, x) $는 트레이닝 데이터의 모든 입력 $ X $과 $ x $ 사이의 covariance 입니다.
식을 자세피 살펴보면 새로 만들어지는 $ k_D $는 기존의 prior $k(x, x') $에서 양수을 뺀 형태이므로 값이 더 작아지게 되므로, 트레이닝 데이터가 주어짐으로써 variance가 낮아짐을 알 수가 있습니다.
여기에 한가지를 더 추가합니다. 트레이닝 데이터의 출력 값에 대한 노이즈를 생각하여야 합니다. 이 노이즈는 보통 다른 입력에 종속적이지 않은 Gaussian noise로 가정하게 됩니다. 이 노이즈를 각 데이터에 관계가 없도록 delta 함수를 이용하여 covariance에 추가해주도록 합시다.
$$y(x) = f(x) + \epsilon, \ \epsilon \sim N (0, \sigma_n^2)$$
$$f \sim GP(m, k), \ y \sim GP(m, k + \sigma_n^2 \delta_{ii})$$
논문의 그림을 보면 트레이닝 데이터가 주어졌을 때 한층 variance가 낮아진 그래프를 볼 수 있습니다.
3 Training a Gaussian Process
이제 우리는 원래 알고 있던 prior에 트레이닝 데이터를 이용하여 posterior를 만들 수 있게 되었습니다. 하지만 이것은 우리가 prior의 mean과 covariance 함수를 알고 있을 때에는 유용하겠지만, 실제로는 두 함수를 전혀 모르는 경우가 많습니다. 주어진 데이터에 맞게 mean, covariance 함수를 결정할 방법이 필요한 것입니다.
실세계의 정확한 모델을 모르는 경우가 많으니 무작정 함수를 결정할 수는 없는 일이니 파라미터를 이용한 식을 만들고 데이터를 최적화하는 파라미터를 결정하여 사용하도록 합니다. 한 예를 들어보면 다음과 같습니다.
만약 우리가 모델이 2차식이라고 생각되어지지만, 그 모양이 정확히 어떤지는 잘 모르는 상황이라고 한다면, 아래처럼 파라미터를 사용하여 식을 표현하고나서 파라미터를 최적화하여 식을 완성하는 것입니다.
$$f \sim GP(m, k)$$
$$m(x) = ax^2 + bx + c, \text{ and} k(x, x') = \sigma_y^2 \exp ( - \frac{(x-x')^2}{s l^2}) + \sigma_n^2 \delta_{ii'}$$
여기서 파라미터 $ \theta = \{a, b, c, \sigma_y, \sigma_n, l \} $ 입니다. 최적화는 Log-likelihood를 사용합니다.
$$L = \log p(\mathbf{y | x}, \theta) = - \frac{1}{2} \log | \Sigma | - \frac{1}{2} (\mathbf{y} - \mu)^T \Sigma^{-1} (\mathbf{y} - \mu) - \frac{n}{2} \log (2 \pi)$$
이 식을 각 파라미터에 대해 편미분을 할 수 있습니다.
$$\frac{\partial L}{\partial \theta_m} = -(\mathbf{y} - \mu)^T \Sigma^{-1} \frac{\partial m}{\partial \theta_m}$$
$$\frac{\partial L}{\partial \theta_k} = \frac{1}{2} \text{trace}(\Sigma^{-1} \frac{\partial \Sigma}{\partial \theta_k}) + \frac{1}{2}(\mathbf{y} - \mu)^T \frac{\partial \Sigma}{\partial \theta_k} \Sigma^{-1} \frac{\partial \Sigma}{\partial \theta_k}(\mathbf{y} - \mu)$$
여기서 $ \theta_m, \theta_k $는 각각 mean, covariance에 대한 파라미터를 의미합니다. 이 파라미터들을 conjugate gradient 방법을 사용하여 최적화하고, 이 때 위의 세 식이 활용될 것입니다.
4 Conclusions and Future Directions
여기서는 1개의 covariance 함수만을 예로 들었지만, 사실은 positive definite 한 어떤 함수를 사용하여도 좋습니다. prior의 특성에 따라 어떤 함수를 사용하느냐가 결정되어야 할 것입니다.
또한 여기서는 간단한 Gaussian noise만을 다루었지만, 그렇지 않을 경우 Log-likelihood 또한 non-Gaussian likelihood가 되어버리게 됩니다. 이런 경우 트레이닝이 더 복잡한 일이 되어버리고 말 것입니다.
마지막으로 한가지 염두해 두어야 할 문제는 계산에 가장 큰 부하가 걸리는 부분이 $ \Sigma $의 역행렬을 구하는 부분이라는 것입니다. 계산상, $ O(n^3) $의 복잡도를 가지기 때문에 트레이닝 데이터의 수가 늘어날 수록 그 부하는 점점 심해질 것입니다.