나의 전공 노트

임베딩 / 단어 임베딩: Word2Vec

JoyDo 2022. 11. 3. 18:59
728x90
 

파이썬 / 임베딩(embedding) / 단어 임베딩: 원-핫 인코딩

임베딩이란? 컴퓨터는 자연어를 직접적으로 처리할 수 없다. 컴퓨터는 수치 연산만 가능하기 때문에 자연어를 숫자나 벡터 형태로 변환할 필요가 있다. 이런 일련의 과정을 자연어 처리 분야에

daldalkorean.tistory.com

 

Word2Vec

원-핫 인코딩의 경우 구현은 간단하지만 치명적인 단점을 가지고 있다. 챗봇의 경우 많은 단어를 처리하면서 간어 간 유사도를 계산할 수 있어야 좋은 성능을 낼 수 있기 때문에 원-핫 인코딩 기법은 좋은 선택이 아니다. 따라서 분산 표현 형태의 단어 임베딩 모델을 사용하는 것이 좋다. 대표적인 분산 표현 형태의 단어 임베딩 방법으로는 Word2Vec이 있다.

Word2Vec은 2013년 구글에서 발표했으며 가장 많이 사용하고 있는 단어 임베딩 모델이다. 기존 신경망 기반의 단어 임베딩 모델에 비해 구조상 차이는 크게 없지만 계산량을 획기적으로 줄여 빠른 학습을 가능하게 하였다. Word2Vec 모델은 CBOW(Continuous Bag-of-Words)와 skip-gram 두 가지 모델로 제안되었다.

CBOW 모델은 맥락(conext word)이라 표현되는 주변 단어들을 이용해 타깃 단어를 예측하는 신경망 모델이다. 신경망의 입력을 주변 단어들로 구성하고 출력을 타깃 단어로 설정해 학습된 가중치 데이터를 임베딩 벡터로 활용한다. skip-gram 모델은 CBOW 모델로 하나의 타깃 단어를 이용해 주변 단어들을 예측하는 신경망 모델이다. 입출력이 CBOW 모델과 반대로 되어 있기 때문에 skip-gram 모델이 CBOW 모델에 비해 예측해야 하는 맥락이 많아진다. 따라서 단어 분산 표현력이 우수해 CBOW 모델에 비해 임베딩 품질이 우수하다. 반면 CBOW 모델은 타깃 단어의 손실만 계산하면 되기 때문에 학습 속도가 빠른 장점이 있다.

 

CBOW(Continuous bag-of-words) Skip-gram
- 맥락(context word)이라 표현되는 주변 단어들을 이용해 타깃 단어를 예측하는 신경망 모델
- 신경망의 입력을 주변 단어들로 구성하고 출력을 타깃 단어로 설정해 학습된 가중치 데이터를 임베딩 벡터로 활용
- 타깃 단어의 손실만 계산하면 되기 때문에 학습 속도가 빠른 장점이 있음
- CBOW(Continuous bag-of-words) 모델과 반대로 하나의 타깃 단어를 이용해 주변 단어들을 예측하는 신경망 모델
- 입출력이 CBOW 모델과 반대로 되어 있기 때문에 skip-gram 모델이 CBOW에 비해 예측해야 하는 맥락이 많아짐. 따라서 단어 분산 표현력이 우수해 CBOW에 비해 임베딩 품질이 우수

 

Word2Vec의 두 가지 모델에 다루는 문제

CBOW 모델에서는 타깃 단어를 예측하기 위해 앞뒤 단어를 확인했다. 이때 앞뒤로 몇 개의 단어까지 확인할지 결정할 수 있는데 이 범위를 윈도우(window)라고 한다. 예를 들어 윈도우 크기를 2로 한 경우 타깃 단어 2개의 모델 학습을 위해 사용된다.

CBOW와 skip-gram의 window size

