본문 바로가기
AI/NLP

Word2Vec

by lucian 2021. 11. 22.

 

앞서 말한 희소표현에선 단어의 유사도를 계산할 수 없었다. 모든 단어를 길게 늘어뜰인 벡터로 고차원의 벡터로 만들 뿐 단어와 단어가 어떻게 연결되어 있는지 파악할 수 없다.
그렇기에 단어간의 유사성을 계산하고자 나온 것이 분산표현이다.

 

분산 표현(Distributed Representation)

분산 표현은 분포가설의 가정하에 만들어진 표현방법이라 한다.
비슷한 위치에 등장하는 단어는 비슷한 의미들을 가진다. 라는 가정이라는데, 간단히 말해 강아지하면 떠오르는게 귀엽다, 사랑스럽다 일 것이다. 이 강아지는 귀엽다와 사랑스럽다와 비슷한 의미를 가진다고 볼 수 있다.

즉 강아지라는 단어가 있을 때, 귀엽다와 사랑스럽다라는 단어의 분포가 많을 것이므로 이는 같은 의미라고 여겨지는 것 같다. 이러면 분포를 표현하기만 하면 이 단어의 의미가 유사한지 알 수 있기 때문에 고차원의 벡터를 사용할 이유가 없어진다. 만약 1000의 차원의 수를 가지고 200쯤에서 가장 높은 수치를 가진다고 할 때, 귀엽다와 사랑스럽다도 200쯤에서 가장 높은 수치를 가질 것이다.
그러면 벡터는 실수로 표현이 되야 하고, 이는 앞서 말한 밀집 표현, 임베딩 벡터와 같으므로 밀집 벡터에 속한다고 할 수 있다.

이것을 설명한 이유인즉슨 분산 표현하는 방법(유사도로 벡터를 표현하는 방법) 중 Word2Vec가 많이 쓰이고 있기 때문이다.

Word2Vec

Word2Vec는 두가지 방식이 있다고 한다.

CBOW(Continuous Bag of words), Skip-Gram이다.

 

CBOW - 주변에 있는 단어로 중간 단어를 예측하는 방법

Skip-Gram - 중간에 있는 단어로 주변 단어를 예측하는 방법

둘다 메커니즘은 비슷하다고 한다. 파악해보자.

 

 

1. CBOW(Continuous Bag of words)

앞서 말한 것처럼 주변에 있는 단어로 중간 단어를 예측하는 방법이다.
중간 단어를 center word라 하고, 주변 단어를 context word라고 한다. 추가로 주변 단어를 어디까지 볼지를 정하는데 이 범위를 window라고 한다. 윈도우가 n이라면 앞뒤로 봐야 되므로 주변단어의 갯수는 2n이 되는 것이다.

출처 : https://wikidocs.net/22660

여기서 보면 윈도우의 범위를 2로 설정했다.(n=2)
그러면 앞과 뒤로 볼 단어는 총 4개가 된다.(2n=4)
또한 이 word2vec의 결과인 임베딩 벡터를 만들기 위해선 원핫벡터로 표현해줘야한다.

word2vec를 만들기 위한 신경망 모델은 이렇게 구성되어 있다.
주변 단어들이 input으로 중심 단어가 output으로 하는 input layer와 output layer가 존재하고, 중간층인 projection layer가 존재한다. 또한 그 사이에 W와 W' 가중치가 존재한다.

출처 : https://wikidocs.net/22660

이 프레임워크를 볼 때, 우리는 인공신경망과 유사하다고 볼 수 있다. 하지만 여기서 다른점.
1. 인공신경망과 다르게 projecton layer에선 활성화함수를 쓰지 않는다. 보통 인공신경망에선 선형분류기로 W와 입력층을 곱해준 후, 활성화 함수(시그모이드, ReLU, tanh 등)으로 비선형화 시켜준다. 하지만 word2vec에선 이와 다르게 활성화 함수가 없다! (대신 평균을 구함.)
2.  은닉층이 1개라 깊은 신경망(딥러닝)이라 할 수 없다. 이 모델은 얇은 신경망으로 은닉층 1개인 투사층(projection layer)으로 불린다. 투사층이라 불리는 이유는 인풋 one-hot벡터이기 때문에 가중치의 행의 값이 그대로 투사된다. 그렇기에 투사층이라 불린다.

출처 : https://wikidocs.net/22660

