딥러닝/NLP

한국어 임베딩 - 단어 수준 임베딩 (잠재 의미 분석, GloVe, Swivel)

eunsour 2022. 10. 21.
반응형

1. 잠재 의미 분석

 잠재 의미 분석(LSA, Latent Semantic Analysis)이란 단어-문서 행렬이나 TF-IDF(Term Frequency-Inverse Document Frequency) 행렬, 단어-문맥 행렬 같은 커다란 행렬에 차원 축소 방법의 일종인 특이값 분해를 수행해 데이터의 차원 수를 줄여 계산 효율성을 키우는 한편 행간에 숨어 있는 잠재 의미를 이끌어내기 위한 방법론이다. 단어-문서 행렬이나 단어-문맥 행렬 등에 특이값 분해를 시행한 뒤, 그 결과로 도출되는 행 벡터들을 단어 임베딩으로 사용할 수 있다. 잠재 의미 분석은 GloVe나 Swivel과 더불어 행렬 분해(matrix factorization) 기반의 기법으로 분류된다. 

 

1.1 PPMI 행렬

 단어-문서 행렬, TF-IDF 행렬, 단어-문맥 행렬, 점별 상호 정보량(PMI, Pointwise Mutual Information)에 모두 잠재 의미 분석을 수행할 수 있다. PMI란 두 확률변수 사이의 상관성을 계량화한 지표다. 자연어 처리 분야에서 PMI는 두 단어의 등장이 독립을 가정했을 때 대비 얼마나 자주 같이 등장하는지를 수치화한 것으로 이해할 수 있다. 다음 수식과 같다.  

 

점별 상호 정보량(PMI)

 

 수식에서 로그 안 우변의 분자가 분모보다 작을 경우 PMI는 음수가 된다. A, B 두 단어가 동시에 등장할 확률이 두 단어가 독립일 때보다 작을 때 발생한다. 하지만 이러한 수치는 우리가 가진 말뭉치의 크기가 충분히 크지 않는 한 신뢰하기 어렵다.

 

 보통 말뭉치에서 단어 하나의 등장 확률은 0.001 이하로 작은 편이다. 예컨대 단어에 나타날 확률 P(A, B)는 0.000000001보다 작아야 한다. 두 단어가 동시에 나타난 경우는 10억 개 가운데 1개 꼴로 매우 적다는 뜻이다. 더구나 단어 A, B가 단 한 번도 같이 등장하지 않는 경우 PMI(A, B) = log0 = -inf 가 된다. 

 

 이 때문에 자연어 처리 분야에서는 PMI 대신 양의 점별 상호 정보량(PPMI, Positive Pointwise Mutual Information)이란 지표를 사용한다. PMI가 양수가 아닐 경우 그 값을 신뢰하기 어려워 0으로 치환해 무시한다는 뜻이다. 다음 수식과 같다. 

 

양의 점별 상호 정보량

 

 

 Shifted PMI(SPMI)란 PMI에서 log 𝓴 를 빼준 값이다. 𝓴 는 임의의 양의 상수이다. 다음 수식과 같다. Shifted PMI는 Word2Vec과 깊은 연관이 있다는 논문이 발표되기도 했다.

 

Shifted PMI

 

 

1.2 행렬 분해로 이해하는 잠재 의미 분석

 특이값 분해(Singular Value Decomposition)는 𝓶 x 𝓷 크기의 임의의 사각행렬 A를 그림과 같이 분해하는 것을 가리킨다. 

특이값 분해

 

 

 truncated SVD는 특이값(Sigma의 대각성분) 가운데 가장 큰 𝓭 개만 가지고, 해당 특이값에 대응하는 특이 벡터(singular vector)들로 원래 행렬 A를 근사하는 기법이다. 다음 그림과 같다. 

 

truncated SVD

 

 예컨대 𝓶 개 단어, 𝓷 개 문서로 이루어진 단어-문서 행렬에 truncated SVD를 수행, 즉 LSA를 시행한다. 그러면 𝓤 는 단어 임베딩, 𝓥 는 문서 임베딩에 대응한다. 𝓷 개 문서로 표현됐던 단어 벡터들이 𝓤 에서 𝓻 차원만으로도 표현이 가능해졌다. 아울러 𝓶 개 단어로 표현됐던 문서 벡터들 역시 𝓥 에서 𝓻 차원만으로도 커버할 수 있게 됐다. 마찬가지로 𝓶 개 단어, 𝓶 개 단어로 이루어진 PMI 행렬에 LSA를 수행하면 𝓭 차원 크기의 단어 임베딩을 얻을 수 있다. 

 

 각종 연구들에 따르면 LSA를 적용하면 단어와 문맥 간의 내재적인 의미(latent/hidden meaning)을 효과적으로 보존할 수 있게 돼 결과적으로 문서 간 유사도 측정 등 모델의 성능 향상에 도움을 줄 수 있다. 또한 입력 데이터의 노이즈, 희소성(sparsity)을 줄일 수 있다. 

 

 

