Word2Vec (Skip-gram) 모델이란?
개요
이 글에서는 단어 벡터화의 새로운 지평을 연 Word2Vec 모델, 그 중에서도 Skip-gram 모델에 대한 이론적인 이해를 도모해보고자 한다. Word2vec 모델은 T. Mikolov 및 그 외 연구진에 의해 쓰인 Efficient Estimation of Word Representations in vector space (2013) 논문에서 처음 소개되었다. Word2Vec 모델은 주변 단어를 토대로 중심 단어를 예측하는 CBOW(Continuous Bag-of-Words)와 그 반대인 Skip-gram 방식으로 나뉘며, 일반적으로 Skip-gram 방식이 더 성능이 좋기에 널리 사용된다. 따라서 본 글에서는 Skip-gram 모델에 한정하여 논의하고자 한다.
단어를 벡터화하는 가장 간단한 방법은 원-핫-벡터를 이용하여 각 단어를 단위 벡터(\(\mathbf{e}_w\))로 표기하는 것이다. 그러나 이 방식은 단어의 갯수만큼 벡터의 차원이 커지게 되며, 동시에 벡터의 대부분이 \(0\) 으로 채워져 메모리를 효율적으로 사용하지 못하는 단점이 있다. 또한 각 단어 벡터간 내적이 \(0\) 이므로 단어 사이의 관계에 대한 정보를 전혀 얻지 못하게 된다. 따라서 단어를 밀도 높은 벡터(dense vector)로 나타내는 모델을 개발하고자 하는 연구가 계속 되어 왔다. Word2Vec 이전에 연구된 단어 벡터화 모델에 대해서는 이 글에 잘 소개되어 있다.
[image source](https://miro.medium.com/max/1838/1*YvOdGp73pOHmYGHKqkx5wQ.png)
Skip-gram은 단어들을 정해진 차원의 벡터 공간에 임베딩하는 모델이다(일반적으로 벡터 공간의 차원 « 단어의 갯수). 먼저 임의의 값으로 벡터들을 초기화한 후, 특정 단어가 주어졌을 때 그 주변 단어들의 등장 확률을 증가시키는 방향으로 학습하는 알고리즘이다. 가령 I love him but he hates me.
라는 문장을 생각해보자. 여기서 him
이라는 단어를 기준으로 앞 뒤 두 단어들인 I
,love
,but
,he
의 발생 확률을 증가시키는 방향으로 학습하게 된다.
잘 학습된 Skip-gram 모델은 단어에 대응되는 벡터들의 연산이 실제 단어 간의 의미 및 형태를 보존하게 되어, 텍스트 모델링에 큰 도움을 줄 수 있다. 다만 모델을 훈련하는 과정에서 계산량이 어마어마하기에 이를 개선하기 위해 계층적 소프트맥스, 네거티브 샘플링 등의 기법이 도입된다. 모델 최적화에 대한 내용은 다음 포스팅에서 소개하겠다.
Skip-gram 모델의 구조
주어진 훈련 텍스트에 등장하는 단어들의 집합을 Vocab
이라 하고, 이 집합의 크기를 \(K\) 라 하자. 이 모델의 hyperparameter로 다음 두 가지를 결정해야 한다. 중심 단어를 기준으로 몇 번째 단어까지 하나의 문맥(context)으로 고려할 지(WINDOW SIZE
), 그리고 단어들을 임베딩할 벡터 공간의 차원 \(D\) 를 결정해야 한다.
먼저 크기가 (\(K\), \(D\)) 인 행렬 \(V, U\)를 임의값으로 초기화하자. 단어 집합의 \(i\)번째 단어 \(w_i\)에 대응되는 입력 벡터(input vector)를 \(v_{i} = V_{i} \in \mathbb{R}^D\) , 출력 벡터(output vector)를 \(u_{i} = U_i \in \mathbb{R}^D\)라고 정의한다(행렬 \(A\)의 \(i\)번째 행을 \(A_i\)로 표기).
임의의 중심 단어 \(c\)에 대해(\(c\)번째 단어), 점수 벡터(score vector) \(z = U \cdot v_c\) 를 계산한 후 이 벡터에 소프트맥스를 취하면 다음 확률 벡터 \(\hat{y}\in \mathbf{R}^K\) 를 얻을 수 있다.
\[\hat{y} = \text{softmax}(z) =\left( \frac{\exp(u_j^t v_c)}{\sum_{i=1}^{K}\exp(u_i^t v_c)}\right)_{j \in \{ 1,\ldots,K \}}\]따라서 중심 단어 \(c\) 에 대해 단어 \(o\) 가 문맥에 발생할 확률 \(p(o\vert c)\) 을 다음과 같이 정의할 수 있다.
\[p(o|c) := \hat{y}_o = \frac{\exp(u_o^t v_c)}{\sum_{i=1}^{K}\exp(u_i^t v_c)}\]주어진 텍스트가 \(\{ w_1, w_2, \ldots, w_T\}\)라고 토큰화되어 있을 때, 우리의 목표는 다음 손실함수를 최소화하는 방향으로 \(U, V\)를 훈련시키는 것이다(\(m\)은 WINDOW SIZE).
\[J :=- \frac{1}{T} \sum_{t=1}^{T} \sum_{j=0, j\ne m}^{2m} \log p(w_{t+j}|w_t)\]이는 다시 말해, 텍스트에서 주어진 중심 단어마다 문맥에 등장하는 단어의 확률을 최대한 증가시키는 방향으로 학습을 진행한다는 의미이다(원 논문에서 Word2vec 모델의 손실 함수는 위에 적힌 함수에 \(-1\) 이 곱해진 형태로 주어져있지만, 크로스-엔트로피 함수와의 일치성을 위해 해당 형태를 고려). 중심 단어 \(w_c\) 하나를 고정한 경우의 손실 함수는 다음과 같다.
\[\begin{array}{lcl} J &=& - \log p(w_{c-m}, \ldots, w_{c-1},w_{c+1},\ldots, w_{c+m}\vert w_c)\\ & =& - \log \prod_{j=0, j\ne m}^{2m} p(w_{c-m+j}|w_c) \\ & =& - \sum_{j=0, j\ne m}^{2m} \log \frac{\exp(u_{c-m+j}^t v_c)}{\sum_{i=1}^{K}\exp(u_i^t v_c)} \\ &=&-\sum_{j=0, j\ne m}^{2m} u_{c-m+j}^t v_c + 2m \log\sum_{i=1}^{K}\exp(u_i^t v_c) \end{array}\]참고로 이는 원-핫-벡터 \(y_{c-m+j}\) 들에 대한 \(\hat{y}\) 의 크로스-엔트로피 함수
\[\sum_{j=0, j\ne m}^{2m} H(\hat{y}, y_{c-m+j})\]와 같다. 또한 위 식에서 첫 번째 식과 두 번째 식이 같은 이유는 단어 모델에서는 일반적으로 문맥에 등장하는 단어들끼리는 서로 독립이라고 가정하기 때문이다.
위 손실 함수의 정의로부터 계산을 통해 다음을 확인할 수 있다.
\[\begin{array}{lcl} \frac{\partial{J}}{\partial{v_c}} &=& - \sum_{j=0, j\ne m}^{2m} {u_j} + 2m \sum_{w=1}^K \frac{\exp(u_w^t v_c)}{\sum_{i=1}^K \exp(u_i^tv_c)}u_w \\ &=& - \sum_{j=0, j\ne m}^{2m} {u_j} + 2m \sum_{i=1}^K p(w|c) u_w,\\ \\ \frac{\partial{J}}{\partial{u_o}} &=& -v_c + p(o|c) v_c \quad (o \text{ is a context word of c}),\\ \\ \frac{\partial{J}}{\partial{u_w}} &=& p(w|c) v_c \qquad \quad (w \text{ is not a context word of c}) . \end{array}\]따라서 그래디언트 업데이트를 다음 식을 통해 수행할 수 있다(\(\alpha\) 는 learning rate).
\[V = V - \alpha \frac{\partial{J}}{\partial{V}},\quad U = U - \alpha \frac{\partial{J}}{\partial{Q}}\]이제 중심 벡터에 대해 해당 학습을 반복하며 단어 \(w_i\) 의 두 가지 벡터 표현 \(v_i = V_i\), \(u_i = U_i\) 를 얻을 수 있다. 이 중 어떤 것을 벡터 표현으로 선택해도 성능에 크게 차이는 없다고 알려져 있으며, 일반적으로 입력 벡터 \(v_i\) 를 사용한다.
Skip-gram모델의 장단점
잘 학습된 Word2Vec 모델의 경우 각 단어에 대응되는 벡터는 원 단어들 사이의 형태적, 의미적 관계를 모두 보존하게 된다. 예를 들면 다음 대응들을 내포하고 있다.
- king : man = queen : ??
- 이 경우는 단어의 의미(왕권/성별)에 대한 추론으로 woman을 답한다.
- do : did = play : ??
- 이 경우는 단어의 형태(현재형:과거형)에 대한 추론으로 played를 답한다.
[image source](https://cdn.shortpixel.ai/client/to_webp,q_lossy,ret_img,w_600/https://www.depends-on-the-definition.com/wp-content/uploads/2018/03/word2vec-king-queen-vectors.png)
위 대응 관계는 각 단어의 벡터 표현을 통한 다음 계산을 통해 확인할 수 있다.
\[v_{\text{king}} - v_{\text{man}} + v_{\text{woman}} \quad \simeq \quad v_{\text{queen}}\]여기서 기호 \(\simeq\) 은 단어들에 대응되는 벡터 공간에서 좌변의 벡터와 가장 가까운(cosine similarity가 가장 높은) 벡터가 우변의 벡터라는 의미이다.
따라서 Word2Vec 모델을 사용하면 단어들을 훨씬 작은 공간에 임베딩하여 메모리를 효율화하는 것 뿐 아니라, 단어들 사이의 의미적, 형태적 관계까지 담아낼 수 있으며 이를 통해 언어 모델링에 큰 도움을 줄 수 있다.
그러나 이런 vanilla skip-gram 모델의 경우 치명적인 단점이 있다. 실제 언어를 모델링하는 경우 단어의 갯수 \(K\) 가 \(10^5\) ~ \(10^7\) 정도로 굉장히 큰 편인데, 그래디언트를 계산할 때마다 소프트맥스 연산에 드는 계산량이 \(K\)에 비례하기 때문에 굉장히 비효율적이다. 따라서 다음 포스팅에서 소개할 계층적 소프트맥스, 네거티브 샘플링 등을 도입하여 계산량을 줄이고자 한다.
다음 포스팅 : Word2Vec (Skip-gram) 모델의 개선 기법
Leave a comment