본문 바로가기

Data Science/Machine Learning

[ML] Topic Modeling(토픽 모델)인 LDA(Latent Dirichlet Allocation)

반응형

※해당 게시물에 사용된 일부 자료는 순천향대학교 빅데이터공학과 정영섭 교수님의 머신러닝 전공수업 자료에 기반하였음을 알려드립니다.

 

이번 포스팅에서는 Clustering의 방법 중 하나이며 비지도학습이기도 한 토픽 모델에 대해 알아보려고 한다. 또 토픽 모델 중 가장 유명한 LDA(Latent Dirichlet Allocation:잠재 디리클레 할당)에 대해 공부해보자. 토픽 모델은 원래는 텍스트를 위한 대표적인 Clustering 방법이였지만 현재 이미지와 다른 분야에 널리 사용되고 있다. 토픽 모델이라는 아이디어는 "방대한 양의 텍스트가 존재할 때 누가 이걸 대신 읽고 주제를 파악해줄 수 있을까?" 라는 생각에서 기원했다고 한다.

 

토픽 모델은 여러가지가 나올 수 있다.

 

그런데 토픽모델은 Parameter에 따라 같은 데이터셋을 갖고도 다른 주제를 이야기하는 서로 다른 모델이 도출되기도 한다. 그렇다면 이러한 여러가지 모델들 중 가장 적합한 모델을 어떻게 선정할까? 그 몫은 사람이 결정해야 한다.

 

토픽 모델링도 K-means clustering과 마찬가지로 초기 K값을 설정을 해주어야 한다. 토픽 모델링에서의 최적의 K 초기값은 어떻게 계산할까? 이에 대해서는 LDA에 대해 배우고 글 말미 부분에서 언급하려고 한다. 이제 가장 대표적인 토픽 모델링 종류인 LDA에 대해서 알아보자.

 

#잠깐! 이제부터 소개할 LDA모델은 Fisher가 제안한 'LDA(Linear Discriminant Analysis):선형판별분석'과는 명백히 다른 개념임을 인지하자!

<LDA(Latent Dirichlet Allocation) : 잠재 디리클레 할당>

토픽 모델링으로서 LDA는 토픽(주제)별 단어의 분포, 문서별 토픽의 분포를 추정하는 확률적 모형이다. LDA가 실제로 하는 일은 현재 문서들에 등장하는 단어들(w값들)을 보고 어떤 토픽에서 뽑힌건지 단어들의 이면적인 정보를 추론하는 것이다.

 

LDA가 실제로 하는 일을 알아보기 전에 LDA가 실제로 하고 있는 일의 역과정인 "LDA가 가정하고 있는 문서생성과정"을 살펴보자. 밑의 그림은 LDA를 도식화한 그림이다. 미지수별로 잠재변수가 무엇을 의미하는지 밑의 그림을 참고하면서 차근차근 살펴보자. 어려울 수도 있을 것이다. 필자도 계속적으로 보면서 이해하려고 노력하고 있다...ㅜㅜ

 

LDA's Graphical representation

 

위 그림을 보고 Φ파이값과 Θ세타값에 대해서 애매모호한 개념으로 와닿을 수 있다. 필자도 그랬으므로 직관적인 예시를 들어서 각 파이값과 세타값이 무엇을 의미하는지 살펴보자.

 

세타값과 파이값의 의미

 

먼저 Φ파이값에 대해서 살펴보자. 파이는 각 토픽에서 어떤 단어들이 얼마나 분포하는지에 대한 값이며 위 그림속의 초록색 부분을 살펴보면 된다. Topic1에 대한 단어들의 분포가 Φ1 이 되며 Topic2에 대한 단어들의 분포가 Φ2 값이 된다.

데이터프레임 형태로 보았을 때 열 벡터(column vector)가 Φ파이값에 해당한다고 보면 된다.

 

반대로 Θ세타값에 대해서 살펴보자. 세타는 각 문서들의 Topic 분포에 대한 값이다. 데이터프레임 형태로 보았을 때 행 벡터(row vector)가 세타값에 해당한다고 보면 된다. 각 파이값과 세타값의 합은 1이 되어야 한다.

 

