인공지능관련/MCMC, Gibbs Sampler

0711MCMC2 베이지안 이해하기

학위논문통계 2019. 7. 11. 15:45


오늘 할 것은 베이지안 추론에 대해서 간단히 설명하겠습니다. 사실 베이지안에 대해서 최근에 관심이 많아 높아지고 있는데 반해 제대로 이해하는 분들이 많이 않는 것 같습니다. 여기서 질문하시는 분들을 보면 가능성함수(우도함수)도 이해 못하시는 분들이 계시는데 이 기회에 정확하게 이해하기 바랍니다. 가장 간단하고 현실적인 설명력이 있는 경우가 이항분포(binomial distribution)를 예를 들겠습니다.

 

먼저 컴퓨터 프로그램 언어에 대해서 잠깐 설명해 드리겠습니다. 여기서 프로그램 언이라면 여러분이 아는 프로그램을 짜는 언어를 말합니다. 통상 컴파일러라고 하죠. 즉, 소스파일을 만들어 이걸 컴파일하면 실행파일이 만들어 집니다. 이 파일을 클릭하면 여러분이 아는 프로그램이 윈도우에 뜨게 되는 것이죠. 이 소스파일의 문법을 언어라고 합니다. 요새 애들에게 코딩교육을 시킨다고 난리를 났는데 사실 이 언어를 배우는 것입니다. 한마디로 뻘 짓을 하고 있는 것이죠.

 

이 컴파일러는 2가지 종류가 있습니다. 하나는 프로시저 언어가 있고, 또 하나는 객체지향(object oriented) 언어가 있습니다. 프로시저는 우리가 중고등학교때 수학 문제 푸는 방식으로 위에서 아래로 논리에 따라 프로그램을 짜는 것입니다. 그래서 이공계나 수학문제를 처리해야 하는 분들은 이 프로시저 언어를 배워야 합니다. 대표적인 언어가 포트란이고 C입니다.

 

또 하나는 객체지향 언어인데 이건 진짜 상업용 프로그램을 짤 때 쓰는 언어라고 생각하시면 됩니다. 이건 데이터 구조를 먼저 생각하고 여기서 빌드업 시키는 언어라고 생각하면 되는데 앞의 프로시저 언어보다 배우기 훨씬 어렵습니다. 대표적인 언어가 C+, 애플이 사용하는 Objective C, 그리고 Java가 있습니다. 요새 유행하는 파이선인가 이건 뭔지 모르겠네요.

 

이런 컴파일러 말고 interpretor 라는 것이 있습니다. 이것 위의 프로시저 언어를 배우고 사용하는 것 자체도 사실 힘듭니다. 자기 전공도 공부하기 힘들데 프로그램 언어를 배우서 능숙하게 사용하는 것 자체가 쉬운 일이 아니라는 것이죠. 그래서 수학에서 많이 사용하는 알고리즘을 미리 다 만들어 놓아서 사람들이 간단히 함수만 불러 오면 되게끔 만든 언어입니다.

 

예를 들어 난수를 생성하는 함수는 모든 컴파일러에 다 있습니다. 그러나 앞에서 이야기한 수 많은 분포에서 난수를 뽑으려면 자신이 이론을 배워 스스로 짜야 합니다. 그러나 이 interpretor에서는 웬만한 분포에서 난수를 뽑는 것은 그냥 함수를 불러오기만 하면 됩니다. 또 역함수를 구하는 것도 QR 알고리즘 등 상당히 공을 들여 배워야 합니다. 이것도 interpretor에서는 그냥 함수를 불러 오기만 하면 됩니다.

 

그래서 이공계나 수학을 많이 쓰는 곳은 이 interpretor 언어가 사막의 오아시스와 같은 것이라 생각할 수 있습니다. 대표적인 것이 S-plus, 그리고 S-plus의 공짜 프로그램인 R, matlab, 그리고 SAS에도 있습니다. SPSS에서 제공하는 것은 매우 미약하고 그래서 SPSS에서 제대로 된 프로그램을 짜라고 하면 아마 Visual Basic이라는 컴파일러를 불러 와야 하는 것으로 알고 있습니다.

 

 

