Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Soyeon Park 님의 블로그

토픽 모델링 알고리즘 LDA (Latent Dirichlet Allocation) 본문

텍스트마이닝

토픽 모델링 알고리즘 LDA (Latent Dirichlet Allocation)

chief.park 2025. 11. 12. 20:56

0. 토픽 모델링이란?
 
글의 토픽, 즉 주제를 찾아내는 것이다.
조금 더 구체적으로 말하자면, 문서 집합 속에 내재된 주제통계적으로 추론하는 기법이다. 우리가 일반적으로 글을 읽을 때도 느끼듯, 주제는 문서에 직접적으로 드러나지 않는다. 이 방법 또한 마찬가지로 글에 내재된 주제를 찾아내는 것에 의미가 있다.
 
따라서, 토픽 모델링에서의 토픽(topic)은 당어들의 동시 출현 패턴으로 표현되는 잠재적 의미 집합(latent semantic group)을 의미한다. Topic #1 이 {"에너지", "탄소", "기후", "정책"} 등의 단어의 묶음이라면 이는 기후 정책으로 해석을 할 수 있다는 뜻이다.
 
 

 
이 그림에서 documents와 words는 관측가능하며, topics는 잠재되어 있다. 앞서 말했듯이, 토픽 모델링은 관측 가능한 단어와 문서로부터 잠재적인 topic을 찾아내는 방법론이다. 그리고, 각각의 토픽은 단어들의 출현 패턴(확률 분포)로 표현된다.
 
 
 
 
 
1. LDA (Latent Dirichlet Allocation)
 
LDA는 토픽 모델링의 대표적인 알고리즘이다. 확률을 기반으로 하는 토픽 모델링 기법이다.
Latent Dirichlet Allocation 각 단어의 의미를 알아두면, 도움이 된다.
Latent는 잠재적인 이라는 뜻으로, topic이 문서 내에 잠재하고 있음을 말한다.
Dirichlet은 Dirichelt 분포라는 것이 있는데, 이를 과정 중에 사용한다.Allocation은 할당한다는 뜻이며, 문서의 각 단어가 어떤 topic에서 왔는지를 할당하여 주제를 추론하게 된다.
 

 
이 그림의 LDA의 핵심이다.
먼저 각 기호가 무엇을 의미하는지를 알아본다.
 
먼저 alpha와 beta는 하이퍼파라미터(사용자가 미리 정해주는 값)이다.
토픽 수 K도 미리 정해주기 때문에 하이퍼파라미터이다.
 
D : 전체 document 수
N : document 내 단어 수 (vocabulary)
K : topic 수
 
theta_d는 문서에서 각 토픽이 차지하는 비중을 뜻한다. theta_1 = (0.1, 0.2, 0.7) 이라고 하면 문서1에 topic #1에 해당하는 단어가 0.1, topic #2가 0.2, topic #3이 0.7을 차지하고 있다는 것이다.
 
pi_k는 토픽별로 단어의 분포를 나타낸 것이다. 토픽 모델링에서 토픽 = 단어들의 확률 분포 라는 것이 핵심이다.
해당 토픽에 들어있는 단어들(vocabulary)이 어떤 확률로 있는지 그 분포를 의미한다.
 
w_d,n은 실제로 문서에서 관찰되는 단어를 말한다. w_1,1은 1번 문서의 첫 번째 단어이다.
 
z_d,n은 그 w_d,n이 어떤 topic에서 온 것인지를 나타낸다. z_d,n = (0, 1, 0) 이라면, 이 단어는 topic #2에서 온 것이다.
 
 
 
 
 
2. 토픽과 단어, 토픽과 문서의 관계
 
목표 : 여러 개의 문서가 있는 corpus가 주어졌을 때, LDA는 다음 내용을 추정한다.
 
1. Topic 별 단어의 분포
- Topic A : 사과 50%, 먹어요 50%, 귀여운 0%, 강아지 0%
- Topic B : 사과 0%, 먹어요 0%, 귀여운 40%, 강아지 60%
 
여기서 vocabulary는 4개의 단어로 구성되어 있다.
 
