본문 바로가기

AI/NLP Paper

[NLP] Efficient Estimation of Word Representations in Vector Space(Word2Vec) 리뷰

Abstract

이 논문에서는 아주 큰 데이터셋에 있는 단어의 연속적인 벡터 표현을 계산하는 새로운 모델 구조를 제안합니다.

 

이는 이 전의 모델에 비해 훨씬 적은 계산 양에도 불구하고 정확도에서 큰 성능 향상이 있었습니다. 

 

나아가 syntactic, semantic 단어 유사도 측정 부분에서 state-of-the-art 성능을 달성했습니다.

 

Introduction

이전의 많은 NLP 시스템은 단어를 아주 작은 단위(atomic units)로써 다뤘습니다. 여기에 단어 사이의 유사성에 관한 개념은 없었습니다.

 

이러한 방식에는 단순하고, 강건하다는 장점과 단순한 모델이 많은 양의 데이터로 학습을 진행했을 때가 복잡한 모델이 적은 데이터로 학습했을 때 보다 성능이 좋은 것이 관찰됐습니다.

 

하지만, 이런 단순한 기술들은 다양한 task에서 한계가 존재하고 그러한 문제의 해결에는 기술의 scaling up만으로 진전이 없는 상황이 있습니다. 

 

이에 논문에서는 더 향상된 기술에 초점을 맞추려 했고, 최근에 단어의 분산 표현을 사용하면서 복잡한 모델을 더 큰 데이터셋에 훈련시킬 수 있게 됨으로써 성능이 향상된 사실을 알게 되었습니다.

 

Goals of the Paper

논문의 주요 목표는 거대한 데이터셋에 있는 수많은 단어를 이용해 고품질의 단어 벡터를 학습할 수 있는 기술을 소개하는 것입니다. 

 

고품질의 워드 벡터는 주변 단어의 유사성뿐 아니라 단어가 다양한 유사성(multiple degrees of similarity)을 가질 수 있다는 것을 알려줍니다.

 

또한, 이러한 단어 표현이 구문론적 규칙의 유사성도 찾아낸다는 것을 알게 되었습니다. 

 

그리고 $vector("king") - vector("man") + vector("woman") = vector("queen")$와 같이 단어 벡터 사이의 연산을 통해 유사한 단어 벡터를 찾을 수 있다는 것도 알게 되었습니다.

 

Model Architectures

이미 잘 알려진 LSA(Latent Semantic Analysis), LDA(Latent Dirichlet Allocation)처럼 단어의 연속적 표현을 추정하기 위한 모델은 많이 제안되었습니다.

 

이 논문에서는 신경망을 통해 단어의 분산 표현을 학습하는 것에 초점을 둡니다. 이는 이미 LSA보다 단어 사이의 선형적인 규칙을 잘 보존한다고 알려졌고, LDA는 큰 데이터에서 너무 많은 계산 양을 필요로 하기 때문입니다.

 

먼저 모델끼리 계산 복잡도에 대한 비교를 하기 위해 간단하게 계산 복잡도를 정의해야 합니다. 

 

여기서는 모델의 계산 복잡도는 모델이 훈련을 통해 학습해야 하는 파라미터의 수로 정의했습니다.

 

$계산 복잡도(O) = E \times T \times Q$

  • $E$ = 훈련 에폭(epoch) 수, 보통 3~50
  • $T$ = 훈련 단어 개수, 최대 10억까지 올라감
  • $Q$ = 각 모델의 architecture에 따라 추가적으로 정의

Feedforward Neural Net Language Model(NNLM)

https://wikidocs.net/45609

  • $N$ = input number
  • $D$ = word vector dimension
  • $V$ = vocabulary size
  • $H$ = hidden layer size

NNLM에는 input, projection, hidden, output layer가 있습니다.

 

input layer에서는 N개의 이전 단어들이 원-핫 인코딩 되어 있습니다.

 

들어온 input vector들은 룩-업 테이블을 통과하여 각 D차원의 벡터로 바뀌고 투사층에 concatenate 되어 $N \times D$형태의 Projection layer를 만듭니다.

 

이후 Projection layer에 새로운 weight matrix $W_H (D \times H)$를 곱한 뒤 activation function을 통과하여 hidden layer를 생성합니다. 

 

이때의 계산 복잡도는 다음과 같습니다.

