Word2Vec 모델 기초 (1) - 개념 정리

챗봇을 만들어 볼 생각으로 많은 문서를 뒤졌다.
챗봇을 만드는 방법에는 여러 가지가 있지만,
대부분은 페이스북, 구글, 아마존, 마이크로소프트 등에서 제공하는 프레임웍을 사용하도록 되어 있었다.
대단한 챗봇을 만들 생각이 애초에 없었으므로
매우 어설프게 흉내만 내도 된다고 생각하고 있었는데
소스코드 수준에서의 챗봇은 찾기 힘들었다.

챗봇을 만들기에 앞서
여러 슬라이드를 보면서 배운 얕은 지식으로 보건데
word2vec, seq2seq, rnn 등의 기술은 반드시 포함되어야 하는 것 같다.

일단 첫 번째 작업으로
word2vec 알고리즘을 공부하려고 찾아보니
소스코드는 있는데.. 이것에 대한 설명이 많이 부족했다.
텐서플로우에서 word2vec 알고리즘 구현으로 가장 많이 알려진
word2vec_basic.py 파일을 분석해서 정리했다.

내용이 너무 많아서 여러 개의 문서로 나누어서 정리한다.
여기서는 개념 정리와 같은 기본적인 내용을 다루어 본다.

---------------------------------------------

참고 사이트 정리

  • word2vec 관련 이론 정리
    word2vec 모델을 이해하는데 필수적인 여러 가지 알고리즘을 일목요연하게 정리하고 있다.
    이 문서에서 사용되는 설명의 절반 이상을 이 사이트에서 참조, 정리했다.
  • word2vec 모델 설명
    텐서플로우 코리아에서 번역해 놓은 word2vec 모델에 대한 한글 설명.
    이곳에 관련 seq2seq를 비롯한 관련 설명을 함께 볼 수 있다.
  • word2vec_basic.py 원본 소스코드
    github에 올려놓은 소스 코드. word2vec 폴더에 여러 파일이 함께 있다.
  • word2vec, t-SNE 설명(최근우)
    좋은 설명과 더불어 mnist 데이터를 tSNE로 표현하고 있다. 그 외에도 머신러닝 관련해서 좋은 글이 많이 있다.
  • 텐서플로우를 이용해 자연어를 처리하기 – Word Embedding(Word2vec)
    솔라리스의 인공지능 연구실이라는 이름의 사이트로, 텐서플로우 코리아에서 번역해 놓은 문서를 좀더 친절하게 정리해 놓았다.
    많은 차이가 있지는 않지만, 번역이 좀더 자연스럽다. 그리고, word2vec_basic.py 원본 소스코드에 주석을 달아놨다.
  • 딥러닝 단어사전 - 기초 개념
    Wizard's Note라는 이름의 사이트로, 단어에 대한 설명 외에도 해외 논문을 번역해 놓은 좋은 글들이 많이 있다.

---------------------------------------------

