베이즈 정리

안녕하세요? 15세 재도링입니다.

지난 번에는 베이지안 기법을 간단히 설명하였습니다. 다시 정리하자면 베이지안 기법은 Belief 를 데이터를 이용하여 업데이트하는 기법입니다. Prior (업데이트 되기 전의 Belief) 를 Posterior (업데이트 된 후의 Belief) 로 업데이트하는 기법이라고도 할 수 있겠네요. 그렇다면 어떻게 Belief를 업데이트할까요? 이는 베이즈 정리를 통해 이루어집니다. 이번 글에서는 해당 정리를 간단하게 소개하도록 하겠습니다.

베이즈 정리 (Bayes’ theorem) 는 Belief 를 업데이트하는 방법을 알려주는 공식입니다. Bayes rule 이라고도 합니다. 베이지안 기법들은 모두 베이즈 정리에 기반하다는 점에서 공통점이 있어요. 즉, 베이즈 정리를 어떻게 적용했느냐의 차이만 있을 뿐이라 할 수 있겠네요! 그러니 베이지안 기법에서 베이즈 정리의 중요성은 아무리 강조해도 지나침이 없습니다. 베이즈 정리를 이해한다면 Prior 의 초기값을 설정한다는 것의 의미가 뭔지, 뭘 근거로 어떻게 Belief 를 업데이트하는지, 근본적으로는 베이지안식으로 확률을 해석하는 방식 (Bayesian probability) 을 이해할 수 있게 됩니다.

베이즈 정리의 동작 방식을 이해하기 위해선 수학지식이 필요합니다. 중학교 수준의 수학실력이면 충분하지만 그건 어디까지나 님들같은 고졸 이상에게나 위안이 되는 이야기이지요! 여기선 제 수준에 맞추어 작성해보기로 했습니다. 이번 포스트와 다음 포스트에 걸쳐서 아주 기본적인 수준에서의 수학 부분을 다루어보고자 합니다. 현업에 치여서 수학따윈 다 잊어버렸다면 이 글이 좋은 복습 기회가 되었으면 하네요.

모바일 게임 예제

그나저나 요즘 제가 모바일 게임을 하는데요. 간단히 말하자면 좋은 아이템을 가지고 있으면 친구를 이길 확률이 높아지는 흔한 과금 게임입니다. 같이 하는 놈들을 이기고야 말겠다는 생각으로 어떻게든 돈까지 질러가면서 하게 되는 것 같네요. 게임을 하다보면 러브카스톤이라는 걸 주는데 그걸 까면 카드가 나와요. 보통은 노말 카드 (N) 가 나오죠. 그런데 돈을 주고 사면 딱 봐도 더 좋아보이는 비싼 러브카스톤을 주는데 그걸 까면 상당히 높은 확률로 울트라레어 카드 (UR) 가 나와요. 즉, 이 게임을 잘 하려면 게임을 오래하거나 돈을 쓰거나 둘 중 하나에요.

게임 자체보다는 같이 하는 사람들이 하는 짓이 더 재밌어요. 어떤 친구는 맨날 잠도 안자고 게임을 해서 좋은 카드를 얻어요. 수업시간엔 맨날 자다가 점심 시간마다 얻은 카드 자랑하더라구요. 그런데 어떤 친구는 정작 게임은 몇 시간 안해요. 그런데 돈을 엄청 써서 카드가 정말 좋아요. 그리고 어떤 애들은 돈을 안쓰면서 돈을 썼다 그러기도 하고, 돈을 엄청 써놓곤 돈을 안썼다고 하기도 하죠. 그래서 전 베이지안 기법을 통해서 이 놈들이 과연 어떤 놈들인지 좀 더 자세히 알아보기로 했습니다.

베이즈 정리의 해설

베이지안 기법의 목표는 특정 사건의 확률 (Belief) 를 구하는 것입니다. 확률은 사건 (Event) 의 발생 가능성을 수치로 표현하는 방법입니다. 일상 생활에서는 확률을 퍼센트 포인트 (%) 로 말하곤 하지만 수학에서는 .0 부터 1.0 사이의 값으로 쓰는게 일상화되어 있으니 여기서도 그렇게 하도록 합시다. 일어날 가능성이 없으면 .0, 무조건 일어난다면 1.0입니다. 그리고 .5 정도 되면 반반이라 할 수 있겠네요. 즉, 우리는 확률을 통해 얼마나 해당 사건이 발생 가능한지를 수치로 말할 수 있습니다. 가령 제가 집에 가자마자 스팀을 열고 게임을 할 확률이 90% 라면 이는 아래와 같이 표시됩니다.

