250x250
Notice
«   2025/07   »
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 31
Today
Total
관리 메뉴

serendipity

GloVe , Swivel 본문

Study/AI

GloVe , Swivel

z 2021. 7. 11. 23:41
728x90

5. GloVe (Global Word Vectors)

2014년 미국 스탠포드대에서 개발된 워드 임베딩 기법이다. GloVe는 다음 Word2Vec과 LSA의 단점을 극복하여, 단어 벡터 간 유사도를 잘 측정하면서 말뭉치 전체에 대한 통계량을 잘 반영할 수 있는 임베딩 기법을 목표로 만들어졌다.

 

기존의 임베딩 기법인 Word2Vec은 단어 간 유사도 측정은 잘 할 수 있었으나, 사용자가 지정한 윈도우 내 문맥만 학습하기 때문에 말뭉치 전체에 대해 학습하기에는 어려웠다.  LSA는 말뭉치 전반적인 통계량은 잘 파악되었지만 단어간 유사도 측정은 잘 하지 못한다는 단점이 있었다.

 

'임베딩된 단어 벡터 간 유사도 측정을 수월하게 하면서도 말뭉치 전체의 통계정보를 더 잘 반영해보자' 가 Glove가 지향하는 핵심 목표다.

 

모델 기본구조)

목적함수는 두 단어의 동시 등장 확률인 (임베딩된 두 단어 벡터 사이 내적 값)과 (말뭉치 전체에서의 동시 등장 빈도 로그 값(logX_ij)) 차이가 최소화되어 학습손실이 작아지는것을 목적으로 정의된 함수다.

 

목적함수

 

Glove는 우선, 학습 말뭉치를 대상으로 단어-문맥 행렬 X를 만들고 목적함수를 최소화하는 임베딩 벡터를 찾기 위해 행렬 분해를 수행한다.

처음에 행렬 U, V를 랜덤으로 초기화 한 뒤 목적함수를 최소화하는 방향으로 값으로 U, V를 조금씩 업데이트 해나간다. 만일 학습 손실이 더 줄지 않거나 정해진 스텝 수만큼 학습했을 경우 학습을 종료한다. 학습이 끝나면 U를 단어 임베딩으로 사용할 수 있다. 이밖에 U + Vt, U와 Vt를 이어 붙여 임베딩으로 사용하는 것도 가능하다.

 

!pip install glove_python
from nltk.tokenize import word_tokenize
from glove import Corpus, Glove

result = [word_tokenize(sentence) for sentence in text]

corpus = Corpus() 
corpus.fit(result, window=5)

glove = Glove(no_components=100, learning_rate=0.05)
glove.fit(corpus.matrix, epochs=20, no_threads=4, verbose=True)
glove.add_dictionary(corpus.dictionary)

glove.most_similar("word")

 


 

6. Swivel (Submatrix-Wise Vector Embedding Leamer)

2016년 구글에서 발표한 행렬 분해 기반 단어 임베딩 기법이다. 

 

 

모델 기본구조)

위 GloVe가 단어-문맥 행렬을 분해하는 반면, Swivel은 PMI 행렬을 분해하여 PMI의 단점을 커버할 수 있도록 설계되었다. 

아래 그림처럼 PMI 행렬을 U와 V로 분해하고, 학습이 종료되면 U를 단어 임베딩으로 쓸 수 있다. 

 

Swivel

 

 

1) 먼저 타깃 단어 i와 문맥 단어 j가 window 내 동시에 등장한 케이스가 있는 경우, 아래의 목적함수가 적용된다.

여기서, 타깃 단어 i와 문맥 단어 j의 동시 등장 확률인 벡터 내적 값과 PMI 값이 일치하도록 벡터 값이 변화한다. 함수에 곱해지는 f(x_ij)는 단어 i, j의 동시 등장 빈도를 말한다. 단어 i, j가 자주 동시에 등장할수록 벡터 내적 값과 PMI 값이 같아지도록 만든다는 것이다.

 


2) 타깃 단어 i와 문맥 단어 j가 window 내에 한번도 동시에 등장하지 않은 경우, PMI 값이 -∞로 발산하고 아래 목적함수를 이용한다.

 