용어 정리

  • Word Embedding
    고차원의 데이터를 그보다 낮은 차원으로 변환하면서 모든 데이터간의 관계가 성립되도록 처리하는 과정을 말한다.
    컴퓨터는 숫자만 인식할 수 있고, 한글이나 그림 등의 컴퓨터가 다루는 모든 것들은 반드시 숫자로 변환되어야 한다.
    Word Embeddins To Vector를 직역하면 "단어를 벡터(숫자)로 삽입하기" 정도가 된다. 다시 말해, 문자로 이루어진 단어를 숫자로 변환하는 것을 word embedding이라고 부른다.
    단어 자체를 아스키코드나 유니코드로 처리해서 지금까지 잘 사용해 왔지만, 이것만 갖고는 의미를 추론할 수가 없다.
    왕과 여왕이 관련 있는 단어이고, 왕은 남자, 여왕은 여자라는 사실을 인지하지는 못한다. 왕에서 남자를 빼면 여왕이 될 수도 있는데, 이걸 하고 싶은 것이다. 수없이 많은 단어들 중에서 '파이썬'이라는 단어와 가까운 단어가 무엇인지 알고 싶기 때문에 단어를 숫자로 변환할 필요가 있었다.
    word embedding에는 초기 모델인 NNLM과 RNNLM이 있고, 최근에 발표됐고 현재 가장 많이 사용하는 Word2Vec 모델은 CBOW와 Skip-Gram 모델을 사용해서 학습되어진다.
    word embedding 프로세스에는 신경망, 차원감소, 확률적 모델, 문맥상 표현 등의 여러 가지 처리 과정들이 포함된다.

  • Word2Vec 모델
    단어를 계산에 적용할 수 있는 숫자로 변환해서 다음에 올 단어를 예측하는 모델이다. 다음 단어를 예측하기 위해 Word Embedding을 구현해야 하는데, CBOW 또는 Skip-Gram 알고리즘을 사용한다.
    구글의 연구원인 Tomas Mikolov와 Kai Chen, Greg Corrado, Jeffrey Dean이 작성한 논문인 "Efficient Estimation of Word Representations in Vector Space(백터공간상에서 단어 의미의 효율적인 추정)"에서 제안한 알고리즘을 말한다. 기존의 알고리즘에 비해 자연어 처리(Natural Language Process)에서 엄청난 향상을 가져왔다. 변환된 벡터가 단순한 수학적 존재 이상의 복잡한 개념 표현을 넘어 추론까지도 쉽게 구현할 수 있다는 점에서 대단한 의미를 갖는다.

  • Vector Space Models(VSMs)
    자연어 처리(NLP) 에서 오랫동안 사용되어진 방법으로, 같은 컨텍스트에 있는 단어는 같은 semantic meaning을 공유한다고 가정한다. 이런 가정을 Distributional Hypothesis라고 한다. 이런 가정을 이용해서 자연어 처리를 하는 기법에는 크게 두 가지가 있다.
    Count-Based Methods (e.g. Latent Semantic Analysis)
    어떤 단어가 이웃 단어들과 같이 등장한 횟수를 계산하고 이 통계를 작고 밀도가 높은 벡터로 변환한다.
    Predictive Methods (e.g. Neural Probabilistic Language Models)
    작고 밀도가 높은 embeddings 벡터로 표현된 이웃 단어들을 이용해서 직접적으로 단어를 예측한다. Word2Vec은 가공하지 않은 원본 텍스트로부터 word embedding을 학습하는 계산 효율성이 좋은 predictive 모델이다.

  • 컨텍스트(context)
    CBOW와 Skip-Gram 모델에서 사용하는 용어로, "계산이 이루어지는 단어들"을 말한다. 컨텍스트는 구둣점으로 구분되어지는 문장(sentence)을 의미하는 것이 아니라 특정 단어 주변에 오는 단어들의 집합을 의미한다. "the cat sits on the" 컨텍스트가 있다면, sits라는 단어 양쪽으로 2개의 단어들이 더 있는데, 이들 단어를 모두 합친 5개의 단어가 컨텍스트가 되는 것이다. "the cat sits on the" 뒤에는 'mat'라는 추가 단어가 올 수 있지만, 컨텍스트에는 포함되지 않는다. 이 경우의 컨텍스트는 목표 단어 양쪽에 2개의 단어만을 허용한 경우이다.

  • CBOW 모델(Continuous Bag-of-Words)
    컨텍스트로부터 찾고자 하는 목표 단어를 예측하는 모델을 말한다. 예를 들어, "the cat sits on the"라는 컨텍스트로부터 ‘mat’이라는 목표 단어를 예측한다.
    "아이스크림이 너무 ____ 먹을 수 없었다.” 라는 문장에서, 누구나 생략된 ____ 부분의 단어를 추측할 수 있고, 대부분은 옳게 예측한다. CBOW 모델도 마찬가지의 방법을 사용한다. 주어진 단어에 대해 앞 뒤로 N/2개 씩 총 N개의 단어를 입력으로 사용하여, 주어진 단어를 맞추기 위한 네트워크를 만든다.
    CBOW는 크기가 작은 데이터셋에 적합하다.

  • Skip-Gram 모델
    처리하려고 하는 현재의 단어 하나를 사용해서 주변 단어들의 발생을 유추하는 모델이다. 예를 들어, 'mat'이라는 현재 단어로부터 "the cat sits on the"라는 컨텍스트를 예측한다.
    예측하는 단어들은 현재 단어 주변에서 샘플링하는데, "가까이 있는 단어일수록 현재 단어와 관련이 더 많다"는 원리를 적용하기 위해 멀리 떨어진 단어를 낮은 확률로 선택하는 방법을 사용한다. 나머지는 CBOW 모델과 방향만 반대이고, 거의 비슷하다.
    Skip-Gram model은 크기가 큰 데이터셋에 적합하다. 최근일수록 더욱 많은 데이터를 갖고 있기 때문에 주로 Skip-Gram 모델을 사용한다.

  • Skip-Gram 모델 구현
    원본 소스코드를 분석할 때, 이 부분의 설명을 반드시 이해하고 있어야 한다. 다음과 같은 데이터셋이 있다고 가정해 보자.

      the quick brown fox jumped over the lazy dog

    먼저 컨텍스트를 정의해야 한다. 컨텍스트는 어떤 형태로든 정의할 수 있지만, 사람들은 보통 구문론적 컨텍스트를 정의한다. 여기서는 간단하게 컨텍스트를 현재(목표) 단어의 왼쪽과 오른쪽에 있는 단어들의 윈도우로 정의한다. 윈도우 사이즈를 1로 하면 (context, target) 쌍으로 구성된 아래와 같은 데이터셋을 얻을 수 있다.

      ([the, brown], quick), ([quick fox], brown), ([brown, jumped], fox), …

    Skip-Gram 모델은 현재(목표) 단어로부터 컨텍스트를 예측한다는 점을 상기하라. 우리가 해야할 일은 ‘quick’이라는 현재 단어로부터 컨텍스트 ‘the’와 ‘brown’을 예측하는 것이다. 그래서, 아래와 같은 데이터셋이 만들어진다.

      (quick, the), (quick, brown), (brown, quick), (brown, fox), …

    목적 함수는 전체 데이터셋에 대해 정의될 수 있다. 그러나, 성능상의 이유로 보통 Stochastic Gradient Descent(SGD) 알고리즘을 사용해서 하나 또는 minibatch라고 부르는 일정 갯수의 데이터(배치)로 묶어서 최적화한다.
    일반적으로 데이터 갯수는 (16 <= 크기 <= 512)이다.

  • NCE(Noise-Contrastive Estimation)
    CBOW와 Skip-Gram 모델에서 사용하는 비용 계산 알고리즘을 말한다. 전체 데이터셋에 대해 SoftMax 함수를 적용하는 것이 아니라 샘플링으로 추출한 일부에 대해서만 적용하는 방법을 말한다. k개의 대비되는(contrastive) 단어들을 noise distribution에서 구해서 (몬테카를로) 평균을 구하는 것이 기본 알고리즘이다. Hierarchical SoftMax와 Negative Sampling 등의 여러 가지 방법이 있다.
    일반적으로 단어 갯수가 많을 때 사용하고, NCE를 사용하면 문제를 (실제 분포에서 얻은 샘플)과 (인공적으로 만든 잡음 분포에서 얻은 샘플)을 구별하는 이진 분류 문제로 바꿀 수 있게 된다.
    Negative Sampling에서 사용하는 목적 함수는 결과값이 최대화될 수 있는 형태로 구성한다. 현재(목표, target, positive) 단어에는 높은 확률을 부여하고, 나머지 단어(negative, noise)에는 낮은 확률을 부여해서 가장 큰 값을 만들 수 있는 공식을 사용한다. 특히, 계산 비용에서 전체 단어 V를 계산하는 것이 아니라 선택한 k개의 noise 단어들만 계산하면 되기 때문에 효율적이다. 텐서플로우에서는 tf.nn.nce_loss()에 구현되어 있다.

  • Hierarchical SoftMax
    CBOW와 Skip-Gram 모델은 내부적으로 SoftMax 알고리즘을 사용해서 계산을 진행하는데, 모든 단어에 대해 계산을 하고 normalization을 진행해야 하는데, 이것은 시간이 너무 오래 걸릴 수 밖에 없다.
    계산량을 줄일 수 있는 방법으로 Hierarchical SoftMax와 Negative Sampling 알고리즘이 있다.
    Hierarchical SoftMax 알고리즘은 계산량이 많은 SoftMax 함수를 빠르게 계산가능한 multinomial distribution 함수로 대체한다. 트리 자료구조에는 데이터를 저장하는 노드가 있고, 처음 노드를 루트(root), 마지막 노드를 리프(leaf) 또는 단말(terminal)이라고 부른다. multinomial distribution 함수는 루트에서 리프까지 가는 경로를 확률과 연동시켜서 계산 시간을 단축시킨다.
    Word2Vec 논문에서는 사용 빈도가 높은 단어에 대해 짧은 경로를 부여하는 Binary Huffman Tree를 사용한다. Huffman Tree는 경로의 길이가 일정한 full tree의 성질을 갖고 있기 때문에 성능 향상에는 더욱 이상적이게 된다.

  • Negative Sampling
    SoftMax 알고리즘을 몇 개의 샘플에 대해서만 적용하는 알고리즘이다. 전체 데이터로부터 일부만 뽑아서 SoftMax 계산을 수행하고 normalization을 진행한다. 이때 현재(목표) 단어는 반드시 계산을 수행해야 하기 때문에 Positive Sample이라 부르고, 나머지 단어를 Negative Sample이라고 부른다. Negative Sampling에서는 나머지 단어에 해당하는 Negative Sample을 추출하는 방법이 핵심이다.
    일반적으로 샘플링은 ‘Noise Distribution’을 정의하고 그 분포를 이용하여 일정 갯수를 추출하는데, 논문에서는 여러 분포를 실험적으로 사용해본 결과 ‘Unigram Distribution의 3/4 승’ (여기서 Unigram Distribution은 단어가 등장하는 비율에 비례하게 확률을 설정하는 분포라고 할 수 있다. 이 경우 각 확률을 3/4승 해준 후, Normalization factor로 나누어서 단어가 등장할 확률로 사용한 것이다) 을 이용한 분포가 unigram, uniform 등의 다른 분포들보다 훨씬 좋은 결과를 얻을 수 있었다고 한다.

  • tSNE (t-distributed Stochastic Neighbor Embedding)
    차원이 높은 데이터의 이웃한 구조를 유지하면서 낮은 차원으로 변환하는 알고리즘을 말한다. 보통 그래프의 형태로 출력하기 때문에 2차원을 주로 사용한다.
    존경하는 hinton 교수님과 Laurens van der Maaten이란 분이 만들었는데, hinton 교수님의 Stochastic Neighbor Embedding 알고리즘에 Student t-distribution을 적용해서 높은 차원의 데이터를 낮은 차원의 데이터로 낮추는 알고리즘이다.
    차원 축소 알고리즘으로 가장 유명한 PCA는 데이터 손실이 발생할 수 있기 때문에 여기서는 사용하지 않는다. 그러나, 50차원 정도의 적절한 차원으로 축소하려고 한다면, 일반적으로는 밀도가 높은 데이터에는 PCA, 밀도가 낮은 데이터에는 TruncatedSVD 알고리즘을 사용하는 것이 좋다.

