Importance Sampling
Importance sampling은 Monte Carlo 방법의 일종으로, 기대값을 추정할 때 직접 샘플링하기 어려운 분포 \( p(x) \) 대신 다른 분포 \( q(x) \)에서 샘플을 추출한 후 가중치를 조정하여 정확한 추정치를 얻는 기법입니다. 이 방법은 분산 감소(variance reduction)를 통해 더 효율적인 추정이 가능하며, 특히 고차원 공간이나 희귀 이벤트 분석에 유용합니다.
핵심 원리
기대값 \( \mathbb{E}_{p(x)}[f(x)] = \int f(x)p(x)dx \)를 계산할 때, \( p(x) \)에서 직접 샘플링하기 어려운 경우 \( q(x) \)를 이용해 다음과 같이 변환합니다:
\[ \mathbb{E}_{p(x)}[f(x)] = \mathbb{E}_{q(x)}\left[ f(x) \frac{p(x)}{q(x)} \right] \]
여기서 \( \frac{p(x)}{q(x)} \)는 중요도 가중치(importance weight)로, \( q(x) \)의 편향을 보정합니다.
예제: 정규분포 기반 추정
문제 설정
- 목표 분포: \( p(x) = \mathcal{N}(0, 1) \)
- 추정할 함수: \( f(x) = 10e^{-5(x-3)^4} \)
- \( x=3 \) 근처에서 \( f(x) \)가 크지만, \( p(x) \)는 이 영역에서 확률 밀도가 매우 낮습니다.
표준 Monte Carlo의 한계
\( p(x) \)에서 직접 샘플링하면 \( x=3 \) 근처 샘플이 거의 추출되지 않아 추정치의 분산이 큽니다.
중요도 샘플링 적용
- 제안 분포: \( q(x) = \mathcal{N}(3, 1) \)
- 가중치 계산: \( w(x) = \frac{p(x)}{q(x)} \)
- 추정식:
\[ \hat{\mu} = \frac{1}{n}\sum_{i=1}^n f(x_i) \frac{p(x_i)}{q(x_i)} \]
Python 구현 코드
import numpy as np
from scipy.stats import norm
n = 10000
np.random.seed(0)
# 표준 Monte Carlo
x = np.random.randn(n)
g = 10 * np.exp(-5 * (x - 3)**4)
MC_estimate = np.mean(g)
print(f"Standard MC: {MC_estimate:.4f}")
# 중요도 샘플링
y = 3 + np.random.randn(n) # q(x) = N(3,1)
g_weighted = 10 * np.exp(-5 * (y - 3)**4) * norm.pdf(y, 0, 1) / norm.pdf(y, 3, 1)
IS_estimate = np.mean(g_weighted)
print(f"Importance Sampling: {IS_estimate:.4f}")
결과 비교
방법 | 추정값 | 표준편차 |
---|---|---|
표준 Monte Carlo | 0.0042 | 0.0205 |
중요도 샘플링 | 0.0056 | 0.0011 |
효과적인 \( q(x) \) 선택 전략
- 분산 최소화 조건:
- 실패 사례: \( q(x) \)가 \( f(x)p(x) \)의 고영역을 포함하지 않을 경우 추정 오차가 증가합니다. 가중치 \( \frac{p(x)}{q(x)} \)의 분산이 크면 역효과가 발생할 수 있습니다.
\[ q^*(x) = \frac{|f(x)|p(x)}{\int |f(x)|p(x)dx} \]
이상적인 \( q(x) \)는 \( |f(x)|p(x) \)에 비례하지만, 실제로는 근사 분포(예: 이동된 정규분포)를 사용합니다.응용 분야
- 강화학습: 희귀 이벤트의 기대보상 추정.
- 베이지안 추론: 사후분포 \( p(\theta|D) \)의 기대값 계산.
- 금융 리스크 모델링: 꼬리 위험(tail risk) 분석.
* 중요도 샘플링은 샘플링 효율성과 분산 감소를 동시에 달성할 수 있는 강력한 도구입니다.