슬기로운 연구생활

Classification - [10] GloVe 본문

슬기로운 NLP 생활

Classification - [10] GloVe

vhrehfdl 2020. 9. 13. 13:07

이전 글

[1] 자연어처리란?

[2] Classification Task

[3] POS Tagging

[4] Stemming, Lemmatizing

[5] 형태소 분석기

[6] One-Hot Encoding, Bag Of Word

[7] TF-IDF

[8] Word2vec

[9] Fasttext

 

들어가며

현재까지 Word Embedding 중 Word2vec과 Fasttext에 대해 살펴보았습니다.

오늘은 Jeffrey Pennington, Richard Socher, Christopher D. Manning이 제안한 GloVe에 대해 알아보겠습니다.

 

기존 방법의 문제점

GloVe 연구팀은 LSA와 Word2vec의 장단점을 지적하며 Glove라는 새로운 방법론을 제안했습니다.

 

- LSA는 DTM이나 TF-IDF 행렬과 같이 각 문서에서의 각 단어의 빈도수를 카운트 한 행렬이라는 전체적인 통계 정보를 입력으로 받아 차원을 축소(Truncated SVD)하여 잠재된 의미를 끌어내는 방법론입니다.

LSA는 카운트 기반으로 코퍼스의 전체적인 통계 정보를 고려하기는 하지만, 왕:남자 = 여왕:? (정답은 여자)와 같은 단어 의미의 유추 작업(Analogy task)에는 성능이 떨어집니다. 

LSA에 대한 자세한 설명은 추후 슬기로운 자연어처리 [번외] LSA 에서 설명하겠습니다.

 

- Word2Vec은 주변단어로 중심단어(CBOW)를 중심단어로 주변단어를(Skip-gram) 방법으로 단어를 예측하기 때문에, 단어 간 유추 작업에는 LSA보다 뛰어나다는 장점이 있습니다.

하지만 Word2vec 학습 방법 상 코퍼스의 전체적인 통계 정보를 반영하지 못한다는 단점이 존재합니다.

 

처음에 저는 코퍼스의 전체적인 통계 정보를 반영하지 못한다는 단점이 Word2vec의 Window Size를 문장의 최대 사이즈로 설정하지 않아 생기는 문제라고 잘 못 이해했었습니다.

위 문장의 뜻은 Word2vec 학습과정에서 통계 정보, 전체 코퍼스에서 해당 단어가 몇 번 등장했는지의 정보가 반영되지 않는 다는 뜻인 것을 Glove의 학습 과정을 보고 이해했습니다.

 

예를 들어 Corpus에 "I am a boy", "I love a cookie"라는 문장이 있다고 가정해보겠습니다.

중심단어를 "a"로 가정하여 데이터 셋을 구성하면 ( "a" / "am" ), ( "a" / "boy" ), ( "a" / "love" ), ( "a" / "cookie" ) 로 구성될 수 있습니다.

중심단어 "a"가 입력값이고 "am", "boy", "love", "cookie"가 출력값으로 각각 Shallow Neural Network에 순차적으로 입력되어 학습이 진행되기 때문에, 코퍼스의 전체 통계 정보가 학습 과정에 반영되지 못합니다. 

 

- GloVe는 이러한 기존 방법론들의 각각의 한계를 지적하며, LSA의 메커니즘이었던 카운트 기반의 방법과 Word2Vec의 메커니즘이었던 예측 기반의 방법론 두 가지를 모두 사용합니다.

 

GloVe

GloVe의 핵심은 Matrix Factorization을 사용해 학습한다는 것입니다.

이전에 살펴보았던 Word2vec과 Fasttext는 Shallow Fully Connected Neural Net을 사용해 학습을 한다면 Glove는 신경망이 아닌 MF 방식을 사용한다는 것이 가장 큰 특징입니다.

 

그림으로 표현하면 다음과 같습니다.

위의 그림을 보면 V x V, V x D, D x V과 같이 세개의 행렬이 있습니다.

Co-occurrence Matrix가 V x V 행렬입니다.

V x D 행렬과 D x V 행렬은 임의로 생성한 행렬이며 내부의 초기 값은 랜덤하게 세팅되어있습니다.

V x D 행렬과 D x V 행렬 곱을 하면 V x V 크기의 행렬이 만들어지며 해당 행렬과 Co-occurance 행렬과의 차이를 줄여나가는 과정이 Glove의 학습방식입니다.

Loss Function을 이용해 Co-occurance 행렬과 행렬 곱을 한 행렬의 값이 가까워지게 연산을 진행하는 방식입니다.

 

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

단어의 동시 등장 행렬은 행과 열을 전체 단어 집합의 단어들로 구성된 행렬을 의미합니다.

예제를 보면 쉽게 이해하실 수 있습니다. 

아래와 같은 텍스트가 있다고 가정해보겠습니다.

Ex) I like deep learning
I like NLP
I enjoy flying

윈도우 크기가 N일 때는 좌, 우에 존재하는 N개의 단어만 참고하게 됩니다. 

윈도우 크기가 1일 때, 위의 텍스트를 가지고 구성한 동시 등장 행렬은 다음과 같습니다.

 

카운트

I

like

enjoy

deep

learning

NLP

flying

I

0

2

1

0

0

0

0

like

2

0

0

1

0

1

0

enjoy

1

0

0

0

0

0

1

deep

0

1

0

0

1

0

0

learning

0

0

0

