베이지언 확률(Bayesian Probability)

기계학습 2014. 1. 17. 15:28

갑자기 블로그를 처음 시작했던 2013년 1월달이 생각납니다. 그 때는 처음 시작하는 마음이라 거의 하루에 한개씩 글을 올렸던 것 같습니다 ^^. 새해가 되어서 그런걸까요.. 그때만큼은 아니지만 요즘 비교적 자주 글을 올리고 있습니다. 하지만 요즘에는 댓글들로 인해서 쓰게 되는 글도 많습니다. 댓글을 주고 받으면서 떠오른 생각들, 댓글에는 간략히 답하였지만 글로 정리해서 공유해도 좋겠다 싶은 내용이 생기면 글을 쓰게 됩니다. 이 글도 그런 글의 하나입니다.


Bayesian(베이지언) 확률...


외국의 왠만한 논문을 읽다보면 거의 빠지지 않고 나오는 확률모델. 어떤 문제를 확률적으로 결정할 때 빠지지 않고 나오는 모델인데 사실 논문에 있는 그대로 따라 이해하기도 벅찬 경우가 많습니다. 하물며 자신이 직접 문제에 맞게 그러한 수학적 모델을 만들고 식을 세워나간다고 생각해 보면 참 대단하다는 생각과 함께 한숨이 나오기도 합니다.


예전에 쓴 "베이즈 정리, ML과 MAP, 그리고 영상처리" 글에서는 classification 문제에 확률이 활용되는 대표적인 두 가지 접근방법(ML & MAP)에 대해 설명했었고, "Ferns를 이용한 영상 Object Detection" 글에서는 글 말미에 pure Bayesian, semi-naive Bayesian, naive Bayesian에 대해 간략히 언급한 적이 있습니다.


이번 글에서는 pure, semi-naive, naive 이러한 구분에 대해서 그리고 Bayesian 확률에 대해서 좀더 직관적으로 이해해 보고자 합니다.



1. ML & MAP


눈 앞에 한명의 사람이 서 있습니다. 그런데 이 사람은 커튼에 가려져 있으며 우리가 볼 수 있는 것은 커튼에 비친 그 사람의 형상뿐입니다.



이 사람이 누구일까요? 철수일까요 아닐까요? 아니면 철수일까요 영희일까요 아니면 설까치일까요? 아니면 남자일까요 여자일까요? 이러한 모든 문제들은 결국 확률적 classification 문제로 볼 수 있으며 Bayesian 확률이 사용되는 전형적인 예가 됩니다.


조건부 확률로 생각해 보면 P(눈앞의사람|철수)와 P(철수|눈앞의사람)의 2가지 확률을 생각할 수 있습니다.


P(눈앞의사람|철수)는 철수가 눈앞의사람의 형상을 나타낼 확률이고 P(철수|눈앞의사람)은 눈앞의사람의 형상을 나타내는 사람이 철수일 확률입니다. 얼핏 비슷한 것 같지만 사실은 서로 다른 확률을 나타내는 것임에 주의해야 합니다. 여기서 P(눈앞의사람|철수)는 보통 likelihood라 부르고 P(철수|눈앞의사람)은 posterior 확률이라고 부릅니다.


눈앞의 사람이 누구인지를 확률적으로 알아내는 방법은 크게 ML(Maximum Likelihood) 방법과 MAP(Maximum A Posteriori) 방법이 있는데, ML은 가능한 사람들에 대해서 P(눈앞의사람|철수), P(눈앞의사람|영희), ... 등을 각각 계산해서 그중 likelihood가 가장 높은 사람을 선택하는 방식이고 MAP는 posterior 확률 P(철수|눈앞의사람), P(영희|눈앞의사람), ... 을 계산해서 가장 확률이 높은 사람을 선택하는 방식입니다.


그런데, likelihood P(눈앞의사람|철수)는 철수가 가질 수 있는 다양한 형상들 중에서 눈앞의 형상이 나올 확률을 구하는 문제이므로 비교적 직관적인 이해가 가능합니다. 그러나 posterior 확률 P(철수|눈앞의사람)은 대체 어떻게 계산해야 하는 걸까요?


여기서 그 유명한 Bayes 정리가 나옵니다.


 --- (1)


