베이지언 확률(Bayesian Probability)

기계학습 2014.01.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 다크 프로그래머


  • 이전 댓글 더보기
  • BlogIcon DataCrush 2015.11.10 10:12 신고 ADDR 수정/삭제 답글

    감사합니다! 이해가 잘 되네요^^

  • dd 2016.04.16 20:49 신고 ADDR 수정/삭제 답글

    감사합니다

  • 루돌프 2016.04.21 10:58 신고 ADDR 수정/삭제 답글

    좋은글 정말 감사합니다!

    혹시 서적은 어떤 것을 참고하시나요?

    • BlogIcon 다크pgmr 2016.04.21 11:19 신고 수정/삭제

      필요한 경우 wikipedia, 인터넷 자료, 논문 등을 찾아보긴 합니다만 따로 참조하는 서적은 없습니다.. 따로 책을 보진 않고 그동안의 제 경험과 나름의 이해, 해석을 그때 그때 글로 정리하고 있습니다. 혹 참고한 자료가 있을 경우에는 블로그 해당 글에 레퍼런스를 달고 있으니 참고하시기 바랍니다.

  • 초코라떼 2016.05.23 09:59 신고 ADDR 수정/삭제 답글

    좋은글 감사합니다!
    궁금한 점이 있어서 댓글을 남깁니다.

    키는 0 또는 1만 있으면, 철수는 키가 0이나 1중 하나만 가질 수 있을텐데,
    어떻게 P(키=0 | 철수)와 P(키=1 | 철수)가 각각 0.5가 될 수 있나요??
    제 생각으로는 전자가 1이면 후자가 0이거나, 전자가 0이면 후자가 1이 되어야할거같은데
    어떤 개념을 혼동하고있는건지 모르겠습니다 ㅜㅜ

    그리고 P(키=x|철수)는 철수인 사람의 키가 x일 확률로 설명할 수 있는데, P(키|철수)는 뭐라고 해야맞는건가요?

    • BlogIcon 다크pgmr 2016.05.23 10:29 신고 수정/삭제

      어떻게 설명을 해야 할지 조금 난감한데요, 확률이라는 것은 이미 결정된것이 아닌 모르는 사실 또는 아직 일어나지 않은 것에 대한 값이기 때문에 항상 0 또는 1의 값만 있는게 아니라 0 ~ 1 사이의 임의의 값을 가질 수 있습니다. 철수의 키의 경우도 실제 키는 a, b 둘 중의 하나의 값만 가질 수 있겠지만 아직 직접 키를 확인한 것이 아니라 간접적으로 그림자를 봤다던가, 체중을 쟀다든가, 등등 정황적 관측값을 통해 키를 유추한다고 생각해보면 실제 키가 a일지 b일지는 아직 모르는 것이고 그것은 증거, 또는 관측값에 따라 0~1 사이에서 어느 쪽의 확률이 클 지 수치적으로 표현될 수 있습니다.

    • Oli뀨 2016.06.02 13:53 신고 수정/삭제

      그렇게 생각하면 확률의 의미가 없죠.
      무승부가 없다고 하면 축구 경기는 이기거나 지거나 1 아니면 0인데요. 이길 경우는 한국이 1이면 스페인은 0, 스페인이 1이면 한국은 0인데 뭐하려고 경기 전에 각 팀이 이길 확률을 소수점으로 계산하나요?
      철수의 키는 0 또는 1로 정해진 값이겠지만, P(키=k | 철수)를 계산한다는 것은 철수의 키를 모르는 사람이 통계자료나 관측값를 보고 철수의 키(실제값)가 속하는 범위를 유추한다는 거죠.
      위에 키가 0일 경우와 1일 경우의 확률이 0.5씩 나온 건 통계자료로부터 계산한 값이 0.5(0.4+0.1), 0.5(0.2+0.3)가 된 것입니다. 둘의 확률이 같을 거라고 가정해서 0.5씩 나온 것도 아니구요.
      P(키|철수) 는 P(키=x_1|철수) + ... + P(키=x_n|철수) = 1
      x의 범위가 양의 실수라면, 철수의 키가 양의 실수일 확률이고, x의 범위를 인간이 가질 수 있는 키의 범위로 본다면, 철수의 키가 인간이 가질 수 있는 키의 범위에 속할 확률이 되죠. 즉 어떻게 해도 100%죠

  • 바샤샤 2016.10.06 12:16 신고 ADDR 수정/삭제 답글

    항상 좋은 글 잘 읽고 갑니다^^ 어쩜 이렇게 이해가 잘되게 쓰시는지ㅜㅜ 정말 감사합니다

  • 정보레인져S 2016.10.23 21:06 신고 ADDR 수정/삭제 답글

    와... 정말정말 감사합니다. 이 블로그에서 도움을 엄청 받네요 ㅎㅎ

  • 야간 프로그래머 2016.11.16 04:56 신고 ADDR 수정/삭제 답글

    깔끔하게 정리되어 많은 도움이 되었습니다. 말씀대로 개념 정리가 잘되어 있는 것이 중요한데, 그래서인지 베이지안 러닝의 개념이 머리에 잘 들어오네요. 감사드려요~

  • depth filter 2016.11.16 11:42 신고 ADDR 수정/삭제 답글

    여러 VO 논문중 bayesian depth filter에 관한 내용들이 많아서 검색질을 하다보니 또다시 다크님 페이지로 오게 되네요 ㅋㅋㅋ 항상 이 내공에 감탄하고가요~~!

  • okso6441 2017.01.02 23:42 신고 ADDR 수정/삭제 답글

    아! 정말 감탄하고 갑니다.
    이해가 정말 잘 되네요~
    같이 공부하는 사람들한테도 알려줘야 겠어요~
    정리 해 주셔서 정말로 감사합니다^^
    아 그리고 혹시 공유하면 안 된다면 댓글 남겨주세요~^^;;;;

  • ashtrayK 2017.01.04 11:20 신고 ADDR 수정/삭제 답글

    다크님 블로그는 여러번 왔는데, 댓글은 처음 남깁니다.
    머신러닝 관계된 이론에 대해서 공부하다보면 이 블로그로 귀결되는 경우가 많네요
    항상 좋은 글 감사드립니다. 아직 앞부분만 읽었는데, 좋은글일게 뻔해서
    선댓글후 정독들어가겠습니다. 감사합니다

  • ashtrayK 2017.01.04 17:52 신고 ADDR 수정/삭제 답글

    질문있습니다. 중간에 내용을 보면
    "먼저 가장 단순한 방법인 naive Bayesian 방식은 사람의 키, 머리크기, 허리둘레가 서로 상관관계가~"
    "반면에 pure Bayesian 확률은 사람이 가질 수 있는 모든 (키,머리크기,허리둘레) 조합에 대하여 확률분포를 계산한 값을 사용합니다."

    라고 되어 있는데요.
    이 두 문장에서 '사람'이라고 적힌 것이, 엄밀히 말하면 '철수'라고 적어야 되는 것같은데, 맞나요?
    (말은 안되지만 계산식을 산출하기 위한 측면에서 보자면요)

    • BlogIcon 다크pgmr 2017.01.04 21:38 신고 수정/삭제

      엄청 예리하시고 또 그런 것 같긴 합니다만.. 고치나 안고치나 큰 차이가 있는 건 아니라서 그냥 두도록 하겠습니다...

  • BlogIcon 톈진난만 2017.06.03 10:37 신고 ADDR 수정/삭제 답글

    2년간 연구실에 있으면서 고민했던 내용 중 많은 부분이 다크님 블로그에 잘 정리되어 있네요 ㅎㅎ 감사합니다!

  • 안녕하세요 2017.06.13 10:24 신고 ADDR 수정/삭제 답글

    좋은 글 감사합니다.

  • 김타타 2017.06.13 21:26 신고 ADDR 수정/삭제 답글

    좋네요 이제 막 머신러닝 공부 시작하고 있는데 기본이 잡히는 느낌이에요 감사합니다

  • onion 2017.07.06 01:28 신고 ADDR 수정/삭제 답글

    (2)식에서
    p(철수 | 머리크기, 키 ..) 이렇게 바꾸어야 하는 것 아닌가요..?

    • BlogIcon 다크pgmr 2017.07.06 18:45 신고 수정/삭제

      아니요. p(머리크기, 키, .. | 철수)가 맞습니다.

  • 고라니 2017.07.09 16:33 신고 ADDR 수정/삭제 답글

    졸업한지 좀 오래되긴 했지만 ML 석사 전공자인데요. 다크님이 교수님보다 훨씬 잘 설명해주시는것 같습니다.

  • 치치보이 2017.07.14 13:44 신고 ADDR 수정/삭제 답글

    항상 다크님 블로그에서 공부할 때 마다 느끼는거지만 정말 너무너무 정리가 잘 되어있네요.. 감사합니당

  • Xellos 2017.09.03 20:41 신고 ADDR 수정/삭제 답글

    어려운 내용 쉽게 잘 정리 해주셔서 잘 보고 갑니다

  • yumere 2017.10.08 18:52 신고 ADDR 수정/삭제 답글

    너무 좋은글입니다. 저도 논문볼때 막연히 그런거지 하고 넘어갔는데, 잘 정리가 된 것 같네요

  • oranzi 2018.01.17 17:54 신고 ADDR 수정/삭제 답글

    Bayesian rule 자체는 이해가 가는데, 그것을 머신러닝에 어떻게 적용하는지가 어려웠는데, 덕분에 조금 감을 잡은 것 같습니다. 항상 좋은 내용 공유해주셔서 감사합니다.