중요도 샘플링과 SMC·입자 필터의 실무적 설계
중요도 샘플링, 순차적 몬테카를로, 입자 필터의 가중치 안정화·리샘플링·ESS 진단과 운영 설계를 정리한다.
2026-08-14 · 최초 발행 2025-10-14
표적분포에서 표본을 직접 얻기 어려운 문제는 제안분포를 어떻게 고르느냐에 따라 난도가 크게 달라진다. 중요도 샘플링(Importance Sampling, IS), 순차적 몬테카를로(Sequential Monte Carlo, SMC), 입자 필터(Particle Filtering, PF)는 분포 불일치, 온라인 갱신, 고차원 가중치 붕괴를 다루는 대표적인 방법이다.
표적분포를 입자와 가중치로 근사하는 방법
중요도 샘플링은 표적분포 p(x)에서 직접 샘플링하지 못할 때 제안분포 q(x)에서 표본을 얻고, w = p/q 가중치로 보정하는 절차다. E_p[f(x)]는 이 가중합으로 근사하며, 비편향 추정 프레임워크로 사용할 수 있다.
SMC는 시간에 따라 변하는 잠재 상태의 사후분포를 입자 집합과 가중치로 표현한다. 새 관측이 도착할 때마다 중요도 가중치를 갱신하고 필요에 따라 리샘플링하므로, 스트림 환경에서 온라인 추론을 수행할 수 있다.
입자 필터는 상태공간모형 x_t ~ p(x_t|x_{t-1}), y_t ~ p(y_t|x_t)에서 p(x_t|y_{1:t})를 입자와 가중치로 근사하는 SMC 구현체다. 추정·예측·추적 문제에 널리 적용된다.
제안분포와 리샘플링이 만드는 차이
q(x)의 선택은 분산과 표본 효율을 좌우한다. 가중치는 로그 공간에서 누적하고 max-shift 정규화를 적용해 언더플로를 피해야 한다.
입자 가중치가 일부 표본에 집중되는 퇴화(degeneracy)는 유효표본크기(ESS)로 감시한다. 리샘플링 트리거는 N/2 정도의 임계치가 권장되며, 다항·층화·체계적·잔여 방식 가운데 체계적 또는 층화 방식은 분산과 비용의 균형이 좋다.
SMC는 관측 스트림마다 O(N)으로 갱신할 수 있다. 제안분포에 관측 의존성을 포함하는 최적 제안을 사용하면 누적 드리프트를 줄일 수 있다. 다만 고차원에서는 가중치 붕괴 위험이 커진다. 선형-가우시안 성분을 칼만 필터로 적분하는 Rao-Blackwellized Particle Filter(RBPF)는 이때 분산을 낮추는 방법이다.
ESS, 가중치 엔트로피, 다이버전스(KL)는 추정 품질을 점검하는 지표다. q(x) 갱신, 입자 수 N, 리샘플링 빈도를 적응적으로 조정하는 근거로도 쓸 수 있다.
관측이 들어올 때 입자를 갱신하는 흐름
로그 가중치를 누적한 뒤 최대값을 빼서 정규화한다. ESS 계산에는 분모 안정화를 위한 ε 추가가 필요하며, 리샘플링 뒤에는 병렬 처리와 캐시 지역성이 유지되는지도 확인해야 한다.
추적·학습·희귀 사건 추정에서의 적용
비선형·비가우시안 물체 추적, 차량·드론 위치 추정, 레이더와 비전의 결합 추정에는 PF를 적용할 수 있다. 칼만 필터와 비교하면 외란과 멀티모달 분포를 다루는 데 강점이 있다.
SMC^2와 PMCMC(Particle MCMC)는 파라미터와 상태를 함께 추정하는 베이지안 온라인 학습에 쓰인다. 스트림 데이터가 도착할 때마다 사후분포를 순차적으로 갱신할 수 있다.
IS는 테일 손실 확률과 CVaR 같은 금융 리스크, 희귀 사건 확률 추정에 사용할 수 있다. 제안분포를 잘 설계하면 분산이 크게 낮아진다. 복잡한 물리 시뮬레이터에서는 희귀 이벤트의 관찰 빈도를 높여 계산 예산 대비 유효 표본을 늘린다.
로보틱스 SLAM에서는 FastSLAM 같은 RBPF가 특징점 기반 지도와 입자 기반 위치 추정을 결합한다.
분산·지연·확장성의 특성
적합한 q(x)와 리샘플링을 결합하면 추정 분산은 문제에 따라 30~80% 감소할 수 있다. 같은 정확도에 필요한 N도 줄어 비용 절감으로 이어진다.
SMC는 타임스텝당 O(N) 복잡도와 낮은 메모리 풋프린트를 갖기 때문에 실시간 시스템에서 지연의 예측 가능성을 높인다. 비선형·비가우시안 환경에서는 단봉 가정이 무력해질 때도 멀티모달 또는 치우친 분포의 추정을 안정화할 수 있다.
입자는 서로 독립적으로 처리할 수 있어 데이터와 모델 병렬화가 쉽다. GPU와 멀티코어 환경에서는 선형적 스케일아웃도 가능하다.
| 항목 | Importance Sampling (IS) | Sequential Monte Carlo (SMC) | Particle Filter (PF) |
|---|---|---|---|
| 성능(추정 분산) | 제안 최적 시 매우 낮음, 미스매치 시 급격히 증가 | 시간축 누적 제어, 적응형으로 안정화 | 관측-의존 제안 시 우수, 기본 제안은 퇴화 가능 |
| 확장성 | 독립 샘플 병렬성 우수 | 타임스텝 독립 X, 입자 병렬성 O | 입자 병렬성 O, 리샘플링 동기화 필요 |
| 일관성 | 표본수 → ∞ 시 일관 | 타임스텝 누적에도 일관 | 상태공간모형 가정하 일관 |
| 안정성 | 가중치 붕괴 위험 큼 | ESS 기반 리샘플링으로 완화 | 리샘플링·제안 개선으로 완화 |
| 운영 편의 | 구현 단순 | 설계 항목 다수(ESS, q, 리샘플링) | 모델 설계와 파라미터 튜닝 필요 |
구현 전에 정할 운영 기준
관측 정보를 포함하는 q(x_t|x_{t-1}, y_t)를 우선 검토한다. 이것이 어려우면 이동평균이나 UKF/EnKF를 보조 제안으로 사용할 수 있다.
ESS는 ESS = 1 / sum(w^2)로 계산하고, τ ≈ N/2를 리샘플링 기준으로 삼는다. 체계적(systematic) 또는 층화(stratified) 방식을 선택하면 분산과 비용을 조절할 수 있다.
수치 안정화에는 log-weights 누적과 max-shift 정규화가 필요하다. underflow 방지를 위한 ε 클립, NaN 감시, 재초기화 규칙도 함께 둔다. 벡터화와 배치화, PRNG 스트림 고정은 성능과 재현성을 위한 기본 조건이다. 리샘플링은 최소화하고 관측이 도착한 시점에만 트리거한다.
중요도 샘플링으로 희귀 사건 확률 근사하기
전제조건은 Python 3.10+, numpy 1.26+, 선택적 numba다. 표적 p는 N(5, 1^2), 제안 q는 N(0, 4^2)이며, P_p(X > 7)를 추정한다.
# Python 3.10+, numpy 1.26+
import numpy as np
rng = np.random.default_rng(42)
N = 200_000
# q ~ N(0, 4^2)
x = rng.normal(loc=0.0, scale=4.0, size=N)
def log_norm_pdf(x, mu, sigma):
return -0.5*np.log(2*np.pi*sigma**2) - 0.5*((x-mu)/sigma)**2
# log weights: log p(x) - log q(x)
logw = log_norm_pdf(x, 5.0, 1.0) - log_norm_pdf(x, 0.0, 4.0)
# 안정화: max-shift
logw -= np.max(logw)
w = np.exp(logw)
w /= np.sum(w)
# 추정: P_p(X > 7)
indicator = (x > 7).astype(float)
estimate = np.sum(w * indicator)
# 진단: ESS
ess = 1.0 / np.sum(w**2)
print(f"Estimate P(X>7): {estimate:.6f}")
print(f"ESS: {ess:.1f} / N={N}")
분산이 큰 q로 꼬리 영역을 덮고, 로그 가중치로 언더플로를 피하며, ESS로 표본 품질을 진단한다.
비선형 관측을 사용하는 1D 입자 필터
모형은 x_t = x_{t-1} + ε, ε~N(0, σ_proc^2), y_t = x_t^2/20 + η, η~N(0, σ_obs^2)다.
# Python 3.10+, numpy 1.26+
import numpy as np
rng = np.random.default_rng(0)
T = 50
N = 2000
sigma_proc = 1.0
sigma_obs = 1.0
def systematic_resample(w, rng):
N = len(w)
positions = (rng.random() + np.arange(N)) / N
cdf = np.cumsum(w)
idx = np.searchsorted(cdf, positions, side="right")
return idx
# 시뮬레이션된 관측 생성
x_true = np.zeros(T)
y = np.zeros(T)
for t in range(1, T):
x_true[t] = x_true[t-1] + rng.normal(0, sigma_proc)
y = (x_true**2)/20 + rng.normal(0, sigma_obs, size=T)
# 초기화
x = rng.normal(0, 2.0, size=N)
logw = np.zeros(N)
def log_norm_pdf_scalar(x, mu, sigma):
return -0.5*np.log(2*np.pi*sigma**2) - 0.5*((x-mu)/sigma)**2
est = np.zeros(T)
for t in range(T):
# 제안: 전이분포 p(x_t|x_{t-1})
x = x + rng.normal(0, sigma_proc, size=N)
# 로그-가중치 업데이트: p(y_t|x_t)
pred = (x**2)/20.0
logw += -(0.5*np.log(2*np.pi*sigma_obs**2) + 0.5*((y[t]-pred)/sigma_obs)**2)
# 정규화
logw -= np.max(logw)
w = np.exp(logw)
w /= w.sum()
# 추정
est[t] = np.sum(w * x)
# ESS 기반 리샘플링
ess = 1.0 / np.sum(w**2)
if ess < N/2:
idx = systematic_resample(w, rng)
x = x[idx]
logw = np.zeros(N) # w = 1/N
# 결과 출력(간단)
print(f"MAE: {np.mean(np.abs(est - x_true)):.3f}, Final ESS: {ess:.1f}")
전이분포를 제안으로 사용하고 로그 가중치를 안정화한 뒤, ESS 임계치를 넘을 때 체계적 리샘플링을 수행한다.
비용과 안정성 사이의 선택
N을 늘리면 분산은 감소하지만 비용은 선형으로 증가한다. 비용 대비 효과는 입자 수를 무작정 키우는 것보다 제안분포를 개선할 때 더 좋다.
리샘플링을 자주 하면 샘플 다양성이 떨어지고 동기화 오버헤드가 생긴다. ESS 기반 트리거는 이 지연을 줄이는 기준이 된다. 모델이 복잡해질수록 제안분포 설계도 어려워지므로, RBPF나 보조 필터(Auxiliary PF)로 안정성을 보완할 수 있다.
IS, SMC, PF를 운영할 때는 먼저 단순한 기준선 구현을 두고 ESS와 엔트로피를 관찰하는 편이 좋다. 그 결과를 바탕으로 제안분포, 입자 수, 리샘플링 정책을 적응형 전략으로 확장할 수 있다.