한줄 요약

Importance sampling 은 뽑기 어려운 분포의 기댓값을, 뽑기 쉬운 분포에서 뽑아서 계산하는 방법이다.

어떤 확률 분포 에서 의 평균이 궁금한데 에서 sample 을 만들기 어려운 경우가 있다. 이때 sample 은 만들기 쉬운 분포 에서 뽑고, 뽑힌 sample 하나하나에 라는 무게를 다시 매겨서 의 기댓값을 복원한다.

핵심은 sample 을 바꾼 것이 아니라 무게를 바꿨다는 점이다.

왜 필요한가

두 가지 상황에서 쓴다.

첫째, 에서 직접 뽑는 것이 비싼 경우다. Rejection sampling 은 뽑은 sample 을 조건에 안 맞으면 버리는데, 버리는 비율이 높으면 계산 비용이 크게 늘어난다.

둘째, 애초에 분포 전체가 필요하지 않은 경우다. 우리가 알고 싶은 것이 ” 를 따를 때 의 평균” 하나뿐이라면, 를 그대로 재현하는 sample 을 만들 필요가 없다. 기댓값만 맞으면 된다.

세 번째 상황이 실무에서 가장 흔하다. 이미 다른 분포로 뽑아둔 데이터밖에 없는 경우다. 과거 정책이 남긴 로그로 새 정책을 평가하거나, 예전 모델이 만든 rollout 으로 지금 모델을 업데이트하는 상황이 여기 해당한다.

어떻게 동작하나

그림으로 보면

알고 싶은 것 :  x 를 p 에서 뽑았을 때 f(x) 의 평균
막히는 곳    :  p 에서 뽑기가 어렵다
 
        p(x)  ────  뽑기 어려움  ────X

         │  대신

        q(x)  ────  뽑기 쉬움  ────>  x1, x2, ... , xN

                                       │  sample 마다 무게를 다시 매긴다

                                  w_n = p(x_n) / q(x_n)


                       E_p[f] 의 추정값 = (1/N) Σ w_n · f(x_n)

무게 가 하는 일은 한 줄로 정리된다.

q 가 자주 뽑는데 p 에서는 드문 구간   ->  w = p/q < 1  ->  무게를 줄인다
q 가 드물게 뽑는데 p 에서는 흔한 구간 ->  w = p/q > 1  ->  무게를 키운다

가 실제 분포보다 많이 뽑아온 것은 깎고, 적게 뽑아온 것은 부풀린다. 그래서 로 뽑았는데도 평균이 의 것으로 맞춰진다.

식으로 보면

시작은 기댓값의 정의다. 확률 밀도 함수다.

여기에 를 곱한다. 값은 그대로다.

이제 가 앞에 붙었으므로, 이 식은 에 대한 기댓값 모양이 된다.

마지막으로 이 기댓값을 에서 뽑은 sample 개로 근사한다.

기호는 다음처럼 읽으면 된다.

기호
원래 알고 싶은 분포. nominal distribution
실제로 sample 을 뽑는 분포. importance distribution
기댓값을 구하려는 대상 함수
sample 하나에 매기는 무게. likelihood ratio
에서 뽑은 sample 개수

를 고를 때 조건이 하나 있다. 인 곳에서는 이어야 한다. 에서 일어날 수 있는 일을 가 아예 안 뽑으면, 그 부분은 추정값에 영원히 반영되지 않는다.

|600

숫자로 따라가기

결과가 세 개뿐인 분포로 확인해 보자. 는 C 가 나올 때만 10 을 준다.

결과
A0.10.400.2500
B0.20.300.6670
C0.70.3102.33323.333

직접 계산한 참값은 이렇다.

에서 뽑아 무게를 매긴 쪽도 같은 값이 나온다.

는 C 를 0.3 만큼만 뽑는데 실제 에서는 0.7 이다. 적게 뽑힌 만큼 무게 배로 부풀려서 균형을 맞춘 것이다.

sample 이 적으면 무너진다

위 계산이 성립하는 것은 기댓값 차원의 이야기다. 실제로는 sample 을 유한 개 뽑아 평균을 내므로, 이 작으면 추정값이 참값과 크게 어긋난다.

같은 예시에서 을 바꿔가며 추정해 보면 이렇게 된다.

추정값의 평균추정값의 표준편차
1약 7.010.7
10약 7.03.5
100약 7.01.0
1000약 7.00.34

평균은 어느 에서나 7 근처다. importance sampling 추정량이 편향되지 않았다는 뜻이다. 하지만 일 때 표준편차가 10.7 로, 추정하려는 값 7 보다도 크다.

이유는 표를 보면 바로 보인다. sample 을 하나만 뽑으면 결과가 두 가지뿐이다. A 나 B 가 나오면 추정값은 0 이고, C 가 나오면 23.333 이다. 7 이라는 값은 그 중간 어디에도 없다. 여러 번 뽑아 평균을 내야 비로소 7 에 모인다.

그래서 importance sampling 은 “비율을 곱했으니 보정됐다” 고 말할 수 있는 기법이 아니다. 충분히 많은 sample 을 평균해야 보정이 완성된다. 무게의 분산이 클수록, 즉 가 많이 다를수록 필요한 이 커진다.

이 성질은 LLM RL 에서 실제 논쟁거리가 된다. GSPO 논문은 GRPO 가 각 token 위치에서 sample 하나로 비율을 만드는 것을 두고, 그것이 분포를 보정하는 역할을 하지 못하고 분산만 키운다고 지적한다. 위 표의 행이 바로 그 상황이다.

어디에 쓰이나

  • off-policy RL — 과거 policy 로 만든 rollout 으로 현재 policy 를 업데이트한다. 가 현재 policy, 가 rollout 을 만든 policy 다. PPO 계열의 ratio 가 이 이고, clipping 은 그 무게가 너무 커지지 않도록 자르는 장치다.
  • offline 평가 — 서비스 중인 정책이 남긴 로그로 새 정책의 성능을 추정한다. 추천 도메인에서는 노출될 확률의 역수로 무게를 주는 inverse propensity score 라는 이름으로 더 많이 불린다. 같은 아이디어를 다른 각도에서 부르는 것이다.
  • 드문 사건의 추정 — 확률이 아주 낮은 사건을 에서 그냥 뽑으면 거의 관측되지 않는다. 그 사건 쪽을 자주 뽑는 를 만들어 두고 무게로 되돌리면 훨씬 적은 sample 로 추정할 수 있다.

References