1.3 행렬 분해로 이해하는 Word2Vec 

 Levy&Goldberg(2014)는 네거티브 샘플링 기법으로 학습된 Word2Vec의 Skip-gram 모델(SGNS, Skip-gram with Negative Sampling)은 다음 수식과 같이 행렬 분해 관점에서 이해할 수 있다고 증명해 주목을 받았다. 다시 말해 Word2Vec의 학습은 Shifted PMI(SPMI) 행렬을 𝓤 와 𝓥 로 분해하는 것과 같다는 이야기다. 수식의 𝓐𝓲𝓳는 SPMI 행렬 𝓐의 𝓲 번째 행, 𝓳 번째 열에 대응하는 행렬 원소이다. 𝓤 는 타깃 단어(𝓽)에 대응되는 임베딩 행렬, 𝓥 는 문맥 단어(𝓬)에 대응되는 임베딩 행렬을 가리킨다.

 

행렬 분해 관점에서 이해하는 Word2Vec

 

 수식의 우변 𝓴 는 Skip-Gram 모델의 네거티브 샘플 수를 가리킨다. 네거티브 샘플 수가 1개인 Skip-Gram 모델은 PMI 행렬을 분해하는 것과 같다. log1은 0이기 때문이다. 

 

 수식을 직관적으로 이해하면 이렇다. Skip-Gram 모델은 말뭉치 전체를 단어별로 슬라이딩해 가면서 타깃 단어의 실제 문맥 단어들(포지티브 샘플)과 가짜 문맥 단어들(네거티브 샘플)을 이진 분류하는 과정을 통해 학습한다. 학습이 완료되면 𝓤 와 𝓥 행렬을 얻을 수 있다. 

 

 그런데 𝓤 와 𝓥 의 내적은 SPMI 행렬이 된다. 다시 말해 i번째 타깃 단어에 해당하는 𝓤𝓲 벡터와 𝓳 번째 문맥 단어에 해당하는 𝓥𝓳 벡터의 내적이 단어 𝓲, 𝓳 의 PMI 값에 log k를 빼준 값(SPMI)이 된다. 말뭉치에서 두 단어 𝓲, 𝓳 가 자주 같이 등장한다면 SPMI가 높고 그 반대 경우라면 낮다. SPMI가 높다는 얘기는 두 단어가 의미상 관련이 있을 가능성이 높다. 

 

 따라서 𝓲 와 𝓳 단어가 의미상 얼마나 관련이 있는지 정도가 𝓤𝓲 와 𝓥𝓳 내적 값으로 나타나고, 관련성이 높을수록 그 내적 값이 크게 나타난다. 내적 값은 코사인 유사도에 비례하기 때문에 그 내적 값이 클수록 𝓤𝓲 와 𝓥𝓳 벡터가 벡터 공간상에 가깝게 표현된다는 뜻이 된다. 결과적으로 Skip-gram과 그 변종(FastText)은 단어 임베딩에 말뭉치 전체의 글로벌한 분포 정보를 성공적으로 녹여낼 수 있다. 

 

 

반응형

 

2. GloVe

 GloVe(Global Word Vector)는 미국 스탠포드대학교연구팀(Pennington et al., 2014)에서 개발한 단어 임베딩 기법이다. Pennington et al. (2014)은 Word2Vec잠재 의미 분석 두 기법의 단점을 극복하고자 했다. 잠재 의미 분석은 말뭉치 전체의 통계량을 모두 활용할 수 있지만, 그 결과물로 단어 간 유사도를 측정하기는 어렵다. 아울러 Pennington et al. (2014)은 Word2Vec 기법이 단어 벡터 사이의 유사도를 측정하는 데는 LSA보다 유리하지만 사용자가 지정한 윈도우 내의 로컬 문맥(local context)만 학습하기 때문에 말뭉치 전체의 통계 정보는 반영되기 어렵다는 단점을 지닌다(GloVe 이후 발표된 Levy&Goldberg(2014)는 Skip-gram 모델이 말뭉치 전체의 글로벌한 통계량인 SPMI 행렬을 분해하는 것과 동치라는 점을 증명하기는 했다).

 

 

2.1 모델 기본 구조

 Pennington et al. (2014)은 임베딩된 두 단어 벡터의 내적이 말뭉치 전체에서의 동시 등장 빈도의 로그 값이 되도록 목적함수(objective function)를 정의했다. 다음 수식과 같다. '임베딩 된 단어 벡터 간 유사도 측정을 수월하게 하면서도 말뭉치 전체의 통계 정보를 좀 더 잘 반영해보자'가 GloVe가 지향하는 핵심 목표라 말할 수 있을 것 같다. 

 

