[책 요약] 밑바닥부터 시작하는 딥러닝2-Chapter 3. word2vec

추론 기반 기법과 신경망

  • 앞장에서 배운 PPMI처럼 단어의 등장 횟수를 세는 방식은 통계기반 방법이라면, word2vec은 데이터를 통해 학습하고 그 결과를 토대로 추론 하는 추론 기반 기법이다.

통계 기반 기법의 문제점

  • 단어의 동시발생 행렬을 만들고 그 행렬에 SVD를 적용하여 밀집벡터를 얻을 수 있다.
  • 하지만 현업에서 다루는 말뭉치의 어휘 수는 어마어마하다. 100만개라고 해도 행렬의 차원이 ‘100만 X 100만’이 되므로 이러한 행렬을 실제로 다루는 것은 현실적이지 않다.
SVD를 n x n 행렬에 적용하는 비용은 \(O(n^3)\)이다.
  • 통계 기반 기법은 말뭉치 전체의 통계를 이용해 단 1회의 처리 만에 분산 표현을 얻는다.(배치)
  • 한편, 추론 기법에서는 미니배치로 학습하는 것이 일반적이다.(미니배치)

추론 기반 기법 개요

  • 추론 기반 기법에서는 당연히 ‘추론’이 주된 작업이다. 추론이란 맥락이 주어졌을 때 “?”에 무슨 단어가 들어갈지를 추측하는 작업이다

you ? goodbye and I say hello

  • ‘모델 관점’에서 보면 추론 문제는 다음과 같다.

  • 추론 기반 기법에서는 모델(신경망)에 맥락을 입력 받아 각 단어의 출현 확률을 출력한다.
  • 이러한 틀 안에서 말뭉치를 사용해 모델이 올바른 추측을 내놓도록 학습시킨다.
  • 추론 기반 기법도 통계 기반 기법처럼 분포 가설에 기초한다.

신경망에서의 단어 처리

  • 신경망에 단어를 그대로 입력할 수 없기에 ‘고정 길이의 벡터’로 변환해야 한다.
  • 이때 사용하는 대표적인 방법이 one-hot 벡터이다. 벡터의 하나만 1이고 나머지는 모두 0인 벡터를 말한다.

  • 원핫 벡터를 만들기 위해선 총 어휘 수만큼의 원소를 갖는 벡터를 준비하고 인덱스를 통해 1, 0을 표시한다.
  • 이처럼 단어를 고정 길이 벡터로 변환하면 우리 신경망의 입력층은 다음처럼 뉴런의 수를 고정할 수 있다.

  • 입력층의 뉴런은 총 7개이며, 이 7개의 뉴런은 차례로 7개의 단어들에 대응한다.
  • 즉, you가 신경망에 입력 될 때는 [1, 0, …0] 이 입력되고, say가 입력 될 때는 [0, 1, 0, …, 0]이 입력된다. (아직 you say hello 처럼 여러 단어가 한번에 들어가는 설명은 나오지 않음)
  • 단어의 갯수가 7개이고 출력이 3인 신경망을 표현한 그림(편향은 생략)

  • 위 그림에서 헷갈리면 안되는게, 이것은 단어 임베딩이므로 ‘you say good bye …’ 라는 문장이 한번에 들어가는게 아니라 저 중에서 1개의 단어만 들어가는 것임에 유의해야한다.
  • 결국 입력 값이 벡터이지만 하나의 원소만 1이라는건 W 행렬에서 한개의 행만 뽑아내는 것과 마찬가지의 결과가 된다.

  • 내 생각
    • 여기까지만 봐도 어떤 하나의 단어가 one-hot vector로 표현이 되고 다시 W의 행에 해당하는 벡터로 치환됨으로써 단어가 벡터로 표현되는 것을 볼 수 있다.
    • 단어 → one-hot → W의 1개의 Row
    • 요부분에 대해서 이런 추가 설명이 더 들어갔으면 어땠을까 하는 생각이 든다. 처음 보는 사람은 살짝 이해가 안됬을 것 같다.