이제 세타값과 파이값이 주어지고 z31에 대한 값을 찾아본다고 가정해보자. z는 d번째 문서에 n번째 단어가 어떤 토픽에 해당하는지의 값을 의미한다. 따라서 z31은 3번째 문서에 1번째 단어가 어떤 토픽에 등장하는지 찾는 것인데, 위 그림의 파란색 부분을 보게 되면 '3번째 문서'에 해당하는 d3에 대한 row를 살펴보자. 해당 그림에서 행렬로 표시한다고 하면 d3행, Topic2열에 해당하는 (d3, Topic2)를 찾아가보면 0.625로 가장 값이 높다. 따라서 z31='Topic2'를 3번째 문서에 1번째 단어로 등장하는 것은 'Topic2'에 해당하는 단어일 것이다 라는 결론을 내릴 수 있다. 

 

그리고 위와 같은 상황이 계속 이어진다고 가정하고 w값(단어)을 찾기 위해 위 그림의 초록색 부분으로 되어있는 곳을 살펴보자. z31값으로 부터 'Topic2'라는 단서를 찾아냈고 이를 파이값으로 되어있는 데이터프레임에서 열 벡터를 기준으로 보면 Topic2라는 column에서 'Money'에 해당하는 값이 0.313으로 가장 높은 값임을 알 수 있다. 따라서 w값(단어)은 'Money'라는 결과가 도출된다.

 

여기까지 LDA가 기본적으로 가정하고 있는 문서생성과정을 알아보았다. 이제 이러한 과정을 역으로 수행하는 것이 LDA가 실제로 하고 있는 일이다. 즉, LDA는 토픽의 단어분포와 문서의 토픽분포의 결합확률이 커지도록 해야한다. 이것이 바로 LDA가 하는 Inference(추론)이다.

 

LDA가 Inference를 시작할 때 알고 있는 값이 하이퍼파라미터인 알파값, 베타값, 그리고 주어진 데이터인 단어들(w값들)이다. LDA는 이 3가지를 가지고 P(z,Φ,Θ | w)를 최대로 만드는 z,Φ,Θ 을 알아내야 한다. 이 때 우리가 예전에 배웠던 Bayesian theory 개념을 잠깐 이용할텐데, 바로 Posterior 개념과 Prior개념이 등장한다. 우리가 구하고자 하는 Posterior 확률은 P(z,Φ,Θ | w) 이다. 이 확률식을 계산하기 위해서는 P(w)에 대한 값을 구해야 한다. 하지만 Bayesian theory에서 배웠다 시피 분모에 해당하는 Marginal을 구하기 위해서 Total Probability를 이용해야 한다. 즉, P(w)를 구하기 위해서는 z,Φ,Θ 를 고려한 확률값을 구해야 하는데 z,Φ,Θ 값을 모르기 때문에 문제가 생긴다. 그럼 어떻게 해야 할까?

 

<깁스 샘플링>

해결방법은 깁스 샘플링이다. 깁스 샘플링이란, 나머지 변수는 고정시키고 한 변수만을 변화시키되 불필요한 일부 변수를 샘플링에서 제외시키는 방법이다. 즉 위의 경우 P(z,Φ,Θ | w) 에서 세타와 파이값을 계산에서 생략하는 것이다. 따라서 식은 밑의 그림과 같아진다. 

 

깁스 샘플링으로 인한 확률식의 변화

 

위 식에서 z의 -i에 대한 개념이 궁금할 수 있는데 이는 i번째 단어의 토픽정보를 제외한 모든 단어의 토픽정보를 의미한다. 예를 들어서 'money'라는 단어의 토픽정보를 알기 위해서 'money'를 제외한 모든 단어들의 토픽정보를 토대로 'money'라는 단어의 토픽정보가 무엇인지 추론하는 것이다.

#깁스 샘플링에 대한 자세한 설명은 다음 포스팅을 참고해보도록 하자.

https://ratsgo.github.io/statistics/2017/05/31/gibbs/

 

Gibbs Sampling · ratsgo's blog