p(집에 가자마자 스팀을 열고 게임하기) = .9

그러면 다시 게임 이야기로 돌아가겠습니다. 과금을 할 때와 얻는 카드 종류 사이의 조건부 확률 (Conditional probability) 를 표로 표시하면 아래와 같습니다.

과금과 보상 사이의 Conditional probability를 정리한 표

여기서 Card = N 은 노멀카드를 말하며, Card = UR는 울트라레어 카드를 말합니다. p( Card = N | Stone = 무료) = .99 는 무료로 얻은 러브카스톤을 돌렸을때 노멀카드가 나올 가능성을 의미합니다.

여기서 N 카드를 획득할 확률과 UR 카드를 획득할 확률은 얼마나 될까요? 아래와 같은 식으로 구할 수 있습니다.

  • p(카드=N) = p(카드=N | Stone = 유료)+p(카드=N | Stone = 무료) 
    = 0.99 + 0.01 = 1
  • p(카드=UR) = p(카드=UR | Stone = 유료)+p(카드=UR | Stone = 무료)
    = 0.01 + 0.99 = 1

이상의 경우에서, 확률을 다루는 두 가지 방법이 있는 걸 알 수 있습니다.

1. Conditional probability: p( Card | Stone) 와 같이 특정 Event 가 일어난 것을 가정한 상황에서의 확률이 있습니다. 이를 Conditional probability 라고 합니다.

2. Marginal probability: 다음으로는 p(카드=UR) = p(카드=UR | Stone = 유료) + p(카드=UR | Stone = 무료) 와 같이 가능한 모든 Event 경우들의 합을 통해 특정 Event 의 확률을 구할 수 있습니다. 이를 Marginal probability 라고 합니다.

그나저나 위의 계산대로라면 p(카드=N) = 1 이고 p(카드=UR) = 1 이니까 모든 종류의 카드가 나올 확률은 공평하게 전부 1이 된다는 해석을 할 수 있습니다. 과연 그 말이 맞을까요? 그렇지 않습니다. 만약 제가 돈이 넉넉해서 러브카스톤을 무료로 쓰는 양이랑 유료로 쓰는 양이랑 같을 수준이 된다면 모를까. 돈 없는 저는 보통 시간을 들여서 무료 러브카스톤을 얻는 경우가 대부분입니다. 아주 가끔 술먹고 밤늦게까지 게임 하다가 혹시나해서 지르는 경우가 아니라면 유료 러브카스톤을 사용하진 않거든요 (히이이이이익 중학생이 술을 먹다니). 그러니 제가 무료로 러브카스톤을 쓸 확률을 수치화하라고 한다면 전 그 확률 p(스톤=무료) 을 0.99 라 하겠습니다. 그리고 유료로 쓸 확률 p(스톤=유료)은 0.01 이라 하겠습니다. 그럼 아래와 같은 식이 좀 더 현실을 잘 반영하겠네요.

  • p(카드=N) 
    = p(카드=N|스톤=무료)p(스톤=무료)
     +p(카드=N|스톤=유료)p(스톤=유료) 
    = .99 x.99 + .01 x.01 = .9801 + .0001 = .9802
  • p(카드=UR)
    = p(카드=UR|스톤=무료)p(스톤=무료) 
    + p(카드=UR|스톤=유료)p(스톤=유료)
    = .01 x.99 + .99 x.01= .0099 + .0099 = .0198

즉, 이게 좀 더 나 자신의 게임 성향이 잘 반영된 확률 결과라고 할 수 있겠네요. 저보다 좀 더 과금을 많이 하는 사람이라면 저보다 p(카드=울트라레어) 이 더 높고 그 대신 p(카드=노말) 이 좀 더 낮겠네요.

여기서 좀 더 생각해봅시다. 현재 우리는 p(카드|스톤), p(스톤), p(카드) 을 알고 있습니다. 그럼 여기서 p(스톤 | 카드) 를 알 수 있을까요? 될꺼 같기도 하고요. 안될꺼 같기도 하네요. 이걸 가능하게 만들어주는게 바로 베이즈 정리입니다. 이는 아래와 같습니다.

  • p(스톤 | 카드) = p(카드 | 스톤) p(스톤) / p(카드)

