티스토리 뷰

MLDL/Theory

Word2Vec

Lazyer 2018. 4. 17. 20:39

Word2Vec


1. Word2Vec

word2vec은 2013년 Tomas Mikolov를 중심으로 구글에서 발표한 Continuous Word Embedding 학습 모델이다. NNLM을 계승하면서도 학습 속도를 비약적으로 끌어올려 주목받고있으며 큰 차이점으로는 NNLM모델의 Hidden Layer가 사라졌다.
각 기능에 따라 CBOW, Skip-gram 두 가지 모델을 제시하였다.

2. CBOW

 

 


CBOW의 경우 주위 단어들로 부터 가장 확률론적으로 가능성이 높은 한 단어를 찾는 모델이다.

입력층~은닉층(WV∗NW_{V*N}), 은닉층~출력층(WV∗NW_{V*N})을 연결하는 2개의 행렬 이 존재한다. 서로다른 행렬이며 그 모양은 서로 전치한 것과 동일하다. 실제로 같은 행렬을 이용하여 학습을 진행하기도 한다고 한다.

Input Layer, Projection Layer, Output Layer로 이루어져 있다. NNLM에서 입력 xx를 C 행렬을 통한 변환 후 Hidden Layer로 변환하였는데, 두 과정이 여기서 하나로 합쳐졌다고 생각하면 되겠다.
Input Layer에서 Projection Layer는 활성화 함수가 존재하지 않고 단순히 행렬곱을 통한 선형 변환 에 가까워 Hidden Layer보다는 Projection Layer라는 이름이 더 적절하다.



Input에서는 NNLM모델과 같다. 1xV 크기의 one-hot-encoding으로 넣어주고 VxN 행렬과 1대1 대응된다. Input은 one-hot 벡터이기 때문에 가중치 행렬 W에서 해당 단어에 해당하는 열의 값만 참조하게된다. projection한 값의 평균을 projection layzer에 전달한다.

계산량이 C*N +N*V밖에 되지 않아 비약적으로 감소하였다.

문맥에서 한 단어만 고려하는 CBOW 모델의 단순화한 버전을 생각해보자. 이는 기본적으로 바이그램을 모사한 것이다. 개별 단어 임베딩의 한계는 두개 이상의 단어의 조합이 개별 단어 벡터의 조합으로 표현될 수 없다는 것이며 이런 문제의 해결책 중 하나는 동시등장단어에 기반한 구문을 식별하고 이들을 별도 학습 시키거나 n-gram 임베딩을 학습시키는 것이다.(Johnson and Zhang,2015)

또 다른 한계로는 Context Window에 기반한 임베딩에서 비롯된다. good, bad와 같은 단어는 거의 같은 임베딩을 공유(전, 후로 비슷한 단어들이 온다.)하여 상반된 극성을 갖는 단어가 의미상 유사한 단어로 분류 된다. Tang et al, 2014는 sentiment specific word embedding(SSWE)를 제안함으로 이러한 문제를 히결하였다.(학습 동안 손실 함수에 정답 극성 포함)

3.Skip-gram

skip


Skip-Gram은 중심단어로부터 가능성이 높은 주변 단어를 찾기 위한 모델이다.

"The quick brown box jumps over the lazy dog"에서 Context Window를 옮겨가며 단어들의 쌍을 지어 training sample들을 생성한다. Context Window 사이즈가 2일때를 생각해보자.

skip

Skip-gram의 경우 중심단어를 기준으로 주변 단어들을 최대 4번까지 따로 분리하여 학습하기 때문에 CBOW에 비하여 업데이트의 기회가 많다.(학습량이 많다.)

4. Word2vec 학습

Subsampling frequent words

Word2vec의 파라미터는 W와 W'행렬 두 개이다. 크기가 각각 VxN, NxV이다. NNLM보다는 계산량이 감소하였으나, 단어 사전이 10만개, 임베딩 차원수가 100이라고 가정하여도 2000만의 연산을 하게된다.(10만*100*2)
Word2vec 연구진은 학습량을 확률적 방식으로 줄인다.

자주 등장하는 단어는 학습의 기회가 많기 때문에, 학습에서 제외할 확률을 높인다. i번째 단어 wiw_i를 학습에서 제외시키기 위한 확률은 아래와 같다. z(wi)z(w_i)는 해당 단어가 등장한 비율(단어 빈도/전체 단어 수) 를 뜻한다. 0.001은 임의의 임계값이다. f(wi)f(w_i)가 클 수록 분모가 커지게 되어 루트안의 값은 0에 가까워지고, P(wi)P(w_i)는 1에 가까워 지고, P(wi)P(w_i)의 확률로 학습에서 제외된다.

 

sampling


일부만 선택하여 softmax를 계산하고 normalization을 해준다. 계산량은 NxV에서 NxK로 줄어들 것이다. 이 때 사용하는 단어를 positive sample이라고 부른다.

이게 무슨 말이냐.. 예를 들어보자.

"the quick brown fox jumped over the lazy dog"

라는 9개 단어의 문장은 sampling rate에 따라

"quick brown fox jumped lazy dog"로 바뀐다.

이럴 경우 "dog"와 "jumped"는 4단계가 떨어져 window size가 2일 때 서로 포함되지 않았지만, sampling으로 인해 window size가 2일 때에도 서로 포함되게 된다. Window 내의 단어 수는 동일하기 때문에 계산량은 줄어들지 않으며, 실제로 성능을 증가시킬 수도 있지만 저하시킬 수도 있다.

Negative sampling

실제 단어들의 벡터 사이즈는 수천,수만개가 되기 때문에 softmax의 계산량이 엄청나다. Skip-gram에는 매우 많은 가중치들이 존재하고 매 훈련마다 모두 update되어야 한다. Negative Sampling은 매 step시 가중치의 일부만 수정 하도록 함으로써 전체 계산량을 줄인다.
skip gram을 학습할 때에, positive sample을 제외하고 나머지 negative sample을 뽑는 방법이다

one-hot 벡터에서 ("fox","fire") 한 쌍을 학습할 때 각 단어를 뜻하는 '1'의 값을 제외하고 '0'을 가지는 값들을 negative sample 이라고 한다. Negative sample중에서 가중치를 update하기 위한 소수의 값 k개 만을 선택하여 positive sample과 함께 update를 진행한다. DataSet의 규모가 클 수록 k의 값이 작아도 효율적이다.

300*10000의 matrix에서 update해야하는 가중치는 총 3백만개다(단어 1개 ~ 가중치 300). 여기서 positive sample 1개와 negative sample 5개를 대상으로 훈련한다고 하였을 때, update가 필요한 가중치는 6*300 으로 1800개에 불과하다.

이제 소수의 negative sample을 어떻게 뽑을까.. 아무 단어나 가져오지 않고 Corpus Data에 함께 존재할 가능성이 큰 단어들을 선택해온다.

이러한 단어들을 선택하는 방법들은 아래 논문에 잘 소개되어있는데 학습한지가 조금 되어 기억이 잘 나지않는다.. 추후에 논문을 다시 읽은 후 정리하여야겠다.

Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method


아래 블로그를 바탕으로 작성 및 첨부하였습니다.
negative_sampling
negative_sampling-arXiv
ratsgo님 블로그
shuuki4님 블로그
word2vec모델기초

 

*부족한점, 틀린점이 있다면 댓글달아주시면 정말 감사드리겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함