단순한 word2vec

  • word2vec이라는 용어는 원래 프로그램이나 도구를 가리키는데 사용되었으나 이 용어가 유명해지면서, 문맥에 따라서는 신경망 모델을 가리키는 경우도 많이 볼 수 있다. CBOW 모델과 skip-gram 모델은 word2vec에서 사용되는 모델이다.

CBOW 모델의 추론 처리

  • CBOW 모델은 맥락으로부터 타깃을 추측하는 용도의 신경망이다.
  • CBOW 모델의 입력은 맥락이다. 맥락은 “you”와 “goodbye”같은 단어들의 목록이다.
  • CBOW의 신경망 구조를 설명하기에 앞서, CBOW는 앞뒤 단어가 주어지고 가운데 단어를 맞추는 거라고 설명해야 하지 않나?? 너무 갑자기 신경망으로 들어가는데..
  • CBOW 모델의 신경망 구조

  • 입력층이 2개(입력 값이 2개)이고 은닉층, 출력층이 있음
    • 입력층이 2개인 이유는 맥락으로 고려할 단어를 2개로 정했기 때문. N개면 N개의 입력층이 필요
  • 두 입력층에서 은닉층으로의 변환은 똑같은 완전연결 계층($W_{in}$)이 처리
  • 은닉층에서 출력층 뉴런으로의 변환은 다른 완전연결계층($W_{out}$)이 처리
  • 은닉층의 뉴런은 입력층의 값들을 평균한다.
  • 출력층의 뉴런은 전체 vocab 갯수(여기선 7개)만큼이 필요하다. 출력층 뉴런은 각 단어의 ‘점수’를 뜻하며, 이 점수에 softmax를 취하면 등장 확률이 된다.
  • 입력된 단어는 입력층의 \(W_{in}\)의 각 행에 의해서 결정되므로 행의 값이 단어의 분산 행렬 그 자체이다

'you'라는 단어가 입력되면, \(W_{in}\)의 첫번째 행벡터가 \(W_{out}\)으로 입력되는 식. 그러므로 행벡터가 그냥 단어를 대표하는 분산 표현이 된다.

은닉층의 뉴런 수를 입력층의 뉴런 수보다 적게 하는 것이 중요한 핵심이다. 이렇게 해야 은닉층에는 단어 예측에 필요한 정보를 ‘간결하게’ 담게 되며, 결과적으로 밀집 벡터 표현을 얻을 수 있다. 이때 그 은닉층의 정보는 우리 인간은 이해할 수 없는 코드로 쓰여 있다. 바로 ‘인코딩’에 해당한다. 한편 은닉층의 정보로부터 원하는 결과를 얻는 작업은 ‘디코딩’이라고 한다. 디코딩이란 인코딩된 정보를 우리 인간이 이할 수 있는 표현으로 복원하는 작업이다(사실 엄밀한 표현은 아님. 디코딩을 해도 벡터로 표현되기도 하므로).
  • 계층 관점에서 본 CBOW 모델의 신경망 구조(평균을 계산하는 은닉층이 +, x 로 표시됨)

CBOW 모델의 학습

CBOW 모델의 구체적인 예

  • CBOW 모델의 학습에서는 올바른 예측을 할 수 있도록 가중치를 조정하는 일을 한다.
  • 그 결과로 가중치 \(W_{in}\), \(W_{out}\)에 단어의 출현 패턴을 파악한 벡터가 학습된다.
  • 이 모델은 다중 클래스 분류를 수행하는 신경망이다. 따라서 소프트맥스와 교차 엔트로피 오차만 이용하면 된다.
  • CBOW 모델의 학습 시 신경망 구성

softmax 계층과 scross entropy error 계층이 추가됨

word2vec의 가중치와 분산 표현

  • word2vec에서 사용되는 신경망에는 2가지 가중치가 있다. \(W_{in}, W_{out}\)
  • 그리고 이것들이 단어의 의미가 인코딩되어 저장된 벡터라고 생각할 수 있다.

  • 최종적으로 어떤 벡터를 단어의 분산 표현으로 사용하면 좋을까?
    1. \(W_{in}\)
    2. \(W_{out}\)
    3. 둘 다
  • word2vec(특히 skip-gram)에서는 \(W_{in}\)만 사용하는 것이 보편적이다.
    • GloVe에서는 두 가중치를 더했을 때 더 좋은 결과를 얻었다.

