본문 바로가기
Data Science/NLP with Deep Learning

딥러닝으로 NLP 하자 (2) - word2vector, Word Vectors 기초

by 싸코 2017. 9. 19.

※ 본 포스팅은 스탠포드 대학의 "CS224n: Natural Language Processing with Deep Learning"1 강의를 수강하며 배운 것을 정리하기 위해 작성되었습니다. 모든 원문은 다음 링크에서 확인하실 수 있습니다. http://web.stanford.edu/class/cs224n/  정리한 내용이 불완전하고 오류가 있을 수 있습니다. 댓글로 말씀해주시면 큰 도움이 됩니다.



Word Vectors



1. Word의 의미

2. word2vec 개요

3. Word Vectors

4. word2vec objective function gradients

5. Optimiztation refresher



1. Word의 의미

단어의 의미(meaning)를 어떻게 대신 표현(representation)할 수 있을까? (기존 symbolic 방식)

사전적인 정의로는 의미(meaning)란 관념(the idea)을 단어나, 구문 등으로 대신하여 표현한 것이라고 한다. 또는, 사람이 원하는 것을 문자나, 신호 등으로 

표현하는 것을 의미하기도 한다.


의미(meaning)에 대한 가장 흔한 언어학적 해석은 idea 또는 thing을 명시적으로 의미(denotation)하는 것으로 생각한다


이러한 언어학적 개념이 바탕이 되어 컴퓨터 상에서 단어가 의미를 갖게하기 위해 일반적으로 분류체계(taxonomy)를 활용한다. 아래 샘플 코드를 통해서 확인할 수 있다. 이를 위해서는 anaconda 또는 python 환경에서 nltk 패키지가 설치되어 있어야 하며, nltk_data가 다운로드 되어있어야 한다. 아래 참고자료에서 nltk_data 다운로드에 대해서 확인하자. 먼저 nltk 패키지는 pip 또는 conda를 활용하여 간단하게 설치한다.


> pip install nltk

> conda install nltk


1
2
3
4
5
from nltk.corpus import wordnet as wn
 
hyper = lambda s: s.hypernyms()
good = wn.synset('good.n.01')
list(good.closure(hyper))
cs


참고자료

https://stackoverflow.com/questions/13965823/resource-corpora-wordnet-not-found-on-heroku


symbolic 방식 & statistical NLP의 문제점

하지만 위와 같은 방식으로 단어를 개별적으로(discrete) 그리고 사전에 대신하여 표현(representation)하는 방식은 많은 문제가 있다. good => (advantage, asset, quality, attribute, entity) *수동적으로 매핑하여 사전적으로 정의한 방법


이를 rule-based 그리고 통계적 NLP 방법이라고 일컬으며 단어를 대상을 표현하는 단일한 상징으로 보는 것이다. 
vector 공간에서 이를 설명하면, 이는 하나의 1과 수 많은 0으로 구성된 단일 벡터를 의미한다. ex. [ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ]

차원의 개수(dimensionality)는 단어 활용 상황에 따라 20K(말하기) < 50K(PTB) << 500KB(big voca) <<< 13M(Google 1T) 기하급수적으로 늘어난다


우리는 이를 "one-hot" representation 이라고 부르며 지엽적인(localist) 표현 방식이라고 본다. 이는 general하게 적용되기 어려운 방식임을 뜻한다.


아래는 이러한 방식이 가지는 문제점을 설명하는 이유이다.

  1. 단어의 세부적인 뉘앙스 차이를 놓치기 때문이다.
    예를 들어, "훌륭한"이라는 단어가 있을 때 good이라는 표현이 있지만 동의어(synonyms)이지만 그 의미하는 정도에서 차이가 있는 'adept', 'expert', 'proficient', 'skillful'과 같은 다른 단어들이 있다.
  2. 새로운 단어를 놓칠 수 있다. 항상 최신의 상태로 그 의미를 담고 있지는 않기 때문이다.
    예를 들면 'genius', 'wizard', 'ninja' 같이 새로운 단어는 '훌륭한'이라는 의미를 갖게 된지 얼마되지 않았다면 이를 반영하지 못할 수도 있다.
  3. 그리고 상당히 주관적인(subjective) 방법이기도 하다.
  4. 인간이 끊임없이 만들고 수정해야 하는 문제가 있다.
  5. 단어간의 유사성을 정확하게 계산하기가 어렵다.

웹 검색(web search)에서 이는 큰 문제로 다가온다