여기서 Topic A를 sampling 하면 (사과, 먹어요)가 나온다. Topic B를 sampling 하면 (귀여운, 강아지)가 나온다. 그리고 이 sampling을 아주 많이 하면 큰 수의 법칙에 의해서, Topic을 구성하는 단어의 분포와 일치하게 될 것이다. Topic B를 샘플링한 결과로 귀여운 4, 강아지 6으로 구성될 것이라는 뜻이다. 그리고 이렇게 sampling한 것을 문서로 보는 것이 토픽 모델링의 관점이다.
 
2. 문서별 topic 분포
- 문서 #1 : topic A 80%, topic B 20%
- 문서 #2 : topic A 100%
 
문서를 구성하고 있는 단어들이 어떤 토픽에서 나왔는지에 의해서 표현을 하고 있다.

Topic은 단어들의 확률 분포로 이루어져 있다. 

문서는 구성하고 있는 단어들의 토픽에 의해 표현이 가능하다.
 
 
 
 
 
3. LDA에서 필요한 확률 분포
 
3.1 다항 분포 (Multinomial Distribution)
 
다항 분포는 하나의 시행(trial)에서 여러 개의 결과 중 각 결과가 특정 확률로 발생하는 경우에 대한 확률 분포이다.
여러 범주(category) 중 하나가 선택되는 실험을 n번 반복했을 때, 각 범주가 몇 번씩 선택되는지를 나타낸다.
 
주사위를 던졌을 때 1부터 6까지 각 숫자가 나오는 것은 다항 분포이다. 주사위를 던지는 한 시행에서 가능한 결과의 개수가 6개이며, 각 결과 i(i=1~6)의 발생 확률은 1/6씩으로 합은 1이된다. (1/6, 1/6, 1/6, 1/6, 1/6, 1/6) 이런 확률 벡터가 나온다.
 
기억해야할 점은 다항 분포에서 샘플링을 하면, 각 범주가 가진 확률에 따라 결과가 나온다는 것이다.
 
토픽 모델링에서 토픽 = 단어들의 확률 분포라고 했는데, 이 확률 분포가 다항 분포임을 알 수 있다.
 
 
 
3.2 디리클레 분포 (Dirichlet Distribution)
 
디리클레 분포는 연속 확률 분포의 하나, k차원의 실수 벡터 중 벡터의 요소가 양수이며 모든 요소를 더한 값이 1인 경우에 대해 확률값이 정의되는 분포이다.
어렵다.
 
토픽 모델링에서는 디리클레 분포의 정확한 개념을 이해하지 못해도 좋다. 디리클레는 확률 벡터를 생성하는 분포이다.
중요한 것은 디리클레 분포에서 샘플링을 하면 다항 분포의 확률 분포가 나온다는 것이다.
 
Dirichlet sampling을 했을 때 나오는 결과는
(0.1, 0.2, 0.7)
(0.3, 0.1, 0.6)
(0.5, 0.2, 0.3) 이런 식이다. 각 숫자를 다 더하면 항상 1이 된다.
 
이걸 보면 무엇이 떠오르는가? 바로 위에서 본 다항 분포의 확률 분포이다.
토픽 모델링에서 디리클레 분포는 이렇게 다항 분포의 확률 분포를 만들기 위해서만 사용된다.
이제 디리클레에서 샘플링한 결과는 어디서 사용되는지를 알아볼 수 있게 되었다.
 
 
 
3.3 문서별 토픽 비중과 토픽별 단어 발생 확률 분포
 
3.2에서 알아본 디리클레 분포의 샘플링 결과는 문서별 토픽 비중토픽별 단어 발생 확률 분포초기값을 설정하는데 사용된다.
 
 
 
4. LDA의 기본 가정 : 문서 생성 과정

 
1) pi_k : k번째 topic에서 각 단어가 발생할 확률 vector
- pi_k ~ Dir(beta)
- 디리클레 분포에서 샘플링된 vector
- 이때, beta는 hyperparameter
 
k번째 topic을 구성하는 단어 확률 분포의 초기값을 디리클레 분포에서 얻는다.
beta = (1,2,3,4,5,6)으로 주어졌다고 가정하면,
6개의 단어를 가진 topic의 단어 확률 분포가 나온다.
beta의 vector 차원만큼 단어를 가진 확률 분포가 나오게 되는 것이다.
 
 
2) theta_d : d번째 문서의 topic 비중 vector
- theta_d ~ Dir(alpha)
- 디리클레 분포에서 샘플링된 vector
- 이때, alpha는 hyperparameter
 