GloVe의 목적 함수

 수식을 보면 단어 𝓲, 𝓳 각각에 해당하는 벡터 𝓤𝓲, 𝓥𝓳 사이의 내적 값과 '두 단어 동시 등장 빈도의 로그 값(log 𝓐𝓲𝓳)' 사이의 차이가 최소화될수록 학습 손실이 작아진다. bias 항 두개와 f(𝓐𝓲j)는 임베딩 품질을 높이기 위해 고안된 장치이며, |𝓥|는 어휘 집합 크기이다.

 

 GloVe는 우선 학습 말뭉치를 대상으로 단어-문맥 행렬 𝓐를 만드는 것에서부터 학습을 시작한다. 어휘 집합 크기가 1만 개 정도 되는 말뭉치라면 요소 개수가 1억(10000x10000)이나 되는 큰 행렬을 만들어야 한다. 이후 목적함수를 최소화하는 임베딩 벡터를 찾기 위해 행렬 분해를 수행해야 한다. 처음에 행렬 𝓤, 𝓥 를 랜덤으로 초기화한 뒤 위 수식을 최소화하는 방향으로 𝓤, 𝓥를 조금씩 업데이트해 나간다. 학습 손실이 더 줄지 않거나 정해진 스텝 수 만큼 학습했을 경우 학습을 종료한다. 학습이 끝나면 𝓤 를 단어 임베딩으로 쓸 수 있다. 이밖에 𝓤 + 𝓥t, 𝓤 와 𝓥t를 이어 붙여 임베딩으로 사용하는 것도 가능하다.

 


 

3. Swivel 

 Swivel(Submatrix-Wise Vector Embedding Learner)은 구글 연구 팀(Shazeer et al., 2016)이 발표한 행렬 분해 기반의 단어 임베딩 기법이다. PMI 행렬을 𝓤 와 𝓥 로 분해하고, 학습이 종료되면 𝓤 를 단어 임베딩으로 쓸 수 있다. 이밖에 𝓤 + 𝓥𝓽, 𝓤와 𝓥𝓽를 이어 붙여 임베딩으로 사용하는 것도 가능하다.

 

3.1 모델 기본 구조

 SwivelPMI 행렬을 분해한다는 점에서 단어-문맥 행렬을 분해하는 GloVe와 다르다. Swivel은 목적함수를 PMI의 단점을 극복할 수 있도록 설계했다는 점 또한 눈에 띈다. 다음 수식은 𝓲 라는 타깃 단어와 𝓳 라는 문맥 단어가 사용자가 정한 윈도우 내에서 단 한 건이라도 동시에 등장한 적이 있는 경우에 적용되는 목적함수다.

 

Swivel의 목적함수 1 (말뭉치에 동시 등장한 케이스가 한 건이라도 있는 경우)

 

 위 수식을 직관적으로 이해하면 이렇다. 타깃 단어 𝓲 에 대응하는 𝓤𝓲 벡터와 문맥 단어 𝓳 에 해당하는 𝓥𝓳 벡터의 내적이 두 단어의 PMI 값과 일치하도록 두 벡터를 조금씩 업데이트한다. 여기서 𝓯(𝔁𝓲𝓳)는 단어 𝓲, 𝓳 의 동시 등장 빈도를 의미한다. 𝓯(𝔁𝓲j)가 클수록 𝓤𝓲, 𝓤𝓳 벡터 간 내적 값이 실제 PMI 값과 좀 더 비슷해야 학습 손실이 줄어든다. 다시 말해 단어 𝓲, 𝓳 가 같이 자주 등장할수록 두 단어에 해당하는 벡터의 내적이 PMI 값과 일치하도록 더욱 강제한다는 뜻이다. 

 

 다음 수식은 단어 𝓲, 𝓳 가 말뭉치의 특정 윈도우 내에서 동시에 등장한 적이 한 번도 없는 경우에 적용되는 목적함수다. 두 단어가 한 번도 동시에 등장하지 않았을 때 PMI는 음의 무한대로 발산하기 때문에 이 같은 케이스에 대해 목적함수를 별도로 설정했다. 수식에서 PMI는 단어 𝓲, 𝓳 의 동시 등장 횟수를 0 대신 1로 가정하고 계산한 PMI 값이다.

Swivel의 목적함수 2 (말뭉치에 동시 등장한 케이스가 한 건도 없는 경우)

 

 PMI 식을 다시 쓰면 다음 수식과 같다. 𝔁𝓲𝓳 는 단어 𝓲, 𝓳 의 동시 등장 빈도, x𝓲* 는 𝓲 의 단독 빈도, 𝔁*𝓳 는 𝓳 의 단독 빈도, |𝓓|는 말뭉치의 길이(중복을 허용한 말뭉치 전체 토큰 수)에 해당한다. 