만약 사용자가 "Samsung Notebook Battery Size"를 검색했다고 한다면, 이는 삼성 노트북의 배터리 용량을 찾고 싶어하는 것으로 우리가 찾아준다면 아마 "Samsung Laptop Batter Capacity"라는 검색어로 이를 찾아줬을 것이다. 또는 "강남 모텔"을 검색했다면 비슷한 숙박 시설인 "강남 호텔", "강남 게스트하우스" 등을 검색해줬을지도 모른다.

하지만 위의 symbolic 방식으로 검색을 하게되면 사용자가 입력한 쿼리나 문서의 vector는 직각(orthogonal)을 이룬다. 평행을 이룬다라고 보면 될듯...  orthogonal 직교를 이룬다는 말은 선형대수학을 학습하면서 그 온전한 의미를 알 수 있었다. 이를 위해서는 내적의 개념을 알면 도움이 된다. 일반적으로 두 벡터가 직교를 이룬다는 말은 좌표평면 또는 공간좌표에서 각 방향이 직각으로 이루어져 있다는 의미와 같다. 아래 그림을 참고하자


Image result for 벡터 내적 합 0

그림출처 http://twlab.tistory.com/?page=5


예를 들면


motel [ 0 0 0 0 0 0 0 1 0 0 0 ]

hotel  [ 0 0 0 0 0 1 0 0 0 0 0 ]

=> 두 벡터의 내적은 0이므로 직교한다.


위와 같은 one-hot vector 방식으로는 "강남 모텔"과 "강남 호텔" 간의 개념(notion) 유사성을 발견할 수 없기 때문에 이를 해결하려면 둘 간의 유사성을 직접 입력하여야 한다. 이러한 통계적 모델의 방법은 각 단어를 discrete 단어로 mapping하여 sparsity 문제가 발생하게 된다. 계산량도 많다.



이를 극복하기 위해 distributional similarity based representation의 개념이 소개되었으며, 이는 해당 단어의 주변 단어들을 통해 그 단어가 의미하는 바가 무엇인지 찾는 것이다. 이는 비슷한 distribution(분포)를 가진 단어들은 비슷한 meaning(의미)를 갖을 것이라는 가정(Distributional Hypothesis 참조)에서 출발한다. 예를 들어 비즈니스 분석에서 3C, 5Forces, SWOT분석이 같은 문단 혹은 문장에서 계속 발견된다면 비슷한 분포를 보일 것이고 유사한 의미를 가질 것이라고 생각할 수 있으며, 많은 글을 학습하면서 이러한 관계를 보다보면 이후에는 예측이 가능할 것이다. 


신경망 방식의 word embeddings에서는 특정 단어가 문장 내에서 주변에 함께 등장한 각 단어를 dense vector로 표현하여 이웃 단어들을 이용해 그 의미를 예측해나가며,


word vector 관점에서 중심 단어 와 그 주변 단어(context words) 사이에서 중심 단어의 의미를 예측한다.

여기에서 손실함수(loss function) 개념이 들어간다 (추가 수정)


큰 언어 말뭉치(corpus)에서 많은 위치를 갖고 있는 t를 확인할 수 있다. 단어별로 문장 또는 vector 상에서 위치한 position을 의미하는듯... words embedding에서는 단어를 벡터로 표현하는데 있어 이 손실(loss)을 최소화하는데 주안점을 두고 있다.



word2vec이 나오기까지 Back-propagting errors를 활용한 학습 방법, Neural probabilistic language model 등이 활용되었다. word2vec는 단어 벡터를 더욱 저차원으로(low-dimensional) 만들어주어 다른 학습모델에 비해 간단하고 빠르다.





2. word2vec 개요

word2vec을 간단하게 말하면 모든 단어를 vector로 표현하여 단어 사이의 유사성과 차이점을 계산한다. 계산된 결과를 바탕으로 그 주변단어(context word)와의 관계를 통해 단어가 표현(representation)하는 바를 직접적으로 예측하는 것이다.

Neural Network 방법으로 그동안 자연어처리를 하긴했지만 높은 정확도를 보이기 위해서 많은 양의 학습 데이터가 요구되며 학습속도가 오래걸린다는 한계가 있었고 이런 의미에서 word2vec은 앞서 말한 것처럼 다른 학습 모델보다 간결하고 속도가 빨라 최근 각광받는 방법중 하나인 것이다.

여기에 중요한 2가지 알고리즘과 2가지 학습방법이 활용된다.

