본문 바로가기

개발/NLP Trends

Weekly NLP #04 Review : <왕> minus <남자> plus <여자> = ?

※ 본 블로그 포스트는 박지호님의 "Weekly NLP" 내용을 채용하여 개인공부를 기록한 포스트입니다.
원작자의 허가를 맡았으며 불법적인 공유가 아님을 미리 알립니다.
<왕> - <남자> + <여자> = ?‌‌
<마드리드> - <스페인> + <프랑스> = ?

다음 두 문제의 답은 무엇일까요?

"엥, 단어가 무슨 숫자? 어떻게 더하고 빼니?", "이거 무슨 IQ 테스트에 나오는 문제인가요?" 싶으신 분들이 많으실 겁니다. 하지만 우리의 언어 상식을 이용하면 충분히 답을 유추해낼 수 있지요. 우리는 각 단어 간의 관계를 여태까지 읽어온 수많은 글을 통해 이미 머리 속에 구축해왔으니깐요.

하지만 위클리 NLP의 Week 1을 읽으신 분들은 단어는 숫자로, 아니 Week 3에서 배웠다면 정확히 vector로 표현될 수 있다는 것을 알고 계시겠지요. 다만 우리가 배운 one-hot vector는 단어 간의 관계를 전혀 고려하지 않은 표현 방식이기 때문에 이 문제들을 풀기 적합하지 않다는 것!

이번 주에는 단어 간의 관계를 학습해 vector에 저장하는 Word Embedding이라는 아주 중요한 모델을 소개하려고 합니다.

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

주변 사람들을 보면 그 사람이 어떤 사람인지 알 수 있다고 하죠? 단어도 마찬가지입니다. 예시를 한번 봅시다.

The baby is crawling on the mat.

만약에 baby 대신 TV라는 단어가 들어간다면 어떤가요? "The TV is crawling on the mat." 말이 안 되는 문장이 됩니다.
mat (바닥 매트) 대신 story(이야기)가 들어간다거나, on 대신 with이 들어간다면 역시 문장이 어색해집니다.

baby, on, mat은 타겟 단어인 crawling에 대해 많은 것을 알려줍니다. crawling은 "기어가다"라는 뜻을 가진 동사입니다.
주어로는 baby, 전치사로는 on, 목적어로는 mat이 crawling과 잘 어울리는 단어들이고, 실제로 수많은 텍스트에 같이 등장할 것입니다.

이 정보는 문장을 읽기만 하면 알 수 있습니다. 그냥 crawling이 등장하는 수백, 수천, 아니 수만 개의 문장을 찾아서 보면 됩니다. machine learning에서는 이런 종류의 학습 방법을 Unsupervised Learning이라고 합니다. 따로 시간과 돈을 들여 데이터를 가공할 필요 없이 그냥 책이나 인터넷에 있는 텍스트 그대로만 가지고도 유용한 모델을 만들 수 있다는 것이죠.

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

Word Embedding (word vector)란?

word2vec과 GloVe의 내용으로 들어가기 전에 word embedding이 무슨 의미인지 짚고 넘어갑시다.
지난주에 배운 one-hot vectors는 단어를 Nx1 column vector로 표현합니다. 다만 데이터가 클수록 단어의 개수가 몇천 또는 몇만으로 커질 수 있다고 했죠. 그리고 단어를 표기하는 1개의 row말고는 0으로 채워져 있기 때문에 아주 비효율적입니다.

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

sparse one-hot vector to dense word embedding, 출처 : https://jiho-ml.com/weekly-nlp-4/

간단한 counting을 이용한 GloVe

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

"I enjoy flying."
"I like NLP."
"I like deep learning."

※ 참고로 NLP에서는 가지고 있는 텍스트 데이터를 corpus라고 부릅니다. 앞으로도 자주 나올 용어이니 꼭 기억해주세요.

첫번째 행을 보면 "I"와 같이 두번 나오는 "like"가 있는 열은 2라는 숫자를 가집니다. 반대로 NLP나 flying이라는 단어는 같이 나오지만 근처가 아니거나, 아예 같이 나오지 않기에 0으로 표시됩니다.

co-occurence matrix 예시.&nbsp; stackexchange.com, 출처 :&nbsp;https://jiho-ml.com/weekly-nlp-4/

전체 corpus에서 40,000개의 단어가 있다고 가정합시다. 40,000 x 40,000 매트릭스를 만들고 전부 0으로 초기화시킵니다. vocabulary를 보았을 때 crawling의 번호(index)가 200이고 , baby의 번호가 150이라면, 200행, 150열 그리고 150행, 200열을 숫자를 하나씩 증가(+1)시켜줍니다. 이런 식으로 전체 corpus를 계산하면, 200번째 열은 crawling이라는 단어와 vocabulary에 모든 다른 단어들과의 빈도수 통계가 나올 것입니다.

하지만 40,000 x 40,000 매트릭스는 너무나 큽니다. 같이 한 번도 나오지 않는 단어도 많을 것이기에 0이 꽤나 많은 sparse matrix이기도 하고요. 이러한 비효율을 어떻게 해결할 수 있을까요?

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

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

