이번 강의는 지난 1강에 이어서 계속 워드 임베딩 방법론에 대해서 설명한다. 

lecture1에서 워드 임베딩이 필요한 이유, 워드 벡터와 워드 임베딩이 무엇인지, 그리고 Word2vec의 개념과 훈련 방법에 대해서 쭉 설명한다. lecture2 초반부에서 lec1에 다 못한 설명을 이어서 하는데 그 설명은 이전글에 연결해서 작성했다.

 

여기서부터는 word2vec model의 방법 중 skip-gram(이하 SG)와 CBOW, 카운트 기반 방법론(LSA), 그리고 마지막으로 어떻게 GloVe까지 등장했는지까지의 설명을 작성한다. 

 

 

Word2vec : Skip-grams & CBOW

 

■ Word2vec maximizes objective function by putting similar words nearby in space. 

 

워드 벡터 간 유사도를 측정할 수 없는 단점을 가졌던

- 원-핫 벡터 표현 방식(국소 표현 방식)을

- 대신하여 나타난 방법이  워드 임베딩 : 'word2vec' (분산 표현 방식)이었다.

[ 단어 간 유사도를 반영할 수 있도록 단어의 의미를 벡터화 할 수 있는 방법 ]

 

 

■ Using Center words and Context words : Skip-Gram & CBOW

 

1. SG : Predict context words, Given center word

2. CBOW : Predict center word, Given context words

 

1강에서 설명한 word2vec 방법은 'SG' 방법이었던 것이다. (중심단어로 c가 나올 때 문맥단어로 o가 나올 확률계산)

 

SG

 

 

전 글에서 어떻게 중심단어로 주변단어들을 예측하는지에 대해 적어두었다. 

그리고 윈도우 크기가 m일 때 경사하강법으로 통해 업데이트되는 가중치는 2m+1개이므로 V 사이즈가 매우 크다면 업데이트 되는 2m+1개의 값 외에는 모두 0인 희소행렬이 된다고 했다. 

 

 

또한, 기존 방식에서 위 식의 분모를 계산할 때 단어사전의 크기만큼의 가중치를 주어진 중심단어의 가중치와 매번 내적곱하여 더해줘야 하기 때문에 계산이 복잡하고 비용이 많이 든다는 문제가 있다. 기존 sg의 출력층에서는 소프트맥스 함수를 지난 단어 집합 크기의 벡터와 실제값인 원-핫 벡터와의 오차를 구하고 이로부터 임베딩 테이블에 있는 모든 단어에 대한 임베딩 벡터 값을 업데이트하는 역전파 과정을 거친다. 만약 단어 집합의 크기가 수만 이상에 달한다면 이 모델은 학습하기에 매우 무거운 모델인 것이다.

 

그래서 고안한 방법이 skip-gram model with negative sampling (이하 SGNS)이다. 

기존의 방식이 Loss function을 계산하기 위해 단순 softmax 함수를 이용한 다중분류 방식으로의 접근임과 다르게, 

SGNS는 sigmoid 함수를 이용한 이중분류 방식을 이용하여 계산량을 줄여준다. 

 

 

SGNS

 

요점 : train BINARY logistic regressions to differentiate a
 (1) true pair (center word and a word in its context window) OR
 (2) several "noise" pairs ( the center word paired with a random word )

 

 

 

 

CBOW

 

본 강의에서는 SG만 설명하기 때문에 다른 글을 참고하여 시각적으로 정리해보았다. (접은글)

더보기

 

 

 

 

 

 

Co - occurence counts

말뭉치 전체를 보면서 가중치를 업데이트하고 중심단어를 기준으로 맥락단어가 등장할 확률을 계산하는 대신에, 

어떤 단어가  무슨 단어의 주변에 등장하는지 통계적으로 카운트할 수 없을까? 에서 나온 방법이다. 

 

카운트 기반의 co-occurence matrix를 구성하는 방법으로는 2가지가 있다. 

(1) window 이용 , (2) word-document 기반

 

 

 

■ Window based co-occurence matrix

 

- similar to word2vec, use window around each word → captures some syntactic and semantic information ('word space')

 

 

 

■ Word-document co-occurence matrix

 

- gives general topics (terms within similar topics will have similar entries) leading to 'latent semantic analysis' ('document space')

 

■ Problems with co-occurence matrix & SVD

 

- 단어사전(vocabulary) 크기가 커지면 그만큼 vector의 크기도 커진다. 아무튼, vector 크기 자체가 엄청 커져서 연산이 어려워진다. 

- 그렇게 큰, 고차원 벡터임에도 불구하고 대부분의 값이 0이 될 것임. :: 희소행렬

- subsequent classification models have sparsity issues : models are less robust

 

어떻게 저차원 벡터로 만들 수 있을까??

- 아이디어 : 대부분의 중요한 정보를 저차원 벡터에 담아보자. 밀집행렬.

- word2vec과 비슷하게 25-1000차원으로

- 방법 : SVD → LSA

 

 

(svd의 자세한 방법은 생략)

 

retain only k singular values, in order to generalize

 

그런데 이렇게 차원을 줄이는게 그다지 효과적이지 않아 벡터를 스케일링하는  'COALS'라는 방법이 나왔다고 함. (상세내용생략)

 

GloVe

지금까지 단어를 벡터화하는 방법을 크게 두 가지로 나눠서 봤다.

첫번째는 카운트를 기반으로 한 co-occurence 행렬으로 나타내는 방법. 두번째는 예측 기반 word2vec방법이다. 

카운트 기반 방법은 각 문서에서 단어가 출현하는 빈도를 세어 나타낸 행렬이므로 전체적인 코퍼스의 통계 정보를 잘 반영하였지만 단어 의미 유추 작업(anology)에 성능이 떨어진다. 반면 word2vec 방식은 유추 작업은 뛰어나지만, 임베딩 벡터가 윈도우 크기 내에서만 주변 단어를 고려하기 때문에 코퍼스의 전체적인 통계 정보를 반영하지 못한다. 

 

 

GloVe는 두 방법의 장점들을 모두 반영하기 위해 스탠포드에서 개발된 word embedding 방법이다. 

 

- uses global statistics to predict the probability of word j appearing in the context of word i with a least squares objective

  : co-occurence matrix를 기반으로, 이를 확률로 나타낸 co-occurence probability이다. 

 

 

 

 

해석의 예를 들어보자면, 'ice'라는 단어 주변에 'solid'라는 단어가 나올 확률은 'steam'이라는 단어 주변에 'solid'라는 단어가 나올 확률보다 매우 높다. 한편, 'ice'라는 단어 주변에 'water'이라는 단어가 나올 확률과 'steam'이라는 단어 주변에 'water'라는 단어가 나올 확률은 거의 비슷하다.