← posts

잠재 디리클레 할당 (LDA) 뜯어보기

,

오늘은 잘 알려진 토픽 모델링 기법인 LDA에 대해서 알아보겠습니다. LDA는 Latent Dirichlet Allocation, 즉 잠재 디리클레 할당이라는 이름이며, 보다시피 이 이름은 3개의 단어로 이루어져 있습니다. 이 세 단어를 하나씩 뜯어보면 LDA를 이해할 수 있습니다.

잠재

잠재란 드러나지 않는다는 뜻입니다. LDA는 우리가 보고 있는 데이터인 문서가 숨겨져서 드러나지 않는 어떤 과정의 결과물이라고 가정합니다.

예를 들어,

널 초코칩으로 스프링클로 입맛 버리게 만들고 싶어, 숨기고 있지만 널 더 보고 싶어

누군가가 이런 문서를 썼다고 합시다. (출처)

이 문서가 만들어진 잠재적인(눈에 보이지 않는) 과정은 뭘까? 라는 질문에서 출발합시다. 이 말을 조금 더 쉽게 바꾸면, 이 문서를 쓴 사람은 어떤 과정을 거쳐서 이런 단어들을 골라서 쓰게 되었을까요?

문제는 이 모든 과정이 잠재적이라는 것입니다.

이렇게 ‘문서를 쓰게 된 과정’을 상상해봤지만, 사실 우리는 이 과정의 세부 디테일을 모릅니다. 쿠키 50%, 관심 50% 이런 정보는 문서 어디에도 써있지 않으며 우리가 알 수 있는 건 그 과정의 결과물인 단어들 뿐입니다. 즉 지금 우리가 해야 하는 것은 단어들을 보고, 미지의 확률값들을 추론하는 것입니다. (숨기고 있지만 널 더 보고 싶어!)

그래서 우리에게 필요한 것은 기본적으로 베이지안 추론입니다. 베이지안 추론은 간단하게,

밑에서 더 자세히 살펴보겠지만 LDA가 바로 이런 방식으로 동작합니다. 여기서 관심 있는 사건이 문서이고, LDA는 주어진 문서가 가장 나올 법한 확률 분포를 찾아가는 과정이죠.

이렇게 보면 나름 자연스러운 추론 과정이죠? 문제는 대충 ‘~에 대한 것일 것 같아’가 아니라 숫자로 된 파라미터를 가진 ‘확률 분포’가 필요하다는 것입니다. 그래서 이 때 다음 단어가 등장합니다.

디리클레

디리클레는 확률 분포의 이름입니다. 결론부터 말하면 디리클레 분포는 다항분포의 사전 켤레 분포이기 때문에 사용됩니다. 뭔 소리인지 모르겠으므로 풀어서 설명해 보겠습니다.

일단 다시 우리의 잠재적 가정으로 돌아가서, 주제가 정해졌을 때 단어를 고르는 상황을 상상해 봅시다. 주머니에 수많은 단어카드가 들어 있는데, 각 단어카드가 몇개씩 들어 있는지는 주제별 단어 분포에 따라 다를 것입니다. 주머니에 손을 넣어 아무 카드나 뽑는 걸 반복합니다. 독립적 시행이며, 같은 단어는 여러 번 반복해서 나올 수 있습니다.

이런 경우, 단어를 뽑은 결과는 다항분포를 따르지 않을까 생각해볼 수 있습니다. 다항분포의 확률질량함수(정해진 확률 파라미터에 따라 주어진 관측 결과가 나올 확률값을 돌려주는 함수라고 생각하면 됩니다)는 이렇게 생겼습니다.

f(x1,…,xk;n,p1,…,pk)=n!x1!…xk!p1x1…pkxk f(x_1, \dots, x_k ; n, p_1, \dots , p_k) = \frac{n!}{x_1! \dots x_k!} p_1^{x_1} \dots p_k^{x_k}

