無知

갈 길이 먼 공부 일기

기술 공부/AI

[NLP 기초 잡기] Word Embedding (GloVe, word2vec) with jiho-ml

moozii 2021. 12. 30. 20:19
* 이 글은 박지호 님의 jiho-ml Weekly NLP의 내용을 기반으로 하고 있습니다. 
밀려왔던 주간 뉴스레터의 내용을 훑어보면서, 인상 깊은 부분, 기록하고 싶은 부분만을 남긴 글로, 
더 깊이 알아보고 싶으시다면 아래의 원본 출처 주소로 이동해주세요.
https://jiho-ml.com/weekly-nlp-0/

 

Week 3 - 지구용사 벡터맨? Vector 기초 잡기!

Vector (벡터)는 방향도 포함합니다.
Vector는 몇 차원의 공간에서 표현되느냐에 따라 크게 달라집니다.
이처럼 vector는 N차원 공간에 사는 존재입니다. 이를 euclidean space라고도 부르죠.

그렇다면 10차원 같이 4차원 이상의 vector는 어떻게 이해해야 할까요?
4차원 이상의 공간은 우리가 눈으로 볼 수 있게 표현하는 것은 불가능합니다. 하지만 이렇게 이해하시면 조금 더 쉬울 것 같습니다. 서론에 등장하는 친구 A와 B가 얼마나 나와 비슷한지 숫자로 나타내는 것을 시도해보는 겁니다. 우리가 생각하는 사람 간 비슷함과 거리감에 영향을 받는 10 가지 요소를 골라봅시다. 나이, 성별, 키, 외국 생활 연차 등 수치화할 수 있는 모든 것을 어찌어찌 뽑아낸다면 친구 A, 친구 B, 그리고 나는 각각 10 개의 숫자로 표현될 수 있습니다. 이는 곧 한 사람이 10차원의 vector로 표현된 거라고 볼 수 있습니다! 

https://jiho-ml.com/weekly-nlp-3/

 

Week 4 - <왕> minus <남자> plus <여자>= ?

 

단어 간의 관계를 학습해 vector에 저장하는 word embedding

 

Distributional Hypothesis: 단어는 주변 단어들에 의해 정의된다

Distributional Hypothesis를 가지고 어떻게 machine learning 모델로 만들 수 있을까요?
Stanford에서 나온 GloVe와 2013년에 Google에서 나와 NIPS에 처음 소개된 word2vec은
각자 다른 방식으로 이를 구현합니다.

https://jiho-ml.com/weekly-nlp-4/

 

Word Embedding (word vector)란?

word2vec과 GloVe은 둘 다 하나의 단어를 몇천 차원, 몇만 차원이 아닌 몇십, 몇백 차원으로 낮추려는 게 목표입니다. embed라는 "단단하게 박다"라는 뜻인데, 더 적은 숫자들로 하나의 단어에 대한 정보를 담으려는 word vector들을 embedding이라고도 표현합니다. "듬성듬성하다 (sparse)"의 반대말인 "빽빽하다 (dense)"라는 단어도 같이 많이 쓰입니다. word embedding의 모든 row는 0이 아닌 어떠한 숫자로 채워지기 때문입니다.

https://jiho-ml.com/weekly-nlp-4/

spare one-hot vector to dense word embedding (jiho-ml)

간단한 counting을 이용한 GloVe

GloVe는 아주 직관적인 방식을 택합니다. 같은 문장에 한 단어가 어떤 근처 단어들과 몇 번 같이 나오는지 세보는 것입니다. 이것을 co-occurrence matrix라고 합니다. 이렇게 세 개의 문장을 가진 corpus(NLP에서 텍스트 데이터를 가리킴)를 가지고 생각해봅시다.

https://jiho-ml.com/weekly-nlp-4/

co-occurence matrix 예시.&amp;nbsp;stackexchange.com

전체 corpus에서 40,000개의 단어가 있다고 가정합시다. 전체 corpus를 계산하면, 모든 다른 단어들과의 빈도수 통계가 나올 것입니다. 하지만 40,000 x 40,000 매트릭스는 너무나 큽니다. 같이 한 번도 나오지 않는 단어도 많을 것이기에 0이 꽤나 많은 sparse matrix이기도 하고요. 이러한 비효율을 어떻게 해결할 수 있을까요?

여기서 dimensionality reduction이라는 기술이 등장합니다. 이름 그대로 차원을 줄여주는 Dr. Strange 같은 느낌의 알고리즘인데 정확히 말하면 40,000 x 40,000를 300 x 40,000으로 압축시켜줍니다. 흩어져있는 밀가루 분자들을 단단한 반죽으로 만들어 버리는 겁니다.

