본문 바로가기
Tensorflow

19. Tensorflow 시작하기 - word2vec

by 대소니 2016. 11. 28.


이번에는 텍스트로 사용되는 언어를 처리하는(Language Processing) 방법에 대한 튜토리얼을 살펴보겠습니다.


이번 튜토리얼의 링크는 다음과 같습니다


원문 : https://www.tensorflow.org/versions/master/tutorials/word2vec/index.html

한글 : https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/tutorials/word2vec/

소스 : https://github.com/tensorflow/tensorflow/blob/r0.11/tensorflow/examples/tutorials/word2vec/word2vec_basic.py



Distributional hypothesis


언어를 이해하기 위해서 사용되는 가장 기본적인 단위는 바로 단어입니다.

이 단어들이 의미있게 구성이 되어 하나의 문장을 이루게 되지요


이러한 단어들은 어떤 의미를 가지고 있다는 것을 알고 있습니다. 우리가 이해가 위해서도 단어가 어떤 의미를 가지고 있는지 알아야하니까요. 단어와 단어간에는 비슷한 의미를 가지고 있어 상관관계가 높거나 아니면 반대로 다른 의미를 가지고 있어 상관관계나 낮은 경우도 있게 됩니다.


이렇게 단어들을 그 의미가 유사한 정도에 따라서 어떤 2차원정도의 공간에 각각 배치를 한다고 생각을 해보겠습니다. 

2차원상에 수학적으로 표기를 하는 방법이 바로 Vector 임을 다들 이미 아시지요.

그래서 단어를 곧 Vector로 표현하고 이들간에 유사성을 따지면, 그 의미도 비슷하게 표현을 할 수 있게 됩니다.


이것이 Distributional hypothesis 혹은 Distributional semantics 의 개념이고 이는 비슷한 분포를 가지는 벡터는 비슷한 의미를 가지는 언어가 된다는 것입니다.



Word embedding


이와 같이 자연어를 처리하기 위해서는 단어나 구들을 벡터로 변환을 해야 합니다. 이를 하기 위해서는 신경망, 차원감소, 확률적 모델, 문맥상 표현등의 처리 과정들을 거쳐 이루어지게 되는데 이러한 일련의 프로세스를 Word embedding 이라고 합니다. 



word2vec


그리고 일반적인 text로 부터 이러한 Word embedding 을 학습하기 위해서 만들어진 효율적인 예측 모델이 바로 word2vec 입니다. 우리가 이제부터 살펴볼 내용이 되겠습니다.


word2vec 모델은 크게 두가지로 구분이 되는데, Continuous Bag-of-Words model (CBOW)와 Skip-Gram model 입니다.

이 두가지는 주어진 단어들을 가지고 목표하는 단어를 예측할 것이지, 목표하는 단어를 기준으로 주어진 단어들을 예측할 것이지 방향만 다르고 그외에는 비슷한 방식의 모델입니다.


그로인해서 CBOW 모델은 전체 컨텍스트를 통해서 목표하는 타겟 단어를 예측하기 때문에 작은 dataset에 유용하게 사용할수 있고, Skip-Gram 모델은 목표하는 타겟 단어와 주어진 단어 쌍을 통해서 예측하기 때문에 큰 dataset에 유용하게 사용되는 특성이 발생합니다. 우리가 사용할 모델은 skip-gram model 입니다.



Skip-Gram Model


Skip-Gram Model에 대해서 튜토리얼 문서에 공식과 이미지로 설명이 되어 있으니 한번 읽어보시길 바랍니다.

이 모델이 타겟 단어로 부터 주어진 단어들을 쌍을 이루어 예측을 하는 모델이기 때문에 Noise Classification 을 이용해서 의미 없는 단어쌍을 걸러내주는 과정이 포함이 됩니다. 이를 위해서 우리가 이전에 배웠던 Logistic regresstion 을 사용하네요.


이렇게 하여 실제 원하는 단어의 연관성이 높으면서 노이즈 단어에 대한 확율이 낮아지는 결과가 우리가 찾고자 하는 타겟 단어가 되며, 이때의 J 함수의 결과 값은 최대값(max)이 됩니다. (Negative Sampling)



조금더 예시 단어들을 소개하면서 설명을 하기 위해서 아래와 같이 텍스트가 있다고 합시다.


the quick brown fox jumped over the lazy dog


이에 대한 Context를 타겟 단어의 왼쪽단어와 오른쪽단어로 정의하고 이때 window 사이즈가 1이라고 정의하여, 단어들의 쌍을 만들어보면 다음과 같이 됩니다.


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


그리고 이 조합을 다시 목표하는 타겟 단어와 주어진 단어의 쌍으로 만들어서 (input, output) 로 바꾸면 다음과 같이 됩니다.


(quick, the), (quick, brown), (brown, quick), (brown, fox), ...


이렇게 하여 각각의 쌍을 Stochastic gradient descent 로 학습하면서 최적의 결과를 찾으면 유사한 단어들이 공간에 가까이 배치되는 결과로 나타납니다.



여기까지 기본적인 내용에 대한 설명이 되었습니다.

기본적인 소스에 관련된 설명도 튜토리얼 문서에 있으니 간단하게 살펴보는데 무리가 없을 겁니다.


저는 실제로 해당 소스를 실행해보니 메모리가 부족해서인지 Segmentation fault (core dumped) 에러가 발생하여 결과를 확인할 수가 없었습니다. 이제 슬슬 고사양의 서버가 절실하게 필요하다는 생각이 들기 시작하네요.

서버를 어떻게 마련해야 좋을까를 고민하게 됩니다.^^



댓글