베이즈 통계(13): 사례와 말로 설명하는 MCMC

베이즈 추론은 매력적이다. 하지만 아무리 매력적이라도 실제로 사용할 수 없다면 그림의 떡이 아니겠는가? 아래 베이즈 정리를 보자.

베이즈 추론에 있어 우리의 목표는 좌변에 있는 조건부 확률(분포) 를 구하는 것이다. 즉, 데이터 를 관찰했을 때 퍼라미터 가 참일 확률을 구하는 것이 미션이다. 그런데 가 무수하게 존재하면 그것은 분포로 나타내야 하고 그 분포를 목표 분포(target distribution)라고 부르는데, 그 목표분포를 구하는 것이 미션이 될 것이다. 베이즈 정리인 식(1)은 우리가 알고 있는 정보로부터 우리가 모르는 정보를 추정하게 해준다. 우변의 분자와 분모에 있는 를 모두 특정하면 좌변의 미지 정보 가 추정되는 것이다.

앞 포스팅들에서 사전확률(분포) 는 통계 자료나 선행 연구에서 구할 수 있고, 공액(conjugation)을 통해 우도 함수로부터 추정될 수도 있으며, 심지어 추측으로라도 추정될 수 있다고 했다. 그리고 우도(함수) 도 관찰된 자료가 있고, 그 자료의 분포를 추측할 수 있으면 추정될 수 있음을 보았다.

문제는 분모에 들어 있는 정규화 요인(주변확률) 이다. 때로 그것은 통계 자료로부터 구할 수 있고, 이산확률변수인 경우 해당 결합확률들을 합해서 도출될 수도 있다. 그러나 연속확률변수인 경우 적분 계산을 해야하는데, 적분해야 할 분포함수가 고차원이거나 복잡한 경우에는 계산이 불가능하거나 너무 어렵다.

그래서 베이즈 통계학자들은 우변의 분모 없이 사후확률(분포)을 추정하는 방법을 찾아냈다.

식(1)의 우변에서 비정규화 상수인 분모를 빼면 식(2)와 같이 된다. 이는 사후확률이 사전확률과 우도의 곱에 비례한다는 식이다. 그렇게 해서 구한 사후확률은 정규화되지 않은 값이다. 그것은 합해서 0이 나오지 않는 값들이기 때문에 정확히 말하자면 우리가 구하고자 하는 확률이 아니다. 그러나 추정 과정에서, 만약 식(1)의 우변이 두 개가 있고 그것을 나누어 비례를 구하는 계산이 들어간다면 그 골치아픈 분모는 자연히 소거되어 버릴 것이다.

자, 식(2)의 우변에서 관찰 데이터는 고정되어 있고, 사전확률는 손 댈 수 없으니 무슨 방법이 있을까? 사후확률분포로 눈을 돌릴 수밖에 없다. 거기에서도 데이터 는 고정되어 있으니 무언가 손을 쓸 수 있는 것은 퍼라미터 밖에 없다. 다행히 베이즈 통계에서 는 불변 상수가 아니라 확률변수이다. 무수한 가 존재할 수 있다는 말이다.

만약 로 구성된 목표분포로부터 표본을 추출할 수 있다면 몬테카를로 접근을 이용해서 목표분포를 근사해 낼 수 있을 것이다. 그런데 목표분포를 특정할 수 없다–당연히 그렇겠지만–면, 그것으로부터 직접 표본을 추출할 수 없다. 그렇다면 간접적으로 표본을 추출할 수 있는 방법은 없을까? 그러한 고민 끝에 어렵사리 도달한 방법이 MCMC이다.

MCMC 과정

사실 우리가 베이즈 추론을 응용하는데 굳이 MCMC 과정을 이해하지 않아도 별로 문제가 되지 않는다. MCMC를 적용할 수 있는 컴퓨터 소프트웨어는 손쉽게 구할 수 있고 그것을 사용하면 별로 힘들지 않게 모수나 사후확률분포를 추정할 수 있기 때문이다. 하지만 모든 알고리즘이 그렇듯이 그 과정을 이해한다면 단순한 기계적 적용을 넘어서 보다 풍부하고 정확한 적용이 가능하고 그것이 지닌 함축성도 발견할 수 있을 것이다. 그리고 무엇보다 우리가 사용하는 컴퓨터 프로그램을 블랙박스로 놔눌 수는 없지 않는가.