Word2Vec의 단어 임베딩은 해당 단어를 밀집 벡터로 표현하며 학습을 통해 의미상 비슷한 단어들을 비슷한 벡터 공간에 위치시킨다. 또한 벡터 특성상 의미에 따라 방향성을 갖게 된다. 이때 방향성에 대해 이해해야 한다. 임베딩된 벡터들 간 연산이 가능하기 때문에 다음의 그림처럼 단어 간 관계를 계산할 수 있다. 신기하게도 '왕'과 '여왕'의 방향 차이만큼 '남자'와 '여자'의 방향 차이가 생긴다. 이런 특징을 이용해 자연어의 의미를 파악할 수 있다.

Word2Vec의 두 가지 모델이 다루는 문제

 


 

Word2Vec 모델을 텐서플로나 케라스 같은 신경망 라이브러리를 이용해 직접 구현할 수도 있지만 꼭 그럴 필요는 없다. Word2Vec을 사용할 수 있는 오픈소스 라이브러리인 Genism 패키지를 사용하면 되기 때문이다.

한국어 Word2Vec을 만들기 위해서는 한국어 말뭉치를 수집해야 하는데, 웹에서는 한국어 위키나 네이버 영화 리뷰 데이터(Naver Sentiment Movie Corpus, NSMC)를 제외하고는 한국어 말뭉치를 구하기가 쉽지 않다. 

gensim 설치하기
만약에 파이참에서 gensim이 안 된다면... setting에서 gensim 패키지를 프로젝트에 포함하면 된다고 한다.
setting에서 Python Interpreter로 가서 추가 추가~
못 찾겠으면 gensim을 검색하면 된다.
말뭉치는 파이썬 파일과 같은 위치에 있어야 한다고 들었다.

 


Word2Vec 모델 학습 연습

 

네이버 영화 리뷰 말뭉치 파일(ratings.txt)은 이렇게 생겨 먹었음
'ratings.txt' 파일을 불러 와서 데이터 개수와 측정 시간을 반환하는 코드~

'ratings.txt' 파일은 라인마다 탭을 사용해서 id, document, label 컬럼으로 데이터가 구분되어 있다. 따라서 read_review_data() 함수는 리뷰 데이터를 각 라인별로 읽어와서 \t을 기준으로 데이터를 분리한다. 그 후 첫 번째 행의 헤더를 제거하고 리뷰 데이터만 반환한다. 'start = time.time()'은 각 코드의 수행 속도를 측정하기 위한 시작 시간을 저장한다. 그리고 앞서 정의한 read_review_data() 함수를 호출해 현재 경로에 있는 ratings.txt 파일을 리스트형태로 불러 온다.

결과 화면

Komoran 형태소 분석기를 이용해 불러온 리뷰 데이터에서 문장별로 명사만 추출한다. 여기서 sentence[1]은 rating.txt 파일에서 document 컬럼의 데이터를 의미한다.

결과 화면

앞서 추출한 명사 리스트로 Word2Vec 모델을 학습 시킨다. 그리고 모델을 현재 디렉터리에 nvmc.model(74M)이라는 이름으로 저장한다.

 

Word2Vec의 주요 하이퍼파라미터(hyperparameter)

  • stentences: Word2Vec 모델 학습에 필요한 문장 데이터. Word2Vec 모델의 입력값으로 사용된다.
  • size: 단어 임베딩 벡터의 차원(크기)
  • window: 주변 단어 윈도우의 크기
  • hs: 0(0이 아닌 경우 음수 샘플링 사용), 1(모델 학습에 softmax 사용)
  • min_count: 단어 최소 빈도수 제한(설정된 min_count 빈도 수 이하의 단어들은 학습하지 않음)
  • sg: 0(CBOW 모델), 1(skip-gram 모델)
더보기

하이퍼파라미터란 신경망 모델을 학습할 때 사용자가 직접 세팅해주는 값이다. Word2Vec 클래스의 생성자를 호출할 때 사용하는 변수들은 학습 시 필요한 세팅 값이기 때문에 인자가 아닌 하이퍼파라미터라는 표현을 사용한다. 일반적으로 함수에서 사용하는 인자(파라미터)와는 다른 개념이다.

 

<참고>
https://wikidocs.net/26
[Python] Python 에서 (), [], {} 의 용도 - https://gostart.tistory.com/58
조경래(2020), 처음 배우는 딥러닝 로봇, 한빛미디어(주),121-128.
728x90