자연어처리를 위한 Word2Vec

아래 내용은 CS224N 2019 Lecture 1: Introduction and Word Vectors을 참조하였습니다.
관련 논문은 Efficient Estimation of Word Representations in Vector Space을 참고하세요

Word2Vec은 단어를 표현하는 벡터가 단어의 의미를 잘 표현하도록 학습하는 방법입니다.


1. Word Representation

'책', '읽다', '도서관', '산다', '서점' 이렇게 5개의 단어를 가정해 보겠습니다. 이 단어들은 상호 간에 연관성을 가지고 있습니다. 책은 도서관에서 읽고 서점에서 삽니다.

[
  [1, 0, 0, 0, 0],  # 책
  [0, 1, 0, 0, 0],  # 읽다
  [0, 0, 1, 0, 0],  # 도서관
  [0, 0, 0, 1, 0],  # 산다
  [0, 0, 0, 0, 1],  # 서점
]

위와 같이 단어를 one-hot 벡터로 표현한 경우는 모든 벡터들의 내적이 0입니다. 벡터들이 직교한다는 의미입니다. 즉 one-hot 벡터들은 단어들 상호 간의 관계를 표현하지 못합니다.

[
  [0.45, 0.78, 0.25, 0.01, ... ],  # 책
  [0.74, 0.62, 0.24, 0.54, ... ],  # 읽다
  [0.34, 0.97, 0.53, 0.67, ... ],  # 도서관
  [0.43, 0.65, 0.83, 0.87, ... ],  # 산다
  [0.54, 0.75, 0.92, 0.13, ... ],  # 서점
]

그래서 위와 같이 단어를 dense 벡터로 표현하고 이 벡터들이 단어 상호 간의 관계를 잘 표현하도록 학습을 합니다.

학습을 위한 가정은 다음과 같습니다.

  • 단어의 의미는 주변에 자주 나타나는 단어를 통해 알 수 있다. (Distributional semantics)
  • 한 단어가 나타났을 때 주변의 일정한 범위의 단어에 의미가 포함되어 있다.
  • 한 단어가 나타나는 많은 문장을 이용해 단어의 표현을 학습한다.
나는 책을 서점에서 샀다.
우리는 도서관에서 책을 읽었다.
나는 영어책을 집에 놓고 학교에 갔다.
이번에 새로 나온 수학 책이 좋은 것 같다.
요즘 재미있는 소설책은 어떤 것이 있나요?

오늘은 아침밥을 안 먹어서 배가 고프다.
점심밥을 너무 많이 먹어서 배가 부르다.
어제저녁에 먹은 식당 밥이 너무 맛있었다.
다이어트해야 하는데 밥맛이 너무 좋다.
나는 밥보다는 빵이 좋다.

위와 같은 문장에서 '책'과 '밥'의 의미를 주변단어를 통해 유추할 수 있습니다.

wrod2vec-01.png

위의 문장을 학습한 결과 위 그림과 같이 관련이 높은 단어들이 비슷한 벡터를 가지도록 학습하는 것이 목적입니다.


2. Word2Vec

Word2Vec(Mikolov et al. 2013 google)은 단어벡터를 학습하기 위한 framework입니다.

학습을 위한 idea는 다음과 같습니다.

  • 많은 text data (Wiki, book corpus, news, ...)가 존재한다.
  • 모든 단어는 vector로 표현된다.
  • 문장 내에서 위치 t에 대한 중심단어 c와 주변단어 o 가 있다.
  • c에 대해 o가 나타날 확률을 계산하는데 c와 o의 벡터의 유사성을 이용한다.
  • 단어의 벡터를 변경하여 c에 대해 o가 나타날 확률을 최대화 한다.

학습방법은 Skip-gram과 CBOW (Continuous Bag of Words) 두가지 방법이 있습니다.

wrod2vec-02.png

위 그림은 Skip-gram의 예입니다. 하나의 중심단어를 입력으로 여러 주변단어를 예측하는 방식으로 학습을 진행합니다.

wrod2vec-03.png

위 그림은 CBOW의 예입니다. 여러 주변단어를 입력으로 하나의 중심단어를 예측하는 방식으로 학습을 진행합니다.


3. Skip-gram

'I went to the school library'라는 문장을 Skip-gram으로 학습하는 과정을 확인해 보겠습니다. 이때 window size는 2로 주변단어를 왼쪽 단어 2개 오른쪽 단어 2개와의 관계를 학습하도록 하는 경우입니다.

skip-gram-10.gif

위 그림과 같이 왼쪽 첫 번째 단어부터 중심단어를 기준으로 왼쪽 2개 오른쪽 2개와의 관계를 학습합니다. 학습 방법은 중심단어를 입력으로 주변단어를 예측하도록 학습합니다.

# 중심단어 'I'
('went', 'to'),
# 중심단어 'went'
('I', 'to', 'the'),
# 중심단어 'to'
('I', 'went', 'the', 'school'),
# 중심단어 'the'
('went', 'to', 'school', 'library'),
# 중심단어 'school'
('to', 'the', 'library'),
# 중심단어 'library'
('the', 'school'),

