상세 컨텐츠

본문 제목

[토픽 모델링] HDP와 토픽 모델링

그냥 공부

by ∫2tdt=t²+c 2017. 7. 9. 02:29

본문

앞서서 LDA 토픽 모델링 기법에 대해서 설명했었는데요, LDA 기법은 모수 통계라는 특성 상 학습에 앞서 원 데이터가 가지는 주제의 수 K를 설정해 주어야 합니다. 이 K값에 따라 LDA 토픽 모델링의 결과가 크게 달라지기 때문에 적절한 K값 선정은 정말 중요한 일입니다. 하지만 해당 데이터에 얼만큼의 주제가 포함되어 있는지를 사전에 알기는 정말 어렵죠. 사람이 일일히 문헌을 뒤져가면서 K을 확인할 수도 없는 노릇이구요. 따라서 다양한 K값에 대해서 분석을 돌리고 perplexity 값을 기준으로(또는 해석이 합리적인 정도를 기준으로) 적절한 K값을 선정하는 방식으로 K값을 찾게 됩니다. 

이것이 LDA의 주요한 약점 중 하나입니다. 만약 데이터에 따라 적절한 주제 개수를 찾아주도록 LDA 기법을 개선할 수 없을까요? 당연히 있으니깐 이렇게 포스팅을 쓰고 있겠죠? 디리클레 프로세스(Dirichlet Process)와 이를 응용한 계층적 디리클레 프로세스(Hierarchical Dirichlet Process)를 토픽 모델링에 적용하여 이 문제를 해결한 방법이 있습니다. 이 포스팅에서는 그 기법과 이론적 배경에 간략히 설명해보도록 하겠습니다.



디리클레 프로세스(Dirichlet Process)

이름이 괜시리 어렵지만, 디리클레 분포의 업그레이드 버전이라고 생각하시면 되겠습니다. 디리클레 분포에 대해서는 이미 디리클레 분포와 LDA에서 설명했었죠. 한줄로 정리하자면 디리클레 분포는 주어진 하이퍼 파라미터에 따라 다항분포를 생성해주는 분포에 대한 분포라고 할수 있겠습니다. 그래서 디리클레 분포를 사전확률로 두면, 다항분포를 따르는 사건이 발생했을때 사후확률분포를 쉽게 계산할 수 있다고 했습니다. 그런데 디리클레 분포는 차원수가 정해져 있습니다. 즉 처음에 정해진 차원으로만 분포를 생성해준다는 것이죠. 예를 들어 다음과 같은 디리클레 분포가 있다고 해봅시다.

이 X에서 임의의 표본을 뽑는다고 하면 다음과 같은 Simplex(모든 성분의 합이 1인 벡터)가 뽑힐것입니다.

X1 = (0.3, 0.4, 0.3)

X2 = (0.1, 0.7, 0.2)

X3 = (0.4, 0.3, 0.3)

...
당연히 Xn에는 3개의 성분으로 이뤄진 벡터만 있겠죠. 그것은 X가 애초에 K=3인 디리클레 분포를 따르기 때문입니다. 그리고 Dir(1,2,1)이므로 모든 Xn들을 모아보면 대체로 두번째 성분이 평균적으로 0.5일겁니다.


디리클레 분포를 서로 다른 K값이 나올수 있는 분포로 확장할수 있을까요? 다행히도 앞선 학자들의 연구에 따라 이런 분포가 존재함이 증명되었고, 이를 디리클레 프로세스라고 이름까지 붙여주었습니다. 일반적으로 다음과 같은 수식으로 디리클레 프로세스를 표현합니다.

수식의 의미는 X는 모분포가 H, 집중 파라미터(concentration parameter)가 α인 디리클레 프로세스를 따른다는 것입니다. 이 때 X는 H를 따르는 임의 개수의 표본에 대한 분포를 형성합니다. α가 0에 가까울수록 X 분포는 모분포의 평균을 중심으로 모이고, α가 커질수록 X분포는 모분포의 평균에서 멀리 흩어집니다. (그래서 집중 파라미터라고 부릅니다.) 쉬운 설명을 위해 예를 들자면 다음과 같은 디리클레 프로세스가 있을 수 있습니다.

평균이 0, 표준편차가 1인 정규분포를 모분포로 하는 디리클레 프로세스죠. 여기에서 임의의 표본을 뽑을수 있겠죠. 디리클레 프로세스가 생성하는 표본 역시 디리클레 분포에서와 마찬가지로 Simplex입니다. 하지만 몇 차원의 Simplex일지는 모릅니다. (1이상의 어떤 값도 될수 있기 때문이죠).

