본문 바로가기

DS & ML

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

※본문은 <딥러닝을 이용한 자연어 처리 입문>와 ratsgo.github.io LDA를 요약한 내용입니다.

 

기존의 TF-IDF 행렬은 단어의 의미를 전혀 고려하지 못한다는 단점을 보유한다. 이에 LSA(잠재 의미 분석)는 TF-IDF 행렬이나 DTM 행렬에 Truncated SVD(절단된 SVD)를 사용해 차원을 축소하고, 단어들의 잠재적인 의미를 끌어낸다는 아이디어를 가지고 있음. 

 

다만 LSA는, 새로운 정보에 대해 업데이트가 어렵다는 단점이 있어, Word2Vec 등 단어의 의미를 벡터화할 수 있는 또 다른 방법론인 인공신경망 기반 방법론이 각광을 받는다. 

 

토픽 모델링은 문서의 집합에서 토픽을 찾아내는 프로세스를 말한다. LDA(Latent Dirichlet Allocation)은 토픽모델링의 대표적인 알고리즘으로 뽑힌다. LDA는 문서들은 토픽들의 혼합으로 구성되어있으며, 토픽들은 확률 분포에 기반해 단어들을 생성한다고 가정한다. 데이터가 주어지면, LDA는 문서가 생성되던 과정을 역추적한다. 

 

1. LDA의 가정

LDA는 앞선 포스트의 TF-IDF 행렬 또는 BoW의 행렬 DTM을 입력으로 사용하는데, 이로부터 LDA는 단어의 순서를 신경쓰지 않는다는 점을 알 수 있다. 

 

LDA는 문서들로부터 토픽을 뽑아내기 위해, 다음과 같은 가정을 한다 : 각각의 문서가 작성될 때, 다음과 같은 과정을 거친다는 가정.

1) 문서에 사용될 단어의 개수 $N$을 설정한다.

2) 문서에 사용할 토픽의 혼합을 확률분포에 기반해 결정한다.

3) 문서에 사용할 각 단어를 아래와 같이 정한다.

3-1) 토픽 분포에서 토픽 T를 확률적으로 고른다.

3-2) 선택한 토픽 T에서 단어의 출현 확률 분포에 기반해 문서에 사용할 단어를 고른다

ex) 만약 3-1)에서 60%의 확률로 강아지 토픽을 선택하고, 40%의 확률로 과일 토픽을 선택할 수 있다고 하자. 그럼 만약 강아지 토픽이 선택되었다면 33%의 확률로 강아지라는 단어를 선택할 수 있고, 33%의 확률로 귀여운, 16%의 확률로 깜찍하고, 16% 확률로 좋아요 단어가 나올 수 있다.(출현 확률 분포). 이 (3) 과정을 반복하며 문서를 완성한다.

 

이런 과정을 통해 문서가 작성되었다는 가정 하에, LDA는 토픽을 뽑아내기 위해 위 과정을 역으로 추적하는 reverse engineering과정을 수행한다. 

 

2. LDA의 수식적 이해

 

▶  $D$ : 전체 말뭉치 문서 개수.   $K$ : 전체 토픽 수.   $N$ : $d$번째 문서의 단어 총 개수

▶  $w_{d,n}$ : $d$번째 문서에서 등장한 $n$번째 단어, 유일하게 관측가능함.

위 정보만을 가지고 하이퍼파라미터 $\alpha, \beta$를 제외한 모든 잠재 변수를 추정해야한다. 

▶ Variable(변수) : $\theta_d$, $z_{d,n}$, $\phi_k$, $\alpha$, $\beta$

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

▶  $\phi_k$ : $k$번째 토픽에 해당하는 벡터. 말뭉치 전체의 단어 개수만큼의 길이를 보유(표1의 열벡터). 각 요소가 확률이기 때문에 sum = 1.  LDA가 토픽의 단어 비중 $\phi_k$가 $\beta$를 parameter로 갖는 디리클레 분포를 따른다는 가정을 취하기 때문에 $\beta$에 영향을 받는다. 

 

▶  $\theta_d$ : $d$번째 문서가 가진 토픽 비중을 나타내는 벡터. 전체 토픽 개수 $K$만큼의 길이를 보유. (표2의 행벡터) 역시 각 요소가 확률이기 때문에 sum = 1.  LDA가 문서의 토픽 비중 $\theta_d$가 디리클레 분포를 따른다는 가정을 취하기 때문에 $\alpha$에 영향을 받는다.

각 토픽 내 단어 분포 $\phi_k$
Terms Topic1 Topic2
사과 0.2 0
바나나 0.4 0
먹어요 0.4 0
귀여운 0 0.33
강아지 0 0.33
깜찍하고 0 0.16
좋아요 0 0.16

 

 

각 문서의 토픽 분포 $\theta_d$
Docs Topic1 Topic2
Doc 1 1.00 0.00
Doc 2 0.00 1.00
Doc 3 0.4 0.6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

▶  $z_{d, n}$ : $d$번째 문서 $n$번째 단어가 어떤 토픽에 해당하는지 할당해 주는 역할을 한다. 예를 들면, 세번째 문서의 첫번째 단어는 Topic2일 가능성이 높다. Topic1과 2가 뽑힐 확률이 각각 0.4, 0.6이기 때문에.

 

