-
[텍스트] 토픽 모델링 - 잠재 디리클레 할당 (LDA)텍스트 2022. 7. 8. 22:56
LDA(Latent Dirichlet Allocation)
문서가 생성되는 과정을 확률모형으로 모델링하는 분석 기법
LDA에서 하는 것
토픽의 단어분포 추출 (각 토픽이 어떤 단어들로 구성되었는지) & 문서의 토픽분포 추출 (문서가 어떤 토픽으로 이루어졌는지)
Topics: 위 그림에서 노란색 토픽에 gene이라는 단어가 등장할 확률이 0.04, dna는 0.02, genetic은 0.01이다. 노란색 토픽은 대략 ‘유전자’ 관련 주제라는 걸 알 수 있다.
Documents: 문서를 보면 파란색, 빨간색 토픽에 해당하는 단어보다는 노란색 토픽에 해당하는 단어들이 많다. 따라서 위 문서의 메인 주제는 노란색 토픽(유전자 관련)일 가능성이 크다.
LDA에서 가정하는 문서 생성 과정
토픽에 대한 단어 분포(φ)와 문서에 대한 토픽분포(θ)가 주어졌을 때, 문서를 구성하는 토픽을 확률적으로 선택(z)하고, 선택된 토픽에 존재하는 단어를 확률적으로 선택하는 과정을 반복하여 문서를 생성(w)한다고 가정
기호의미D전체 문서 개수K전체 토픽 개수(hyperparameter)Nd번째 문서의 단어 수각 원확률 변수화살표확률 모형 내에서 상위 변수가 하위 변수를 결정함을 의미Wd,nd번째 문서에 등장한 n번째 단어 (관측) -> 이 정보만을 가지고 하이퍼파라미터 α,β를 제외한 모든 잠재변수를 추정α문서의 토픽 분포(θ 생성을 위한 디리클레 분포 하이퍼파라미터 (보통 '50/토픽수'를 활용)β토픽의 단어 분포(φ 생성을 위한 디리클레 분포 하이퍼파라미터 (보통 0.01을 활용)LDA에서 추정하는 잠재변수의 종류
1. φk (토픽의 단어 분포)
- 하이퍼파라미터 β(개별 단어들이 얼마나 자주 쓰이는지에 대한 사전지식)의 영향을 받는다.
- Draw each per-corpus topic distributions
- 각 단어가 k번째 토픽에서 차지하는 비중을 나타내는 벡터
- 코퍼스 전체의 단어 개수만큼의 길이를 보인다.
- φk의 각 요소값은 해당 단어가 k번째 토픽에서 차지하는 비중을 의미한다. 예를 들어 φ1은 아래 표에서 첫번째 열벡터이다.
- φk의 각 요소는 확률이므로 모든 요소의 합은 1이다.
2. θd (문서의 토픽 분포)
- 하이퍼파라미터 α의 영향을 받는다.
- For each document, Draw per-document topic proportions
- d번째 문서가 가진 토픽 비중을 나타내는 벡터
- 전체 토픽 개수 K만큼의 길이를 보인다.
- θd의 각 요소값은 k번째 토픽이 해당 d번째 문서에서 차지하는 비중을 의미한다. 예컨데 θ1은 아래 표에서 첫번째 행벡터이다.
- θd의 각 요소는 확률이므로 모든 요소의 합은 1이다.
3. Zd,n (단어별 토픽 분포 할당)
- For each document and each word, Draw per-word topic assignment
- 문서 수준에서의 θ분포를 기반으로 d번째 문서 n번째 단어가 어떤 토픽(k)에 해당하는지 할당한다.
- 예컨대 세번째 문서의 첫번째 단어는 ‘Topic2’일 가능성이 높은데, 이는 Topic1과 2가 뽑힐 확률이 각각 0.375, 0.625이기 때문이다.
- z를 알아내는 게 핵심이며, z분포를 알면 θ와 φ를 추정할 수 있다. -> θ와 φ를 알면 문서의 topic distribution이므로, 주어진 코퍼스에서 토픽이 얼마만큼의 비율(porption)로 존재하는지 알 수 있다.
4. Wd,n (관측된 데이터)
- For each document and each word, Draw observed word
- ϕ_z(ϕ와 z가 합쳐진)의 분포를 기반으로 d번째 문서에 등장하는 n번째 단어를 할당한다.
- 예시에서 z3,1은 실제로 Topic2에 할당됐다고 치고, ϕ2를 보면 w3,1은 Money가 될 가능성이 높은데, 이는 Topic2의 단어 분포 가운데 Money가 0.313으로 가장 높기 때문이다.
LDA의 문서 생성과정을 다시 나타내면,
관측된 데이터(Wd,n)을 가지고 잠재변수를 역으로 추정하는 과정
실제 문서 생성 과정에서는 현재 문서에 등장한 단어들이 어떤 토픽에서 뽑힌 단어들인지 알 수 없다. 따라서 역으로 실제 관찰가능한 문서 내 단어(Wd,n)를 가지고 우리가 알고 싶은 토픽의 단어분포, 문서의 토픽분포를 추정한다.
여기에서 LDA가 가정하는 문서 생성 과정이 합리적이라면 해당 확률과정이 우리가 갖고 있는 코퍼스를 제대로 설명할 수 있을 것이다. 즉, 토픽의 단어분포와 문서의 토픽분포의 결합확률이 커지도록 해야 한다는 것이다.
확률과정과 결합확률을 각각 그림과 수식으로 나타내면 아래와 같다.
Zd,n: per-word topic assignment
θd: per-document topic proportions
ϕk: per-corpus topic distributions
위 수식에서 하이퍼파라메터 α,β와 관찰가능한 Wd,n을 제외한 모든 변수가 미지수다. 따라서 사후확률 p(z,ϕ,θ|w)를 최대로 만드는 z,ϕ,θ를 찾아야 한다. 그런데 사후확률을 계산하려면 베이즈 정리의 분모에 해당하는 p(w)를 반드시 구해야 한다. p(w)는 잠재변수 z,ϕ,θ의 모든 경우의 수를 고려한 각 단어(w)의 등장 확률을 말한다. 그러나 z,ϕ,θ는 우리가 직접 관찰하는 게 불가능할 뿐더러, p(w)를 구할 때 z,ϕ,θ의 모든 경우를 감안해야 하기 때문에, 결과적으로 p(w)를 단번에 계산하는 것이 어렵다. 이 때문에 깁스 샘플링 같은 기법을 사용하는 것이다. (깁스샘플링은 아래 링크 참조)
https://ratsgo.github.io/statistics/2017/05/31/gibbs/
LDA에서는 나머지 변수는 고정시킨 채 한 변수만을 변화시키되, 불필요한 일부 변수를 샘플링에서 제외하는 collapsed gibbs sampling 기법을 쓴다. p(z,ϕ,θ|w)를 구할 때 ϕ,θ를 계산에서 생략한다. LDA의 깁스 샘플링 과정을 나타낸 수식은 다음과 같다.
p: w와 z−i가 주어졌을 때 문서의 i번째 단어의 토픽이 j일 확률
w: 우리가 이미 알고 있는 값
z: 각 단어가 어떤 토픽에 할당돼 있는지를 나타내는 변수
z−i: i번째 단어의 토픽 정보를 제외한 모든 단어의 토픽 정보
위 그림에서 zi는 'record'라는 단어가 속하는 토픽을 의미하는데, 깁스 샘플링을 위해 원래 있던 토픽 정보를 지워 놓았다. 나머지 단어에 대한 토픽 정보(z-i)는 그대로 쓴다. 이 상태의 정보를 토대로 'record'라는 단어가 어떤 토픽에 속할지 할당하는 것이 LDA의 깁스 샘플링 과정이다. 이를 수식으로 정리하면 아래와 같다.
d번째 문서 i번째 단어의 토픽 Zd,i가 j번째 토픽에 할당될 확률 예시
단어 5개로 구성된 문서 Doc1
각 단어마다 토픽 zi도 이미 초기에 랜덤할당 되어있고 토픽 수는 3개로 지정된 상태다.
코퍼스에 등장하는 모든 단어들을 대상으로하는 토픽분포(각각의 단어들이 어떤 토픽에 속해 있는지를 일일이 세어서 만든 표)도 초기에 랜덤할당 되어있다.
이제 p(z1,2)을 구하면 되는데, z1,2(첫번째 문서의 두번째 단어의 토픽 정보)를 지운 상태에서, 나머지 단어들의 토픽 할당 정보를 활용해 계산할 수 있다.
위 표를 보면 z1,2를 지우고 나니 첫번째 문서엔 1번/3번 토픽이 각각 절반씩 있다. 즉, n1,1=2, n1,3=2이다. α는 사용자가 지정하는 하이퍼파라미터로 깁스 샘플링 과정에서 변하는 값이 아니므로 A의 크기는 n1,1과 n1,3에 영향을 받는다. 즉, z1,2가 2번 토픽이 될 확률은 0이고, 1번/3번은 같다. 이에 따라 A를 그림으로 나타내면,
깁스 샘플링을 수행하면서 trade의 토픽 정보를 지웠으므로 전체 코퍼스를 대상으로 단어들의 토픽 할당 정보를 조사한 표(단어별 토픽 분표)에서 v2가 1이 줄어들었음을 알 수 있다.
우리의 관심인 trade라는 단어의 토픽은 Topic1일 가능성이 제일 높은데, 이는 전체 코퍼스에서 trade의 토픽은 1번, 2번, 3번 순으로 많기 때문이다.(v1,trade=10, v2,trade=7, v3,trade=1) B에 적용된 β 역시 샘플링 과정에서 바뀌는 과정이 아니므로 B의 크기는 vk에 가장 많은 영향을 받는다. 이에 따라 B를 그림으로 나타내면,
p(z1,2)는 A와 B의 곱이다. A와 B를 각각 직사각형의 높이와 너비로 둔다면, p(z1,2)는 아래와 같이 직사각형의 넓이로 이해할 수 있다.
위 그림을 보면 z1,2는 Topic1에 할당될 가능성이 제일 크다. 하지만 Topic3에 할당될 가능성도 Topic1에 비해선 작지만 0은 아니다. (확률적인 방식으로 토픽을 할당하기 때문)
어쨌든 결과적으로 z1,2이 Topic1에 할당됐다고 가정해보면 Doc1의 토픽 분포(θ1)와 첫번째 토픽의 단어 분포(ϕ1)가 각각 다음과 같이 바뀜을 확인할 수 있다.
이런 방식으로 모든 문서, 모든 단어에 대해 깁스 샘플링을 수행하면 모든 단어마다 토픽을 할당해줄 수 있으며 이 과정에서 ϕ,θ 또한 자연스럽게 구할 수 있다. 보통 1000회~1만회 반복 수행하면 그 결과가 수렴한다고 한다.
참고사항
디리클레 파라미터의 역할
d번째 문서 i번째 단어의 토픽 Zd,i가 j번째 토픽에 할당될 확률 A는 d번째 문서가 j번째 토픽과 맺고 있는 연관성 강도를, B는 d번째 문서의 n번째 단어(Wd,n)가 j번째 토픽과 맺고 있는 연관성의 강도를 의미한다.
그러면 여기에서 α값은 어떤 역할을 할까?
이전 예시에서 첫번째 문서에 Topic2에 할당된 단어들이 하나도 없었다(n1,2=0). 원래대로라면 첫번째 문서가 Topic2와 맺고 있는 연관성 강도, 즉 A는 0이어야 할 것이다. 이렇게 되면 Zd,i가 Topic2가 될 확률 또한 0이게 된다. 하지만 사용자가 지정하는 하이퍼파라미터 α의 존재 덕분에 A가 아예 0으로 되는 일을 막을 수 있게 된다. 일종의 smoothing 역할을 한다는 것. 따라서 α가 클수록 토픽들의 분포가 비슷해지고, 작을 수록 특정 토픽이 크게 나타나게 된다. 이는 β가 B에서 차지하는 역할과 같다. 아래는 디리클레 파라메터 변화에 따른 토픽 분포의 변화를 직관적으로 나타난 그림이다.
최적 토픽 수 찾기
LDA의 토픽수 K는 사용자가 지정하는 하이퍼파라미터다. 최적 토픽수 또한 여러 실험을 통해 구해야 하는 미지수라는 것이다. LDA는 문서가 생성되는 과정을 확률모형으로 가정한다. LDA로부터 추정된 토픽 정보(z)를 활용해 계산한 각 단어의 발생확률이 클수록 학습 코퍼스가 생성되는 과정을 제대로 설명하는 것이라는 얘기. 최적 토픽 수를 찾기 위한 방법도 이 아이디어를 차용한다.
우선 깁스 샘플링으로 구한 ϕ,θ를 활용해 전체 문서, 모든 단어의 발생 확률 p(w)를 식으로 쓰면 다음과 같다. p(w)는 코퍼스에 등장한 모든 단어의 발생확률을 종합적으로 따지기 때문에 곱으로 연결되지만, 이를 로그를 취한 결과가 아래 식과 같다.
첫번째 문서 세번째 단어가 ‘King’이라 하자. 'king'이라는 단어가 첫번째 문서에 나타난 빈도가 3이라고 하면 n^31=3이다. 여기에 토픽의 단어분포 정보인 ϕ와 문서의 토픽 비중 정보인 θ를 element-wise 곱 방식으로 계산한다. 그런데 ‘King’이라는 단어는 하나의 토픽에만 있는게 아니고 여러 토픽에 걸쳐 있을 수 있습니다. (흔한 단어일 경우 더더욱 그렇다.) 그래서 모든 토픽에 대해 합을 계산한다.
위 정보를 활용한 Perplexity 지표는 다음과 같이 구한다.
p(w)는 클수록 좋은 inference이므로 exp(−log(p(w))는 작을수록 좋다. 따라서 아래 그림처럼 토픽 수(K)를 바꿔가면서 Perplexity를 구한 뒤 가장 작은 값을 내는 K를 최적의 토픽수로 삼으면 된다.
'텍스트' 카테고리의 다른 글
[텍스트] LSA(Latent Semantic Analysis, 잠재 의미 분석) 논문리뷰 (0) 2023.10.06 [텍스트] DTM, TF-IDF (0) 2022.07.08