식 (1)에서 P(눈앞의사람)은 그 값이 무엇이든지간에 고정된 상수값이기에 MAP에서는 결국 P(눈앞의사람|철수)P(철수), P(눈앞의사람|영희)P(영희), ... 들 중에서 가장 높은 값을 나타내는 사람을 선택하는 것이 됩니다. 즉, 결과적으로 ML와 MAP의 차이는 뒤에 P(철수), P(영희), ... 과 같은 확률을 곱하느냐 곱하지 않느냐의 차이가 되는데, P(철수), P(영희), ... 와 같이 클래스 고유의 확률값을 prior 확률이라고 부릅니다 (만일 눈앞의 사람형상이 남자인지 여자인지를 구분하는 문제라고 생각해 보면 prior 확률이 어떤 의미를 갖는지 알 수 있음).


☞ P(눈앞의사람)도 사실 계산이 가능한 상수값인데, 만일 가능한 사람이 철수, 영희, 까치라고 한다면 P(눈앞의사람) = P(눈앞의사람|철수)P(철수) + P(눈앞의사람|영희)P(영희) + P(눈앞의사람|까치)P(까치) 로 계산됩니다.


ML와 MAP 중 어느것이 보다 정확한 방법이냐고 물으면 대답은 MAP이 보다 정확한 방법이다 입니다. 커튼에 비친 사람의 형상을 보고 그 사람이 누구인지 맞춘다고 했을 때, P(철수|눈앞의사람), P(영희|눈앞의사람), ... 가 가장 높은 사람을 선택하는 것이 원래의 문제를 있는 그대로 푸는 것입니다. 그리고 ML로 문제를 푸는 것은 모든 prior 확률이 같다는 가정(P(철수)=P(영희)=...)하에 일종의 근사적인 해를 구하는 것입니다. 하지만 MAP로 문제를 풀더라도 식(1)에 의해서 likelihood 식으로 변환하여 계산하기 때문에 어느 경우나 결국은 likelihood의 계산이 필요하게 됩니다.


ML과 MAP classification 문제를 식으로 정리해 보면 다음과 같습니다 (c: 클래스, z: 관측값).




2. pure, naive, semi-naive Bayesian


그러면 두번째 주제로 넘어가서 이 likelihood를 어떻게 계산하는지, pure, naive, semi-naive Bayesian이 어떻게 다른지에 대해 살펴보겠습니다.


likelihood P(눈앞의사람|철수)를 직접 계산하기 위해서는 철수에 대한 사진 수만장을 찍고 여기서 나온 형상들의 확률 분포를 구해야 합니다. 그러나 이러한 접근은 상당히 비효율적이며 형상의 같고 다름에 대한 기준도 모호할 뿐더러 이렇게 구한 확률분포가 철수라는 사람이 가지고 있는 형상의 특징을 효과적으로 표현할 수 있을지도 의문이 됩니다.


따라서, 대부분의 실제 문제에 있어서는 사람의 형상에 대한 주요 특징(키, 머리크기, 허리둘레 등)만을 선별하여 이 특징들에 대한 확률분포를 이용하는 것이 일반적입니다. 즉, 원래의 P(철수|눈앞의사람), P(눈앞의사람|철수) 대신에 P(철수|키,머리크기,허리둘레,...), P(키,머리크기,허리둘레,...|철수)를 이용하여 classification 문제를 풀게 됩니다.


이 때 이 특징(feature)들에 대한 likelihood P(키,머리크기,허리둘레,...|철수)를 어떤 식으로 계산하느냐에 따라서 pure Bayesian, naive Bayesian, semi-naive Bayesian이 구분됩니다.


먼저 가장 단순한 방법인 naive Bayesian 방식은 사람의 키, 머리크기, 허리둘레가 서로 상관관계가 없는 독립변수라는 가정하에 키의 확률분포, 머리크기의 확률분포, 허리둘레의 확률분포를 각각 구한 후 각각의 확률을 서로 곱하여 최종 결합확률을 계산합니다.


 --- (2)


반면에 pure Bayesian 확률은 사람이 가질 수 있는 모든 (키,머리크기,허리둘레) 조합에 대하여 확률분포를 계산한 값을 사용합니다. 즉, naive Bayesian은 키만을 고려한 확률분포, 머리크기만을 고려한 확률분포, 허리둘레만을 고려한 확률분포 이렇게 3개의 확률분포로부터 나온 값들을 곱하여 결합확률을 계산하고 pure Bayesian은 키, 머리크기, 허리둘레를 동시에 고려한 3차원의 확률분포에서 계산된 값을 이용하는 것입니다.