▶  $w_{d, n}$ : $d$번째 문서 $n$번째 단어를 할당해 주는 역할을 한다. $\phi_k$와 $z_{d, n}$에 동시에 영향을 받는다. 해석하자면, 직전 예시에서 $z_{3, 1}$이 실제로 Topic2에 할당되었다고 하자. 이제 $phi_2$를 보면 가장 큰 확률값인 "강아지"가 될 가능성이 높다. (귀여운과 강아지 확률값 0.33 중 강아지가 아주 조금이라도 더 높다면)

 

3. LDA의 Inference(추정)

 

이제 $w_{d,n}$을 가지고 잠재변수를 역으로 추정하는 과정을 살펴보자. LDA는 위의 토픽 내 단어분포와 문서의 토픽분포의 결합으로 문서 내 단어들이 생성된다고 가정한다. 즉, LDA의 inference는 실제 관찰 가능 한 문서 내의 단어를 가지고, 우리가 알고싶은 토픽의 단어 분포, 문서의 토픽분포를 추정하는 과정이다. 

 

문서생성과정이 합리적이라면, 확률과정이 우리의 말뭉치를 제대로 설명할 수 있고, 따라서 토픽의 단어분포와 문서의 토픽분포의 결합확률이 커질 것이다. 결합확률을 수식으로 나타내면 아래와 같다 : 

$$p(\phi_{1:K}, \theta_{1:D}, z_{1:D}, w_{1:D}) = \prod_{i=1}^{K}p(\phi_i | \beta) \prod_{d=1}^{D}p(\theta_d | \alpha) \{ \prod_{n=1}^{N} p(z_{d, n} | \theta_d) p(w_{d, n} | \phi_{1:K}, z_{d, n}) \}$$

위 식을 토대로, 사후확률 $p(z, \phi, \theta | w)$를 최대로 만드는 $z, \phi, \theta$를 구하는 것이 LDA의 inference이다. 그런데, 사후확률을 구하기 위해서는 $p(z, \phi, \theta | w) = \frac{p(z, \phi, \theta, w)}{p(w)}$의 분모인 $p(w)$를 구해야 한다. $p(w)$는 잠재변수 $z, \phi, \theta$의 모든 경우의 수를 고려한 각 단어(w)의 등장확률을 가리키지만, $z, \phi, \theta$는 관찰이 불가능하고 모든 경우를 감안해 계산해야 하기 때문에 계산이 어렵다. 따라서 깁스 샘플링과 같은 기법을 사용하게 된다.  

 

4. LDA와 깁스 샘플링

 

LDA에선 나머지 변수는 고정시킨 채 한 변수만을 변화시키되, 불필요한 변수를 샘플링에서 제외하는 Collapsed Gibbs Sampling 기법을 사용한다. 자세한 내용은 ratsgo.github.io 를 참고하자. LDA의 깁스 샘플링 과정을 나타낸 수식은 다음과 같다 : $$p(z_{d,i} = j | z_{-i}, w)$$

w는 우리가 이미 알고 있는 값이고, $z$는 각 단어가 어떤 토픽에 할당되어 있는지를 나타내는 변수이며, $z_{-i}$는 $i$번째 단어의 토픽 정보를 제외한 모든 단어의 토픽 정보를 가리킨다. 즉, $w, z_{-i}$가 주어졌을 때 $d$ 문서의 $i$번째 단어의 토픽이 $j$일 확률을 의미한다.

처음에는 임의로 문서의 단어 토픽을 무작위로 뿌려놓고, $z_{0, 1}$ 즉, 첫번째 문서의 첫번째 단어 토픽 정보를 지운다. 그리고 나머지 단어들의 토픽 정보를 토대로 가장 그럴싸한 토픽 ID를 새로 뽑는다. 이 과정을 $z_{0,2}$, ...., $z_{D, n}$까지 문서 내 모든 단어와 밀뭉치 내 모든 문서에 대해 깁스 샘플링을 반복하면 어느 순간 토픽 할당 정보가 수렴하게 된다. 이를 사용한다. 

 

5. 실제 계산 과정 

$$p(z_{d,i} = j | z_{-i}, w) = \frac{n_{d, j} + \alpha_j}{\sum_{i=1}^K (n_{d, i} + \alpha_i)} \times \frac{v_{j, w_{d, n}} + \beta_{w_{d, n}}}{\sum_{l=1}^V (v_{k, l} + \beta_l )}$$

▶  $n_{d, j}$ : $j$번째 토픽에 할당된 $d$번째 문서의 단어 빈도 

▶  $v_{j, w_{d, n}}$

 

$p(topic = t | \textrm{document  } d)$ : 문서 $d$의 단어들 중 토픽 $t$에 해당하는 단어들의 비율

$p(word = w_{d, n} | topic = \,\, t)$ : 각 토픽들 t에서 해당 단어 w의 분포

 

$\textbf{Coherence}_{u-mass}(w_i) = \sum_{i < j} \log (\frac{1 + D(w_i, w_j)}{D(w_i)})$

'DS & ML' 카테고리의 다른 글

TF-IDF(Term Frequency-Inverse Document Frequency)  (0) 2021.07.28