※ 본 포스팅은 스탠포드 대학의 "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)에 대한 가장 흔한 언어학적 해석은 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하게 적용되기 어려운 방식임을 뜻한다.
아래는 이러한 방식이 가지는 문제점을 설명하는 이유이다.
- 단어의 세부적인 뉘앙스 차이를 놓치기 때문이다.
예를 들어, "훌륭한"이라는 단어가 있을 때 good이라는 표현이 있지만 동의어(synonyms)이지만 그 의미하는 정도에서 차이가 있는 'adept', 'expert', 'proficient', 'skillful'과 같은 다른 단어들이 있다. - 새로운 단어를 놓칠 수 있다. 항상 최신의 상태로 그 의미를 담고 있지는 않기 때문이다.
예를 들면 'genius', 'wizard', 'ninja' 같이 새로운 단어는 '훌륭한'이라는 의미를 갖게 된지 얼마되지 않았다면 이를 반영하지 못할 수도 있다. - 그리고 상당히 주관적인(subjective) 방법이기도 하다.
- 인간이 끊임없이 만들고 수정해야 하는 문제가 있다.
- 단어간의 유사성을 정확하게 계산하기가 어렵다.
웹 검색(web search)에서 이는 큰 문제로 다가온다
만약 사용자가 "Samsung Notebook Battery Size"를 검색했다고 한다면, 이는 삼성 노트북의 배터리 용량을 찾고 싶어하는 것으로 우리가 찾아준다면 아마 "Samsung Laptop Batter Capacity"라는 검색어로 이를 찾아줬을 것이다. 또는 "강남 모텔"을 검색했다면 비슷한 숙박 시설인 "강남 호텔", "강남 게스트하우스" 등을 검색해줬을지도 모른다.
하지만 위의 symbolic 방식으로 검색을 하게되면 사용자가 입력한 쿼리나 문서의 vector는 직각(orthogonal)을 이룬다. 평행을 이룬다라고 보면 될듯... orthogonal 직교를 이룬다는 말은 선형대수학을 학습하면서 그 온전한 의미를 알 수 있었다. 이를 위해서는 내적의 개념을 알면 도움이 된다. 일반적으로 두 벡터가 직교를 이룬다는 말은 좌표평면 또는 공간좌표에서 각 방향이 직각으로 이루어져 있다는 의미와 같다. 아래 그림을 참고하자
그림출처 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 개요
알고리즘 Algorithms
- Skip-gram (SG)
: 타겟 단어를 이용해 주변단어(context words)를 예측 - Continuous Bag of Words (CBOW)
: 주변단어를 이용해 타겟 단어를 예측
학습방법 Training Methods
- Hierarchical softmax
- Negative sampling
각 알고리즘과 학습방법에 대해서는 다음 포스트에서 소개할 예정이다.
출처: https://myndbook.com/view/4900
3. Word Vectors 기초 (=Word Embedding)
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
.....
'Data Science > NLP with Deep Learning' 카테고리의 다른 글
NTN으로 시작하는 자연어처리와 딥러닝 (4) - 모델 학습 (0) | 2019.02.22 |
---|---|
NTN으로 시작하는 자연어처리와 딥러닝 (3) - NTN 신경망 구조 파악 및 이론적 배경 탐색 (3) | 2018.02.14 |
NTN으로 시작하는 자연어처리와 딥러닝 (2) - 일단 NTN 알기 : 새로운 사실의 발견 (0) | 2018.02.07 |
NTN으로 시작하는 자연어처리와 딥러닝 (1) - 핵심개념 살펴보기 (0) | 2018.02.07 |
NTN으로 시작하는 자연어처리와 딥러닝 (0) - 들어가기 앞서 (0) | 2018.02.06 |
딥러닝으로 NLP 하자 (1) - NLP와 Deep learning 기초 (0) | 2017.09.19 |
댓글