Patrick's 데이터 세상

Word2vec 본문

Deep Learning/이론

Word2vec

patrick610 2020. 11. 29. 18:43
반응형
SMALL

 

Word2vec

 

Word2vec은 단어 임베딩 모델들 중 대표적인 모델입니다.

단어 임베딩을 학습하는 알고리즘에는 여러 가지가 있는데 GloVe, FastText 등이 있습니다.

그중 가장 자주 쓰이고 가장 유명한 방식은 word2vec입니다.

Word2vec 알고리즘은 신경망 모델을 사용하여 큰 텍스트 코퍼스에서 단어 연관성을 학습합니다. 일단 학습되면 이러한 모델은 동의어 단어를 감지하거나 부분 문장에 대한 추가 단어를 제안할 수 있습니다.

이름에서 알 수 있듯이 Word2vec는 벡터라고 하는 특정 숫자 목록을 사용하여 각각의 고유 한 단어를 나타냅니다.

벡터는 간단한 수학 함수(벡터 간의 코사인 유사성)가 해당 벡터가 나타내는 단어 간의 의미 유사성 수준을 나타내도록 신중하게 선택됩니다.

 

 

 

 

아이디어

 

word2vec의 핵심적인 아이디어에 대해 알아보겠습니다.

단어의 주변을 보면 그 단어를 안다. You shall know a word by the company it keeps. - 언어학자 J.R. Firth (1957)

 

 

위 문장에서 빈칸에 들어갈 말을 유추해보면 Korean, Italian, delicious 등 food를 꾸며줄 수 있는 단어를 예상할 것입니다.

하지만 chair, parking과 같은 연관성 없는 말들은 들어가기 어려울 것입니다.

 

단어의 주위만 보았는데도 어떤 단어가 적합하고 어떤 단어가 부적합한지가 어느 정도 드러납니다. 이 빈칸에 들어갈 수 있는 단어들은 서로 비슷한 맥락을 갖는 단어들, 즉 서로 비슷한 단어들입니다.

단어의 주변을 보면 그 단어를 알 수 있기 때문에, 단어의 주변이 비슷하면 비슷한 단어라는 말이 됩니다.

 

 

알고리즘

word2vec 안에도 두 가지 방식이 있습니다.

하나는 맥락으로 단어를 예측하는 CBOW(continuous bag of words) 모델이고 또 다른 하나는 단어로 맥락을 예측하는 skip-gram 모델입니다.

 

 

CBOW

 

CBOW 모델은 주변 단어, 다른 말로 맥락(context)으로 타겟 단어(target word)를 예측하는 문제를 풉니다. 주변 단어란 보통 타겟 단어의 직전 몇 단어와 직후 몇 단어를 뜻합니다. 타겟 단어의 앞 뒤에 있는 단어들을 타겟 단어의 친구들이라고 보는 것입니다. 이 주변 단어의 범위를 window라고 부릅니다.

예를 들어 “Colorless green ideas sleep furiously"라는 문장이 있다고 해보겠습니다. 주변 단어는 타겟 단어의 앞 단어와 뒷 단어 하나씩이라고 정의하고 “green"이 타겟 단어라면 “Colorless"부터 “ideas"까지 창문이 놓여있다고 생각하고 이 단어들만 보는 것이 window 접근법입니다.

앞과 뒤에서 몇 단어까지 볼지는 지정해줄 수 있는데 이를 window size라고 합니다.

데이터셋을 만들 때 word2vec은 sliding window라는 방법을 씁니다. green을 타겟 단어로 놓고 Colorless부터 ideas까지 한번 본 다음에 window를 밀어서 이번에는 ideas를 중심에 놓고 그다음은 sleep을 중심에 놓고 봅니다. 이렇게 window를 점차 옆으로 밀면서 타겟 단어를 계속 바꾸는 방식을 sliding window라고 부릅니다. 만들어진 window 하나 하나가 우리의 학습 데이터가 됩니다.

CBOW는 맥락으로 단어를 예측하는 문제를 푸는데 즉, 주위에 있는 단어가 입력이 되고 타겟 단어가 우리가 예측해야 하는 출력 값이 되는 문제를 푸는 것입니다. 그 과정에서 모델의 파라미터를 학습하고, 이렇게 학습된 파라미터가 단어들의 벡터 표현이 됩니다.