앞에서 제가 이쪽에 전문가로서 행사하고 싶으면 여행하는 영업사원 문제를 자바 applet으로 짜 보시라고 권유했는데 이걸 하려면 어쩔 수 없이 객체 지향 언어인 Java를 공부할 수 밖에 없습니다. S나 R에서 여행하는 영업사원 문제를 프로그램 짜서 간단히 짤 수 있습니다. 그러나 최적 경로를 찾아가는 과정을 그래픽으로서 보여 줄 수 없습니다.

 

자바 applet에서는 최초 여행 경로를 그래픽으로 보여 주고 그 다음 선택되는 경로를 계속 그래픽을 보여 줘 나중에는 최종 결과 경로를 보여 줄 수 있습니다. 예를 들어 100*100 이미지를 만듭니다. 그런 다음 (x, y) 좌표 50개를 랜덤으로 생성합니다. 그러면 100*100 이미지에 50개 도시가 생성됩니다. 그래서 경로가 뽑힐 때만다 이 경로를 따라서 50개 도시를 연결시켜 주면 됩니다. 그러면 최종 경로까지 답이 구해지는 과정이 웹에서 동영상처럼 보여 줄 수 있습니다.

 

 

그럼 컴퓨터 언어이야기는 여기까지 하고 베이지안 추론에 대해서 이야기를 해보죠.

 

일단 주류 통계학을 배운 사람, 즉 상대에서 하는 기초통계학이나 일반적인 통계학 이론 책을 배운 사람들은 다 주류통계학을 배운 것입니다. 이 주류 통계학을 배운 사람들이 처음에는 베이지안 추론을 이해하기 어려운데 이건 확률분포 f(x)의 기호 때문에 그렇습니다. 베이지안 추론의 기본 원칙은 고등학교 책에 나오는 베이지안 공식, 그 이전에 조건부 확률 공식이라는 매우 간단한 공식에 따르는 것이기 때문에 전혀 어려운 점이 없습니다. 그런데도 사람들이 잘 이해를 못하는 것은 확률분포 f(x)의 기호 때문에 헤갈리기 때문입니다.

 

 

우리가 기분적으로 데이터 y를 뽑는 이유는 이 데이터 y를 통해, 확률분포 속, 또는 모형 속에 있는 모르는 값 모수 a를 추정하려는데 있습니다. 이 a값을 추정하면 우리는 기본적으로 우리가 알고 싶어 하는 모든 정보를 다 구한 것입니다. 여기서 우리가 더 알고 싶은 값을 추출해 내는 것이죠. 그럼 우리가 먼저 해야 하는 것은

    

 

Pr(모수 a| 데이터 y)=데이터 y를 관찰했을 경우 모수 a가 나올 가능성, 즉 확률

 


이것입니다. 이 확률이 가장 높게 나오는 a가 우리가 추정하고자 하는 a 값입니다. 또는 정규분포같이 균형분포의 경우 E(a)를 사용하기도 합니다.

 

그럼 베이지안 정리나 조건부 확률 계산 공식에 의해서

 

Pr(a|y)=(Pr(y|a)*Pr(a)) / Pr(y)

 

가 됩니다. 이걸 확률분포 모양으로 쓰면

 

f(a|y)=f(y|a)*f(a)/f(y)

 

 

가 됩니다. 여기서 f(y|a)는 흔히 우리가 이야기하는 모형의 분포가 되고, f(a)는 사전확률분포, f(a|y)는 사후확률분포가 됩니다. f(y)는 중요하지 않습니다. y 데이터는 관찰된 값이기 때문에 실제로는 숫자가 들어가서 f(y)는 모수 a와 전혀 관계없는 숫자가 됩니다. 이런 것을 분자 f(y|a)*f(a)를 적분하면 1로 만들어 주는, 확률분포로 만들어주는 normalizing factor, constant 라고 이야기 합니다.

 

그런데 주류 통계학에서는 모형의 분포인 f(x|a)를 이렇게 표시하지 않고 f(x;a) 이런식으로 표시하기 때문에 혼란이 생깁니다. 이렇게 표현하는 이유는 주류 통계학에서는 모수 a는 우리가 값을 모르지만 확률변수라고 생각하지 않습니다. 하나의 숫자로 생각한다는 것이죠. 이에 반해 베이지안은 모수 a도 확률분포를 가지는 확률변수로 생각을 합니다.

 