먼저 N(0, 1)의 분포는 위 그림과 같습니다. 이 분포를 모분포로하는 디리클레 프로세스 X에서 3개의 샘플을 뽑으면 아래와 같을 겁니다. (이 사진들은 영어 위키 Dirichlet Process 항목에서 가져왔습니다.)


파란 막대의 개수(이는 곧 K값을 의미합니다)는 각 표본마다 다릅니다. 대체로 모분포인 정규분포 곡선과 비슷하게 중앙이 높고 그 주변이 작은 형태를 띠긴 합니다. α값을 10으로 키워서 표본을 추출하면 아래와 같이 나옵니다.


더 많은 파란 막대가 나타납니다. α를 100으로 키우면 막대는 더 늘어나도 주변으로 퍼지겠죠.

α가 몇이든 간에 표본을 충분히 많이 뽑으면 그 표본들의 분포는 평균적으로 모분포인 N(0, 1)을 따르게 됩니다. (비록 각각의 표본들에 포함된 막대 개수 K는 다를지라도요). 이것이 디리클레 프로세스입니다. 네 이쯤되면 이런분포가 존재할 수 있다는거는 이해하셨을 겁니다. 다만 어떻게 이런 분포를 얻을 수 있을까요? 이를 위한 재미난 비유가 다음 단락에서 이어집니다.


중국집 프로세스(Chinese Restaurant Process)

어려운 디리클레 프로세스를 쉽게 설명하고자 사람들이 이걸 중국집에 자주 비유하더라구요. (심지어 직접 체험해볼 수 있는 사이트도 있습니다.) 가정은 다음과 같습니다.


한 중국집이 있는데, 그 중국집에는 무수히 많은 식탁이 있습니다. 그리고 그 식탁에는 무수히 많은 자리가 있어서 손님이 얼마든지 앉을수 있죠. 손님이 한 명씩 들어와서 식탁에 앉을텐데 (손님은 들어오기만 합니다. 들어올땐 맘대로지만 나갈땐 아니니깐요), 식탁에 아무렇게나 앉는것이 아니라 앉는 규칙이 있습니다.

  1. 손님은 식탁의 인기도를 고려해서 어느 식탁에 앉을지를 고릅니다.
  2. 식탁에 어떤 음식이 올려질지는 식탁에 첫 손님이 앉을때 모분포 H에서 음식 하나를 뽑음으로써 결정합니다.
  3. 식탁의 인기도는 앉아 있는 사람의 수에 비례합니다. 하지만 손님이 비어있는 식탁을 고를 수도 있습니다. 이때 그 빈 식탁의 인기도는 집중 파라미터 α와 비례한다고 봅니다.
위와 같은 규칙에 따라 손님이 한명씩 한명씩 들어온다고 해봅시다. 첫번째 손님은 당연히 비어있는 식탁에 앉을 수 밖에 없습니다. 두번째 손님이 들어오면 첫번째 식탁에 앉거나 새로운 비어있는 식탁에 앉는 선택지가 있겠죠. 만약 α가 크다면 비어있는 식탁을 고를 확률이 높아지겠죠. 혹은 첫번째 식탁의 인기가 영 없는(확률이 낮은) 경우, 비어있는 식탁을 고를 확률이 높을 겁니다.

이렇게 손님이 무한히 계속 들어오다보면 (α이 아무리 크더라도 식탁이 무한정 늘어나지는 않습니다.) 식탁의 개수도 정해지고, 그 식탁의 인기도 비도 일정 값에 수렴하게 됩니다. 이렇게 각 식탁에서 얻은 인기도 비는 모분포가 H, 집중 파라미터인 α 디리클레 프로세스에서 뽑은 샘플이 됩니다.


이 밖에도 막대 부러뜨리기(빼빼로 나눠먹기, Stick Breaking Process), 공 꺼내기(Polya-Urn Model)과 같은 비유들이 있지만, 저는 개인적으로 중국집 프로세스가 제일 재밌고 저게 가장 이해가 쉬운듯하여 나머지 설명은 생략하도록 할게요.


