베이지안 방법론 개요¶
베이지안 방법론(Bayesian Methods)은 확률을 불확실성의 척도로 해석하고, 사전 지식과 관측 데이터를 결합하여 추론하는 통계적 접근법. 불확실성 정량화, 작은 데이터, 의사결정에 강점이 있음.
핵심 개념¶
베이즈 정리¶
\[P(\theta | D) = \frac{P(D | \theta) P(\theta)}{P(D)} = \frac{\text{Likelihood} \times \text{Prior}}{\text{Evidence}}\]
| 구성 요소 | 기호 | 의미 |
|---|---|---|
| Prior | \(P(\theta)\) | 사전 지식/믿음 |
| Likelihood | $P(D | \theta)$ |
| Posterior | $P(\theta | D)$ |
| Evidence | \(P(D)\) | 정규화 상수 |
빈도주의 vs 베이지안¶
| 관점 | 빈도주의 | 베이지안 |
|---|---|---|
| 확률 해석 | 장기적 빈도 | 불확실성/믿음 |
| 파라미터 | 고정된 미지 상수 | 확률 변수 |
| 추정 | 점추정 (MLE) | 분포 추정 (Posterior) |
| 불확실성 | 신뢰구간 | 신용구간 (Credible Interval) |
| 사전 지식 | 사용 안 함 | Prior로 반영 |
알고리즘 분류 체계¶
Bayesian Methods
├── Inference
│ ├── Exact
│ │ └── Conjugate Priors
│ ├── Sampling (MCMC)
│ │ ├── Metropolis-Hastings
│ │ ├── Gibbs Sampling
│ │ ├── Hamiltonian Monte Carlo (HMC)
│ │ └── No-U-Turn Sampler (NUTS)
│ └── Variational Inference
│ ├── Mean-field VI
│ └── Automatic Differentiation VI (ADVI)
├── Bayesian Models
│ ├── Bayesian Linear Regression
│ ├── Bayesian Neural Networks
│ ├── Gaussian Processes
│ └── Hierarchical Models
├── Bayesian Optimization
│ ├── Gaussian Process surrogate
│ └── Acquisition Functions (EI, UCB)
└── Applications
├── A/B Testing
├── Hyperparameter Tuning
└── Decision Making
베이지안 추론¶
Conjugate Priors¶
사후분포가 사전분포와 같은 가족이 되는 편리한 조합:
| Likelihood | Conjugate Prior | Posterior |
|---|---|---|
| Bernoulli/Binomial | Beta | Beta |
| Poisson | Gamma | Gamma |
| Normal (mean) | Normal | Normal |
| Normal (variance) | Inverse Gamma | Inverse Gamma |
| Multinomial | Dirichlet | Dirichlet |
예: Beta-Binomial
\[\text{Prior: } \theta \sim Beta(\alpha, \beta)$$
$$\text{Likelihood: } x | \theta \sim Binomial(n, \theta)$$
$$\text{Posterior: } \theta | x \sim Beta(\alpha + x, \beta + n - x)\]
MCMC (Markov Chain Monte Carlo)¶
복잡한 사후분포에서 샘플링:
Metropolis-Hastings:
1. 현재 상태 θ에서 제안 θ' ~ q(θ'|θ) 샘플
2. 수락 확률 계산:
α = min(1, [p(θ'|D)q(θ|θ')] / [p(θ|D)q(θ'|θ)])
3. u ~ Uniform(0,1) < α이면 수락 (θ = θ')
4. 반복
Hamiltonian Monte Carlo (HMC):
물리적 시뮬레이션으로 효율적 탐색
import pymc as pm
import arviz as az
# PyMC 모델 정의
with pm.Model() as model:
# Prior
mu = pm.Normal('mu', mu=0, sigma=10)
sigma = pm.HalfNormal('sigma', sigma=10)
# Likelihood
y_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=data)
# MCMC 샘플링 (NUTS)
trace = pm.sample(2000, tune=1000, cores=4, return_inferencedata=True)
# 결과 분석
az.summary(trace)
az.plot_trace(trace)
az.plot_posterior(trace)
Variational Inference¶
사후분포를 간단한 분포로 근사:
\[q^*(\theta) = \arg\min_{q \in Q} KL(q(\theta) \| p(\theta|D))\]
ELBO 최대화로 동치:
\[ELBO = \mathbb{E}_q[\log p(D|\theta)] - KL(q(\theta) \| p(\theta))\]
with pm.Model() as model:
# ... 모델 정의 ...
# ADVI
approx = pm.fit(method='advi', n=30000)
trace = approx.sample(2000)
Gaussian Processes¶
함수에 대한 분포:
\[f(x) \sim GP(m(x), k(x, x'))\]
예측 분포:
\[f_* | X, y, X_* \sim \mathcal{N}(\bar{f}_*, cov(f_*))\]
\[\bar{f}_* = K_*^T (K + \sigma_n^2 I)^{-1} y\]
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel
kernel = RBF(length_scale=1.0) + WhiteKernel(noise_level=1.0)
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(X_train, y_train)
# 예측 + 불확실성
y_pred, y_std = gp.predict(X_test, return_std=True)
# 신뢰구간
lower = y_pred - 1.96 * y_std
upper = y_pred + 1.96 * y_std
베이지안 최적화¶
비용이 큰 블랙박스 함수 최적화:
1. Surrogate Model (GP) 학습
2. Acquisition Function 최대화 → 다음 평가점 선택
3. 실제 함수 평가
4. Surrogate Model 업데이트
5. 반복
Acquisition Functions:
| 함수 | 수식 | 특성 |
|---|---|---|
| Expected Improvement | \(\mathbb{E}[\max(f(x) - f^+, 0)]\) | Exploitation + Exploration |
| Upper Confidence Bound | \(\mu(x) + \kappa \sigma(x)\) | 탐색-활용 균형 조절 |
| Probability of Improvement | \(P(f(x) > f^+ + \epsilon)\) | 보수적 |
from bayes_opt import BayesianOptimization
def objective(x, y):
return -((x - 2) ** 2 + (y - 3) ** 2)
optimizer = BayesianOptimization(
f=objective,
pbounds={'x': (-5, 5), 'y': (-5, 5)},
random_state=42
)
optimizer.maximize(init_points=5, n_iter=25)
print(optimizer.max)
베이지안 A/B 테스트¶
import pymc as pm
import numpy as np
# 데이터
control_conversions = 120
control_total = 1000
treatment_conversions = 145
treatment_total = 1000
with pm.Model() as ab_model:
# Prior (무정보적)
p_control = pm.Beta('p_control', alpha=1, beta=1)
p_treatment = pm.Beta('p_treatment', alpha=1, beta=1)
# Likelihood
obs_control = pm.Binomial('obs_control', n=control_total, p=p_control,
observed=control_conversions)
obs_treatment = pm.Binomial('obs_treatment', n=treatment_total, p=p_treatment,
observed=treatment_conversions)
# 차이 및 상대 효과
diff = pm.Deterministic('diff', p_treatment - p_control)
relative_lift = pm.Deterministic('relative_lift', (p_treatment - p_control) / p_control)
# 샘플링
trace = pm.sample(5000, return_inferencedata=True)
# 결과 해석
posterior_diff = trace.posterior['diff'].values.flatten()
prob_treatment_better = (posterior_diff > 0).mean()
print(f"P(Treatment > Control) = {prob_treatment_better:.2%}")
# 95% 신용구간
print(f"Lift 95% CI: [{np.percentile(posterior_diff, 2.5):.4f}, {np.percentile(posterior_diff, 97.5):.4f}]")
계층적 모델 (Hierarchical Models)¶
그룹 간 정보 공유 (부분 풀링):
\[y_{ij} | \theta_j \sim p(y | \theta_j)$$
$$\theta_j | \phi \sim p(\theta | \phi)$$
$$\phi \sim p(\phi)\]
with pm.Model() as hierarchical_model:
# Hyperpriors
mu_global = pm.Normal('mu_global', mu=0, sigma=10)
sigma_global = pm.HalfNormal('sigma_global', sigma=5)
# Group-level parameters
mu_group = pm.Normal('mu_group', mu=mu_global, sigma=sigma_global, shape=n_groups)
# Likelihood
y = pm.Normal('y', mu=mu_group[group_idx], sigma=sigma, observed=data)
trace = pm.sample(2000)
참고 문헌¶
교과서¶
- Gelman, A. et al. (2013). "Bayesian Data Analysis" (3rd ed). CRC Press.
- McElreath, R. (2020). "Statistical Rethinking" (2nd ed). CRC Press.
- Murphy, K.P. (2023). "Probabilistic Machine Learning: Advanced Topics". MIT Press.
핵심 논문¶
- Hoffman, M.D. & Gelman, A. (2014). "The No-U-Turn Sampler". JMLR.
- Blei, D.M. et al. (2017). "Variational Inference: A Review for Statisticians". JASA.
라이브러리¶
- PyMC: https://www.pymc.io/
- Stan: https://mc-stan.org/
- NumPyro: https://num.pyro.ai/
- ArviZ: https://arviz-devs.github.io/arviz/