MI Lab/Word2Vec - 2021.11~2022.01

[단어 연관도 분석] Word2Vec

코딩뽀시래기 2021. 11. 20. 22:30
728x90

인공지능을 이용해 영어 단어의 연관성을 분석하고, 그 분석 정보를 바탕으로 영어 단어를 입력했을 때 함께 공부하면 도움이 될 영어단어를 추천해주는 앱을 개발하려고 한다. 그 과정에서 인공지능 부분을 맡게 되면서 인공지능을 이용해 영어 단어의 연관성을 찾는 방법에 대해 공부를 하고 있다.

 

단어의 연관성 탐색을 하는 인공지능 알고리즘 중에 Word2Vec라는 알고리즘이 있기에 깊이 공부해보려 한다.

 


 

▶ Word2Vec란?

- 신경망을 기반으로 한 비지도 학습 알고리즘

- 자동으로 단어 사이의 관계를 학습한다.

- Word2Vec 아이디어: 비슷한 의미를 가진 단어를 비슷한 클러스터*로 모으는 것

- Word2Vec에서 만든 벡터 공간을 이용하면 간단한 벡터 연산으로 단어를 생성할 수 있다.

예) king - man + waman = queen

클러스터*: 디스크로부터 데이터를 읽어오는 시간을 줄이기 위해, 자주 사용되는 테이블의 데이터를 디스크의 같은 위치에 저장하는 방법

 

+) word2vec 알고리즘은 BoW 모델을 대체할 수 있는 방법이다. (Bow 모델도 이후에 공부해보기)

 


 

<작동 원리>

- text 언어 자료를 받아 단어 벡터를 생성한다.

- 먼저 훈련 텍스트 데이터에서 어휘를 구성한 다음, 단어의 벡터 표현을 학습한다.

- 학습된 표현을 조사하는 간단한 방법: 사용자가 지정한 단어에 가장 가까운 단어를 찾는 것. (입력한 단어에 대해 가장 유사한 단어와 해당 단어까지의 거리를 표시함)

→ 그렇다면 거리는 어떻게 계산하는 걸까?

 

- word2vec에는 두 가지 주요 학습 알고리즘이 있다.

1) continuous bag-of-words

2) continuous skip-gram

- 두 알고리즘 모두 문장의 다른 단어를 예측하는 데에 유용한 단어 표현을 학습한다.

→ 해당 알고리즘 찾아보고 공부하기 (아래에 간단히 설명)

 

- 단어 벡터의 속성?

: 벡터가 단어의 많은 언어적 규칙성을 포착함

vector('Paris') - vector('France') + vector('Italy') = vector('Rome ')

vector('king') - vector('man') + vector('woman') = vector('queen')

 

- 단어 벡터의 품질에 영향을 미치는 요소

 - amount and quality of the training data (훈련 데이터의 양과 품질)

 - size of the vectors (벡터의 크기)

 - training algorithm (훈련 알고리즘)

 


<원핫 인코딩(one-hot encoding)>

- 단어에 번호를 매기고, 그 번호에 해당하는 요소만 1, 나머지는 0을 갖는 벡터로 바꿈.

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

- N개의 단어가 있다면, 각 단어는 한 개의 요소만 1인 N차원의 벡터로 표현됨.

- 단점: 벡터 표현에 단어와 단어의 관계가 전혀 드러나지 않는다는 것

예) '강아지'와 '멍멍이'라는 단어가 있을 때 의미가 비슷한데도 불구하고 전혀 다른 벡터로 표현이 됨.

→ 벡터에 단어의 의미를 담을 수 있다면? 비슷한 단어들을 비슷한 벡터로 표현할 수 있다면? 단어와 단어 같의 관계가 벡터를 통해 나타날 수 있다면?

 

- 단어 임베딩(word embedding)

: 단어를 벡터로 바꾸는 모델

→ word2vec는 단어 임베딩 모델들 중 대표적인 모델임

- 벡터 간에는 덧셈 뺄셈이 가능 → 벡터 간의 덧셈 뺄셈이 해당하는 단어 간의 의미의 합과 의미의 차로 반영됨,

- 어떻게 이런 벡터 연산으로 단어 간의 관계를 파악할 수 있을까? 단어의 의미가 벡터에 잘 담겨있기 때문.

- 어떻게 벡터에 단어의 의미를 담을 수 있을까?

 


 

< feature representation >

: 대상의 속성을 표현하는 방식

- 데이터: 대상의 속성을 표현해놓은 자료

- 자연어 처리의 경우: 대상은 텍스트이고, 데이터는 해당 텍스트의 속성을 표현해놓은 것이다.

- feature representation: 그 단어가 '강아지'라는 것 자체, 단어의 품사, 앞 단어가 무엇인지, 문장에서 몇 번째 단어인지, 단어가 긴지 짧은지 등의 언어적 정보를 추출해서 표현하는 것

- 대상의 속성을 표현 하는 방법

  1) sparse representation (=one-hot encoding)

  2) dense representation (=word2vec)

 

1) Sparse representation (예: one-hot encoding)

- 해당 속성이 가질 수 있는 경우의 수를 각각 독립적인 차원으로 표현

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

- sparse vector(희소 벡터): 벡터의 값 중 대부분이 0이고, 몇 개만 값을 갖고 있는 벡터

 

2) Dense representation (예: word2vec)

- 각 속성을 독립적인 차원으로 나타내지 않고, 정해둔 개수의 차원으로 대상을 대응시켜서 표현