그리고 계속 넘어가기 전에 여기서 디리클레 프로세스의 특징을 다시 정리해보도록 하겠습니다.


  • 모분포를 따르는 임의 차원의 simplex를 추출할 수 있음
  • 디리클레 분포를 사전 분포로 사용할 경우 미리 K를 설정해야하는데, 실제 데이터가 K값에 적합하지 않을 경우 이는 부정확한 추론 결과를 낼 수 있음
  • 디리클레 프로세스를 사전 분포로 사용하면, 미리 K를 설정할 필요가 없고, 데이터의 특성에 따라 적절한 K를 찾아갈 수 있다는 장점이 있음
  • 디리클레 프로세스는 모분포가 연속일지라도 뽑혀나오는 분포는 이산적이라는 특징이 있음. 연속분포에서는 같은 값이 2번 이상 뽑힐 확률이 0이지만, 이산분포는 그렇지 않기 때문에 클러스터링에 활용가능

계층적 디리클레 프로세스(Hierarchical Dirichlet Process)

앞서 설명했듯이 DP는 모분포의 특성을 잘 모르더라도 학습과정에서 적절한 K값을 찾아내기 때문에 아주 쓸모가 많습니다. 그런데 만약 여러 개의 DP를 한데 묶어서 분석을 수행하려고 하면 애로사항이 꽃 피게 됩니다. 예를 들어 봅시다. 위의 중국집 비유에서 중국집이 한 곳이 아니라 여러 곳이 있다고 합시다. 우리는 어떤 음식 F가 올려진 식탁을 찾아서 각각의 중국집에서 그 음식점이 얼마나 인기가 있는지 확인하고 싶습니다. 문제는 여기서 발생합니다. 우리는 각 중국집에 식탁이 몇 개 있는지도 모르고, 각 식탁에 뭐가 올려져 있는지도 모릅니다. 그리고 결정적으로 모든 식탁에 몇 종류의 음식들이 얼마나 올라가는지 전혀 모르죠. 식당 A에 음식 F가 등장했다고 해서 식당 B에 음식 F가 등장한다는 보장도 없구요. 식탁에 올려지는 음식은 모분포 H를 따르는데, 만약 모분포 H가 연속 분포일 경우 같은 음식을 뽑게 될 확률은 사실 상 0입니다. 이럴 경우 아예 식당 간 음식 비교가 불가능해지겠죠.

그래서 학자들은 계층적 디리클레 프로세스를 제안했습니다. 

쉽게 설명하면 여러 개의 디리클레 프로세스들을 이어주기 위해 그 위에 디리클레 프로세스를 하나 더 씌운겁니다. 즉 모분포를 따르는 상위 디리클레 프로세스를 생성하고, 이 디리클레 프로세스를 모분포로 하는 하위 디리클레 프로세스를 여러 개 생성함으로써, 하위 디리클레 프로세스끼리 서로 연결될 수 있게 한 것이지요. 이렇듯 상위/하위 단계로 디리클레 프로세스를 사용했기 때문에 계층적 디리클레 프로세스라고 부릅니다.


G0이 Gj들을 어떻게 서로 묶어줄 수 있을까요? 바로 위의 중국집 비유로 돌아가봅시다. 우리는 식탁마다 몇 종류의 음식이 얼마나 올라갈지를 전혀 감 잡을수가 없습니다. 그렇기에 식당 A에서 나온 음식 F가 식당 B에도 있을지도 알수가 없는거고, 전혀 비교나 통합이 안되는거죠. 근데 앞서 설명했던 디리클레 프로세스의 특징을 잘 곱씹어보면, K가 몇일지 모르는 경우에도 알아서 적합한 K값을 잘 찾아가준다고 했고, 모분포가 연속일지라도 뽑혀 나오는 분포는 이산적이라고 했습니다. 방금 위의 문제를 해결하기에 딱 맞는 상황이죠. 즉 그렇기 때문에 식당들의 음식 분포를 디리클레 프로세스를 따른다고 가정을 바꾸면 서로 다른 중국집들의 음식끼리도 비교, 통합할 수 있게 됩니다.

(출처: Teh, Y. W., Jordan, M. I., Beal, M. J., & Blei, D. M. (2005). Sharing clusters among related groups: Hierarchical Dirichlet processes. In Advances in neural information processing systems (pp. 1385-1392).)


(계층적) 중국집 프로세스

따라서 중국집 프로세스 비유를 HDP에 맞게 업그레이드하면 다음과 같이 될것입니다.