그렇게 300 x 40,000 행열로 압축이 되면 각 열 (300x1)이 하나의 단어를 대표합니다. 앞에 소개 했듯이 각 단어가 dense한 vector로 압축되어, 예를 들어 crawling이라는 단어를 300개의 숫자로 표현할 수 있게 되는 것이죠!

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이 실험 결과 상 더 효과가 좋습니다.)

https://becominghuman.ai/how-does-word2vecs-skip-gram-work-f92e0525def4, 출처 :&nbsp;https://jiho-ml.com/weekly-nlp-4/

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

아직은 technical detail을 전부 이해하는 것은 어렵겠지만, Glove와 궁극적으로 같은 word embedding을 다른 방식으로 학습 시키는 것이라고 이해하시면 됩니다! 더 깊게 들어가실 분은 reference의 원 논문을 참고해주세요!

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

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

https://nlp.stanford.edu/projects/glove/, 출처 :&nbsp;https://jiho-ml.com/weekly-nlp-4/
도시와 국가 이름들을 word2vec을 2D로 표현했을 때, 출처 :&nbsp;https://jiho-ml.com/weekly-nlp-4/

위 예시와 같이 단어의 성별 관계, 회사와 CEO 이름의 관계, 도시와 ZIP code의 관계, 그리고 형용사의 변형 (ex. dark, darker, darkest)까지 vector의 방향성에 encoding이 되어있다는 것을 알 수 있습니다.

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


NLP여정의 4번째 포스팅입니다.
제가 이해하기론 텍스트데이터 가공을 위한 하나의 방법론으로써 배워서 어떻게 적용이 되고 구현되는지 직접적으로 보이지 않아 이 내용이 어떤식으로 응용되는지에 대한 의구심이 많이 들엇던 것 같습니다.
여튼, 제가 이해한 내용을 정리해보도록 하겠습니다.

Word Embeddig (워드 임베딩)

워드 임베딩단어를 Vector로 표현하는 방법 입니다. 컴퓨터가 텍스트를 처리할 수 있게 숫자로 변환하는 과정입니다.
대표적인 방법으로는 LSA, Word2Vec, FastText, GloVe 등등이 존재합니다.

Sparse Vector vs Dense Vector

위의 Word-Embedding 방식을 하나하나 공부해보기 전에 가장 근간이 되는 용어를 먼저 알아봅시다.

Sparse Vector (희소 벡터)

선형대수학의 희소행렬을 한번씩 들어봤을 겁니다. 이와 굉장히 비슷한 개념으로 이해하면 됩니다.
예를 들어, "That dog is cute"라는 문장이 있을 때 이 문장은 the, dog, is, cute의 4개 단어로 구성됩니다.
sparse vector는 각 단어가 있다면 1, 없다면 0으로 표현하는 vector로 각 단어에는 정해진 위치가 있습니다.
만약 우리가 가진 vocabulary속 고유한 단어수가 8개라고 할 때 "The dog is cute"를 sparse vector로 나타내면 [0, 1, 0, 0, 1, 1, 0, 0, 1]로 표현되는 것이다.
즉, sparse vector는 One-Hot Vector와 동일하다고 말할 수 있습니다. 상황에 따라선 좋은 성능을 가지는 이 vector도 다음과 같은 단점을 가집니다.

  • 단어의 수가 많아지면 Vector의 Dimension이 매우 커져 데이터 분석에 어려움이 생깁니다. 이것은 곧 계산복잡도가 증가하고 공간이 낭비되는 것으로 직결됩니다.
  • 전체 텍스트에서 한 번 등장한 단어도 벡터에 포함되기 때문에 그 규모가 커져 매우 비효율적일 수 있습니다.

Dense Vector (밀집 벡터)

dense vector는 sparse vector의 dimension 문제를 보완한 벡터입니다. 쉽게 말하면 sparse vector를 압축한 것으로, 사용자가 설정한 크기로 단어를 맞춥니다. 즉, "The dog is cute"를 sparse vector로 나타내면 [0, 1, 0, 0, 1, 1, 0, 0, 1] 이지만, dense vector로 나타내면 [0.2, -0.1, 0.03, 0.5] 로 표현됩니다. 요 표현을 어떻게 하는지는 조금 더 세부적으로 공부해서 기록해놓도록 할게요!

Word2vec

Word2vec은 워드임베딩 방식중 하나로 텍스트를 Dense vector로 변환하는 과정을 말한다. 크게 CBOWSkip-Gram으로 구분된다.

CBOW