---------------------------------------------

word2vec_basic.py 파일에서 사용하는 데이터 파일

  1. text8.zip(30mb)
  2. 압축을 풀면 텍스트 파일 1개 나옴. 확장자 없음.
  3. text8(대략 100mb)
    이 파일은 특이하게 100,000,000byte 크기를 가짐.
  4. 개행문자와 구둣점 없이 소문자 단어로만 구성되어 있고, 공백으로 구분됨
    개행문자가 없기 때문에 전체가 한 줄에 있음. 텍스트랭글러에서 열리지 않음.
  5. 단어 갯수는 17,005,207개.
  6. 맨 앞의 1024개만 발췌. 첫 번째 글자는 공백.
    anarchism originated as a term of abuse first used against early working
  7. class radicals including the diggers of the english revolution and
    the sans culottes of the french revolution whilst the term is still used
    in a pejorative way to describe any act that used violent means
    to destroy the organization of society it has also been taken up
    as a positive label by self defined anarchists the word anarchism is
    derived from the greek without archons ruler chief king anarchism as
    a political philosophy is the belief that rulers are unnecessary and
    should be abolished although there are differing interpretations of what
    this means anarchism also refers to related social movements that advocate
    the elimination of authoritarian institutions particularly the state
    the word anarchy as most anarchists use it does not imply chaos nihilism
    or anomie but rather a harmonious anti authoritarian society in place of
    what are regarded as authoritarian political structures and coercive
    economic institutions anarchists advocate


'챗봇' 카테고리의 다른 글

Word2Vec 모델 기초 (2) - 코드 분석  (0) 2017.04.13