d번째 문서를 구성하는 topic 구성 확률 분포의 초기값을 디리클레 분포에서 얻는다.
alpha = (2,3,4)로 주어졌다고 가정하면,
3개의 topic 구성 확률 분포가 나온다.
alpha의 vector차원은 문서의 개수를 나타낸다.
 
마지막으로 정리하겠다. Dir(alpha), Dir(beta)를 통해서 theta_d와 pi_k의 초기값을 세팅하는 것이다.
 
 
3) z_d,n : d번째 문서, n번째 단어를 topic에 할당
- z_d,n ~ Multi(theta_d)
- 다항 분포에서 sampling된 vector

 
z_1,1 = (1,0,0) : 첫번째 문서의 첫번째 단어는 topic 1 때문에 발생했다. = topic 1에서 왔다.
그렇다면 z_1,1은 어떻게 나왔을까? 이는 Multi((0.6,0.1,0.3))을 샘플링한 결과이다.
 
 
4) w_d,n : 문서에 등장하는 단어를 할당하는 역할
- z_d,n 과 pi_k에 동시에 영향을 받는다.

 
w_1,2 = "Jordan" 임을 관측해서 알고 있다.
좀 전에 Multi(theta_1)에서 샘플링된 결과로, z_1,2 = (1,0,0)을 Topic1에서 왔다고 할당해두었다.
그리고 Topic1에서 각 단어 발생 확률 벡터인 pi_1 = (0.3,0.2,0.2,0.0,0.2,0.1)에서 샘플링된 결과로, w_d,n이 나왔다고 보는 것이다.
 
 
 
LDA 문서 생성 과정 정리해보자.
 
1. 각 Topic 별로 단어 발생 분포 vector 생성

  • pi_k ~ Dir(beta)

2. 각 문서별로 topic 비중 분포 vector 생성

  • theta_d ~ Dir(alpha)

3. 각 문서내 단어를 topic에 할당하는 vector 생성

  • z_d,n ~ Multi(theta_d)

4. 각 문서내 단어를 topic에 할당한 정보 + topic별 단어 발생 분포 vector를 활용하여 → 단어 생성

  • w_d,n ~ Multi(pi_(z_d,n))

 
 
 
5. LDA 학습과정

LDA의 학습은
주어진 문서들과 각 문서들의 단어들로부터, 다음 파라미터들을 학습해야 한다.

  • theta_d
  • pi_k
  • z_d,n

그리고 이 3개의 파라미터는 위의 식이 최대화가 되는 방향으로 학습되어야 한다.
 
Step1. Topic의 개수(K) 결정한다.
Step2. 문서 d에 포함된 각 단어 w를 무작위로 K개의 토픽 중 하나에 할당한다.
Step3. 문서 d에 포함된 각 단어 w에 대해 X*Y의 확률로 토픽 k로 재할당한다.

  • X : theta_d = p(topic k | document d) = 문서 d에서 토픽 k가 차지하는 비율
  • Y : pi_k = p(word w | topic k) = topic k에 할당된 단어들 가운데 단어 w가 차지하는 비율
  • X*Y = 문서 d에서 topic k가 word w를 생성한 비율

Step4. 안정화된 최종 topic 할당한다.
 
 
 
예시를 통해서 topic을 재할당해보자.
예시 : 문서 3개 / topic 2개
미션 : Doc3의 4번째 단어인 fish에 대해서 topic을 재할당해보기

우리의 목적은 fish에 대해서 토픽별로 X*Y을 계산하고 큰 값을 가지는 topic으로 재할당하는 것이다.
1) fish의 topic이 A인 경우
X = 3/6
Y = 0/7
X*Y = 0
 
2) fish의 topic이 B인 경우
X = 3/6
Y = 2/9
X*Y = 1/9
 
X*Y의 값이 topic B가 더 크므로, Doc3의 4번쨰 단어 fish는 topic B로 할당될 확률이 높다.
재할당하면, 문서 내 토픽 비율과 토픽별 단어 분포에 변화가 생긴다.
이를 바탕으로 분포와 비율이 수렴할 때까지 학습 과정을 반복한다.