상세 컨텐츠

본문 제목

[잠재 디리클레 할당 파헤치기] 2. 디리클레 분포와 LDA

그냥 공부

by ∫2tdt=t²+c 2017. 4. 20. 16:09

본문

앞 글에서는 베이즈 추론의 기본 개념과 이에 자주 사용되는 분포 중 하나인 이항분포, 베타분포에 대해서 살펴보았습니다. 이번에는 앞서 다룬 이항분포를 N개의 경우의 수로 확장한 다항분포(Multinomial Distribution)와 그 켤레 사전 분포인 디리클레 분포(Dirichlet Distribution)을 살펴보도록 하겠습니다.


가능도

켤레 사전 분포

가짓수 = 2

Bernoulli

A, B 둘 중 하나만 일어나는 사건

Binomial

A, B가 여러 번 일어나는 사건

Beta

가짓수 > 2

Categorical

A, B, … Z 중 하나만 일어나는 사건

Multinomial

A, B, … Z가 여러 번 일어나는 사건

Dirichlet


이전 글에 있었던 표를 다시 가져와보았습니다.


각 분포의 수학적 표기

본격적인 설명에 들어가기에 앞서, 이항분포, 다항분포, 베타분포, 디리클레 분포를 수학적으로 어떻게 표현할 것인지 약속을 하고 넘어가도록 할게요.

이항분포의 수학적 표기

이항분포를 구성하는 확률값은 1가지만 있으면 됩니다. 사건이 일어나거나 일어나지 않는 2가지 경우만 있기 때문에, 일어날 확률 p를 알면, 일어나지 않을 확률 q = 1-p로 간단히 계산해서 얻을 수 있기 때문입니다. 그리고 이항분포를 따르는 사건을 n회 반복시행했을때의 결과는 사건이 일어난 횟수 x와 일어나지 않은 횟수 n-x로 서술할 수 있겠죠. 

발생확률이 p일때 N회 반복시 X번 사건이 발생할 확률은 이항분포를 따르는데, 이를 다음과 같이 표현하도록 하겠습니다.



다항분포의 수학적 표기

다항분포의 경우, 발생가능한 사건이 k개라고 하면 총 k-1개의 확률값을 알아야 분포를 알 수 있습니다. 예를 들어 가위/바위/보 중 하나를 내를 사건이 있을때, 확률이 각각 가위: 0.25, 바위: 0.25이라고 하면, 보를 낼 확률은 1 - (0.25 + 0.25) = 0.5 라고 알 수 있겠죠.

또한 다항분포를 따르는 사건을 n회 반복시행한다고 하면, 각 경우가 일어난 횟수는 총 k개의 수치로 나타낼 수 있습니다. (이때 당연히 k개의 횟수의 합은 n이 되어야겠죠.) 

표기의 간결성을 위해 벡터를 도입하도록 하겠습니다. 벡터 P = (p1, p2, p3, ... p_k) 는 각각의 경우가 일어날 확률을 나타냅니다. p1~p_k의 합은 당연히 1이 되겠죠. 벡터 X = (x1, x2, x3, ... x_k)n회 반복했을때 각 경우가 일어난 횟수를 나타냅니다. x1~x_k의 합은 n이 됩니다. 즉 다항분포는 확률을 나타내는 벡터 P와 시행 결과를 나타내는 벡터 X를 가지고 표현할 수 있습니다.



베타분포의 의미와 수학적 표기

앞 글에서 설명했듯이 베타분포는 2개의 하이퍼 파라미터(흔히 α, β로 씀)를 가집니다. 다시 정리하자면, 베타분포의 의미는 사건이 발생한 횟수가 α-1번, 발생하지 않은 횟수가 β-1번 관측되었을때, 사건이 발생할 확률이 p일 확률을 표현하는 분포라는 것이죠. 이를 수식으로 표현하자면 다음과 간결하게 적도록 하겠습니다.


디리클레 분포의 의미와 수학적 표기

디리클레 분포는 2가지 경우만을 다루는 베타분포를 k가지 경우를 다루도록 확장한 버전이라고 생각할 수 있습니다. 그렇기에 하이퍼 파라미터는 k개(α1α2, ..., α_k라고 씀)가 됩니다. 디리클레 분포는 즉, k가지 경우가 발생할 수 있는 사건에서 경우1은 α1-1번, 경우2은 α2-1번, ... 경우k은 α_k-1번, 일어났을때, 각각 경우1이 일어날 확률이 p1, 경우2가 p2, ... 경우k가 p_k 일 확률을 표현합니다. 당연히 확률값 p1~p_k의 합은 1이겠죠. 이를 간결히 다음과 같이 적곤 합니다.

(이때 P = (p1, p2, ... p_k)의 확률값 벡터, α = (α1, α2, ... α_k) 의 하이퍼 파라미터 벡터입니다.)


디리클레 분포를 이용한 베이즈 추론