이번 글에서는 깁스 샘플링(Gibbs Sampling)에 대해 간단히 살펴보도록 하겠습니다. 이번 글 역시 고려대 강필성 교수님 강의와 위키피디아, ‘밑바닥부터 시작하는 데이터과학(조엘 그루스 지음, ��

ratsgo.github.io

<α, β (Hyperparameter)의 역할>

그렇다면 α, β의 역할은 무엇일까? 알파값은 파이값에, 베타값은 세타값에 디클레레 분포를 따름을 가정하고 영향을 준다고 한다. 먼저 알파값의 역할에 대해서 알아보자. 알파값은 '문서들의 토픽 분포'를 나타내는 세타값에 영향을 준다.

아래 수식을 보면서 다시 살펴보자. 아래 수식은 d번째 문서에 i번째로 등장하는 단어의 토픽이 j번째 토픽일 확률을 의미한다.

 

출처 : https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/06/01/LDA/

 

위 수식에서 A는 d번째 문서가 j번째 토픽과 맺고 있는 연관성의 정도를 나타낸다. B는 d번째 문서의 n번째 단어(Wd,n)가 j번째 토픽과 맺고 있는 연관성의 정도를 의미한다. 

 

여기서 α값은 어떤 역할을 할까? 아까 위에서 들었던 파란색으로 칠해진 세타값의 데이터프레임 형태로 된 부분으로 돌아가보자. 해당 부분에서 d1의 Topic2를 보게 되면 0값을 볼 수가 있다. 이는 1번째 문서에 할당된 단어들은 Topic2와 연관성이 아예 없음을 나타낸다. 그런데 이렇게 되면 결국 d번째 문서에서 n번째 단어가 어떤 토픽에 해당하는지의 값(위 수식에서의 맨 왼쪽의 Zd,i 값)도 '0'이 됨을 의미하게 된다. α는 이 값을 0으로 되는 것을 막고자 하이퍼파라미터로서 역할을 하게 된다.

 

베타값은 '각 토픽에서 어떤 단어들이 얼마나 분포하는지'를 알려주는 파이값에 영향을 주며 하는 역할은 알파값과 동일하다.

α, β 값은 클수록 토픽 분포를 비슷하게 만들며 값이 작아질수록 특정 토픽이 크게 나타나게 된다. 다음 그림을 살펴보면서 α, β 값이 미치는 영향을 살펴보자.

 

하이어파라미터 값의 크기에 따라 달라지는 토픽 분포

 

<LDA의 최적의 K 초기값을 결정하는 방법>

글 초반부에 토픽모델링도 K-means 알고리즘처럼 K값의 최적 초기값을 설정해주어야 한다고 했었다. LDA에서는 최적의 K초기값을 어떻게 결정하게 될까? 이 때 Perplexity라는 지표를 이용하게 된다.

Perplexity지표는 깁스생플링을 사용해 P(w)값을 구한 이후로 부터 나오게 된다. P(w)값에 log을 취하게 되면 다음과 같은 수식이 표현된다.

 

P(w)값에 log을 취하게 되면 이러한 수식으로 변한다.

 

위 수식에서 n이 의미하는 바는 예를들어 n의 j=3, d=1이라고 하면 1번째 문서의 3번째 단어가 첫번째 문서에 나타난 빈도수를 의미한다. 그리고 Φ,Θ을 서로 element-wise곱을 취해준다. 하지만 이 수식은 해당 단어가 다른 토픽에서도 중복되어 나타날 수 있음을 간과하고 있다. 따라서 밑의 수식으로 변환해 줌으로써 모든 토픽에 대해 합을 계산해준다.

 

Perplexity의 최종 수식

 

결국 Perplexity(w)식은 위처럼 exponential 수식과 같아진다. p(w)값이 커질수록 LDA의 Inference가 좋다고 할 수 있다. 그런데 등호를 기준으로 오른쪽 식의 exp[-log{p(w)}]값이 작아질수록 p(w)값은 커지게 된다. 따라서 '최대화'문제에서 '최소화'문제로 변환되는 것을 볼 수 있다. 이렇게 토픽 수 K값을 하나씩 집어넣어보면서 Perplexity값을 구한 뒤 Perplexity가 가장 작은 값을 내는 K값이 바로 최적의 K값이 되게 된다.

 

#참고 포스팅

https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/06/01/LDA/

 

반응형