그럼 가장 쉬운 이항분포(binomial distribution)의 예를 한번 들어 보죠.

 

문재인 지지율은 모수 p라고 하죠. 즉 어떤 사람이 문재인을 지지할 확률이 p이고 이 p값은 우리가 모르는 값입니다. 그래서 이 p를 추정하려고 사람들 n=10명을 조사하였는데 y=3명이 문재인 지지하는 것으로 나왔습니다. 그럼 주류 통계학의 입장에서나 아니면 그냥 통계학을 전혀 모르는 일반인도 문재인 지지율 p는 표본비율 r=3/10=0.3이라고 생각합니다.

 

왜 p를 추정하는데 표본비율 r= y/n을 사용할가요? 그냥 기분에 그런 것 같아서요?

 

통계학과에서 배우는 것은 이런 이유들를 배우는 것입니다. 그냥 그렇게 하자 이런 식으로 이야기하면 이건 학문으로서 존재할 수 없죠. 그래서 요새 정부 통계 가지고 말들이 많이 나오는데 통계학과에서는 이런 것을 안 배웁니다. 왜 지지율 p를 추정하는데 표본비율 r=y/n을 사용해야 하는지 이런 이유를 이론으로서 배우는 것입니다.

 

표본비율 r은 사실 표본평균입니다. Xi를 i 번째 사람이 문재인을 지지하면 1, 아니면 0 이런식으로 하면 r=(X1+X2+...+Xn)/n=Y/n이 되어 표본 평균이 됩니다.

 

그럼 주류통계학에서 이항분포는 다음과 같습니다.

 

f(y|p)=nCy*py*(1-p)(n-y)

 

주류통계학에서는 위의 이항분포식을 f(y|p)로 쓰지 않고 f(y; p) 이런식으로 표현한다는 것이죠. 하여간 이 이항분포식은 우리가 데이터를 관찰하기 전 우리가 모르는 모수 p일때 데이터 y가 관찰될 확률을 말합니다. 여기서 우리가 해야 할 일은 f(p|y), 즉 데이터가 관찰되었을 때 p가 나올 확률, 가능성 분포를 찾는 것입니다. 그럼 위의 베이지안 공식에 의해, 분모 f(y)는 숫자에 불과하기 때문에 생략하고

 

f(p|y)=f(y|p)*f(p)

 

가 되고 그럼 문제는 모수 p가 일어날 확률 분포 사전확률분포 f(p)를 정하는 것이 핵심 주제가 됩니다.

 

문재인 지지율이 p는 0에서 1 사이에 값을 갖기 때문에 흔히 이럴 경우 많이 사용하는 분포는 균등분포나 beta 분포 B(a,b)라는 것을 많이 사용합니다. 균등분포는 베타분포의 일종이고 베타분포는 또 매개변수인 a, b에 따라 분포의 모양이 다양하게 나옵니다. 실제 베타분포의 예를 그림으로 한번 볼까요.  

 

 

       

과연 사전확률분포 Beta(a,b)를 우리 추론 과정에 집어 넣는 것이 타당할까요.

 

우리는 최근 몇 몇 여론조사 기관의 여론조사에 의해 문재인 지지율이 r=50%=0.5에 조금 못 미치는 지지율을 유지하고 있다는 사전 정보가 있습니다. 그러나 내가 조사한 문재인 지지율은 r=0.3은 대부분 노인 층이여서 평소 자한당 지지율이 높은 집단이라는 것이죠. 이런 경우 10명 조사해서 나온 문재인 지지율 r=0.3은 바로 믿기가 힘들다는 것이죠. 따라서 사전 정보을 가지고 교정할 필요성이 있습니다. 그런 이유로 사전정보인 f(p)인 베타분포를 집어넣는다는 것이죠. 그럼 사전정보에 의해 문재인 지지율이 50%=0.5정도 된다는 것을 안다면 위의 베타 분포에서 a=5, b=5인 베타 분포를 사전확률분포 f(p)로 하면 되겠다는 것을 알 수 있습니다. 그럼 베타분포의 식은 어떻게 될까요.

 

 