MCMC를 한 마디로 표현하면, 시뮬레이션을 통해서 마치 실제로 사후확률분포로부터 추출한 것과 같은 많은 수의 모수(값)를 구하고, 그 값들로 이루어진 확률분포를 구성하는 작업이다. 그 분포가 우리가 궁극적으로 구하고자 하는 목표분포이다.

  • MCMC 시뮬레이션의 핵심은 무작위 추출(random sampling)이다. 일정한 절차를 거쳐 무작위로 표본을 추출하는 작업을 수없이 반복한다.
  • 여기서 무작위로 간주될 수 있는 일정한 절차란 무엇일까? 그 절차를 간략히 제시하면 다음과 같다.
    1. 사후확률분포를 상정한다. 공액을 이용하면 사전확률분포에 대한 정보로부터 사후확률분포의 유형이 추정될 수 있다. 물론 그 분포의 퍼라미터(값)은 모르지만 말이다. 사실 그 분포를 특정하는 것이 MCMC 시뮬레이션의 미션이다.
    2. 사후확률분포로부터 두 개의 모수(값)를 추출한다. 먼저 뽑은 모수를 현재 모수()라고 부르고, 두 번째 뽑은 모수를 제안된 모수()라고 부른다.
    3. 현재 모수제안된 모수 중 중 하나를 선택하여 저장한다.
    4. 매 반복시행(iteration)이 끝날 때마다 그렇게 선택된 모수가 다음 반복시행에서 뽑게 되는 두 개의 모수 중 하나가 된다.
  • 위 반복시행을 어느 상태에 도달할 때까지 계속 한다. 그것이 수 만번이 될 수도 있다.
  • 그렇게 해서 저장된 수많은 모수들을 가지고 확률분포를 작성한다. 그것이 우리가 궁극적으로 구하려고 하는 목표분포(사후확률분포)이다.
  • 그 확률분포를 요약한다.

이상이 최대한 간략히 묘사된 MCMC 시뮬레이션이다. 다시 정리해 보면 매 반복시행마다 사후확률분포로부터 무작위로 두 개의 모수 값을 뽑은 다음 그 중 하나를 선택하여 남기는 방식을 수없이 반복해서 엄청나게 큰 표본을 만든다. 그런데 가장 단순한 무작위 추출은 사후확률분포로부터 한꺼번에 두 개의 모수 값을 뽑아서 그 중 하나를 저장하는 방법일 것이다. MCMC는 조금 더 정교한 방법으로 두 개의 모수 값을 추출하고 약간 복잡한 방법으로 그 중 하나를 선택, 저장한다.

그 무작위 절차의 각 단계를 좀 더 구체적으로 살펴보자.

  • 사후확률분포를 무엇을 근거로 상정하는가? 이는 초기값, 즉, 최초의 추측(initial guess)에 관한 문제이다. MCMC 시뮬레이션이 시작되기 위해서는 시작점(starting point)이 있어야 한다. 그 시작점은 단순한 추측일 수도 있고, 정보에 근거한 추측일 수도 있다. 처음부터 사후확률분포의 유형을 알고 거기에서 초기값을 추출하면 목표분포에 빨리 도달할 수 있겠지만, 처음에 사후확률분포에 대한 정보가 없는 경우도 많다. 그러나 사후확률분포에 대한 정보가 없어도 목표분포에 도달할 수 있다. 한 동안의 반복시행 결과는 초기값의 영향을 받을 것–이 기간을 burn-in period라고한다–이다. 그러나 그 기간을 지나고 나면 목표분포를 따르는(즉, 목표분포에서 추출된 것과 같은) 표본이 형성된다.
  • 현재 모수는 어떻게 추정되는가? MCMC 알고리즘이 작동하는 첫 번째 시행(iteration)에서는 한 개의 모수를 임의로 정한다(대개의 경우 관찰된 데이터나 데이터 분포, 그리고 공액 사전분포를 참고해서 추측된다). 두 번째 반복시행부터는 이전 반복시행에서 선택해 저장한 모수가 그 반복시행의 현재 모수가 된다.
  • 제안된 모수는 어떻게 추정되는가? 현재 모수를 중심(중앙값 혹은 평균)으로 갖는 대칭적인 분포(symetric distribution)를 상정하고, 그 대칭분포로부터 무작위로 어떤 모수(값)를 추출하면 그것이 제안된 모수이다.
  • 현재 모수와 제안된 모수 중 하나를 선택하는 방법은 무엇인가? 이 부분이 조금 복잡하다. 먼저 알려져 있거나 우리가 믿고 있는 사전확률분포를 가지고 현재 모수와 제안된 모수 각각에 대한 사전밀도(prior density)를 구한다. 또한 현재 모수와 제안된 모수가 진실이라는 전제로 우리 손에 쥔 데이터를 관찰할 확률, 즉, 각각의 우도(likelihood)를 구한다. 이 사전확률밀도와 우도를 곱하면, 공식 (2) 버전의 베이즈 정리에 따라 비정규화된 사후밀도(unnormalized posterior density)가 추정된다. 현재 모수에 대한 비정규화된 사후밀도에 대한 제안된 모수에 대한 비정규화된 사후밀도의 비율을 구한다. 이렇게 하면 골치 아픈 정규화 상수가 소거된다. 그렇게 해서 이동확률()을 구한다. 제안된 모수의 사후밀도가 현재 모수의 사후밀도보다 크면, 즉, 이동확률이 1보다 크면 제안된 모수를 선택하여 저장한다(제안된 모수로 이동한다). 만약 제안된 모수의 사후밀도가 현재 모수의 사후밀도와 같거나 작으면 둘 중 하나를 확률적으로(probabilistically) 선택하여 저장한다(제안된 모수로 이동할 것인지가 확률적으로 결정된다). 여기서 ‘확률적으로’를 실제로 구현하는 방법은, 0과 1 사이의 균일분포에서 하나의 값을 무작위로 추출한 다음, 그 값과 이동확률을 비교한다. 만약 이동확률이 그 무작위 값보다 크면 이동한다(즉, 제안된 모수를 선택, 저장한다). 만약 이동확률이 그 무작위 값보다 작으면 이동하지 않는다(즉, 현재 모수를 선택, 저장한다).
  • 모수의 어떤 값에 수렴되면 시뮬레이션이 끝난다. MCMC는 우리가 표본을 얻고자 하는 목표분포(target distribution)를 정상분포(Stationary Distribution)로 가지는 마르코프 연쇄를 만드는 것이다. 매 반복시행에서 저장해 놓았던 모수들 중 burn-in 기간의 모수를 버리면 나머지 모수들은 목표분포에서 추출된 것으로 간주될 수 있다. 그것들로 분포를 그리면, 그것이 바로 우리가 구하고자 하는 추정된 사후확률분포이다. 그리고 그 분포를 요약하면 모든 과정을 마치게 된다.