자 이제 한 레이어씩 살펴보자. 첫번쨰 input layer는 원핫 벡터로 문장에서 나오는 단어의 수가 차원의 수가 된다.
여기서 총 7개의 단어가 나왔으므로 차원의 수가 7인 원핫 벡터로 표현됬다.
또한 M은 즉 임베딩벡터의 차원의 수는 우리가 정할 수 있다. 여기선 차원의 수가 5다.
1. 인풋은 1x7의 행벡터(그림에선 7x1의 열벡터지만 가중치의 행과 열이 VxM으로 봤을 때, 그냥 행벡터인 듯하다.)
2. 투사층(M)은 1x5의 행벡터이다.
3. 그럼 가중치(W)는 VxM의 2차원 벡터가 된다. 왜냐하면 [1x7]*[7x5]=[1x5]의 행렬의 곱으로 표현되기 때문.

만약 인풋을 열벡터(7x1)로 표현했다면 가중치는 거꾸로 MxV가 됬을 것이다. [MxV]*[Vx1]=[Mx1]


자 이제 여기서 왜 투사층이란 이름이 되는가?!!!
왜냐면 인풋이 원핫벡터이기 때문이다!!

예를 들자.
인풋은 [1,0,0,0], [0,0,1,0]인 4차원에서 두번째 값의 주변값이 첫번째 단어와 세번째 단어가 인풋으로 들어간다.(윈도우는 1)
가중치는 \begin{bmatrix}
1&2 &3\\
4&5&6\\
7&8&9\\
10&11&12\\
\end{bmatrix} 이다.

이를 그럼 표현하면
\begin{align*}
\begin{bmatrix}
1&0&0&0\\
\end{bmatrix}
\begin{bmatrix}
1&2 &3\\
4&5&6\\
7&8&9\\
10&11&12\\
\end{bmatrix}
=\begin{bmatrix}
1&2&3\\
\end{bmatrix}
\end{align*}

\begin{align*}
\begin{bmatrix}
0&0&1&0\\
\end{bmatrix}
\begin{bmatrix}
1&2 &3\\
4&5&6\\
7&8&9\\
10&11&12\\
\end{bmatrix}
=\begin{bmatrix}
7&8&9\\
\end{bmatrix}
\end{align*}

즉 가중치의 i번째 행이 그대로 반영된다. 이것이 원핫코딩의 특징이다!
그럼 이제 다음 W'을 구해야하는데, 값은 두개다. 그러므로 나왔던 벡터들을 원소끼리 더해주고 나누기 2n=2 해준 즉 평균 벡터를 구해준다. 이것이 투사층의 벡터이다.

출처 : https://wikidocs.net/22660
출처 : https://wikidocs.net/22660

이제 중심 단어 center word를 비교해줘야한다. W'은 [MxV]의 이차원 벡터가 된다.( [1xM]*[MxV]=[1xV] )
이렇게 가중치(W') 곱해준 벡터($y$)에 소프트맥스 함수를 취해준다.(소프트 맥스함수는 0과 1사이의 벡터 원소값을 출력해주는 함수로 각 원소를 다 더하면 1이 된다.) 이 벡터를 스코어 벡터($\widehat{y}$)라 한다. 
이 $\widehat{y}$ 스코어 벡터와 center word의 원핫벡터를 손실함수(loss function)인 cross entropy함수로 loss를 구해준다. 그러한 뒤 역전파(back propagation)을 수행하여 W와 W'를 학습시켜준다. 
이작업을 인풋과 아웃풋을 바꿔가면서 계속 수행해준다.

모든 학습이 끝났다.
이제 이 M차원의 크기를 갖는 W의 행이나 W'의 열 중 하나가 임베딩벡터가 되는 것이다.
sat을 나타내는 i=3(0부터 시작)일 때의 W의 행이나 W'열이 임베딩 벡터가 된다.

 

Skip-gram

CBOW를 이해했으면 매우 간단하다. CBOW의 방식을 반대로 사용하면 된다.
주변 단어를 보고 중심 단어를 예측한 CBOW에 반하여 중심단어를 보고 주변단어를 예측하는 Skip-gram.
대신 중심단어에서 주변단어로 뻗어가므로 투사층에서 평균을 구할 필요가 없다.(왜냐 인풋이 하나이기 때문에!)

또한 여러 논문에서 성능을 비교했을 때, 전반적으로 sckp-gram이 CBOW보다 성능이 더 좋다고 한다.

출처 : https://wikidocs.net/22660
출처 : https://wikidocs.net/22660

 

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

Word Embedding  (0) 2021.11.22
자연어처리-추가예정  (0) 2021.11.22

댓글