파라미터가 학습되는 방식은 일반적인 머신 러닝, 딥 러닝 모델이 학습되는 방식과 같습니다. 처음 파라미터는 랜덤으로 초기화된 상태(random initialization)로 시작합니다. 이 파라미터로 예측을 하고, 실제 값과 차이가 생기면 틀린 만큼 파라미터들을 조금씩 조정합니다. 이 과정을 학습 데이터셋을 돌아가며 반복합니다. 뉴럴 네트워크 용어로는 이를 backpropagation이라고 부르며, 그 원리는 gradient descent와 같은데 즉 cost function이 최소화되는 쪽으로 파라미터들을 업데이트해 가는 것입니다.

CBOW에서 모델의 입력은 주변 단어인데 입력이 비슷하면 출력도 비슷해질 것입니다.

즉, 주위에 있는 단어가 비슷하면 그 단어의 벡터 표현 역시 비슷해집니다. 벡터가 비슷하다는 말은 벡터 간의 거리가 짧다는 말입니다. word2vec은 이러한 방식으로 비슷한 맥락의 단어에 비슷한 벡터를 줍니다.

 

 

 

 

 

Word2vec 수학적 이해

문맥에서 한 단어만 보고 타겟 단어를 예측하는 가장 간단한 형태의 CBOW를 생각해보겠습니다. 한 단어가 앞 단어인지 뒷 단어인지는 중요하지 않지만, 편의상 앞 단어라고 할 때 입력으로 타겟 단어의 앞 단어가 들어가고 출력으로 타겟 단어가 나와야 하는 문제입니다.

아래 그림은 이 단순화된 문제의 뉴럴 네트워크 모델입니다. V는 사전의 크기(vocabulary size), N은 히든 레이어의 크기(hidden layer size)를 뜻합니다. 사전의 크기란 다른 말로 단어의 개수, 히든 레이어의 크기는 우리가 단어를 몇 차원으로 임베딩 할지를 나타냅니다.

입력은 one-hot encoding 된 벡터이고 입력 단어, 즉 타겟 단어의 앞 단어는 V개의 요소 중 하나만 1이고 나머지는 모두 0인 벡터로 표현됩니다. 이렇게 단어의 개수만큼의 차원을 갖는 입력 레이어(input layer)가 히든 레이어(hidden layer)에서 임베딩 크기만큼의 차원의 벡터로 대응됩니다. 마지막으로 출력 레이어(output layer)는 다시 단어의 개수만큼의 차원을 갖습니다. 출력은 타겟 단어이므로 단어의 개수만큼의 경우의 수가 있기 때문입니다.

 

레이어들 사이의 뉴런들은 서로 모두 연결되어(fully connected) 있습니다. 입력 레이어(input layer)와 히든 레이어(hidden layer) 사이를 연결하는 파라미터들은 V X N의 행렬 W로 나타낼 수 있고, 입력 레이어에서 히든 레이어로 넘어가는 것은 단순히 행렬 W를 곱하는 것과 같습니다. x가 입력 벡터라고 하면, 히든 레이어 h는 WTx로 계산됩니다. 이 벡터는 V차원, 즉 임베딩 차원의 벡터가 됩니다.

입력 벡터 x는 one-hot encoding 된 벡터입니다. x의 요소 중 k번째 요소만 1이라고 할 때 x의 나머지 요소가 모두 0이기 때문에 다른 부분은 모두 무시되고 WTx의 결과는 WT의 k번째 열, 즉 W의 k번째 행만 남습니다. 이 벡터가 해당 단어의 N차원 벡터 표현이 됩니다. W의 각 행들은 각각 해당하는 단어의 N차원의 벡터 표현인 것입니다. W의 i번째 행을 vwIT라고 부르면, 히든 레이어 h는 vwIT와 결국 같다는 것을 알 수 있습니다.

입력 레이어에서 히든 레이어로 넘어가면서 우리는 히든 레이어 h를 얻었습니다. 히든 레이어에서 출력 레이어로 넘어가기 위해, 우리는 또 다른 행렬 W′ 가 필요합니다. W′ 는 N X V의 행렬입니다. 이 파라미터 행렬을 이용해서, 우리는 모든 단어에 대해 출력 레이어의 점수 uj를 계산할 수 있습니다. 아래 식에서 zwj W′의 j번째 열을 뜻합니다. 즉 uj는 j번째 단어에 대한 예측 점수입니다.

 

마지막으로 예측 점수를 각 단어의 확률 값으로 바꿔주기 위해 softmax를 씁니다. 이는 각 단어의 점수에 비례하여 점수를 확률로 만들어주는 방법입니다. 이 방식을 통해 각 단어의 예측 점수가 모두 0 이상이고 모두 더하면 1이 되는 확률 값으로 변합니다.

 