하지만 앞서 언급했듯 우리는 확률값을 전혀 모르기 때문에 사전 확률을 정한 다음 업데이트를 통해 사후 분포를 얻는 전략을 취할 겁니다. 그래서 사전 확률 분포를 뭐로 정할 것이냐의 문제인데요. 사전 확률 분포와 사후 확률 분포가 같은 가족군일 때 이들을 켤레분포라고 하며, 만약에 켤레 사전 분포(conjugate prior)를 사전 분포로 사용할 경우 사후 분포 업데이트에 필요한 계산이 매우 편해지기 때문에 켤레 사전 분포를 사전 분포로 고르게 됩니다.

다항분포의 켤레 사전 분포인 디리클레 분포를 살펴 보기 전에, 왜 따로 사전 분포가 필요한데? 사후 분포랑 뭐가 다른데? 라는 생각을 해보면,

디리클레 분포의 확률밀도함수는 이렇게 생겼습니다(다항분포와 달리 연속확률분포입니다).

f(p1,…,pk;α1,…,αk)=1B(α)∏i=1kpiαi−1 f(p_1, \dots, p_k ; \alpha_1, \dots, \alpha_k) = \frac{1}{ B(\alpha)} \prod_{i = 1}^k p_i^{\alpha_i-1} B(α)=∏i=1kγ(αi)γ(∑i=1kαi) B(\alpha) = \frac{\prod_{i=1}^{k} \gamma (\alpha_i)}{\gamma (\sum^k_{i=1} \alpha_i)}

이해를 위해 단어가 3개 있다고 가정할 때 α\alpha 값에 따라 확률밀도함수가 어떻게 달라지는지 보겠습니다.

그림 출처

이제 LDA가 가정하는 잠재적인 과정과 이용하는 확률 분포에 대해 알았습니다. 마지막 단어로 넘어가서, LDA가 실제로 어떻게 주제를 찾는지 알아보겠습니다.

할당

LDA의 최종 목표는 단어별로 문서별로 주제를 할당하는 것입니다. 어떻게 할까요? 그 과정은 다음과 같이 하나의 도식으로 나타낼 수 있습니다.

그림 출처

LDA는 이 목적을 달성하기 위해 베이지안 통계에서 자주 등장하는 깁스 샘플링(Gibbs Sampling)이라는 기법을 사용합니다. 단어의 개수가 많아질수록 우리가 추정해야 하는 값들의 차원이 엄청나게 늘어나기 때문에 추론에 필요한 계산을 가능하게 해주는 방법입니다.

전체 과정을 순서대로 설명하면 다음과 같습니다. 토픽의 개수인 KK는 미리 지정해 주어야 합니다. 사전분포의 파라미터 값들(α,\alpha, β\beta)도요.

  1. 모든 단어에 아무 주제나 할당한다. 그러면 이 값에 따라 우리의 관심사인 2개의 분포가 결정된다.
    • 아무렇게나 정했기 때문에 당연히 엉망일 것이다. 이제 업데이트를 하자.
  2. 1개의 단어를 고르고, 이 1개의 단어를 제외하고 나머지 단어들은 다 정답인 주제로 배정되어 있다고 가정한다.
    • 나머지 단어들만 사용해서 이 문서의 주제 분포와 각 주제의 단어분포를 다시 계산한다.
    • 이 분포를 기반으로 이 1개의 단어에 각 주제가 할당될 확률을 계산한 후 p(zi∣z−i,w)p(z_i \mid z_{-i}, w) 가장 확률이 높은 주제로 재할당한다.
      • P(주제 ∣\mid 분포) x P(단어 ∣\mid 주제) 를 나머지 단어들의 카운트를 통해 계산하면 된다. 지금까지 설명한 단어 선정 방식과 직관적으로 일치하는 내용.
  3. 문서 내 모든 단어에 대해 이것을 반복한다. 이것이 1회의 깁스 샘플링이다.
  4. 샘플링(재할당)을 반복하다보면 더 이상 변동이 없이 안정적으로 수렴하는 순간이 올 것이다. 거기서 멈춘다.
  5. 멈췄을 때 얻은 모든 단어의 주제 분포를 사용해서 단어의 집합인 각 문서에 주제를 할당한다.

참고한 글들


Comments