좀 더 일반화하자면 아래와 같이 정리할 수 있습니다.

  • P(Belief|Sample) = P(Sample|Belief)p(Belief) / p(Feature)

여기서 Belief 는 해당 사건에 대해서 자신이 생각하는 확률값을 말합니다. Feature 는 Belief 를 업데이트하기 위해 사용하기 위해 사용하는 데이터이지요. 업데이트 시점에 따라서 Belief 를 Prior 와 Posterior 라 하는데 이는 아래와 같습니다.

  • Posterior = P(Belief|Sample) = 데이터를 보고 업데이트한 Belief.
  • Prior = P(Belief) = 업데이트 하기 전의 Belief 입니다.

Bayesian Updating

예에서 볼 수 있었듯이 베이즈 정리를 사용하기 위해서는 일단 Belief 가 있어야 합니다. 전 저 자신을 잘알고 있기 때문에 자신있게 0.99 랑 0.01 로 초기값을 잡을 수 있었지요. 하지만 저 자신의 과금 행동이 아니라 제 친구의 과금 행동에 대해서는 어떻게 Belief 를 초기화할 수 있을까요? 그 녀석들이 솔직하게 제게 말해줄 때도 있겠지만, 아무래도 말만 들어서는 정확하게 알기 힘들지요. 속이기도 할 겁니다. 이 경우 우리가 할 수 있는 행동이란 뭘 근거로 하건 간에 초기값을 잡고, 데이터를 때려박으면서 잘 되기를 기도하는 수 밖에 없습니다. 이렇게 주관적으로 Belief 를 초기화하여 사용하는 Prior 를 Subjective Prior 라고 합니다.

베이즈정리를 이용한 업데이트 (Bayesian Updating)을 이용하면 초기값을 잘못 잡았다고 하더라도 데이터를 받아들임에 따라서 계속 자신의 Belief 를 수정할 수 있게 됩니다.

제 주변에 과금 전사 친구가 한 명 있다고 가정해보겠습니다. 한 달에 백만원씩 과금한다는 이야기를 몇 달 동안 듣다보니 이 친구 다섯 번 중에 네 번은 과금을 해서 카드를 얻는게 아닌가 하는 생각이 들 정도입니다. 수학적으로는 아래와 같은 Belief 를 가지게 되었습니다.

  • p(스톤=무료) = 0.2
  • p(스톤=유료) = 0.8

제가 그 친구의 카드를 슬쩍 한 장 봤다고 칩시다. 그게 UR 이냐 R 이냐에 따라서 아래와 같이 Belief 가 달라지게 됩니다.

확인한 친구의 카드가 N 일 경우

  • p(스톤=무료 | 카드 = N) 
    = p(카드 = N | 스톤 = 무료) p(스톤 = 무료) / p(카드 = N)
    = .99 * .2 / (.99 * .2 + .01 * .8) = .198 / .206 = .9612
  • p(스톤=유료 | 카드 = N)
    = p(카드 = N | 스톤 = 유료) p(스톤 = 유료) / p(카드 = N) 
    = .01 * .8 / (.99 * .2 + .01 * .8) = .008 / .206 = .0388

확인한 친구의 카드가 UR 일 경우

  • p(스톤 = 무료 | 카드 = UR) 
    = p(카드 = UR | 스톤 = 무료) p(스톤 = 무료) / p(카드 = UR)
    = .01 * .2 / (.01 * .2 + .99 * .8) = .002 / .794 = .0025
  • p(스톤 = 유료 | 카드 = UR)
    = p(카드 = UR | 스톤 = 유료) p(스톤 = 유료) / p(카드 = UR)
    = .99 * .8 / (.01 * .2 + .99 * .8) = .792 / .794 = .9975

이상의 예제를 통해 베이즈 정리가 무엇인지, Belief 의 예가 어떤 것이고 Prior 와 Posterior 의 관계 그리고 Bayesian Updating 의 개념을 확인해보았습니다. 어디까지나 해당 개념을 잡기 위한 예제라는 점에 주의하세요. 가령 위 예제의 경우 Bayesian Updating 의 결과가 너무 극과 극이지요? 이를 조절하기 위해서는 Probability Distribution (확률 분포도) 를 사용하면 됩니다. 하지만 계산 대상만 달라질 뿐이지 베이즈 정리를 사용하는 것은 동일합니다.

다음에는 복습의 마지막 차례로 Probability Distribution 에 대해서 소개해보도록 하겠습니다.