이 과정을 보면, 무작위 추출(random sampling)이 결정적인 요소이다. 그래서 알고리즘의 이름에 몬테카를로(Monte Carlo)가 들어가 있다.

이 과정에는 두 가지 속성이 필요하다. 하나는 각 반복실행의 모수 선택에는 바로 이 전 반복실행에서 구한 모수만이 영향을 미친다는 점이다. 그보다 이전 단계에서 어떤 모수들이 구해졌는가는 전혀 고려되지 않는다는 말이다.

다른 하나는 시뮬레이션이 한없이 계속되거나 어느 단계에서 인위적으로 끝내서는 안되며, 각 반복실행에서 구해진 값이 어느 모수(진실한 모수, true parameter라고 추정된다)에 수렴될 때 시뮬레이션이 멈추어야 한다.

이 두 가지 속성을 가진 수학 모형이 마르코프 연쇄(Markov Chain)이다. 마르코프 연쇄는, 확률변수(random variable)가 어떤 상태(state)에 도달할 확률이 오직 바로 이전 시점의 상태(state)에 달려 있으며, 정칙 마르코프 연쇄(regular Markov chain)는 변화가 멈추는 정상상태(stationary state)를 갖고 있다.

그래서 이 알고리즘의 이름이 Markov Chain Monte Carlo (MCMC)로 붙여졌다. MCMC를 구현하는데는 현재 여러가지 알고리즘이 나와 있다. 위에 제시한 설명은 그 중 메트로폴리스 알고리즘(Metropolis algorithm)을 기준으로 한 것이다.

상어공격 문제 사례를 가지고 살펴보자. 이 사례는 Donovan & Michey (2019)에서 인용하였다. 대양에 인접한  한 지역에 상어가 출현하여 사람을 공격하는 문제이다.

연간 상어공격의 평균빈도를 구한다고 하자. 이는 포아송 분포의 퍼라미터를 추정하는 문제이다. 는 연간 상어공격의 평균 빈도이다. 이론적으로 는 0에서 무한대까지의 값을 가질 수 있다.

사전확률분포로 감마 분포를 채택한다. 그것은 가설들에 대한 확률밀도를 나타낸다. 어떤 가설에 대한 확률밀도 값이 클수록 그 가설에 대한 우리의 확신도 크다. 이전의 조사를 토대로 다음과 같은 사전확률분포를 설정하였다고 하자.

그리고 금년에는 5회의 상어공격이 목격되었다.

1 단계: 사후확률분포로부터 임의 값 하나를 뽑아 첫 번째 값을 제안한다. 그 값을 라고 하자. 3.100은 그냥 임의의 값이다.