학습 데이터 준비

  • 학습에 쓰일 예시로 “You say goodbye and I say hello”라는 한 문장을 이용해보자.

맥락과 타깃

  • word2vec에서 이용하는 신경망의 입력은 ‘맥락’이다. 그리고 그 정답 레이블은 맥락에 둘러싸인 중앙의 단어, 즉 ‘타깃’이다.
  • 다시 말해, 우리가 해야 할 일은 신경망에 ‘맥락’을 입력했을 때 ‘타깃’이 출현할 확률을 높이는 것이다.
    • 쉽게 말해, 양 옆 단어를 주고 가운데 단어를 맞추는 거
  • 맥락과 타깃은 다음과 같이 만들 수 있다.

  • 말뭉치내에서 모든 단어에 대해서 맥락과 타깃을 만들어 낸다(양 끝 단어 제외)
  • 여기서는 맥락을 양 옆 2개의 단어로 설정함(더 길게 만들수도 있음, contexts window size=1)

원핫 표현으로 변환

  • 신경망에 입력을 위해 원핫벡터로 변환해보자.

CBOW 모델의 구현

# 순전파 함수
def forward(self, contexts, target):
    h0 = self.in_layer0.forward(contexts[:, 0])
    h1 = self.in_layer1.forward(contexts[:, 1])
    h = (h0+h1) * 0.5
    score = self.out_layer.forward(h)
    loss = self.loss_layer.forward(score, target)
    return loss
  • contexts는 3차원 넘파이 배열이며, (batch, contexts_length, onehot_length)가 됨
  • CBOW의 역전파 예시

  • softmax with loss 계층의 역전파 출력이 \(\textbf{ds}\)

word2vec 보충

CBOW 모델과 확률

  • 사후 확률은 \(P(A|B)\)로 쓴다. 이는 말 그대로 ‘사건’이 일어난 후의 확률이다. ‘B’라는 정보가 주어졌을 때 A가 일어날 확률’이라고도 해석 할 수 있다.
  • CBOW 모델을 확률 표기법으로 표기해보자. CBOW 모델이 하는 일은 맥락을 주면 타깃 단어가 출현할 확률을 출력하는 것이다.

  • 위의 상황을 수식으로 나타내면 다음과 같다

$$P(w_t|w_{t-1}, w_{t+1})$$

  • 위 식을 이용하면 CBOW 모델의 손실 함수도 간결히 표현 가능하다.
  • cross entropy loss 식은 \(L=-\sum{t_k log \space y_k}\) 이고, \(y_k\)는 k 번째에 해당하는 사건이 일어날 확률이다. \(t_k\)는 정답 레이블이며, 원핫 벡터로 표현된다.
  • 따라서,
    $$L = -log P(w_t|w_{t-1}, w_{t+1})$$
  • CBOW 모델의 손실 함수는 단순히 위 식에 log와 마이너스를 붙인 것이며 이를 음의 로그 가능도(negative log likelihood) 라고 한다.
  • 모든 말뭉치 전체로 Loss를 확장하면,
    $$L = -\frac{1}{T}\sum_{t=1}^T{log P(w_t|w_{t-1}, w_{t+1})}$$

