cs Word2vec 알고리즘 리뷰 1 : CBOW 와 Skip-gram
본문 바로가기
  • 매일 한걸음씩
  • 매일 한걸음씩
개발/NLP(Natural Language Processing)

Word2vec 알고리즘 리뷰 1 : CBOW 와 Skip-gram

by 시몬쯔 2020. 5. 28.
728x90

https://simonezz.tistory.com/34

 

추천시스템 Recommender System 정리

코드만 짜고 하다보니 전체적인 그림이 자꾸 잊혀지는 것 같아 한 번 정리를 쭉 해보고자 한다. 참고 추천시스템이란? 사용자의 interest를 예측해서 흥미로워할 만한 상품을 추천해주는 것. 추천�

simonezz.tistory.com

 

위의 포스팅에서 협업 필터링 시스템은 fully connected 방법이나 Item2vec 방법을 사용한다고 했는데,

Item2vec은 word2vec의 아이디어를 사용한 알고리즘이므로 word2vec에 대해 알아보자.

 

참고자료

 

Word2vec의 주요 아이디어는 "비슷한 분포를 가진 단어라면 비슷한 의미를 가질 것이다."이다.

즉, 자주 같이 등장할수록 두 단어는 비슷한 의미를 가진다는 것이다.

Word2vec은 Input, Hidden, Output layer 즉 3개의 층으로만 이루어져 있으므로 학습이 빠르고 많은 단어 뭉치를 학습할 수 있으니 성능이 좋다.

또 기존의 단어들 간의 유사성을 표현할 수 없었던 모델들과는 달리 단어간의 유사함과 통사적 유사함을 정교하게 표현가능하다.

 

Word2vec의 모델은 Continuous Bag Of Word(CBOW)Skip-Gram이 있다.

 

 

 

1. Continuous Bag Of Word(CBOW)

CBOW의 기본 아이디어는 주변 단어를 통해 주어진 단어를 예측하는 것이다. 

총 단어가 c개라고 할 때 앞뒤로 c/2개의 단어를 통해 주어진 단어를 예측한다.

 

예를 들어,

 

"파리에 갔더니 ___를 볼 수 있었다." 라는 문장이 있다고 하자.

 

__에 들어갈 단어는 주변 단어들을 통해 예측할 수 있다.

 

아키텍처를 살펴보면,

 

CBOW의 학습과정을 살펴보면,

학습시킬 문장의 모든 단어들을 one-hot encoding방식으로 벡터화한다. (특정 위치에만 1이 들어가고 나머지에는 0이 들어가는 형식)

 

그 다음, 하나의 center 단어에 대해 2m개의 단어 벡터를 Input으로 갖는다.

 

CBOW방식의 파라미터는 Input layer -> Hidden layer로 가는 weights와 Hidden layer -> Output layer로 가는 weights이다.

이 모델 학습의 목적은 주변의 단어들이 주어졌을 때 다음의 center 단어의 조건부 확률을 최대화 하는 것이다.

 

위에서 말했듯이 각 단어는 one hot encoding 방식으로 벡터화되므로 파라미터 W와 곱하면 각 단어에 대응하는 W의 행이 결과로 나온다.

 

one-hot encoding방식의 단어벡터들은 파라미터 W와 곱해져서 embedded word vector(위에서의 [10,12,19])가 된다.

 

embedded word vector 2m개의 평균을 계산한 벡터가 Hidden layer가 된다.

 

 

이제 output layer로 전달할 score를 계산해야 한다. Hidden layer -> Output layer로 가는 파라미터 W'(=U) 를 곱해서 각 단어에 대한 score를 만든다. 가까운 위치의 단어는 높은 스코어값을 갖게 한다.

마지막으로 각 score값들을 확률값으로 계산해주기 위해 softmax함수를 사용한다.

 

 