f(p)=1/B(a,b)*p(a-1)*(1-p)(b-1)

 

여기서 B(a,b)는 베타함수로 Gamma(a)*Gamma(b)/Gamma(a+g)가 됩니다. Gamma는 n이 정수일 경우 Gamma(n)=(n-1)!이 됩니다. 그럼 위 식에 대입하면, 쓸데 없는 것을 제외하면

 

 

f(p|y)=f(y|p)*f(p)=10C3*p3*(1-p)(10-3) *1/B(a,b)*p(a-1)*(1-p)(b-1)

 

                        =10C3*p3*(1-p)(10-3) *1/B(a,b)*p(5-1)*(1-p)(5-1)

 

 

위 식을 보면 f(p|y)에서 y은 사라집니다. 즉 이건 데이터 값인데 실제로 관찰했기 때문에 y 대신 숫자가 들어갑니다. 그래서 오로지 모르는 모수 p와 a, b에 관한 수식으로 변합니다. 여기서 우리의 관심인 모수는 p이고 a, b는 우리의 관심 대상이 아니고 사전에 우리가 p에 관해 알고 있는 정보에 따라 우리가 집어 넣는 값입니다. 앞에서 우리는 a=5, b=5를 집어 넣었죠. 이걸 p에 관해 정리하면

 

 

f(p|y)=1/B(a+y, b+n-y)*p(y+a-1)*(1-p)*(n-y+b-1)

            =1/B(5+3, 5+10-3)*p(3+5-1)*(1-p)*(10-3+5-1)

 

                                   =bata(8, 12)

 

 

이렇게 됩니다.

 

beta(a, b) 분포의 평균은 a/(a+b)입니다. 그래서 사전 정보문재인 지지율은 a=5, b=5여서 평균 0.5입니다. 그러나 주변의 사람들을 대상으로 10명 조사한 후의 사후확률분포는 beta(8,12)가 되어 문재인 지지율은 8/(8+12)=0.4로 됩니다. 즉 데이터에서 나온 문제인 지지율 0.3과 사전 정보에 의한 문재인 지지율 0.5 사이에 있게 된다는 것이죠.

 

일반적으로 사후확률분포의 평균은 (y+a)/(n+a+b)가 됩니다. 우리가 주변의 10명 대상에서 더 밖으로 나가 100명, 1000명 더 조사를 합니다. 즉 n이 점점 커진다는 것이죠. 그럼 사전확률분포 beta(a, b)의 a, b의 영향력이 점점 줄어듭니다. 즉 데이터가 계속 늘어나면 사전확률정보의 중요성은 점점 떨어집니다. 상식적인 결과이죠.

 

그럼 위의 예에서 베이지안을 쓰는 것이 상당히 그렇듯하죠. 그럼 설문조사 회사에서는 이 베이지안을 어떻게 쓸 수 있을까요.

 

현재 설문조사의 문제점은 여러 가지로 이야기할 수 있을 겁니다. 먼저 표본의 기술적인 대표성인데 이건 성별, 지역별, 연령별로 어느 정도 층화추출을 하는 것으로 알고 있어서 이 대표성은 별 문제가 없고요.

 

또 하나의 문제점은 유선과 무선의 배분을 어떻게 할지, 그리고 가장 핵심적인 것은 설문조사는 일반적으로 지지성향이 매우 뚜렷한 사람들이 응답하는 반면 실제 투표는 부동층도 많이 한다는 것이죠.

 

그럼 투표 전 날 자기들이 설문조사한 결과와 다음날 실제 사람들이 투표결과와의 차이가 있을 겁니다. 이걸 가지고 사전 정보(f(p))로 만들어 현재 설문조사 결과(f(x|p))에 추가해서 사후확률분포(f(p|x))를 만들어 지지율을 추정하면 됩니다. 그러나 우리나라 선관위에서는 베이지안 추론을 아마 받아주지를 않을 겁니다. 여론조사기관과 정당 자체에서만 알 수 있는 것인지 국민들에게 공포할 수는 없을 겁니다.

 

 