skip-gram 모델

  • skip-gram 모델은 중앙의 단어로부터 주변의 여러 단어를 추측한다.

  • skip-gram 모델의 신경망 구성

  • skip-gram 모델을 확률로 표현하면 다음과 같다.
    $$P(w_{t-1}, w_{t+1}|w_t)$$
  • skip-gram에서 맥락의 단어들 사이에 관련성이 없다고 가정하면 다음과 같이 분해 가능(근데 독립이 아닐텐데??)
    $$P(w_{t-1}, w_{t+1}|w_t) = P(w_{t-1}|w_t)P(w_{t+1}|w_t)$$
  • 이어서 이를 교차 엔트로피 오차에 적용하여 skip-gram 모델의 손실 함수를 유도할 수 있다.
    $$\begin{align}L &= -logP(w_{t_1}, w_{t+1}|w_t)\\ &=  -logP(w_{t_1}|w_t)P(w_{t+1}|w_t)\\
    &= -(logP(w_{t_1}|w_t)+logP(w_{t+1}|w_t))
    \end{align}$$
  • skip-gram vs CBOW
    • 단어 분산 표현의 정밀도 면에서 skip-gram이 더 좋은 경우가 많다.
    • 특히 말뭉치가 커질수록 저빈도 단어나 유추 문제의 성능 면에서 skip-gram이 더 뛰어난 경향을 보인다. skip-gram은 하나의 단어로부터 주변 단어를 예측해야 하므로 CBOW 문제보다 더 어려운 문제를 푼다고 할 수 있기 때문이다(그러니까, 저빈도 단어처럼 데이터가 몇개 없어서 학습이 몇 번 되지 않는 단어는 그 몇번 안되는 기회를 잘 살려야하기 때문에 더 어려운 문제를 푸는 skip-gram이 더 낫다고 봐야 할까)
    • 반면 학습 속도는 CBOW 모델이 빠르다.

통계 기반 vs. 추론 기반

  • 통계 기반은 말뭉치의 전체 통계로부터 1회 학습하여 단어의 분산 표현을 얻는다.
  • 추론 기반은 미니배치 학습을 통해 단어의 분산 표현을 얻는다.
  • 어휘에 추가할 새 단어가 생겨서 단어의 분산표현을 갱신해야 하는 상황을 생각해보면
    • 통계 기반 기법에서는 계산을 처음부터 다시 해야 한다. 동시발생 행렬을 다시 만들고 SVD를 수행하는 작업을 다시 해야 한다.
    • 반면, 추론 기반 기법은 지금까지 학습한 가중치를 초깃값으로 사용하고 새로운 가중치를 추가하여 학습하면 된다.
    • 이런 점에서 추론 기반 기법이 우세하다.
  • 단어의 분산 표현의 성격이나 정밀도 면에서는 어떨까?
    • 통계 기반 기법에서는 주로 단어의 유사성이 인코딩 된다.
    • 추론 기반 기법에서는 유사성은 물론 단어 사이의 패턴까지도 파악이 된다. (king - man + woman = queen이 되는 유명한 예시)
    • 그러나 실제로 단어의 유사성을 정량 평가해본 결과, 의외로 추론 기반과 통계 기반 기업의 우열을 가릴 수 없었다고 한다(Improving distributional similarity with lessons learned from word embeddings, 2015)
    • 또한, 추론 기반 기법과 통계 기반 기법은 서로 관련되어 있다고 함. 구체적으로 skip-gram과 네거티브 샘플링을 이용한 모델은 모두 말뭉치 전체의 동시발생 행렬(실제로는 살짝 수정한 행렬)에 특수한 행렬 분해를 적용한 것과 같다.
      • SVD하고 신경망 학습이 유사하다니.. 당연하면서도 신기하게 느껴진다
    • 이후 추론 기법과 통계 기반 기법을 융합한 GloVe 기법이 등장함. GloVe의 기본 아이디어는 말뭉치 전체의 통계 정보를 손실 함수에 도입해 미니배치 학습을 하는 것임.

정리

  • 추론 기반 기법은 추측하는 것이 목적이며, 그 부산물로 단어의 분산 표현을 얻을 수 있다.
  • word2vec은 추론 기반 기법이며, 단순한 2층 신경망이다.
  • word2vec은 skip-gram 모델과 CBOW 모델을 제공한다
  • CBOW 모델은 여러 단어(맥락)로부터 하나의 단어(타깃)을 추측한다.
  • 반대로 skip-gram 모델은 하나의 단어(타깃)로부터 다수의 단어(맥락)을 추측한다.
  • word2vec은 가중치를 다시 학습할 수 있으므로, 단어의 분산 표현 갱신이나 새로운 단어 추가를 효율적으로 수행할 수 있다.