앞 글에서 이항분포의 사건을 가지고 베이즈 추론을 진행한것마냥, 다항분포의 사건을 가지고 마찬가지로 베이즈 추론을 진행할 수 있습니다. 친구와 가위/바위/보를 하는 경우를 생각해봅시다. 친구가 무엇을 어떻게 낼지 전혀 모르지만, 가위/바위/보 결과를 관측해나가면서 우리의 추론을 정교하게 업데이트해 나가봅시다.


가위/바위/보는 3가지 경우가 나타나는 사건이므로 다항분포(카테고리 분포)에 속합니다. 따라서 관측 사건이 다항분포이므로, 사전확률을 다항분포의 켤레 분포인 디리클레 분포를 사용하면 손쉽게 사후확률 분포를 계산할 수 있겠죠.


  1. 그러므로 친구가 가위/바위/보를 내는 확률 X는 디리클레 분포를 따른다고 가정하고 시작합시다. 관측된 값이 없으므로 하이퍼 파라미터 3개는 모두 1로 주었습니다.
    사전 확률 분포: X ~ Dir(1, 1, 1)
  2. 가위바위보 5판을 했는데, 친구가 (가위, 바위, 보) = (2, 2, 1) 번을 냈습니다. 
    관측값: (2, 2, 1)
  3. 관측값을 바탕으로 사후 확률분포를 계산합니다. 디리클레 분포의 하이퍼 파라미터를 각각 (2, 2, 1) 씩 키워주면 되겠죠.
    사후 확률 분포: X' ~ Dir(3, 3, 2)
  4. 가위바위보 3판을 더했는데, 친구가 (가위, 바위, 보) = (0, 1, 2)번을 냈습니다.
    관측값: (0, 1, 2)
  5. 관측값을 바탕으로 사후 확률분포를 또 업데이트합시다.
    새로운 사후 확률 분포: X'' ~ Dir(3, 4, 4)

처음 단계에서 친구가 가위/바위/보를 낼 확률이 (0.25, 0.25, 0.5)일 가능도는 다음과 같겠죠.


3번에 이르렀을 때, 친구가 가위/바위/보를 낼 확률이 (0.25, 0.25, 0.5)일 가능도를 계산하고자 하면 다음과 같이 됩니다.


5번에 이르렀을 때, 마찬가지로 (0.25, 0.25, 0.5)일 가능도를 계산하면 다음과 같이 되겠죠. (실제 계산방법은 생략했습니다. 컴퓨터가 알아서 해줄테니깐 계산식에 집착할 필요는 없다고 생각합니다.)


관측 과정을 통해 가능도가 바뀌어나가는 것을 확인할 수 있죠. 따라서 베이즈 추론과 디리클레 분포를 이용하면 친구가 가위/바위/보를 낼 확률값이 어느 정도인지 추정해볼 수 있습니다.




3차 디리클레 분포의 모양. 하이퍼 파라미터 값에 따라서 전체 구간에서 확률이 고르게 분포할 수도, 특정 구간에 모일수도 있음. 하이퍼 파라미터 값들이 1보다 작을 경우 가운데가 파이고 모서리가 솟아오르며, 반대로 하이퍼 파라미터 값들이 커질수록 가운데 부분이 뾰족하게 튀어오른다.



정리해봅시다. 디리클레 분포를 활용하면 여러 경우가 발생하는 사건을 관찰해나가며, 그 사건에서 각각의 경우가 발생할 확률의 추정치를 더 좋게 개선해 나갈 수 있다는 것입니다.


토픽 모델링에 적용해보자.

이 복잡한 통계 분포를 주제를 자동으로 찾는 토픽 모델링 과정에 사용할 생각을 한 사람이 있었습니다.  David Blei과 Andrew Ng그리고 Michael I. Jordan 였는데요, 그들의 가정은 다음과 같았습니다.

  1. 문헌을 여러 개의 주제를 포함할 수 있다.
  2. 주제에는 여러 개의 단어가 포함될 수 있다.
  3. 문헌에 사용된 단어 하나하나는 어떤 주제에 포함된다.
그들은 사람이 글을 쓰는 과정을 다음과 같은 생성 모델로 가정했습니다.
  1. 먼저 문헌에 어떤 주제들이 들어갈지를 대략 생각해 놓는다. (문헌의 주제 분포 결정)
  2. 주제들 중에서 하나를 고른다. (주제 선정)
  3. 주제들에 포함된 단어들 중에서 하나를 고른다. (단어 선정)
  4. 그 단어를 문헌에 추가한다.
  5. 2로 돌아가 반복
우리가 실제로 보게 되는 것은 문헌의 주제분포나 주제별 단어분포가 아니라 문헌에 들어있는 단어들뿐입니다. 문헌들에 어떤 주제들이 포함되어있는지를 알기 위해서는, 관측가능한 단어들로부터 알수없는(Latent) 문헌별 주제분포, 주제별 단어분포를 추론하는 작업이 필요하게 됩니다. 통계적 추론이 필요하다는 거죠.

