본문으로 바로가기

참조: https://wikidocs.net/22660 / https://brunch.co.kr/@goodvc78/16 

 

02) 워드투벡터(Word2Vec)

앞서 원-핫 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다는 단점이 있음을 언급한 적이 있습니다. 그래서 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 ...

wikidocs.net

 

Word2Vec 그리고 추천 시스템의 Item2Vec

마이크로소프웨어 AI특집 복간호 기고글 | 개발자들의 마소(마이크로 소프트웨어 잡지)가 다시 발간되었다. 우연히 기회가 되어 재 발간되는 마소에 나의 글을 기고할 수 있게 된 것은 가문의

brunch.co.kr


 

Word2Vec

원-핫 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다

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

단어의 의미를 다차원 공간에 벡터화하는 방법 (분산 표현, distributed representation) 활용

 

단어 벡터화 방식

1. 희소 표현 (Sparse Representation)

   - One-Hot Encoding

 

2. 밀집 표현 (Dense Representation) 

blog.skby.net/워드-임베딩word-embedding/

 

분산 표현 (Distributed Representation)

'비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다' 라는 가정

희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산 하여 표현

-> 이런 표현 방법을 사용하여 단어 벡터 간 유의미한 유사도를 계산

대표적인 학습 방법: Word2Vec

 

 

 

CBOW(continuous bag-of-words)와 skip-gram 이라는 2가지의 모델로 제안이 되었다.

 

1. CBOW

Continuous Bag-Of-Words

CBOW 모델의 경우 context words라는 주변의 단어들을 이용해서 target word를 예측하는 모델

"나는 대한민국 국민이다"라는 문장이 있다고 가정을 해보자. Input은 "나는", "대한민국", "국민이다"라는 것들이 되며 이 문장들을 학습하여 "나는 ~ 국민이다" 안에 들어갈 단어를 예측해 낼 수 있다.

이때 주변 단어를 몇개 쓸 것인지 학습을 할 때 선택할 수 있는데 이를 윈도우 크기(Window size)라 한다. 예를 들어 윈도우 크기를 2로 할 경우 학습 시 앞뒤 단어 2개를 사용하여 중간에 있는 단어를 예측하게 된다.

https://wikidocs.net/22660

 

2. Skip-Gram

주변의 단어들의 문맥(context)를 학습하여 단어를 예측하는 것이 CBOW라고 한다면 Skip-Gram은 이와 반대되는 개념

"~ 대한민국 ~"의 문장이 있을 경우, 대한민국의 주변 단어들을 예측하는 모델

 

Skip-Gram도 CBOW 처럼 윈도우 개념을 사용하며 하나의 단어를 기반으로 주변의 단어를 몇개까지 예측하는지를 역시 Window로 표현한다. 1일 경우 앞뒤 한개씩, 2일 경우 앞뒤 2개씩을 학습하며 예측한다.

대충 성능은 CBOW가 더 좋을거라 예측할 수 있어서 Skip-Gram은 왜 쓰는 것일까 생각할 수 있지만 분산 표현력은 Skip-Gram이 더 우수하며 CBOW는 학습 속도가 빠른 장단점들을 각각 가지고 있다.

 

+실제 현업에서는 CBOW보다는 Skip-Gram 알고리즘을 많이 사용합니다. 그 이유는 일단 성능적인 측면이 큽니다. Skip-Gram은 CBOW 보다 좀 더 어려운 테스크를 수행하고, 하나의 문장에서 더 많인 데이터가 나옵니다.

 

+일반적으로 데이터 집합이 클 경우 Skip-gram 모델 구조가 우수한 정확도 등의 측면을 보이는 것으로 알려져 있다(Mikolov et al., 2013; 심영석 & 김홍범, 2018).

 

https://wikidocs.net/22660

 

 

간단한 코드 구현:

# Word2Vec
import gensim
from gensim.models import Word2Vec 

# Word2Vec 모델 학습(학습 방식 = CBOW)
model_cbow = gensim.models.Word2Vec(sentences=df['Text_token'], size=100, window=3, min_count=0,workers=4,sg=0)

# 완성된 임베딩 매트릭스의 크기 확인(cbow)
model_cbow.wv.vectors.shape   #>(7131, 100)

# 단어 유사도 확인
print(model_cbow.wv.most_similar("삼겹살"))