가우시안 프로세스
더 많은 작업
- Gaussian process; GP; 가우시안 프로세스, 가우스 과정
- 임의의 유한 개 입력에서의 함숫값이 언제나 다변량 정규 분포를 따르는 확률 과정. 기계 학습에서는 함수 자체에 사전 분포를 두는 베이즈 회귀·분류 모델로 쓴다
가우시안 프로세스(Gaussian process, GP)는 "함수에 대한 확률 분포"다. 평균 함수 와 공분산 함수(커널) 로 정해지며, 어떤 입력 점들을 고르든 그 점들의 함숫값이 다변량 정규 분포를 따른다. 통계학 교재에서는 '가우스 과정', '가우시안 과정'이라고도 옮기고, 기계 학습 분야의 한국어 자료에서는 '가우시안 프로세스'와 '가우시안 프로세스 회귀(GPR)'라는 표기가 주로 보인다.
GP 회귀는 예측값과 함께 예측의 불확실성(사후 분산)을 닫힌 식으로 준다. 데이터가 적고 불확실성이 중요한 문제, 특히 베이지안 최적화의 대리 모델로 쓰인다. 지구통계학에서 같은 모형을 크리깅(kriging)이라 부른다. 계산량이 데이터 수의 세제곱이라 큰 데이터에는 근사가 필요하다. 커널의 수학적 배경은 커널 트릭 문서, 상위 개념은 기계 학습 문서 참고.
확률 과정 가 평균 함수 , 공분산 함수 인 가우시안 프로세스라는 것은
가 모든 과 모든 입력 에 대해 성립한다는 뜻이다. 무한 차원 대상을 다루지만, 실제 계산은 관측한 점과 예측할 점만으로 이루어진 유한 차원 정규 분포에서 끝난다. 보통 평균은 0으로 두고(데이터를 중심화한다) 함수의 성질은 모두 커널에 맡긴다. 커널은 "두 입력이 가까우면 함숫값도 비슷하다"는 가정을 수치로 표현한 것이며, 그람 행렬이 공분산 행렬이 되므로 양의 준정부호여야 한다.
관측 모델을 , 로 두자. 훈련 입력 (개), 출력 , 시험 입력 에 대해 , , 로 쓰면, 사전 분포에서 훈련 출력과 시험 함숫값의 결합 분포는
이다. 정규 분포의 조건부 공식을 적용하면 사후(예측) 분포도 정규 분포다.
시험 점이 하나면 평균은 , 분산은 이다.[1] 읽는 법은 다음과 같다.
- 사후 평균은 관측값 의 선형 결합이며, 로 두면 이다. 커널 릿지 회귀(규제 계수 )의 예측과 똑같다.
- 사후 분산은 사전 분산에서 "데이터가 설명해 준 만큼"을 뺀 값이다. 관측값 에 의존하지 않고 입력 위치에만 의존한다. 훈련 점 근처에서는 작고, 멀어지면 사전 분산으로 돌아간다.
- 관측 잡음이 있는 새 관측 의 분산을 원하면 여기에 를 더한다.
역행렬을 직접 구하지 않고 촐레스키 분해를 쓴다(Rasmussen & Williams 알고리즘 2.1).[1]
- 평균
- , 분산
- 로그 주변 우도
촐레스키 분해는 약 번의 연산, 삼각 행렬 풀이는 번이 든다. 메모리는 다. 표본이 수천 개면 노트북에서도 충분하지만 수십만 개면 그대로는 어렵다.
커널의 길이 척도 , 신호 분산 , 잡음 분산 같은 하이퍼파라미터 는 로그 주변 우도(log marginal likelihood)를 최대화해 정한다.
첫 항은 데이터를 잘 설명할수록 커지고, 둘째 항은 커널이 지나치게 유연할수록(행렬식이 클수록) 작아진다. 함수 를 적분해 없앤 우도이므로 교차 검증 없이도 과적합을 어느 정도 억제한다. GPML은 이를 "자동 오컴의 면도날"이라 설명한다.[2] 목적 함수가 볼록하지 않아 국소 최적에 빠질 수 있으므로 여러 초깃값에서 다시 최적화한다(scikit-learn의 n_restarts_optimizer). 입력 차원마다 길이 척도를 따로 두는 ARD(automatic relevance determination) 커널을 쓰면, 학습된 길이 척도가 큰 차원은 출력에 덜 중요하다고 읽을 수 있다.
| 커널 | 식() | 표본 함수의 성질 | scikit-learn |
|---|---|---|---|
| 제곱 지수(RBF) | 무한 번 미분 가능, 매우 매끄러움 | RBF
| |
| 마테른 | 연속이지만 미분 불가, 거칢 | Matern(nu=0.5)
| |
| 마테른 | 한 번 미분 가능 | Matern(nu=1.5)
| |
| 마테른 | 두 번 미분 가능 | Matern(nu=2.5)
| |
| 유리 이차 | 여러 길이 척도의 RBF를 섞은 것 | RationalQuadratic
| |
| 주기 | 주기 로 반복 | ExpSineSquared
| |
| 선형(내적) | 직선, 베이즈 선형 회귀와 같음 | DotProduct
| |
| 백색 잡음 | 관측 잡음 항 | WhiteKernel
|
실무 기준은 다음과 같다.
- 기본값으로는 RBF나 마테른 5/2를 쓴다. RBF의 표본 함수는 실제 최적화 문제에 비해 지나치게 매끄럽다는 이유로, 스노크 등은 베이지안 최적화에 ARD 마테른 5/2 커널을 제안했다.[3]
- 구조가 알려져 있으면 커널을 더하고 곱해 표현한다. 예를 들어 "장기 추세 + 계절성 + 잡음"은
RBF(긴 척도) + RBF * ExpSineSquared + WhiteKernel처럼 짠다. 합은 독립 성분의 합, 곱은 성질의 동시 성립(예: 서서히 모양이 변하는 주기)을 뜻한다. - 잡음 분산은
alpha로 고정하거나WhiteKernel로 학습한다. 아주 작은alpha라도 넣으면 그람 행렬의 수치 안정성이 좋아진다.[4] - 입력은 표준화하고, 출력도 평균을 빼거나
normalize_y=True를 쓴다. 평균 0 사전 분포라 훈련 데이터에서 멀어질수록 예측이 0으로 돌아가기 때문이다.
알고리즘 2.1을 그대로 옮긴 것이다(numpy 2.1, SciPy 1.15에서 실행 확인).
import numpy as np
from scipy.linalg import cho_factor, cho_solve
def rbf(A, B, ell=1.0, sf=1.0):
d2 = ((A[:, None, :] - B[None, :, :]) ** 2).sum(-1)
return sf**2 * np.exp(-0.5 * d2 / ell**2)
def gp_predict(X, y, Xs, ell=1.0, sf=1.0, sn=0.1):
K = rbf(X, X, ell, sf) + sn**2 * np.eye(len(X))
L = cho_factor(K, lower=True) # 촐레스키 분해, O(n^3)
alpha = cho_solve(L, y) # (K + sn^2 I)^-1 y
Ks = rbf(X, Xs, ell, sf)
mean = Ks.T @ alpha # 사후 평균
var = sf**2 - np.sum(Ks * cho_solve(L, Ks), axis=0) # 사후 분산(대각)
logml = -0.5 * y @ alpha - np.log(np.diag(L[0])).sum() - 0.5 * len(X) * np.log(2 * np.pi)
return mean, var, logml
rng = np.random.default_rng(0)
X = rng.uniform(0, 5, (20, 1))
y = np.sin(X[:, 0]) + 0.1 * rng.normal(size=20)
Xs = np.linspace(0, 5, 5)[:, None]
mean, var, logml = gp_predict(X, y, Xs)
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C, WhiteKernel
kernel = C(1.0) * RBF(length_scale=1.0) + WhiteKernel(noise_level=1e-2)
gpr = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=5, random_state=0)
gpr.fit(X, y) # 로그 주변 우도를 L-BFGS-B로 최대화
print(gpr.kernel_) # 0.903**2 * RBF(length_scale=1.65) + WhiteKernel(noise_level=0.00346)
mean, std = gpr.predict(Xs, return_std=True)
samples = gpr.sample_y(Xs, n_samples=3) # 사후 분포에서 함수 표본
커널을 고정(optimizer=None, alpha=0.01)하면 위의 numpy 구현과 평균·표준편차·로그 주변 우도가 소수 셋째 자리까지 같다. GaussianProcessRegressor는 GPML 알고리즘 2.1을 기반으로 구현되어 있다.[5] 기본 커널은 ConstantKernel() * RBF(), 기본 alpha는 1e-10이다. WhiteKernel을 커널에 넣으면 predict의 표준편차에 잡음 분산이 함께 들어간다는 점에 주의한다.
출력이 범주이면 우도가 정규 분포가 아니므로 사후 분포를 닫힌 식으로 구할 수 없다. 잠재 함수 에 GP 사전 분포를 두고 로지스틱이나 프로빗 함수로 확률을 만든 뒤, 사후 분포를 정규 분포로 근사한다. 라플라스 근사, 기댓값 전파(EP), 변분 추론이 쓰인다. scikit-learn의 GaussianProcessClassifier는 라플라스 근사를 쓰고, 다중 클래스는 이진 분류기 여러 개(일대다 또는 일대일)로 처리한다.[4]
베이지안 최적화는 평가 비용이 큰 함수 (예: 하이퍼파라미터를 넣어 모델을 학습하고 검증 점수를 재는 과정)를 적은 횟수로 최적화하는 방법이다. GP는 여기서 대리 모델(surrogate model)로 쓰이는데, 적은 관측으로도 평균과 불확실성을 함께 주기 때문이다. 스노크 등(2012)은 기계 학습 알고리즘의 하이퍼파라미터 튜닝을 GP 기반 베이지안 최적화로 자동화했다.[3]
반복 절차는 다음과 같다.
- 지금까지의 관측 로 GP를 학습한다.
- 사후 평균 와 표준편차 로 획득 함수를 계산하고, 그것이 가장 큰 를 고른다.
- 를 실제로 평가해 관측에 추가한다.
대표적인 획득 함수(최대화 문제, 지금까지의 최댓값 )는 다음과 같다.
- 기대 개선(EI): . , 는 표준 정규 분포의 누적 분포 함수와 밀도 함수이고 은 탐험 정도다.
- 신뢰 상한(UCB): . 가 클수록 불확실한 곳을 더 탐험한다.
- 개선 확률(PI): .
EI의 첫 항은 평균이 높은 곳(활용), 둘째 항은 불확실성이 큰 곳(탐험)을 선호하므로 둘의 균형을 자동으로 잡는다. 입력 차원이 높거나 평가가 싸서 많이 돌릴 수 있으면 GP 대신 트리 기반 대리 모델(TPE, 랜덤 포레스트)이나 단순 무작위 탐색이 더 실용적인 경우가 많다.
- 은닉층이 하나인 신경망에서 가중치에 독립 사전 분포를 두고 폭을 무한대로 늘리면 출력이 GP가 된다는 사실이 1990년대 닐(Radford Neal)의 연구로 알려졌다. 리 등(2018)은 이를 깊은 신경망으로 확장해, 층이 여러 개인 무한 폭 신경망에 대응하는 커널(NNGP)을 계산했다.[8]
- 학습 중인 무한 폭 신경망은 신경 탄젠트 커널(NTK)을 쓴 커널 회귀와 같아진다. 자세한 내용은 커널 트릭 문서 참고.
- 실무에서는 신경망이 뽑은 특징 위에 GP를 얹어(심층 커널 학습) 불확실성 추정을 보강하기도 한다. 불확실성을 다루는 다른 방법은 베이지안 심층 신경망 문서 참고.
| 장점 | 단점 |
|---|---|
| 예측 불확실성을 닫힌 식으로 준다 | 정확한 계산이 이라 표본 수만 개 이상은 근사가 필요하다 |
| 데이터가 적어도 잘 작동하고, 커널로 사전 지식(매끄러움, 주기)을 넣을 수 있다 | 결과가 커널 선택에 크게 좌우된다 |
| 하이퍼파라미터를 주변 우도로 학습해 교차 검증이 덜 필요하다 | 입력 차원이 높으면(대략 수십 이상) 거리 기반 커널의 성능이 떨어진다 |
| 사후 평균이 훈련 점을 보간하는 매끄러운 함수다 | 분류·비정규 출력은 근사 추론이 필요하다 |
- ↑ 1.0 1.1 1.2 Carl Edward Rasmussen, Christopher K. I. Williams, 《Gaussian Processes for Machine Learning》, MIT Press, 2006, 2장. 저자 공개본
- ↑ Rasmussen & Williams, 앞의 책, 5장 "Model Selection and Adaptation of Hyperparameters". PDF
- ↑ 3.0 3.1 Jasper Snoek, Hugo Larochelle, Ryan P. Adams, 〈Practical Bayesian Optimization of Machine Learning Algorithms〉, NIPS 2012. arXiv:1206.2944
- ↑ 4.0 4.1 scikit-learn 문서, Gaussian Processes
- ↑ scikit-learn 1.9 문서, GaussianProcessRegressor
- ↑ Michalis Titsias, 〈Variational Learning of Inducing Variables in Sparse Gaussian Processes〉, AISTATS 2009. PMLR 5
- ↑ Jacob R. Gardner 외, 〈GPyTorch: Blackbox Matrix-Matrix Gaussian Process Inference with GPU Acceleration〉, NeurIPS 2018. arXiv:1809.11165
- ↑ Jaehoon Lee 외, 〈Deep Neural Networks as Gaussian Processes〉, ICLR 2018. arXiv:1711.00165
- Carl Edward Rasmussen, Christopher K. I. Williams, Gaussian Processes for Machine Learning, MIT Press, 2006
- Christopher M. Bishop, 《Pattern Recognition and Machine Learning》, Springer, 2006, 6.4절 "Gaussian Processes".
- scikit-learn 문서, Gaussian Processes