정리하자면, 각 단어에 파라미터 W를 곱하면 각 단어들은 one hot encoding 벡터이기 때문에 각 단어에 대응하는 W의 행이 나올 것이다. 이 결과로 나온 값을 그 단어에 대응하는 embedding vector가 된다.

그리고 각 단어마다 가지고 있는 embedding vector의 평균을 내고 거기에 파라미터 U를 곱해 score를 계산하고 소프트맥스 함수를 이용하여 확률값으로 만들어준다.

 

 

https://lilianweng.github.io/lil-log/2017/10/15/learning-word-embedding.html#context-based-continuous-bag-of-words-cbow

이제 이 모델로부터 최적의 output을 뽑아내기 위해 학습의 과정을 거쳐야 한다.

우선 학습을 위해서는 우리가 minimize할 loss function 즉, objective function이 필요하다.

 

여기서는 다음 cross entropy와 같이 정의했다.

우리는 각 단어에 대해 one-hot encoding을 사용했으므로 위의 식에서 y는 한자리만 1인 벡터이다. 

즉 위의 식에서 

로 간단하게 쓸 수 있다. i는 우리가 예측하고자 하는 단어의 위치이다.

단어를 정확하게 예측했다면 yi와 yi^ 모두가 1이 되어 H값은 0이 된다. 

 

우리는 또한 위의 식을 다음과 같이 확률분포에 대한 식으로도 볼 수 있다.

 

optimization 방법으로는 Stochastic Gradient Descent(SGD) 방법을 사용한다.

 

 

 

* CBOW의 계산량

즉, 파라미터 W,W'와 곱하는 계산이고 전체 계산량은 C X N + N X V 이다.

 

loss function을 줄이기 위해 SGD를 이용하여 학습을 한 후 나온 행렬 W에서 위에서 말했듯이 one-hot encoding이므로 W의 각 행을 각 단어의 embedding vector로 사용하게 된다.

 

2. Skip - Gram

 

Skip - gram은 CBOW와는 반대로 하나의 단어에서 여러 단어를 예측하는 방법이다. 즉 중심단어에서 주변단어를 예측하는 방식인데 CBOW보다 성능이 좋아 더 많이 쓰인다.

 

성능 비교

그림으로 살펴보면 CBOW와 마찬가지로 input은 one-hot encoding 방식으로 들어가고 Hidden layer를 거쳐 softmax함수를 사용하여 output layer가 나온다. 하나의 단어에서 여러개의 단어가 나오는 방식이므로 output layer에서는 여러개의 단어가 나오게 된다.

 

위에서는 10000개의 단어 중 ants라는 input이 들어가서 ants 자리에 해당하는 위치값이 1이다.

output layer는 10000개의 neurons으로 이루어져 있는데, softmax 함수를 이용하여 나온 0~1사이의 값은 각 단어가 나올 확률을 뜻한다. 아마 대부분의 확률값은 0에 가깝고 몇몇의 소수의 값만 높은 확률이 나올 것이다.

 

Hidden layer를 살펴보면 300개의 뉴런으로 이루어져있다.(사용자 설정)

그렇다면 Input layer -> Hidden layer로 가는 parameters는 [10000,300] 사이즈인 행렬이 될 것이다.

이러한 parameter들을 CBOW때와 마찬가지로 loss function을 최소화시키는 방식으로 학습시켜 조정한다.

 

이렇게 학습된 word vector는 비슷한 단어에 대해서는 비슷한 결과를 내게 된다. 즉 비슷한 row vector를 갖고 있는 것들은 비슷한 단어라는 의미가 된다. 그렇다면 이 행 벡터의 유사도 또는 거리를 cosine similarity를 이용하여 구하면 비슷한 단어들은 묶이게 된다. 행 벡터들을 시각화해보면,

 

이러한 식으로 비슷한 단어는 비슷한 곳에 모여있음을 확인할 수 있다.

 

 

이상으로 word2vec의 방식인 CBOW와 Skip-gram에 대해 알아보았다.

 

 

728x90

댓글