알고리즘 Algorithms

  1. Skip-gram (SG)
      : 타겟 단어를 이용해 주변단어(context words)를 예측
  2. Continuous Bag of Words (CBOW)
      : 주변단어를 이용해 타겟 단어를 예측

학습방법 Training Methods

  1. Hierarchical softmax
  2. Negative sampling


각 알고리즘과 학습방법에 대해서는 다음 포스트에서 소개할 예정이다.



출처: https://myndbook.com/view/4900


3. Word Vectors 기초 (=Word Embedding)

Word vectors를 조금만 더 추가적으로 설명하려고 한다. 영어 같은 경우 1,300만 개의 tokens들이 있는데 모든 token들이 독립적일 수 있는지 서로 관계가 없다고 할 수 있을지 모르겠다. 호텔과 모텔이라는 두 단어는 각각 독립적인 의미를 가질까? 그렇지 않다! (둘은 숙박이라는 개념 안에서는 동일한 의미를 지닐 수 있기 때문이다.) 먼저, 호텔과 모텔 각 단어를 단어 토큰(token)을 벡터화하여 벡터 공간(word space)에서 각 단어를 표현(represent)해 볼 수 있겠다. N차원의(N-dimensional) 공간에서 각 단어는 실제로 존재할 것이고(N은 1,300만 이하...), 각 차원(dimension) 안에서 각 단어는 의미를 갖을 것이다. 그 다음, 우리는 각 단어를 one-hot vector로 표현해볼 수 있다. vector의 크기는 우리가 가진 어휘 수만큼 많을 것이다. 그리고 one-hot vector 방식으로 표현된 각 단어느 완전히 독립된 개체(entity)로 표현될 것이다. 앞에서 말한 것처럼 one-hot vector 방식으로는 단어 간의 유사성을 찾을 수 없다. 벡터를 내적하면 0이 나오기 때문이다. 호텔과 모텔의 개념적, 의미적 유사성을 발견할 수가 없다.

따라서, 1) 단어의 벡터 공간 크기를 줄일 필요가 있고,  2) 각 단어의 관계를 발견할 수 있는 방향으로 단어를 공간에서 표현하는 방법이 필요하다.

3.1. SVD Based Methods

Singular Value Decomposition(SVD; 특이값 분해)에 기반한 방법.

전체 데이터(massive data)를 한 바퀴 탐색하고 동시 발생한(co-occurrence) 단어의 빈도를 계산하여 matrix 형태로 표현하고 Singular Value Decomposition을 활용해서 USVT 값을 얻는 것이다. 보통 SVD는 PCA와 처럼 차원축소를 위해서 사용된다. 따라서 SVD 기반의 Word Embedding은 벡터 공간을 줄이기 위한 차원축소 방법이라고 할 수 있다. (추가 수정: 문사철 출신인 나에게 SVD는 벡터 쪽에서 사용하는 인수분해 처럼 보인다... 차차 추가 공부하며 부족한 부분을 채워나가 내용을 더 추가하도록 하겠다.)





참고자료

http://darkpgmr.tistory.com/106

https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/04/06/pcasvdlsa/

Skip-gram

1부터 T까지 각 단어(t)의 m 반경만큼 떨어진 주변단어를 예측하는 것

현재 주어진 중심단어(target/center word)로부터 가까이 있는 단어의 확률값을 최대화하는 방향으로 함수 구성 (Loss function = Objective function = Cost Function) *손실함수에 대해서는 이후에 추가 보충

즉, 타겟 단어의 주변에 있을수록 높은 점수를 받아 관련성이 높다고 판단하게 됨


*위에서 는  최적화하려는 모든 함수를 표현




을 위한 가장 간단한 수식은 다음과 같다


 
*o: outside word index
*c: center word index
*u&v: 'center' and 'outside' vectors of indices c and o


Softmax는 단어 c를 활용해서 단어 o의 확률을 계산할 때 사용한다.


output을 계산하는 u&v는 몇 개의 단어를 반경(window of m radius)으로 할 것인지에 따라서 그 계산량이 비례하여 증가하므로 샘플링을 많이 할수록 계산량이 많아 전체 속도는 떨어질 것이다.



Softmax와 Negative Sampling에 대해서 잘 소개된 블로그가 있다. word2vector에 대해서도 비교적 쉽게 이해할 수 있도록 정리되어 있다.



참고자료




4. word2vec objective function gradients

.....

5. Optimiztation refresher

.....


댓글