중국집 체인점이 여러 개 있습니다. 체인점에는 무수히 많은 식탁이 있습니다. 그리고 그 식탁에는 무수히 많은 자리가 있어서 손님이 얼마든지 앉을수 있죠. 각 체인점마다 손님이 한명씩 꾸준히 들어와서 식탁을 골라 앉습니다. 

다만 달라진 것은 각각의 체인점에 음식을 배분해주는 역할을 하는 중국집 본사가 생겼다는 것이죠. 각 체인점에서 손님이 빈 식탁에 앉게 되면 직원을 본사로 보내서 식탁에 올릴 음식을 골라오게 합니다. 본사에는 음식이 담겨있는 엄청나게 큰 접시가 무한히 있고, 각 접시는 충분히 크기 때문에 직원들이 무한히 달라붙어서 음식을 풀 수 있습니다. 직원이 어떤 음식을 퍼올지는 손님이 식탁을 고르는 것과 유사합니다.


(디리클레 프로세스 G0)

  1. 직원은 접시의 인기도를 고려해서 어느 식탁에 앉을지를 고릅니다.
  2. 접시에 어떤 음식이 올려질지는 접시에 첫 직원이 붙을때 모분포 H에서 음식을 하나 뽑음으로써 결정합니다.
  3. 접시의 인기도는 붙어 있는 직원의 수에 비례합니다. 하지만 직원이 비어있는 접시를 고를 수도 있습니다. 이때 그 빈 접시의 인기도는 집중 파라미터 γ와 비례한다고 봅니다.

앞에서와 같이 각 중국집 체인점에 손님이 들어오게 됩니다. 손님이 식탁을 고르는 과정은 앞과 유사합니다.


(디리클레 프로세스 Gj)

  1. 손님은 식탁의 인기도를 고려해서 어느 식탁에 앉을지를 고릅니다.
  2. 식탁에 어떤 음식이 올려질지는 식탁에 첫 손님이 앉으면 직원을 본사로 보내서 결정되고, 그 음식의 분포 역시 직원들이 접시에 붙어있는 분포 G0를 따릅니다.
  3. 식탁의 인기도는 앉아 있는 사람의 수에 비례합니다. 하지만 손님이 비어있는 식탁을 고를 수도 있습니다. 이때 그 빈 식탁의 인기도는 집중 파라미터 α와 비례한다고 봅니다.

각각의 체인점에 손님이 무한히 들어오다보면 본사로 보내지는 직원 역시 무한히 늘어나게 되고, 본사에 있는 접시의 개수(=음식의 종류수) 및 접시의 인기도 비율도 특정한 값으로 수렴합니다. 또한 각 체인점의 식탁 개수 및 식탁별 인기도 비율도 특정한 값으로 수렴하구요. 서로 다른 체인점이라 할지라도 본사에서 특정한 음식을 배급받기 때문에 체인점별로 손님들의 음식에 대한 인기도를 비교할수도 있습니다.


(출처: Teh, Y. W., Jordan, M. I., Beal, M. J., & Blei, D. M. (2005). Sharing clusters among related groups: Hierarchical Dirichlet processes. In Advances in neural information processing systems (pp. 1385-1392).)



HDP-LDA

HDP를 토픽 모델링에 적용해 볼수 있겠죠. 위의 계층적 중국집 프로세스 비유에서 중국집 체인점들을 각각의 문헌으로 바꾸고, 본사에서 결정해주는 음식을 주제라고 바꿔주면 (당연히 각각의 손님들은 해당 문헌에서 등장하는 단어가 되겠죠) 완벽한 토픽 모델링 모형이 됩니다. 이를 구현하기 위해서 깁스 샘플링을 어떻게 하느냐는 https://github.com/arnim/HDP 의 Java 코드나 https://github.com/bab2min/tm-cpp를 살펴보심을 추천드립니다. 위 내용을 숙지하고 본다면 어렵지 않아요.


(이 단락은 나중에 여유생기도 심심해지면 채워넣도록 하겠습니다..)


참고 자료들

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

https://www.slideshare.net/MohitdeepSingh/chinese-restaurant-process

http://enginius.tistory.com/397

http://enginius.tistory.com/513


Teh, Y. W., Jordan, M. I., Beal, M. J., & Blei, D. M. (2005). Sharing clusters among related groups: Hierarchical Dirichlet processes. In Advances in neural information processing systems (pp. 1385-1392).

Teh, Y. W., & Jordan, M. I. (2010). Hierarchical Bayesian nonparametric models with applications. Bayesian nonparametrics1.

관련글 더보기

댓글 영역