word2vec을 처음 제안한 논문인 Efficient Estimation of Word Representations in Vector Space를 읽고 리뷰하였습니다. 논문에서는 사실 word2vec이라는 표현이 어디에서도 사용되지 않는데, 나중에 알고 보니까 저자인 Mikolov와 그의 구글 팀원들이 배포한 소프트웨어 패키지의 이름이라고 합니다. 이 패키지는 논문에서 구현한 알고리즘을 담고 있기 때문에, 이 툴이 인기를 얻으면서 word2vec이라는 이름이 널리 퍼지게 되었습니다. 번역을 통해 오히려 이해가 어려워지거나, 원문의 표현을 사용하는 게 원래 의미를 온전히 잘 전달할 것이라고 생각하는 표현은 원문의 표기를 따랐습니다. 오개념이나 오탈자가 있다면 댓글로 지적해주세요. 설명이 부족한 부분에 대해서도 말씀해주시면 본문을 수정하겠습니다.
1. Overview
과거 자연어 처리에서는 단어를 원자와 같이 취급하여, 단어 사이에 유사도라는 개념이 없고 그저 어휘 사전의 인덱스로만 표현되었습니다. 이런 방법은 간단하다는 장점이 있고, 많은 양의 데이터로 훈련한 간단한 모델이 적은 양의 데이터로 훈련한 복잡한 모델보다 뛰어난 성능을 가질 수 있게 하였습니다. 대표적인 예시가 통계적 언어 모델링에 사용되는 N-gram 모델입니다.
하지만 이런 간단한 기법은 많은 태스크에서 한계를 갖습니다. 예를 들어 당시 음성 인식이나 기계 번역에 필요한 데이터는 충분히 않았기 때문에 조금 더 발전된 기법이 필요했습니다. 또한 머신 러닝 기법이 발전하면서 복잡한 모델이 더 많은 데이터를 학습할 수 있게 되었고, 복잡한 모델은 단순한 모델의 성능을 뛰어넘기 시작했습니다. 주요 원인은 단어의 분산 표현(distributed representations)을 사용하게 되었기 때문입니다. 지난 논문에서 살펴보았듯이 신경망에 기반한 언어 모델이 N-gram 모델의 성능을 아득히 뛰어넘게 되었습니다.
논문에서는 대규모 데이터셋에서 높은 품질의 단어 벡터를 학습하는 기법을 소개합니다. 저자는 유사한 단어가 가까이 위치할 뿐만 아니라 다양한 측면에서 유사성을 갖는다고 하였습니다. 여기서 저자는 multiple degrees of similarity라는 표현을 사용하였는데, 단어 벡터가 의미적(semantic), 통사적(syntactic) 특징을 잘 반영하기 때문에 단어 벡터간의 거리가 단순히 의미적 유사성만을 나타내지는 않기 때문입니다. 대표적인 예시가 (king) - (man) + (woman)의 결과가 (queen)이 된다는 것인데, 이처럼 단어 벡터가 다양한 의미적, 통사적 관계를 포착하고 있습니다. 여기서 괄호 안의 단어는 벡터화된 단어를 의미합니다.
저자는 단어의 선형적 규칙성을 유지하면서 위 예시와 같은 벡터 연산의 정확성을 최대화하는 새로운 모델 아키텍처를 제안합니다. 또한 단어 벡터의 의미적, 통사적 규칙성을 평가할 수 있는 테스트 세트를 개발하여 제안한 모델이 얼마나 정확하게 규칙성을 학습할 수 있는지를 입증하였습니다. 추가로 모델 훈련 시간과 정확도, 단어 벡터의 차원, 학습 데이터의 양이 어떤 관계를 갖는지를 분석하였습니다.
2. Model Architectures
Latent Semantic Analysis(LSA)와 Latent Dirichlet Allocation(LDA)를 포함하여 단어의 연속적인 표현을 위한 다양한 모델이 제안되었습니다. 여기서는 나아가 단어의 분산 표현을 신경망을 통해 학습하는 방법을 제안합니다.
먼저 모델을 학습에 사용되는 파라미터의 개수를 바탕으로 기존 모델과의 연산 복잡도를 비교합니다. 그리고 연산 복잡도는 최소화하고, 정확도는 최대화하는 방법을 연구합니다. 논문에서 사용된 모델의 훈련 복잡도는 다음 식에 비례합니다.
$E$는 학습 에포크이고, $T$는 학습 데이터셋에 포함된 단어의 개수, $Q$는 모델 아키텍처에 따라 다르게 정의되며 추후 설명하겠습니다. 일반적으로 $E$는 3-50이며 $T$는 최대 10억입니다. 모든 모델은 확률적 경사 하강법(SGD)와 역전파를 사용해 학습되었습니다.
2.1 Feedforward Neural Net Language Model (NNLM)
확률적 피드포워드 신경망 언어 모델(Probabilistic feedforward neural network language model)은 요슈아 벤지오에 의해 제안되었습니다. 이는 입력, 투영(projection), 은닉(hidden)과 출력 레이어로 구성됩니다. 입력 레이어에서 $N$개의 이전 단어들은 각각 1에서 $V$중 하나의 숫자로 인코딩됩니다. $V$는 어휘 사전의 크기입니다. 입력 레이어는 projection layer $P$에 의해 $N \times D$차원으로 투영됩니다. 여기서 projection matrix는 모든 단어에 대해 공유됩니다. 즉 투영에 사용되는 가중치가 공유됩니다. $N$개의 입력만이 항상 활성화되기 때문에 projection layer의 연산은 비용이 적은 편입니다.
하지만 projection layer의 값이 밀집(dense)되어있기 때문에, NNLM 아키텍처에서 projection과 hidden layer 사이의 연산은 복잡합니다. 일반적으로 $N=10$ 일 때, projection layer $P$의 크기는 500에서 2000이고, hidden layer의 크기 $H$는 500에서 1000 정도입니다. 게다가 hidden layer는 어휘 사전 내의 모든 단어에 대해 확률 분포를 계산하여 출력 레이어의 차원이 $V$가 되도록 합니다. 따라서 각 훈련 샘플에 대한 연산 복잡도는 다음과 같이 나타낼 수 있습니다.
여기서 연산량에 가장 큰 영향을 미치는 dominating term은 $H \times V$입니다. 하지만 vocabulary를 이진 트리로 표현하는 등 몇 가지 실용적인 방법이 제안되며 연산에 대한 부담이 줄어들어, 최종적으로 비용 부담이 가장 큰 연산은 $N \times D \times H$가 됩니다.
논문의 모델에서는 어휘가 Huffman binary tree로 표현되는 hierarchical softmax를 사용합니다. Huffman tree는 자주 등장하는 단어에 짧은 바이너리 코드를 할당하고 연산에 사용되는 출력 유닛의 개수를 줄여줍니다. Balanced binary tree의 연산이 $\log_2(V)$로 나타난다면, Huffman tree based hierarchical softmax는 $\log_2(\textrm{Unigram_perplexity}(V))$가 됩니다. 그런데 연산 병목이 $N \times D \times H$에서 발생한다는 점에서 앞서 언급한 내용이 NNLM에 큰 도움은 되지 않지만, 추후 설명될 아키텍처에서는 hidden layer를 갖지 않기 때문에 소프트맥스 정규화의 효율성에 크게 의존하게 됩니다.
2.2 Recurrent Neural Net Language Model (RNNLM)
RNNLM은 context length를 지정해줘야 하는 등 피드포워드 NNLM의 한계를 극복하기 위하여 제안되었습니다. RNN 모델은 projection layer가 없이 입력과 은닉, 출력 레이어만을 갖습니다. RNN 모델은 time-delayed connection을 사용하여 자기 자신에게 hidden layer를 연결하는 재귀 행렬을 갖기 때문에 일종의 단기 기억 능력이 있습니다. RNN 모델의 복잡도는 다음과 같이 정의됩니다.
단어 표현 $D$는 hidden layer $H$와 같은 차원을 간습니다. 여기서도 $H\times V$는 hierarchical softmax를 사용하여 $H\times \log_2(V)$가 되며 대부분의 연산은 $H\times H$에서 발생합니다.
2.3 Parallel Training of Neural Networks
저자는 모델을 대규모 데이터셋으로 훈련하기 위해서 DistBelief라고 불리는 대규모의 분산 프레임워크에서 모델을 구현하였습니다. 이 프레임워크는 같은 모델을 복제하여 병렬적으로 실행할 수 있게 해주며 각 복제는 모든 파라미터를 가지고 있는 중앙 서버를 통해 그라디언트 업데이트를 동기화합니다. 이러한 병렬적인 학습을 위해서 mini-batch asynchronous gradient descent와 Adagrad가 사용되었습니다.
3. New Log-linear Models
앞서 대부분의 연산은 모델의 비선형 은닉 레이어에서 발생함을 확인하였습니다. 비선형 은닉 레이어는 신경망의 분명한 장점이지만 저자는 신경망만큼 정밀하게 데이터를 표현하지는 못하더라도 더 많은 데이터에서 효율적으로 학습할 수 있는 간단한 모델을 탐색하였습니다.
새로운 아키텍처는 두 단계로 학습되는데 먼저, 간단한 모델을 사용하여 연속적인 단어 벡터를 학습하고 N-gram NNLM이 앞에서 학습한 단어의 분산 표현을 사용하여 학습됩니다.
3.1 Continous Bag-of-Words Model
첫 번째로 제안하는 아키텍처는 피드포워드 NNLM과 유사하지만, 비선형 은닉 레이어(non-linear hidden layer)가 제거되었고 모든 단어는 같은 projection matrix를 가질 뿐만 아니라 projection layer를 공유됩니다. 따라서 모든 단어는 평균을 계산하여 같은 position으로 투영됩니다. Order of words가 투영에 영향을 미치지 않기 때문에 이런 아키텍처를 bag-of-words라고 부릅니다. 단어 임베딩에서 order of words는 현재 단어의 표현을 학습하기 위하여 사용하는 단어의 개수를 의미합니다. 예를 들어 order of words가 2인 모델은 bigram을 사용합니다. 또한 이전 단어 뿐만 아니라 이후에 나오는 단어도 사용합니다. 저자는 4개의 이전 단어와 4개의 이후 단어를 입력으로 사용하는 log-linear classifier가 가장 뛰어난 성능을 보임을 발견하였습니다. 이 모델의 복잡도는 다음과 같이 나타낼 수 있습니다.
저자는 이 모델이 일반적인 bag-of-words 모델과 다르게 문맥에 대한 연속적인 분산 표현을 사용하기 때문에 CBOW라고 명명하였습니다. 입력과 투영 레이어 사이의 가중치 행렬이 모든 단어의 위치 대해 공유된다는 점이 핵심입니다.
3.2 Continuous Skip-gram Model
두 번째 아키텍처는 CBOW와 비슷하지만 문맥을 바탕으로 현재 단어를 예측하는 대신, 문장 내의 다른 단어를 바탕으로 classification을 최대화합니다. 조금 더 엄밀하게는 현재 단어를 log-linear classifier의 입력으로 사용하여, 해당 단어 이전과 이후 특정 범위에 등장할 단어들을 예측합니다. 이 범위를 늘리면 단어 벡터의 품질도 좋아지지만, 연산 복잡도도 따라서 증가합니다. 일반적으로 멀리 떨어진 단어보다는 문장 내에서 가까이 위치한 단어가 연관성이 높을 것이므로, 멀리 있는 단어에는 더 작은 가중치를 할당하였습니다. 이 아키텍처의 연산 복잡도는 다음과 같습니다.
$C$는 단어 간의 최대 거리입니다. 만약 $C=5$라면, 각 단어에 대해 $<1; C>$범위에서 임의로 $R$을 선택하고, 입력 단어의 이전과 이후의 $R$개의 단어를 레이블로 사용합니다. 따라서 현재 단어를 입력으로, $R+R$개의 단어를 출력으로 하여 $R\times2$번의 단어 분류를 수행합니다. 실험에서는 $C=10$을 사용하였습니다.
4. Results
여러 단어 벡터의 성능을 평가하기 위해서 이전 연구에서는 각 단어와 가장 유사한 단어들을 보여주는 방식을 사용했습니다. 이런 방식은 France와 Italy, 그리고 몇 개의 나라들이 비슷하다는 것을 보여줍니다. 그런데 이 벡터를 더 복잡한 유사도 측정에 사용하는 것은 더 어려운 문제입니다. 예를 들어 biggest와 big의 관계를 보고 small은 어떤 단어에 대응하는지를 찾는 문제입니다.
놀라운 점은 간단한 대수적 연산을 통해 이러한 문제의 답을 찾을 수 있습니다. 예를 들어서 위 질문에 대한 답은 단순히 $X=\textrm{vector(biggest)}-\textrm{vector(big)}+\textrm{vector(small)}$을 통해 계산될 수 있습니다. 이후 벡터 공간에서 $X$와 코사인 거리상 가장 가까운 단어를 찾습니다. 모델이 충분히 잘 훈련되었다면, 이런 방법으로 정답 smallest를 찾을 수 있었습니다.
또한 저자는 고차원 단어 벡터를 대규모 데이터에서 학습하면 단어 간의 미묘한 의미적 관계도 포착할 수 있음을 발견하였습니다. 이렇게 의미적 관계를 갖는 단어 벡터는 많은 NLP 태스크에서 유용하게 사용될 것입니다.
4.1 Task Description
저자는 단어 벡터의 품질을 평가하기 위해 다음 표와 같이 다섯 개의 의미 이해 문제와 아홉 개의 구문 이해 문제로 구성된 테스트 세트를 정의하였습니다. 각 카테고리에서 문제는 두 가지 단계를 걸쳐 제작되었는데 먼저 유사 단어 쌍을 직접 목록화하였고 , 두 개의 단어 쌍을 연결하여 문제를 제작하였습니다. 예를 들어 저자는 68개의 미국의 도시와 소속된 주에 대한 목록을 만들고, 여기서 임의로 두 개를 선택하여 2500개 정도의 질문을 제작하였습니다. 테스트 세트에는 하나의 토큰으로 이루어진 단어만을 포함하였습니다. 예를 들어 New York은 포함되지 않습니다.
각 질문 유형은 개별적으로 정확도를 평가하였습니다. 만약 연산 결과 가장 가까운 단어가 질문의 정답과 같을 경우만 정답 처리하였습니다. 따라서 동의어는 오답으로 판정됩니다. 모델은 형태론(morphology)를 이해하지 못하기 때문에 정답률이 100%에 이르기는 사실상 불가능에 가깝습니다. 하지만 저자는 단어 벡터의 유용함은 여기서 측정한 정확도와 유의미한 상관관계가 있을 것이라고 생각하였습니다.
4.2 Maximization of Accuracy
학습에는 약 60억 개의 토큰을 포함하는 Google News 말뭉치를 사용하였습니다. Vocabulary size는 백만 개의 빈출 단어로 제한하였습니다. 여기서 데이터의 양과 벡터의 차원은 모두 정확성에 영향을 미칠 것이기 때문에 최적화 문제가 발생합니다. 최적의 선택지를 찾기 위하여 저자는 먼저 데이터의 일부를 학습에 사용하였고 어휘 사전의 크기는 3만개로 제한하였습니다. 이에 대한 실험 결과는 다음과 같습니다.
특정 지점 이후에는 차원과 데이터를 각각 늘리는 것이 큰 의미를 갖지 않습니다. 따라서 저자는 벡터의 차원과 학습 데이터의 양을 함께 늘리는 방법을 사용하였습니다. 이러한 결정은 사소해보일 수도 있지만, 이전 연구에서는 벡터의 차원을 늘리기보다는 더 많은 학습 데이터를 사용하는 방법이 주로 사용다는 점에서 의미가 있습니다.
4.3 Comparison of Model Architecture
저자는 같은 학습 데이터와 똑같이 640 차원을 갖는 단어 벡터를 학습한 서로 다른 모델 아키텍처를 비교하였습니다. 실험 결과는 다음 표와 같습니다. NNLM 벡터는 RNNLM 보다 훨씬 성능이 좋은데, RNNLM의 단어 벡터는 non-linear hidden layer와 직접적인 연결이 없다는 점을 고려하면 당연한 결과입니다. CBOW는 NNLM에 비해 syntactic task에서 성능이 훨씬 뛰어났고, Skip-gram은 Semantic task에서 성능이 매우 뛰어났습니다.
다음으로 저자는 여러 모델을 하나의 CPU만을 사용하여 훈련한 후 공개된 단어 벡터들과 성능을 비교하였습니다. 그 결과는 다음과 같습니다. CBOW 모델은 Goole News 데이터의 일부로 약 하루 동안 훈련되었고,Skip-gram의 훈련 시간은 약 3일 정도였습니다.
추가 실험을 위해 한 에포크만 학습한 모델과의 비교도 수행하였습니다. 모델을 두 배 많은 데이터로 학습하는 것은 같은 데이터를 세 번 학습하는 것과 비슷하거나 더 나은 결과를 보였습니다.
4.4 Large Scale Parallel Training of Models
이전에 언급했듯이 저자는 여러 모델을 분산 프레임워크인 DistBelief에서 구현하였습니다. 다음은 이에 대한 실험 결과입니다. 데이터 센터의 기기들은 여러 태스크에서 공동으로 사용되고, 사용량은 조금씩 변동될 수 있으므로 CPU 코어의 수는 추정한 값입니다.
4.5 Miscrosoft Research Sentence Completion Challenge
Miscrosoft Research Sentence Completion Challenge는 언어 모델링과 다른 NLP 기법의 발전을 위하여 제안된 태스크입니다. 이 태스크는 1040개의 문장에서 누락된 하나의 단어를 다섯 개의 보기 중에서 선택하는 과제입니다. 저자는 Skip-gram 아키텍처를 사용하였습니다. 먼저 640 차원을 갖는 모델을 500만 개의 단어로 훈련하였습니다. 먼저 unknown word를 입력으로 하여 테스트 세트의 각 문장에 대한 점수를 계산하고, 주변 단어를 예측하였습니다. 최종 점수는 개별 예측의 합이며, 이 점수를 사용하여 가장 그럴듯한 문장을 선택하였습니다. 실험 결과는 다음과 같습니다. Skipgram 모델이 LSA similarity보다 나은 성능을 보이지는 않지만, RNNLM과의 가중합을 계산하여 사용할 경우 새로운 SOTA 결과를 달성할 수 있었습니다.
5. Examples of the Learned Relationships
저자는 두 단어 벡터의 차이로 관계를 정의하고, 한 벡터에 이를 더한 결과를 확인하였습니다. 예를 들어 Paris - France + Italy = Rome과 같은 결과를 확인할 수 있었습니다. 논문에서 사용한 정확도는 exact match만을 고려하였기 때문에 60% 정도밖에 되지 않습니다. 하지만 이를 통해 더 많은 데이터와 더 큰 차원으로 학습된 단어 벡터는 더 뛰어난 성능을 보일 것이라고 생각하였습니다. 또한 다른 하나가 아닌 다른 여러 개의 단어 벡터와의 관계를 정의하면 정확도를 더욱 향상할 수 있다고 하였습니다. 마지막으로 벡터 연산을 통해 다른 태스크를 해결할 수도 있다고 언급하였습니다. 예를 들어 여러 개의 단어의 평균을 계산한 후, 거리가 가장 먼 하나의 단어를 out-of-the-list 단어로 정의할 수 있습니다. 이와 같이 단어 벡터를 이용한 다양한 기법이 만들어질 수 있고, 여러 태스크에서 응용될 수 있음을 강조하였습니다.
6. Conclusion
저자는 논문의 연구를 통해 다양한 모델에서 학습한 단어의 벡터 표현의 품질을 의미, 통사적 이해를 묻는 여러 태스크에서 평가하였습니다. 실험을 통해 피드포워드 신경망이나 순환 신경망과 같은 모델에 비해 매우 간단한 모델 아키텍처만으로 높은 품질의 단어 벡터를 학습할 수 있음을 발견하였습니다. 또한 연산 복잡도도 훨씬 낮기 때문에 높은 정확도를 보이는 고차원 단어 벡터를 더 많은 데이터셋을 통해 학습할 수 있습니다. 저자는 DistBelief 분산 프레임워크를 사용하여 CBOW와 Skip-gram 모델을 일 조(trillion)개 이상의 단어를 갖는 말뭉치에서도 학습할 수 있을 것으로 기대합니다.
7. Further Thinking
유명한 정적 임베딩 기법 중 하나인 word2vec을 제안한 논문을 드디어 리뷰하게 되었습니다. word2vec에 사용된 개념을 최초로 제안한 논문이긴 하지만, 이와 관련된 연구가 이후 여러 논문에서 계속해서 이루어졌습니다. 여기서는 간단하게 단어 임베딩을 학습하는 두 가지 알고리즘인 CBOW와 Skip-gram을 제안하였습니다. 지난 논문에서부터 계속해서 등장하는 개념 중 재밌는 것은 연산량에 대한 것입니다. 이전에 리뷰했던 contextual representations에 대한 논문은 특별히 연산 효율에 대한 분석이 언급되지 않았던 것 같은데, 사실상 임베딩에 대한 개념을 최초로 도입한 A Neural Probabilistic Language Model 논문에 이어 이번 논문에서도 연산 효율에 대한 언급이 계속해서 등장합니다. 아마 당시는 딥러닝의 물결이 새롭게 시작된 지 오래 되지 않았고, 지금에 비해서 하드웨어의 성능이 좋지 않은 편이었기 때문에 모델 성능을 조금 포기하더라도 연산 효율을 고려해야 했기 때문이 아닐까 싶습니다. 실제로 이번 논문에서는 성능을 포기하고 연산 효율을 챙긴다는 표현이 직접적으로 언급되기도 했습니다. NLP와 임베딩에 관한 개념을 계속해서 공부하면서 어느 시점부터 사실상 하드웨어 성능의 문제에서 벗어나게 되었는지를 알아보는 것도 새로운 탐구 주제가 될 것 같습니다.
댓글