1

0

0

0

NLP

0

1

0

0

0

0

0

flying

0

0

1

0

0

0

0

 

위 행렬은 전치(Transpose)해도 동일한 행렬이 된다는 특징이 있습니다. 

 

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

동시 등장 확률 P(k | i)는 동시 등장 행렬로부터 특정 단어 i의 전체 등장 횟수를 카운트하고, 특정 단어 i가 등장했을 때 어떤 단어 k가 등장한 횟수를 카운트하여 계산한 조건부 확률입니다.

다음은 GloVe의 제안 논문에서 가져온 동시 등장 확률을 표로 정리한 하나의 예입니다.

 

Ratio

k=solid

k=gas

k=water

k=fasion

P(k | ice)

0.00019

0.000066

0.003

0.000017

P(k | steam)

0.000022

0.00078

0.0022

0.000018

P(k | ice) / P(k | steam)

8.9

0.085

1.36

0.96

 

위의 표를 위의 표를 통해 알 수 있는 사실은 "ice"가 등장했을 때 "solid"가 등장할 확률 0.00019 입니다.

"steam"이 등장했을 때 "solid"가 등장할 확률은 0.000022로서 "ice"가 등장했을 때보다 약 8.9배 큽니다. 

그도 그럴 것이 "solid"는 "단단한"이라는 의미를 가졌으니까 "증기"라는 의미를 가지는 "steam"보다는 당연히 "얼음"이라는 의미를 가지는 "ice"라는 단어와 더 자주 등장할 겁니다.

 

수식적으로 다시 정리하면 k가 solid일 때, P(solid l ice) / P(solid l steam)를 계산한 값은 8.9가 나옵니다. 

이 값은 1보다는 매우 큰 값입니다. 

왜냐면 P(solid | ice)의 값은 크고, P(solid | steam)의 값은 작기 때문입니다.

그런데 k를 "solid"가 아니라 "gas"로 바꾸면 얘기는 완전히 달라집니다. 

"gas"는 "ice"보다는 "steam"과 더 자주 등장하므로, P(gas l ice) / P(gas l steam)를 계산한 값은 1보다 훨씬 작은 값인 0.085가 나옵니다. 

 

반면, k가 "water"인 경우에는 "solid""steam" 두 단어 모두와 동시 등장하는 경우가 많으므로 1에 가까운 값이 나오고, k가 "fasion"인 경우에는 "solid""steam" 두 단어 모두와 동시 등장하는 경우가 적으므로 1에 가까운 값이 나옵니다. 

보기 쉽도록 조금 단순화해서 표현한 표는 다음과 같습니다.

 

Ratio

k=solid

k=gas

k=water

k=fasion

P(k | ice)

큰 값

작은 값

큰 값

작은 값

P(k | steam)

작은 값

큰 값

큰 값

작은 값

P(k | ice) / P(k | steam)

큰 값

작은 값

1에 가까움

1에 가까움

 

Loss Function (손실함수)

Co-occurrence가 있는 두 단어의 단어 벡터를 이용하여 co-occurrence 값을 예측하는 regression 문제를 풉니다.

아래는 GloVe 의 목적식입니다. 

는 두 단어 $w_{i}$의 co-occurrence 입니다.

Window 안에 함께 등장한 횟수입니다.

단어 $w_{i}$$w_{j}$의 벡터의 곲에 각 단어의 bias 인 $b_{i}$를 더한 값이 co-occurrence 의 log 값과 비슷해지도록 $w_{i}$를 학습합니다.

위 loss function 에서 $b_{i}$가 0 이라면, 두 단어의 벡터의 곲이 co-occurrence의 log 값이 되는 것입니다.

Co-occurrence가 높을수록 두 단어 벡터는 비슷해져야 합니다.

Bias, $b_{i}$ 는 빈번하게 등장하는 단어의 기본 빈도수 역할을 합니다.

$w_{i}$가 cat 이나 dog 이고, $w_{i}$이 sit, animal, pet 처럼 cat 과 dog 에 공통적으로 등장하는 context words 라면, $w_{j}$에 의하여 cat 과 dog 은 비슷한 벡터를 학습하게 됩니다.

결국 Word2Vec 과 비슷한 학습 결과가 유도됩니다. (이후 Levy and Goldberg 는 GloVe 와 Word2Vec 이 이론적으로는 같음을 증명합니다).

 

마무리

이번 글에서는 Glove를 알아보았습니다.

Word2vec, Fasttext, Glove는 대표적으로 사용되는 Word Representation 방식이며 기존의 Count Based 방식의 문제점을 해결해주고 있습니다.

각 단어가 Dense Vector로 표현되기 때문에 불필요한 공간 낭비가 없고 단어의 의미적 유사성을 파악할 수 있습니다.

 

하지만 이러한 Word Embedding 방식에도 한계가 존재하며 이러한 문제를 해결하기 위해 ELMo, BERT, RoBERTa와 같은 방법이 나왔습니다.

다음 글 부터는 Contextualized Word Embedding에 대해 알아보도록 하겠습니다.

'슬기로운 NLP 생활' 카테고리의 다른 글

Classification - [12] GPT  (0) 2020.10.07
Classification - [11] ELMo  (0) 2020.09.24
Classification - [9] Fasttext  (0) 2020.09.02
Classification - [8] Word2vec  (2) 2020.08.24
Classification - [7] TF-IDF  (1) 2020.08.23
Comments