$$Q = N \times D + N \times D \times H + H \times V$$

여기서 가장 영향을 크게 끼치는 부분은 $H \times V$입니다. 

 

하지만 계층적 소프트맥스 함수(hierarchical versions of the softmax)를 사용하면 계산량이 $H \times log_2(V)$까지 감소하게 되고, 따라서 대부분의 계산 복잡도는 $N \times D \times H$에서 발생합니다.

 

Recurrent Neural Net Language Model(RNNLM)

RNN은 얕은 신경망(shallow neural network)에 비해 좀 더 복잡한 패턴을 효율적으로 표현할 수 있습니다.

 

RNN은 투사층이 없고 input, hidden, output layer로만 이루어져 있습니다.

 

RNN은 short term memory의 형태를 띠는데, 이는 과거로부터의 정보가 현재 단계의 input과 이전 time step의 hidden state를 기반으로 업데이트된 hidden layer state로 표현될 수 있다는 뜻입니다.

 

훈련 복잡도는 아래와 같습니다.

$$Q = H \times H + H \times V$$

여기서 hidden layer $H$와 word representation $D$는 동일한 차원입니다. 또한 $H \times V$는 계층적 소프트맥스를 이용하여 $H \times log_2(V)$로 줄어들게 됩니다. 따라서 대부분의 계산 복잡도는 $H \times H$에서 발생합니다.

 

New Log-linear Models

이번에는 단어의 분산 표현을 학습할 때 계산 복잡도를 최소화하기 위한 2개의 새로운 모델 architecture를 소개합니다.

 

이 전 section에서 대부분의 복잡도는 비선형 히든 레이어에서 생겨났습니다.

 

비선형 히든 레이어가 신경망을 매력적으로 보이게 할 수도 있지만, 논문에서는 더 많은 데이터를 효율적으로 훈련할 수 있는 단순한 모델을 연구하기로 했습니다.

Continous Bag-of-Words Model

CBOW모델은 비선형 hidden layer가 없습니다.

 

이때의 훈련 복잡도는 $Q = N \times D + D \times log_2(V)$가 됩니다.

 

이 모델은 기본적인 bag of words 모델과 다르게 context의 연속적인 분산 표현을 사용합니다.

 

논문에서는 모델의 자세한 부분이 나오지 않아서 전에 따로 정리한 게시물과 더 자세한 설명이 있는 블로그를 링크로 남기겠습니다!

 

Continous Skip-gram Model

이 모델은 CBOW와 비슷하지만, 주변 단어를 이용하여 중심 단어를 예측하는 것이 아니라 중심 단어를 이용하여 특정 범위에 있는 앞, 뒤의 단어를 예측합니다.

 

이때 단어를 예측할 범위를 늘리면 워드 벡터의 결과가 좋아지지만 계산 복잡도도 증가하게 됩니다. 또한, 단어 예측 시 멀리 떨어진 단어는 현재의 단어와 연관성이 떨어지기 때문에, 멀리 있는 단어에는 적은 가중치를 주게 됩니다.

 

이 모델의 계산 복잡도는 $Q = C \times (D + D \times log_2(V))$입니다.

 

여기서 $C$는 단어의 최대 거리로, 현재 단어에서 얼마만큼 떨어진 단어까지 예측할 것인가에 대한 값입니다.

 

[1, C)의 범위에서 랜덤 하게 $R$을 뽑고, 현재 단어에서 이전 $R$개, 이후 $R$개의 단어를 예측합니다.

 

 

Results

단어 벡터의 quality를 비교할 때 가장 유사한 단어를 찾는 것이 대부분이었습니다.

 

우리는 France라는 단어와 Italy라는 단어가 어떤 나라의 이름을 나타낸다는 점에서 유사하다는 것을 알기 쉽습니다. 하지만 좀 더 복잡한 유사성 찾기 문제는 어려운 문제입니다.

 

예를 들면 "biggestbig이 유사한 단어라고 할 때, small과 유사한 단어는 무엇인가요?"와 같은 질문에 답을 하는 문제입니다. 

 

놀랍게도 이러한 질문에 대한 답은 단어 벡터를 이용한 간단한 수학적 계산을 통해 구할 수 있습니다.

 

$X = vector("biggest") - vector("big") + vector("small")$과 같이 벡터 $X$를 구하고, 코사인 거리를 이용해 벡터 공간에서 $X$와 가장 가까운 벡터를 찾으면 됩니다.

 