위 내용은 'I went to the school library' 문장의 중심단어와 주변단어의 관계를 정리한 결과입니다.

Skip-gram의 목적함수는 다음과 같습니다.

$$ L(\theta) = \prod_{t=1}^T\prod_{-m \le j \le m}^{j \ne 0} p(w_{t+j}|w_t;\theta) $$

위 수식은 Likelihood로서 최대화하는데 목적이 있습니다. 즉 중심단어를 입력으로 주변단어를 예측할 확률을 최대화한다는 의미입니다.

  • $T$: 전체 단어수를 의미합니다.
  • $m$: window size를 의미합니다.
  • $w_t$: 중심단어를 의미합니다.
  • $w_{t+j}$: 주변단어를 의미합니다.

Negative Log Likelihood 수식은 다음과 같습니다.

$$ J(\theta) =-{1 \over T} \log L(\theta)= -{1 \over T} \sum_{t=1}^T\sum_{-m \le j \le m}^{j \ne 0} \log p(w_{t+j}|w_t;\theta) $$

Negative Log Likelihood를 최소화 하게되면 Likelihood가 최대화 됩니다.

이제 위 수식에서 $p(w_{t+1}|w_t;\theta)$를 구해야 합니다. 수식은 아래와 같습니다.

$$ p(o|c) = {exp(v_c \cdot u_o) \over \sum_{w \in V} exp(v_c \cdot u_w)} $$

중심단어를 표현하는 $v$ 벡터와 주변단어를 표현하는 $u$ 벡터의 dot-product를 이용해서 확률분포를 구합니다.

  • $o$: 주변단어를 의미합니다.
  • $c$: 중심단어를 의미합니다.
  • $v_c$: 중심단어를 표현하는 벡터를 의미합니다.
  • $u_o$: 주변단어를 표현하는 벡터를 의미합니다.
  • $V$: 전체 vocabulary의 모든 단어를 의미합니다.
  • $u_w$: 전체 vocabulary의 모든 후보 주변단어벡터를 의미합니다.

위 수식은 아래의 softmax 수식과 비슷합니다. 즉 softmax 함수를 이용해 확률분포를 구할 수 있습니다.

$$ softmax(x_i) = {exp(x_i) \over \sum_{j=1}^n exp(x_j)} = p(x_i) $$

3.1 .수식을 그림으로 표현

위 수식을 그림으로 표현해보겠습니다.

skip-gram-07.png

위 그림은 중심단어벡터를 표현하는 Center Embedding $V$와 주변단어벡터를 표현하는 Outer Embedding $U$를 표현하고 있습니다.

skip-gram-08.png

위 그림과 같이 중심단어벡터 $v_c$와 Outer Embedding을 transpose한 $U^T$와의 행렬곱을 통해 $v_c$와 모든 후보 주변단어 $u_w$와의 dot-product를 구할 수 있습니다. 수식으로 표현하면 다음과 같습니다.

$$ \tilde{y} = v_c U^T $$

skip-gram-09.png

위 그림과 같이 $\tilde{y}$에 softmax를 실행하여 확률분포 $\hat{y}$를 구하고 정답 y와 cross entropy loss를 계산합니다. 수식은 아래와 같습니다.

$$ \begin{equation} \begin{split} CE &= - \sum_{w \in V} y_w \log \hat{y}_w \\ &= - \log \hat{y}_o \\ &= - \log {exp(v_cu_o^T) \over \sum exp(v_cu_w^T)} \end{split} \end{equation} $$

위 수식에서 $y$는 $y_o$는 1이고 나머지는 0이므로 단순하게 표현할 수 있습니다.

이 과정을 많은 단어에 대해서 실행하고 cross entropy loss가 줄어들도록 학습하면 됩니다.

3.2. 학습결과

Word2Vec 학습이 잘 되면 각 단어들은 상호 관계를 벡터공간에서 표현하게 됩니다.

linear-relationships.png

위 그림과 같이 남성-여성의 관계, 동사의 시제의 관계, 나라-수도의 관계등을 벡터공간에서 표현하게 됩니다.


4. 단어벡터 평가

단어벡터의 성능평가방법은 Intrinsic, Extrinsic 크게 두가지로 나눌 수 있습니다.

4.1. Intrinsic

위 학습결과의 그림과 같이 단어벡터 간의 관계와 단어의 의미가 잘 표현되는지를 확인해 보는 방법입니다. 특징은 다음과 같습니다.

  • 단어벡터의 성능을 빠르게 확인이 가능합니다.
  • 단어벡터 시스템을 이해하는 데 도움이 됩니다.
  • 실제 task에 적용했을 때 도움이 될지 불명확합니다.
4.2. Extrinsic

실제 task에 적용해서 성능이 좋아지는 정도를 가지고 평가하는 방법입니다. 특징은 다음과 같습니다.

  • 결과를 확인하는데 많은 시간이 필요합니다.
  • 문제 발생 시 원인이 단어벡터 때문인지 아니면 다른 이유인지 불명확할 수 있습니다.
  • 단어벡터만을 변경해서 성능 향상이 있다면 단어벡터로 인한 성능 향상이라 볼 수 있습니다.