- 속성을 N차원으로 표현하는 경우, 그 속성을 N차원 벡터에 대응시키는 것 (=임베딩 embedding)

+) 임베딩하는 방식은 머신러닝을 통해 학습하게 된다.

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

- 원핫 인코딩처럼 희소 벡터가 아니라, 모든 차원이 값을 가지고 있는 벡터로 표현아 됨.

- dense representation = distributed representation

- 하나의 정보가 여러 차원에 분산되어 표현됨.

  = 하나의 차원이 하나의 속성을 명시적으로 표현하지 않고, 여러 차원이 조합되어 속성을 표현함.

→ 각각의 차원이 어떤 의미를 갖는지는 알 수 없지만, 각 단어가 얼마나 비슷하고 다른지는 벡터 간의 거리를 통해 알 수 있음.

- 단어 벡터의 값들을 머신 러닝을 통해 학습되며, word2vec가 그 학습 방법론 중 하나임.

 

+) dense representation이 sparse representation에 비해 가지는 장점

1. 적은 차원으로 대상을 표현할 수 있다.

  - 입력 데이터의 차원이 높으면 차원의 저주라는 문제가 생김

  - 입력 데이터에 0이 많으면 데이터에서 정보를 뽑아내기 어렵기 때문에 sparse representation을 쓰면 모델의 학습이 어렵고 성능이 떨어지기 쉬움.

  - dense representation으로 단어를 표현할 때는 보통 20~200차원 정도를 사용.(sparse는 몇 천 자원이 필요)

  - 각각의 차원이 모두 정보를 들고 있어 모델이 더 작동하기 쉬워짐

2. 더 큰 일반화 능력을 가지고 있다.

  예) '강아지'와 '멍멍이'가 서로 비슷한 벡터로 표현이 된다면 '강아지'에 대한 정보가 '멍멍이'에도 일반화될 수 있음.

      '강아지'를 입력으로 받고, '애완동물'이라는 출력을 하도록 모델이 학습된다면, '멍멍이'도 비슷한 출력이 나올 가능성이 높음. '강아지'라는 단어에 대해 배운 지식을 '멍멍이'라는 단어에도 적용가능.

 


 

<word2vec>

- 단어 임베딩을 학습하는 알고리즘 중 하나(가장 자주 쓰임)

 

- 단어의 주변을 보면 그 단어를 알 수 있으므로, 단어의 주변이 비슷하면 비슷한 단어이다.

- 문장의 빈 칸에 들어갈 수 있는 단어들은 어느 정도 비슷한 맥락을 가진다고 볼 수 있다.

 

- 비슷한 맥락을 갖는 단어에 비슷한 벡터를 주는 방법

  → word2vec는 predictive method라는 방식에 속함

 

- predictive method

: 맥락으로 단어를 예측하거나, 단어로 맥락을 예측하는 문제를 마치 지도학습처럼 푸는 것

- 이 예측 모델을 학습하면서, 단어를 어덯게 표현할지를배우게 되고 비슷한 단어가 비슷한 벡터로 표현된다.

 

- word2vec는 지도 학습을 닮았지만, 비지도 학습 알고리즘임.

- 어떤 단어끼리 비슷한지 사람이 알려주지 않아도 비슷한 단어들을 찾아낼 수 있음.

- 모든 텍스트들을 학습 데이터로 사용할 수 있다.

 

<word2vec의 방식>

1) CBOW(continuous bag-of-words)

: 맥락으로 단어를 예측

- CBOW 모델은 맥락(주변 단어)로 타겟 단어를 예측하는 문제를 푼다.

- 주변 단어: 보통 타겟 단어 직전 몇 단어와 직후 몇 단어

- 주변 단어의 범위: window

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

- 앞뒤로 몇 단어까지 볼지는 지정 가능. (window size)

- word2vec는 데이터셋을 만들 때, sliding window라는 방법을 사용.

- sliding window: window를 점차 옆으로 밀면서 타겟 단어를 계속 바꾸는 방식

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

- 이렇게 만들어진 window 하나하나가 학습데이터가 됨.

 

- CBOW는 맥락으로 단어를 예측하는 문자를 풀기 때문에, '주위에 있는 단어가 입력이 되고 타겟 단어가 예측해야 할 출력값이 되는' 문제를 푼다.

- 이 과정에서 모델의 파라미터를 학습하고, 학습된 파라미터가 단어들의 벡터 표현이 된다.

- 처음 파라미터는 랜덤으로 초기화된 상태로 시작해서, 이 파라미터로 예측을 하고 실제 값과 차이가 생기면 오차를 조정해나간다. 이 과정을 학습 데이터셋을 돌아가며 반복한다. (=backpropagation) cost funstion(비용 함수)가 최소화되는 쪽으로 파라미터를 업데이트해 가는 것.

 

- 입력이 비슷하면 출력도 비슷한데, CBOW에서 모델의 입력은 주변 단어이므로 주위에 있는 단어가 비슷하면 그 단어의 벡터 표현도 비슷해진다. (벡터가 비슷하다 = 벡터 간의 거리가 짧다) → 이런 방식으로 비슷한 맥락의 단어에 비슷한 벡터를 주는 것.

 

2) continuous skip-gram

: 단어로 맥락을 예측

- CBOW 모델을 반대로 뒤집으면 skip-gram 모델이 됨.

 


 

+) 참고 링크

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

 

쉽게 씌어진 word2vec | Dreamgonfly's blog

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

dreamgonfly.github.io

 

728x90