GloVe는 Singular Value Decomposition (SVD)라는 알고리즘을 사용합니다. 선형 대수 (linear algebra)를 좋아하시는 분들이 있다면 꼭 공부를 해보시기를 권합니다. 자매품으로는 Principle Component Analysis (PCA)가 있습니다. 이러한 Dimensionality reduction 알고리즘들은 NLP 뿐만 아니라 추천 시스템 등 machine learning에서는 엄청나게 중요하고 유용하게 쓰이는 기술 중의 기술입니다!

 

Singular Value Decomposition (SVD)

Math for Data Science, 2021 Winter Bootcamp in SNU GSDS, @MOOZII

 

neural network를 이용한 word2vec

word2vec은 continuous bag-of-words (CBOW) 또는 skipgram 알고리즘을 통해 학습시킬 수 있습니다. 기발하게도 저자는 주변 단어와 타깃 단어의 관계를 예측 문제 (classification)로 바꾸어 버립니다.

(1) CBOW - 주변 단어들을 모두 합쳐서 본 후 타깃 단어를 맞추기
(2) skipgram - 타깃 단어를 보고 주변 단어를 맞추기

아래 예시에서 fox가 target이라면, CBOW 같은 경우 ["the", "quick", "brown", "jumps", "over"]을 가지고 "fox"을 예측하려고 하고, skipgram에서는 "fox"을 가지고 "the", "quick", "brown", "jumps", "over"를 각각 예측하려고 하는 거죠. (CBOW가 좀 더 직관적이지만 실제로 skipgram으로 학습된 embedding이 실험 결과 상 더 효과가 좋습니다.)

예측을 위한 classification model은 neural network로 구현이 되고, stochastic gradient descent (SGD)로 학습이 됩니다. input은 Nx1 word embedding으로 들어갑니다. 처음에는 무작위의 숫자로 embedding이 초기화되지만, 학습이 점점 될수록 word embedding은 주변 단어들과의 관계에 대한 정보가 encoding 됩니다.

https://jiho-ml.com/weekly-nlp-4/

 

<마드리드> - <스페인> + <프랑스> = <파리>!

word2vec 또는 glove로 학습된 word embedding들은 단어를 N차원에 사는 vector로 바꾸어준 것입니다. 그렇기 때문에 서로 더하고 뺄 수 있게 되는 거죠? 더 놀라운 것은 이 더하기, 빼기를 통해 단어들의 의미적 관계 (semantics)과 문법적 관계 (syntactic)를 알아낼 수 있다는 것입니다.

https://nlp.stanford.edu/projects/glove/
https://jiho-ml.com/weekly-nlp-4/

 

또한 이러한 word embedding들을 다른 NLP task의 input으로 사용하였을 때, 엄청난 성능 증가를 기대할 수 있습니다. 왜냐하면 word embedding은 엄청난 양의 corpus로 학습되어 각 단어에 대한 정보를 꽤나 정확하고 깊게 담아낼 수 있거든요. 수능 국어를 잘 보려면 어렸을 때부터 독서량을 늘려야 된다는 전문가들의 조언과 일맥상통합니다.

https://jiho-ml.com/weekly-nlp-4/

 

Week 4 요약 댓글

Word embedding : 단어간의 관계를 학습해 vector에 저장하는 모델 ->일종의 unsupervised learning방식이며 단어는 주변단어들에 의해 정의된다는 'Distributional 가설'에 기반.

Word embedding의 종류
1. GloVe : 같은 문장에 한 단어가 어떤 근처 단어들과 몇 번 같이 나오는지 세보는 것(co-occurence matrix를 만듬) ->그런데 단어가 많아지면서 이 Matrix크기가 엄청 커져버리는데 이 때 SVD알고리즘을 사용하면서 Matrix의 차원을 축소시킴

2.word2vec : 기본적으로 neural network를 사용한 분류문제 해결을 기반으로 하여 단어간의 관계를 파악. 구체적으로 다음과 같은 두 가지 알고리즘을 사용함.
-CBOW(Continuous bag of words) : 주변 단어들을 모두 합쳐서 이를 바탕으로 타겟 단어를 맞추는 방법
-Skipgram : 타겟 단어를 보고 주변 단어를 맞추기(CBOW와는 반대방식 느낌!)

#참고로 corpus로 단어간의 관계들을 파악한 후의 워드 임베딩을 다른 NLP task의 input으로 사용하면 엄청난 성능 증가를 기대할 수 있음.