이제 naive Bayesian 확률과 pure Bayesian 확률이 어떻게 달라지는지 간단한 예를 통해 살펴보겠습니다.


예를 들어 사람의 키는 0 또는 1의 값을 가지고, 머리크기도 0 또는 1의 값만을 가지며 철수의 키와 머리크기의 확률분포가 다음과 같다고 가정하겠습니다 (철수 형상에 대한 다수 샘플을 수집한 후 각 샘플에서 계산된 키, 머리크기의 값에 대한 히스토그램을 구하여 합이 1이 되도록 정규화한 값).


 P(키,머리크기|철수)

 키=0

 키=1

 머리크기=0

 0.3

 0.1

 머리크기=1

 0.2

 0.4

<표1> P(키,머리크기|철수)의 확률분포


그런데, 만일 동일한 샘플에 대해 키, 머리크기의 확률분포를 독립적으로 구했다면 그 결과는 다음과 같을 것입니다.



키=0 

 키=1

P(키|철수) 

 0.5

0.5 

<표2> P(키|철수)의 확률분포


 

 머리크기=0

 머리크기=1

 P(머리크기|철수)

 0.4

 0.6

<표3> P(머리크기|철수)의 확률분포


이제 P(키=0, 머리크기=0 | 철수)를 pure Bayesian으로 구해보면 0.3이고 naive Bayesian으로 구해보면 0.5*0.4 = 0.2가 되어서 서로 다른 값이 나옴을 확인할 수 있습니다.


어떤 값이 올바른 값일까요?


당연히 pure Bayesian으로 계산한 0.3이 올바른 확률값입니다. naive Bayesian에서 잘못된(오차가 있는) 값이 나오는 이유는 feature간의 상관관계(키와 머리크기가 가지는 상관관계)를 무시하고 확률을 계산했기 때문입니다. 물론 정말로 상관관계가 없다면 naive Bayesian으로 계산된 확률값도 맞는 값이 될 것입니다.


그러나 실제 문제에 있어서는 pure Bayesian이 당연히 가장 정확한 확률모델임에도 불구하고 naive Bayesian이 사용되는 경우도 많습니다. 그 이유는 pure Bayesian 확률분포는 구하기가 어렵기 때문에 오차를 감수하고 간단한 naive Bayesian으로 문제를 단순화시켜서 풀기 때문입니다. 예를 들어, feature의 개수가 10개이고 각각의 feature가 가질 수 있는 값의 종류가 각각 3개씩이라면 pure Bayesian 방식으로는 3^10 = 59,049 가지 경우에 대한 확률을 계산해야 하지만 naive 방식으로는 3*10 = 30개의 확률값만 계산하면 되기 때문입니다.


마지막으로 pure Bayesian과 naive Bayesian의 중간 단계에 있는 semi-naive Bayesian에 대해 살펴보겠습니다.


semi-naive Bayesian은 feature들을 먼저 소그룹으로 그룹핑(grouping)을 한 후에 각 그룹 내에서는 feature들 간의 상관관계를 풀(full)로 계산하되, 그룹과 그룹 사이에서는 상관관계가 없는 것으로 확률을 계산하는 방식입니다. 만일 feature들을 실제 상관관계가 있는 것끼리 잘 그룹핑할 수만 있다면 semi-naive Bayesian 방식이 가장 효율적인 확률모델이 될 것입니다.


예를 들어, f1, f2, ..., f9 9개의 feature를 순서대로 3개씩 묶어서 그룹(F1={f1,f2,f3}, F2={f4,f5,f6}, F3={f7,f8,f9})을 만들고 각 그룹내에서는 풀로 가능한 모든 조합에 대해 확률분포를 계산했다면 semi-naive Bayesian 확률은 다음과 같이 계산됩니다.


 --- (3)


마지막으로 이상의 3가지 Bayesian 확률 모델을 정리해 보면 다음과 같습니다.



☞ 사실 저도 베이지언에 대해 정리가 된 건 최근입니다. 논문 등을 볼때마다 그런 것 같긴 한데 뭔가 마음에 와 닿지는 않았던 적이 있습니다. 아마도 수식적인 부분에 너무 얽매였던 것 같습니다. 조금만 멀리 떨어져서 생각해 보면 사실 그렇게 어려운 개념이 아닌데.. 아마도 이제는 그런 모호함이 적겠지요. 그래서 개념이 중요함을 다시 한번 느낍니다.

by 다크 프로그래머