PMI

 

 

 다음 수식은 목적함수 2에 PMI를 대입한 결과다. PMI*는 𝓐𝓲𝓳 를 1로 가정하고 계산한 것이기 때문에 log𝓐𝓲𝓳 = log1 = 0이 돼 해당 항이 소거된다. 다음 수식은 목적함수 2와 비교해 그 표현이 달라졌을 뿐 계산 결과는 동치다. 

 

Swivel의 목적함수 2 (말뭉치에 동시 등장한 케이스가 한 건도 없는 경우)

 

 위 수식을 직관적으로 이해하면 단어 𝓲, 𝓳 가 각각 고빈도 단어인데 두 단어의 동시 등장 빈도가 0이라면 두 단어는 정말로 같이 등장하지 않는, 의미상 무관계한 단어일 것이라고 가정했다. 예컨대 [무모]라는 단어와 [운전]이라는 단어는 단독으로는 자주 등장하는 단어이지만 어떤 말뭉치에서든 두 단어가 연어(collocation)로 쓰이는 경우는 거의 없다. 이럴 땐 두 단어에 해당하는 벡터의 내적 값이 PMI*보다(=단 한 번 같이 등장했다고 가정했을 때 대비) 약간 작게 되도록 학습한다. 수식을 보면 두 단어가 고빈도 단어라면 마지막 두 개 항(log𝓐𝓲*, log𝓐*𝓳 )이 커지기 때문에 학습 손실을 줄이려면 𝓤𝓲, 𝓥𝓳 간 내적 값을 작게 해야 한다. 

 

 반대로 단어 𝓲, 𝓳 가 저빈도 단어인데 두 단어의 동시 등장 빈도가 0이라면 두 단어는 의미상 관계가 일부 있을 수 있다고 봤다. 우리가 가지고 있는 말뭉치 크기가 작아 어쩌다 우연히 해당 쌍의 동시 등장 빈도가 전혀 없는 걸로 나타났을 수도 있는 것이다. 예컨대 [확률]이라는 단어와 [분포]라는 단어는 아주 흐나지는 않지만 통계학과 관련 있는 데이터에서는 자주 같이 등장하는 편이다. 그런데 우리의 데이터에서 이들의 동시 등장 빈도가 0 임을 확인했을 때, 두 단어에 해당하는 벡터의 내적 값이 PMI*보다(=단 한 번 같이 등장했다고 가정했을 때 대비) 약간 크게 되도록 학습한다. 두 단어가 저빈도 단어라면 마지막 두 개 항(log𝓐𝓳*, log𝓐*𝓳)이 작아지기 때문에 𝓤𝓲, 𝓥𝓳 간 내적 값을 약간 크게 해도 학습 손실이 늘어나지 않는다. 

 

 Swivel은 GloVe와 마찬가지로 𝓤, V 행렬을 랜덤 초기화한 뒤 목적함수를 최소화하는 방향으로 행렬 값들을 조금씩 업데이트하는 방식으로 학습한다. 

 

 

요약

  • 잠재 의미 분석이란 단어-문서 행렬이나 TF-IDF 행렬, 단어-문맥 행렬 같은 커다란 행렬에 차원 축소 방법의 일종인 특이값 분해를 수행해 데이터의 차원 수를 줄여 계산 효율성을 키우는 한편 행간에 숨어 있는 잠재 의미를 이끌어내기 위한 방법론이다. 단어-문서 행렬이나 단어-문맥 행렬에 특이값 분해를 시행한 뒤 그 결과로 도출되는 벡터들을 단어 임베딩으로 사용할 수 있다.
  • GloVe는 Word2Vec과 잠재 의미 분석 두 기법의 단점을 극복하고자 했다. '임베딩된 단어 벡터 간 유사도 측정을 수월하게 하면서도 말뭉치 전체의 통계 정보를 좀 더 잘 반영해보자'가 GloVe가 지향하는 핵심 목표다. GloVe 저자들은 임베딩된 두 단어 벡터의 내적이 말뭉치 전체에서의 동시 등장 빈도의 로그 값이 되도록 목적함수를 정의했다.
  • Swivel은 점별 상호 정보량(PMI) 행렬을 분해하는 과정에서 학습된다. 말뭉치에 동시 등장한 케이스가 한 건도 없는 단어 쌍에 대한 PMI는 음의 무한대로 발한하는데, Swivel 저자들은 이러한 경우가 발생하지 않도록 목적 함수를 세심하게 설계했다. 

 

 

Reference

 
한국어 임베딩
저자 : 이기창
감수 : NAVER Chatbot Model
출판 : 에이콘출판사
발매 : 2019.09.26

 

 

 

반응형

댓글