하여간 이항분포의 경우 계산은 조금 복잡한 것 같지만 베이지안이 조금 쓸모가 있는 것 같죠. 그러나 가장 많이 쓰는, 가장 흔한 정규분포의 경우만 해도 계산 과정이 매우 매우 복잡합니다. 이건 다음 시간에 쓰겠습니다. 그래서 과연 일반적인 경우 베이지안이 정말 유용할까 하는 생각이 듭니다. 논리상으로는 베이지안이 당연히 맞습니다.

 

여기서 베이지안 계산 팁으로 베이지안 계산할 때 정확하게 하지는 않습니다. 정확하게 하지 않고 분포의 모양에 집중합니다. 그래서 특별한 모양이 나오면 이걸 가지고 추측을 합니다. 예를 들어 exp(-x2)이 나오면 정규분포를 생각하고, exp(-ax)는 지수분포 이렇게 추측해서 전개합니다. 위의 사후확률분포 f(p|y)에서 보면 변수 p를 중심으로 보면 베타분포의 모양을 하고 있다는 것을 추측할 수 있습니다.

 

 

그럼 주류 통계학에서 나오는 가능성함수(우도함수)는 도대체 뭔 말하는 것일까요.

 

앞에서 이야기한 모형의 분포 f(y|p)는 데이터 y가 관찰되기 전의 상태에서 y의 분포입니다. 그러나 데이터 y를 관찰한 후에는 f(y|p)를 가능성함수라고 합니다. 예를 들어 위의 경우

 

확률분포 f(y|p)= nCy*py*(1-p)(n-y)

 

가능성함수(우도함수)=L(p)=10C3*p3*(1-p)(10-3) (n=10, y=3을 대입한 것입니다)

 

단지 책에서는 이론을 일반적으로 전개하기 위해서 실제 데이터 값을 집어넣지 않고 일반적인 값 y로 쓰기 때문에 분포식 자체는 f(f|p)=L(p)로 같습니다.

 

 

위의 경우 베타분포에서 나오는 a, b는 우리의 경우 미리 특정한 값을 지정했지만 이것도 모수로 보고 a, b의 사전확률분포 f(a,b)를 설정할 수 있습니다. 즉 p==>beta(a,b)==>a,b의 사전확률분포 f(a,b)을 설정하는 등 계층적으로 사전 확률을 설정할 수 있습니다. 이런 베이지안 모형을 위계적 베이지안 모형(Hierarchical Bayesian Model) 또는 베이지안 위계모형(Bayesian Hierarchical Model)이라 합니다. 이 경우 사후확률분포는 f(p,a,b|y)가 되고 f(p|y)는

 

 

 

 

이 작업을 해야 합니다. 결국 우리가 알고 싶은 것은 p이고 a, b가 아니거든요. 즉 a, b는 우리가 추론하는 과정에서 장애가 되는 모수라고 볼 수 있습니다. 이런 작업을 marginalzation 이라고 합니다.

 

위에서 사전확률분포도 베타분포고 사후확률분포도 베타분포입니다. 이렇게 사전확률분포를 사후확률분포와 같은 모양의 분포가 되도록 사전확률분포를 설정하는 것을 conjugate prior 확률분포라고 하고 이런 계통을 conjugate prior family이라고 합니다. 이건 처음 사전 정보에서 데이터 y를 추출하는 것을 사후정보로 가는 업데이트 과정이라고 보는 것입니다.

 

이런 conjugate family말고 non-informative, improper prior에 관한 정보는

 

Davison의 Statistical Models를 참조하시기 바랍니다. 잘 설명되어 있습니다. 이것 구글하면 구할 수 있습니다.

 

다음에는 정규분포의 경우 해보고 왜 베이지안 계산이 쉽지 않은 지 알아 보죠.


'인공지능관련 > MCMC, Gibbs Sampler' 카테고리의 다른 글

MCMC 암호 뽀개기  (0) 2019.08.04
0715MCMC Gibbs Sampler1  (0) 2019.07.15
0706MCMC2  (0) 2019.07.05
mcmc1  (0) 2019.07.01
MC sample, MCMC, Gibbs Sampler, Metropolis   (0) 2013.03.10