CBOW는 주변단어를 이용해 중심단어를 예측하는 방법이다.
CBOW의 매커니즘은 아래와 같다.

  • Input layer: 주변단어 4개($$1 \times v$$ vector)를 input으로 받는다. 이 떄 가중치행렬 $$W_{v \times m}$$ 을 각 단어에 곱하여 그 값을 projection layer에 전달한다. 이 때 주변단어는 희소벡터 형태로 표현된다.
  • Projection layer: 4개의 주변단어와 가중치행렬을 곱하여 4개의 output($$1 \times m$$ vector)을 산출한다. 이 때 각 output을 $$v_{fat}, v_{dog}, v_{delicious}, v_{min}$$ 이라 하자. Projection layer에서는 이 네 개의 벡터의 평균을 구하여 새로운 벡터를 만든다.
  • Output layer: Projection layer에서 구한 벡터 $$v$$와 가중치행렬을 transpose한 W 행렬을 곱하여 output layer의 input으로 전달한다. 이 값을 $$z$$ 라 하자. 그리고 최종적으로 output layer의 ouput은 $$z$$에 softmax함수를 적용하여 구할 수 있다.
  • Output layer에서 구한 최종 output $$\hat{y}$$와 예측하고자 하는 대상인 ate의 희소벡터 $$y$$ 와의 cross entropy를 계산하여 loss를 구한다.

(아직 tistory에 수식입력하는게 익숙하지 않네요,.,,, ㅠㅜ)

출처 :&nbsp;https://hyewonleess.github.io/nlp/NLP-basic/

Skip-Gram

Skip-Gram은 중심단어를 이용해 주변단어를 예측하는 방법으로, 앞서 다룬 CBOW 방법과 반대 과정이다. CBOW 방법과의 차이점 중 하나는 Skip-Gram방법은 Projection Layer에서 해당 Layer의 Output 평균을 낼 필요가 없다는 점이다. 생각해보면 당연한 것이지만 이 방법은 하나의 중심단어로부터 주변단어를 예측하는 알고리즘이기 때문에 Input Layer에서 Projection Layer로 전달되는 값이 단 하나이므로 평균을 내지 않아도 된다.

출처 :&nbsp;https://hyewonleess.github.io/nlp/NLP-basic/

GloVe

텍스트분석 시 텍스트를 컴퓨터 언어로 처리하기 위해 사용되는 기법은 크게 카운트 기반, 예측 기반으로 나눠진다.
카운트기반은 말 그대로 텍스트를 구성하는 단어의 수를 세어 빈도를 기반으로 단어를 예측하고자 하는 것이고 예측기반의 대표적인 알고리즘은 위에서 다룬 word2vec 이다. 이 두 방법론에는 장단점이 있다.

카운트 기반 방법론의 경우, 전체 텍스트에서의 단어 발생 빈도와 같은 전체적인 통계 정보를 포함하지만 단순히 “빈도 기반”이기 때문에 단어 간의 유사도를 반영하지 못한다는 단점이 있다. 반대로 예측 기반 방법론에서는 단어간 유사도를 반영하지만 전체 텍스트에서의 통계 정보는 반영하지 못한다.

이 두 방법론을 모두 사용하는 알고리즘이 바로 GloVe 이다.

동시등장행렬(Co-occurence Matrix)

동시등장행렬은 텍스트를 구성하는 단어들을 행, 열에 배치하고, i번째 행에 해당하는 단어의 윈도우 크기 내에서 k 단어가 등장한 횟수를 표시한다. 백문이 불여일견! 예시와 함께 살펴보자.

예시: I like deep learning. I like NLP. I enjoy eating. 이렇게 세 문장이 텍스트를 구성한다고 하자. 그러면 텍스트를 구성하는 개별 단어는 I, like, enjoy, deep, learning, NLP, eating이다. 윈도우 사이즈는 1이라고 가정하자.

이를 동시등장행렬로 표현하면 다음과 같다.

출처 :&nbsp;https://hyewonleess.github.io/nlp/NLP-basic/

위 표에서 I 단어를 살펴보자. I 단어의 윈도우 사이즈 1 내에서, 즉 바로 다음에 오는 단어는 like가 2개, enjoy가 1개이다. 따라서 I 행렬에 [0, 2, 1, 0, 0, 0, 0] 로 표시되는 것이다.

동시등장확률(Co-occurence Probability)

동시등장확률  단어가 등장했을 때 윈도우 사이즈 내에서 단어가 등장한 확률을 계산한 값이다. 위에서 다룬 동시등장행렬에 적용하면  단어에 해당하는 행에 해당하는 카운트 값들을 모두 더한 것을 분자로 하고, 번째 행 열에 해당하는 단어에 대한 카운트를 분모로 한다고 볼 수 있다. 이렇게 구한 동시등장확률을 이용해 손실함수를 구하고, 이 손실함수를 최소화하는 방향으로 NLP모델을 학습한다.

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

 

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

<왕> - <남자> + <여자> = ?‌‌<마드리드> - <스페인> + <프랑스> = ? 다음 두 문제의 답은 무엇일까요? 이번 주에는 단어 간의 관계를 학습해 vector에 저장하는 word embedding이라는 아주 중요한 모델을

jiho-ml.com

출처 : https://hyewonleess.github.io/nlp/NLP-basic/

 

[NLP] #1. 워드 임베딩(Word Embedding)

Prologue 자연어처리(Natural Language Preprocessing) 은 문장, 텍스트 등 인간의 언어를 컴퓨터 언어로 구현하는 AI 알고리즘이다. NLP는 현 시대를 대표는 AI 알고리즘 중 하나로, 가장 대표적인 것이 텍스

hyewonleess.github.io