여기에서 yj는 출력 레이어의 j번째 출력 값입니다. 위 식들을 조합하면 최종적으로 아래와 같은 식을 얻습니다.

결과적으로 단어 w는 두 가지 벡터 vw와 zw로 표현됩니다. zw는 입력 레이어에서 히든 레이어로 넘어가는 행렬 W에서 나오며, zw는 히든 레이어에서 출력 레이어로 넘어가는 행렬 W′ 에서 나옵니다. vw를 단어 w의 입력 벡터(input vector), zw를 단어 w의 출력 벡터(output vector)라고도 부릅니다.

 

입력 벡터(input vector)와 출력 벡터(output vector) 모두 각각 단어의 의미를 담고 있지만, 이 둘을 조합하면 단어의 의미를 더욱 잘 표현할 수 있다고 알려져 있습니다.

 

 

 

 

시각화해서 이해하기

word2vec을 이해하기 쉽게 직접 학습시켜보며 시각적으로 볼 수 있는 wevi라는 웹페이지를 통해 확인해보겠습니다.

wevi

  • 왼쪽 위는 이 모델의 설정과 학습 데이터셋을 보여준다. 학습 데이터셋에서 eat|apple은 eat이 들어왔을 때 apple을 예측하도록 학습하겠다는 뜻이다.
  • 오른쪽 위에는 word2vec 모델이 있다. 왼쪽 단어들이 입력 레이어(input layer)이고 오른쪽 단어들이 출력 레이어(output layer)이다. 왼쪽 단어들 중 하나가 들어왔을 때 오른쪽 단어가 어떻게 예측되는지를 보여준다.
  • 왼쪽 아래는 단어 벡터의 값을 색깔로 보여준다. 정확한 숫자는 보이지 않지만 빨간색일수록 숫자가 크다는 뜻이고 파란색일수록 숫자가 작다는 뜻이다. 이 색깔의 의미는 오른쪽 위 Neurons에도 동일하게 적용된다.
  • 오른쪽 아래는 PCA를 이용해 단어 벡터를 2차원으로 표현한 것이다.

Next를 누르면 학습이 한번 진행됩니다. 첫 번째로 eat이 들어가서 apple을 예측해야 합니다. 처음에는 무작위 값으로 초기화된 weights가 곱해지기 때문에 eat에서 apple을 예측할 확률이나 water 예측할 확률이나 차이가 없습니다. 하지만 점차 학습이 진행되면서 같이 나올만한 단어와 나오지 않을 단어들의 차이가 뚜렷해집니다. 점점 좋은 벡터를 학습하게 되며 오른쪽 아래 PCA 화면에서 비슷한 단어끼리는 뭉치고, 다른 단어끼리는 떨어지게 됩니다. 이렇게 학습이 되는 과정을 볼 수 있습니다.

학습이 된 결과를 보면 오른쪽 아래 그래프에서 apple, orange, rice가 뭉쳤고 milk, juice, water가 뭉쳤습니다. 먹는 것과 마시는 것이 나눠진 것을 알 수 있습니다. 오른쪽 위 그래프에서는 drink라는 입력이 들어오자 juice, milk, water에 붉은색으로 높은 가중치가 부여되는 것을 알 수 있습니다.

 

 

 

 


출처

 

dreamgonfly.github.io/blog/word2vec-explained/

 

쉽게 씌어진 word2vec | Dreamgonfly's blog

텍스트 기반의 모델 만들기는 텍스트를 숫자로 바꾸려는 노력의 연속이다. 텍스트를 숫자로 바꾸어야만 알고리즘에 넣고 계산을 한 후 결과값을 낼 수 있기 때문이다. 텍스트를 숫자로 바꾸는

dreamgonfly.github.io

 

bcho.tistory.com/1210

 

t-SNE를 이용한 차원 감소 (Dimension reduction)

t-SNE를 이용한 차원 감소 조대협 (http://bcho.tistory.com) PCA 기반 차원 감소의 문제점 앞의 글에서 차원 감소에 대한 개념과, 차원 감소 알고리즘의 하나인 PCA 알고리즘에 대해서 살펴보았다. PCA의 경

bcho.tistory.com

 

반응형
LIST

'Deep Learning > 이론' 카테고리의 다른 글

정보 검색 개념  (0) 2021.02.18
BOW(Bag of Words)  (0) 2020.12.17
텍스트 분석(Text Analytics)  (0) 2020.12.14
PCA 분석  (0) 2020.12.02
Word Embedding 이론  (0) 2020.11.25
Comments