Task Description

먼저 성능 평가를 위해 5종류의 semantic questions, 9종류의 syntactic questions를 포함하는 테스트 셋을 만듭니다.

 

정확도는 전체 질문 type에 대한 정확도와, 각 질문 타임에 대한 개별 정확도를 구했습니다.

 

Maximization of Accuracy

훈련에는 Google News corpus를 시용했습니다. 

 

총 60억 개의 토큰이 있고 단어장의 크기는 1백만 개로 제한했습니다.

 

전체 데이터에 대한 성능을 확인하기 전에 먼저 최적의 모델을 찾아야 하기 때문에 데이터의 일정 개수만 사용하여 테스트를 진행했습니다.

 

표에서 차원을 늘리거나 훈련 데이터의 양을 늘리면 성능이 올라가는 모습을 보이고 있지만, 어느 시점 이후로 둘 중 하나만을 추가하게 되었을 때(차원 고정하고 데이터만 늘림) 성능 향상의 정도가 감소하는 양상을 보였습니다.

 

때문에 벡터의 차원과 데이터의 양을 같이 증가시킬 필요가 있다는 것을 알 수 있었습니다. 

 

Comparison of Model Architectures

이번에는 동일한 조건을 가지고 모델별 성능을 비교해보겠습니다.

 

결과를 보면 RNN을 이용해 만든 단어 벡터는 syntactic question에서 훨씬 좋은 모습을 보입니다.

 

CBOW는 NNLM보다 syntactic task에서는 성능이 좋았지만, semantic task에서는 거의 비슷합니다.

 

Skip-gram은 CBOW보다 syntactic에서 약간 낮은 성능을 보이지만(그래도 NNLM 보다는 좋습니다), semantic task에서 다른 어떤 모델보다 훨씬 좋은 성능을 보입니다.

 

Table 4는 개별 task의 정확도를 비교하는 게 아니라 전체 정확도를 비교한 표입니다.

 

그리고 아래의 표는 에폭 수에 따른 결과 비교입니다.

결과를 보면 같은 조건이면 3 에폭이 성능이 더 좋습니다. 하지만 에폭수가 적어도 고차원 벡터이거나 훈련 데이터의 수가 많으면 성능이 더 좋아지기도 합니다.

 

Large Scale Parallel Training of Models

DistBelief distributed framework를 이용해 병렬 처리를 했더니 훈련 시간은 비슷하지만 성능이 훨씬 향상된 것을 볼 수 있습니다.

 

Microsoft Research Sentence Completion Challenge

Microsoft Sentence Completion Challenge는 문장 중간에 단어가 빠져있는 문장이 주어집니다. 그리고 문장과 가장 잘 어울리는 단어를 예측하는 문제입니다.

 

표를 보면 Skip-gram만 사용했을 때는 성능이 그렇게 좋지 않습니다. 하지만 RNNLM과 weighted combination을 했더니 58.9%의 정확도로 sota를 달성했습니다.

 

Examples of the Learned Relationships

앞에서 설명한 적 있던 단어 벡터들 간의 수학적 계산을 통해 단어를 예측하는 task와 관련된 결과가 Table 8에 있습니다.

 

정확도가 꽤나 좋아 보이지만, 사실 accuracy metric을 이용하면 대략 60%밖에 되지 않습니다.

 

성능 향상을 위한 방법으로는 2가지 정도가 있습니다.

 

  1. 많은 데이터, 더 많은 차원의 벡터 이용
  2. 관계를 나타내는 예제를 더 많이 주는 방법 (약 10개의 예제를 줬더니 성능이 10% 정도 올랐음)

이 것 말고도 단어 리스트의 평균 벡터를 계산해서 가장 멀리 떨어진 단어를 찾는 out-of-the-list word selection에 대해서도 좋은 정확도를 보였습니다.

 

Conclusion

CBOW와 skip-gram이라는 새로운 word embedding 학습 방법을 제안했습니다.

 

기존의 여러 model들에 간단한 구조의 모델을 이용하여 계산 복잡도를 크게 줄이면서 양질의 워드 벡터를 학습할 수 있다는 것을 봤습니다.

 

또한 word embedding vector의 syntax, semantic 성능을 측정할 수 있는 새로운 dataset을 제시했습니다.