여기에서 나타난 pmi*는 단어의 동시 등장 횟수가 0인 것을 1로 가정하고 계산된다. 자주 등장하는 단어들의 동시 등장 횟수가 0인 경우 의미가 연관되어 있지 않을 것이라고 판단하는 반면, 자주 등장하지 않는 단어들의 동시 등장 횟수가 0인 경우 의미가 연관되어 있을 수 있다고 판단한다.

 


번외로, 지금까지 단어 수준의 임베딩에 대해 다뤄봤는데, 그렇다면 문장을 기준으로는 어떻게 할까? 라는 궁금증이 생길 수 있다.

이번에는 단어 임베딩을 문장 수준 임베딩으로 확장하는 방법을 설명하겠다.

 

 

7. 가중임베딩

미국 프린스턴 대학교 연구 팀이 ICLR에 발표한 방법론으로, 아주 간단한 방법이지만 성능 향상 효과가 좋아 한번쯤 써 봄직한 방법이다.

이 방식에는 '문서 안의 단어는 글쓴이가 생각한 주제에 의존한다' 라는 내용을 기반으로 한다. 다시 말해, 주제에 따라 단어 사용 양상이 달라진다는 의미다.

 

이를 위해 '주제 벡터' 라는 개념을 도입했다. 

주제 벡터 Cs가 있을 때 어떤 단어 w가 나타날 확률은 다음과 같다.

  • P(w) : 주제와 상관없이 단어가 등장할 확률
  • exp(<v_w, c_s>)/Z : 단어와 주제의 유사도

단어 등장 확률

 

수식을 좀 더 직관적으로 설명하자면, 우변의 첫번째 항은 단어 w가 주제와 상관없이 등장할 확률을 가리킨다. 한국어를 예로 들면 조사 '을/를', '이/가' 같은 경우 P(w)가 높은 축에 속할 것이다. 우변 두번째 항은 단어 w가 주제와 관련을 가질 확률을 의미한다. 이는 주제 벡터 Cs와 w에 해당하는 단어 벡터 Vw가 유사할 수록, 즉 내적 값이 클수록 그 값이 커진다. 예컨데, 주제가 정치인 상황에서 경제,사퇴에서 인수 같은 단어가 우변 두번째 항이 높은 축에 속할 것이다. 마지막으로는 첫번째 항과 두번째 항을 가중합을 취해서 최종 등장 확률을 계산한다. (α 는 사용자가 직접 지정하는 하이퍼파라미터다.)

 

문장 전체에 대해 계산할 때는 문장에 나오는 단어들에 대해 확률을 다음과 같이 모두 곱해서 구한다.

 

그런데 이는 값이 작아지는 underflow 문제가 나타날 수 있다. 따라서, 아래와 같이 로그를 취해 더하는 방식으로 대체한다.

 

 

테일러 급수에 의해 아래와 같은 근사식이 나온다.

테일러 급수는 항의 무한합으로 함수를 표현하는 한 방법으로,  이를 통해 무한합의 n번째 항까지만 써서 원래 함수를 근사할 수 있다.

 

테일러 급수

 

우리가 관찰하고 있는 단어 w가 등장할 확률을 최대화하는 주제 벡터를 찾는 것이 목표이다. 

위 식의 알파 값을 α= (1- α)/ αZ 로 바꾸고 argmax로 정리하면 다음 수식과 같다.

 

 

좀 더 직관적으로 설명하자면, 우리가 관찰하고 있는 문장이 등장할 확률을 최대화하는 주제 벡터 Cs는 문장에 속한 단어들에 해당하는 단어 벡터에 가중치를 곱해 만든 새로운 벡터들의 합에 비례한다. 새로운 단어 벡터를 만들 때 가중치는 P(w)를 고려하여, 즉 해당 단어가 얼마나 자주 등장하는지를 감안하여 지정한다. 희귀한 단어(p(w)가 작다) 라면 높은 가중치를 곱해서 해당 단어 벡터의 크기를 키우고, 높은 빈도의 단어라면 해당 벡터의 크기를 줄인다. 이런 점은 TF-IDF 논리와 비슷하며, 아울러 문장 내 단어의 등장 순서를 고려하지 않는 bag of words (백오브워즈) 가정하고도 비슷하다.

 

 

728x90

'Study > AI' 카테고리의 다른 글

ELMo  (0) 2021.07.12
Doc2Vec , LDA  (0) 2021.07.12
FastText , LSA  (0) 2021.07.11
NPLM , Word2Vec  (0) 2021.07.11
지도 & 비지도 학습  (0) 2021.07.10
Comments