2 단계:

  • 그 가설이 진실일 때 5회의 상어공격을 관찰할 우도(likelihood)를 계산한다. 아래와 같이 포아송 분포의 pdf를 적용하면 될 것이다.

  • 다음, 사전확률분포에서 3.100과 결합된 확률밀도를 구한다. 감마확률밀도함수를 적용한다.

여기서 x 대신 를 집어넣는다.

위에서 식(2)에 각 값을 대입해서 비정규화된 확률밀도를 구한다.

이제 이 값을 라고 부른다.

3단계:

두 번째 값을 제안한다. 의 현재값(, 3.100)을 중심으로 하는 대칭적 분포를 상정하고 그 분포로부터 무작위로 숫자 하나를 뽑는다. 이 사례에서는 대칭적 분포로 이고, 인 정규분포를 적용한다. 여기서 미세조정 퍼라미터(tuning parameter)라고 부른다. 무작위로 뽑아서 제안한 값이 이라고하자.

4단계:

에 대한 사후밀도를 구한다. 2단계와 동일한 방식을 적용하면 된다. 먼저 우도를 구하고, 사전확률밀도를 구한 다음, 두 값을 곱하면 된다.

이 사후확률밀도를 라고 부르자.

우리의 두 가설에 대한 사후확률밀도는 다음과 같다:

다음은 이 둘 중 하나를 버려야 한다. 어느 값을 가질까? 첫 번째 값인 에 남을까 아니면 두 번째 값인 으로 옮겨갈까?

메트포폴리스(Metropolis) 알고리즘은 두 값 중 두 번째 값으로 옮겨갈 확률을 계산하는 공식을 다음과 같이 규정한다.

6단계:

균일분포, 로부터 무작위수 하나를 뽑는다. 그렇게 뽑은 수가 위의 옮겨갈 확률 값보다 작으면, 로 갈아탄다. 0.8204이 뽑혔다고 하자. 그 수가 0.7019보다 크니 를 수용한다.

7단계: 3.100을 두 번째 시행의 로 받아서 위의 절차를 수천 혹은 수만 번 반복한다. 매 시행 때마다 수용된 값을 기록한다.

8단계: 각 시행에서 수용된 값들을 분포의 형태로 나타내고, 그 분포를 요약한다.

아래 표는 Donovan & Michey(2019)의 202쪽에서 전재하였다. MCMC를 10회 시행한 결과를 정리한 것이다.

데이터(data)와 사전확률(prior)은 매번 같지만, 사후확률(posterior)은 매번 바뀌고 있다. 사후확률에서 가 무작위성(randomness)이 들어가는 부분이다. 알고리즘을 시작할 때 를 사후확률분포에서 무작위로 뽑았으며(혹은 임의로 정했으며), 를 중심()으로 하는 대칭분포(여기서는 , 인 정규분포)에서 무작위로 추출한 수이다. 때문에 사후확률 는 베이즈정리(위에서 식 (2))를 이용하여 계산되었지만 무작위성을 지닐 수밖에 없다.

의사결정 과정에서도 무작위성이 한 번 들어간다. 모수(가설)를 람다를 선택할 때 기준으로 작용하는 요소가 균일분포 에서 무작위로 추출한 수이다. 결국 MCMC 수행과정에서 조건부 무작위 추출이 세 번 들어갔다.

이렇게 다소 복잡한 시뮬레이션을 통해서 통계학자들은 사후확률분포를 모르면서 사후확률분포로부터 수많은 모수를 추출하여 사후확률분포를 특정하는 모순(?)을 해결했다. 사후확률분포로부터 모수를 추출한다는 말은 배우는 학생들을 혼란스럽게 만들기 충분하다. 사후확률분포를 모르는데 어떻게 그것으로부터 모수를 추출한다는 말인가? 더구나 베이즈 추론을 통해서 궁극적으로 구하려고 하는 것이 사후확률분포가 아니던가. 베이즈 통계학자들은 몬테카를로 시뮬레이션마르코프 연쇄라는 열쇠를 가지고 베이즈 추론이라는 마법의 문을 열었다.

이 포스팅에서는 수학 사용을 최소화하면서 MCMC를 최대한 말로 쉽게 설명하려고 시도하였다. 필자는 베이즈 통계에 입문하는 인문사회과학도가 이 정도만 MCMC를 이해하면 충분하지 않을까 생각한다. 샘플링하는 방법이나 의사결정하는 방법에 적용하는데 있어 메트로폴리스 외에도 여러가지 알고리즘이 있지만 그것들은 베이즈 추론에 좀 더 익숙해진 후에 천천히 익혀도 늦지 않을 것이다. (2020-11-21)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.