머신러닝&딥러닝/베이지안

베이지안 딥러닝 (2) - Gaussian Process Regression (1)

Like_Me 2020. 10. 12. 18:07

 Gaussian Process Regression(GPR)은 Non-parametric Bayesian regression 방법으로 Gaussian Process의 성질을 이용한다. 이를 이해하기 위해 먼저 Gaussian Process(GP)를 알아야 한다. 

 

 GP는 처음 들어보는 것으로 낯설지만 어렵지 않은 개념이다. GP는 Random Process의 한 종류인데 Random Process는 시간(혹은 공간) 별로 표시된 확률변수의 조합이다. 직관적 이해를 돕기 위해 시간을 t 하나로 고정시키면 Random Process는 Random Variable이 된다. 즉 하나의 시간별로 Random Variable이 있고 이것이 시간만큼 나열되어 있는 것이다. Random Process X(t)인 $t_{1},t_{2}, ... , t_{k}$ 에 대해 랜덤 벡터 $X(t_{1}) , X(t_{2}), ... , X(t_{k})$ 가 jointly Gaussian을 만족하면 Gaussian Process(GP) 이다. 이때 joint density는 다음과 같이 정의된다.

$$ Mean : m(t) = E(X(t)) \in R^{n} $$

$$ \cdot m(*) : mean function$$

$$ Covariance : k(t,s) = cov(X(t),X(s)) \in R^{n \times n} $$

$$ \cdot k(*,*) : covariance function $$

$$ Notation : X(t) \sim gp(m(t),k(t,s)) $$

다시 말해 GP는 유한한 점들에 대한 다변량 정규분포를 의미한다.

 

  이에 대한 예시로 X(t) = tA , where A ~ N(0,1) and t$\in$R 이 있다. t가 고정이면 상수 $\times$ A가 되고 A~N(0,1) 이므로 Random variable을 만족하며 A가 고정이면 시간에 대한 함수가 되므로 랜덤 프로세스의 조건을 만족한다. 이때,  Mean : m(t) = E(X(t)) = tE(A) = 0 가 되며 Covariance : k(t, s) = E(tAts) = ts 이므로 커널 함수가 ts인 GP가 성립된다.

 

  Weight space view를 이용해 Gaussian Process Regression을 설명해보겠다. 우선 간단한 Linear Regression에 대한 식 $f(x) = x^{T}W$ 을 생각해본다. 이 식은 x가 주어졌을 때 W를 찾는 것이다. y(x) = f(x) + $\varepsilon$ (where $\varepsilon \sim N(0,\sigma^{2}))$ 으로 n개의 Train data에 Noise가 섞였다고 가정한다. 그랬을 때 Likelihood는 $$ P(y|x, w) = \prod_{i=1} ^ {n} P(y_{i}|x_{i},w) = \frac{1} {\sqrt{2\pi\sigma_{n}^{2}}} exp(-\frac{(y_{i}-y{i}^{T}w)^{2}} {2\sigma_{n}^{2}}) = \frac{1} {(2\pi\sigma^{2}_{n})^{\frac{2} {n}}} exp(-\frac{1} {2\sigma_{n}^{2}} ||y-X^{T}w||^{2})$$

 

  Bayesian은 단순히 Likelihood를 구하는 것이 아니다. Posterior distribution을 찾는 것이 그 목적이다. 따라서 파라미터에 대한 prior를 줘야 한다. 즉, weight에 대한 분포를 줘야 하는데 이때 Gaussian을 주게 된다. Gaussian을 주는 이유는 Conjugate Prior 때문이다. 낯선개념인데 간단하다. 내가 가지고 있는 Likelihood에 대한 Prior 꼴이 있다는 것이다. 이 Prior를 가정해야 Posterior을 계산할 수 있다. 그런데 이것을 만족하는 꼴이 별로 없으며 그중 하나가 Gaussian이다. 위에서 Likelihood를 구할 때 가우시안을 가정하였으므로 Prior도 Gaussian 분포를 따른다고 가정한다. 그래서 Gaussian$\times$Gaussian = Gaussian을 도출한다. 이때 Posterior는 다음과 같다.

  $$P(w|y,x) = \frac{P(y|x,w) P(w)} {p(y|x)} \propto exp(\frac{1}{2\sigma^{2}_{n}}(y-x^{T}w)^{T}(y-x^{T}w)) exp(-\frac{1} {2} w^{T} \Sigma_{p}^{-1}w)$$

$$ = exp(\frac{1} {2} (w-\bar{w})^{T}A(w-\bar{w})) (where , \bar{w}=\frac{1} {\sigma^{2}_{n}}A^{-1}xy , A=\frac{1}{\sigma^{2}_{n}}xx^{T}+\Sigma^{-1}_{p})$$

$$\therefore P(w|y,x) = N(\bar{w},A^{-1})$$

 

  슬프게도 단순히 Posterior를 구하는 것이 Bayesian solution이 아니다. 새로운 입력값에 대한 Posterior의 mean을 구하는 것이다. 여기까지 데이터에 대한 w의 분포를 구했다. 이제 새로운 입력 $x_{*}$이 들어왔을 때 Posterior mean을 구할 것이다.

$$P(f_{*}|x_{*},x,y) = \int P(f_{*}|x_{*},w)P(w|x,y)dw$$

$$N(\frac{1}{\sigma^{2}_{n}}x_{*}^{T}A^{-1}xy,x^{T}_{*}A^{-1}x_{*})$$

여기까지 구한 것은 Linear regression에 대한 bayesian solution으로 Gaussian Process Regression을 구하기 위해서는 kernel trick을 써야 한다. 이는 입력을 다른 공간으로 보내서 Linear Regression을 해주는 방법이다. $f(x) = \phi(x)^{T}w$

 

kernel trick까지 이용하여 최종적으로 값을 구하면 $f_{*}$의 분포는 다음과 같다.

$$ f_{*}|x_{*}, x, y \sim N(m_{*},\Sigma_{*})$$

$$ m_{*} = k(x_{*},x)(k(x,x)+\sigma_{n}^{2}l)^{-1}y$$

$$ \Sigma_{*} = k(x_{*},x_{*})-k(x_{*},x)(k(x,x)+\sigma_{n}^{2}l)^{-1}k(x,x_{*})$$

 

  weight space view는 수식이 많아 어렵고 직관적이진 않은 것 같다. (좀 더 쉽게 정리한 글을 참조하면 좋다.) 다시 한번 정리해보면, 간단한 Linear Regression에 대한 베이지안 솔루션을 구하고자 한다. 우선 Likelihood와 Prior(파라미터에 대한)를 Gaussian이라고 가정하여 Posterior를 구한다. 그러면 새로운 입력에 대한 Posterior의 mean 값을 구할 수 있게 된다. 마지막으로 kernel trick으로 GPR을 구할 수 있다. 하지만 GPR은 n개의 데이터가 있을 때 n*n의 역행렬을 구해야 해서 컴퓨터 연산량이 굉장히 크다. 그래서 빅데이터 시대에는 딥러닝에 뒤쳐지게 되었다.

gaussian process regression (wiki)

사진 참조 : commons.wikimedia.org/wiki/File:Gaussian_Process_Regression.png

강의 참조 : www.edwith.org/bayesiandeeplearning/joinLectures/14426