정확한 확률분포를 모르는 상황에서 관측을 거쳐가며 확률분포를 개선해나가는 모델을 쓰는게 딱 좋겠네요. 바로 베이즈 추론 과정이죠.

주제가 k가지가 있다고 하면 k개의 주제 중 하나를 고르는 행위는 다항분포가 될겁니다. 또한 주제에 포함된 단어가 v개가 있다고 할때 v개의 단어 중 하나를 고르는 행위 역시 다항분포가 되겠죠. 우리가 관측하는 단어는 다항분포의 결과가 두번 중첩된 것이죠. 따라서 사전 확률은 켤레 사전 분포인 디리클레 분포로 두면 되겠습니다. 그렇기에 문헌별 주제분포와 주제별 단어분포는 디리클레 분포를 따른다고 가정합니다.


LDA 모형의 판 표기법(Plate Notation)


흔히 위와 같은 그림으로 LDA 모형을 설명하곤 합니다. 회색으로 칠해진 W가 우리가 관측할수 있는 단어를 뜻하고, 상자 모양으로 둘러싸인것은 그것이 반복됨을 의미합니다. 각각의 문자의 의미는 다음과 같아요.


M: 문헌의 갯수

K: 주제의 갯수

N: 문헌에 속한 단어의 갯수

θ: 문헌의 주제 분포(주제 분포는 문헌마다 다를테니, 총 θ_1~θ_M까지 M개의 주제 분포가 있겠죠.)

φ: 주제의 단어 분포(단어 분포는 주제마다 다를테니, 총 φ_1~φ_K까지 K개의 단어 분포가 있을 겁니다.)

Z: 해당 단어가 속한 주제의 번호


앞서 이야기했듯이 문헌의 주제분포 θ는 디리클레 분포를 따를 것입니다. 이때의 초기 하이퍼 파라미터 값을 α라고 하면,이 α값은 문헌의 주제분포가 얼마나 밀집되어있는지 성긴지를 조절하는역할을 하게되겠죠. 마찬가지로 주제의 단어분포 φ도 디리클레 분포를 따르겠고, 이 때의 하이퍼 파라미터 β는 주제별로 단어들이 얼마나 모여있는지 그렇지 않은지를 결정하게 됩니다.


LDA를 실시할 때 사전에 결정해주어야할 값은 αβ, K값입니다. α은 대게 0.1, β는 대게 0.001로 잡습니다. 이 값이 1에 가까워질수록 문헌에 많은 주제가 포함되고, 주제에 많은 단어가 포함되게 되겠죠. 그리고 우리가 얻고자하는 값은 Z와 θφ입니다. θφ는 주어진 하이퍼 파라미터 αβ를 따르는 디리클레 분포라고 가정하고, 실제 문헌 내 단어 W를 관측해나가면서 단어마다 적절한 주제를 부여하여 Z값을 정합니다. 그리고 이 결과를 따라 θφ의 디리클레 분포를 업데이트하는 과정을 거치는거죠. 가능한 모든 경우 Z값 중에서 가장 가능도가 높은 Z값을 찾아내게 되면, 문헌 내의 각각의 단어들이 어디에 배정되어야하는지 추론할 수 있게되는거죠.


이 전체 과정은 베이즈 정리로 간략하게 정리할 수 있습니다.

일때

P(Z|W)를 최대로 하는 Z값을 찾는 것이 LDA의 목표


W는 실제 단어, Z는 그 단어가 배정된 주제 번호겠죠. 어떠한 단어도 관측되기 전의 P(Z)는 순수한 주제분포를 따르므로 결국 문헌의 주제분포인 θ와 연관됩니다. 그리고 P(W|Z)는 특정 주제에 대해서 해당 단어가 나타날 확률을 의미하므로, 주제별 단어분포와 연관되겠죠. P(W)Z와는 상관없는 상수이므로, P(Z|W)의 최댓값을 찾을때 고려하지 않아도 됩니다. 


정신없이 이론만 계속 늘어놓았는데요, 다음 글에서는 실제로 P(Z|W)를 최대로하는 Z값을 찾는 방법 중 하나인 깁스샘플링을 설명하면서 실제로 LDA가 어떻게 문헌 내에서 주제를 묶어내는지 설명하도록 하겠습니다.


2018년 2월 13일 추가

마지막 부분에서 LDA로 넘어가는 부분의 설명이 좀 부족한듯하여, 추가로 포스팅을 업로드하였습니다.

[잠재 디리클레 할당 파헤치기] 2.5. 디리클레-다항분포와 마법의 폴리아 항아리

윗 글을 참고하시면, 디리클레 분포가 어떻게 토픽 모델링에 쓰이는지 좀더 쉽게 이해하실 수 있으실듯합니다.

참고링크

http://www.4four.us/article/2010/11/latent-dirichlet-allocation-simply : LDA(Latent Dirichlet Allocation): 겉핥기

http://www.4four.us/article/2014/10/lda-parameter-estimation : LDA 파라미터 추정: 깁스 샘플링을 써서

https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation

관련글 더보기

댓글 영역