word2vec 이해하기

word2vec 이해하기

word2vec

"Distributed Representations of Words and Phrases and their Compositionality"란 제목으로 세상에 나온 word2vec 개념이 얼마나 큰 파장을 일으켰는지는 논문의 피인용수를 살펴보면 알 수 있는데 무려 13,400회이다. 참고로 나는 딥러닝을 공부하면서 피인용수가 1000회가 넘으면 상당히 괜찮은 논문이라고 생각하고 공부하고 있었다.

단어를 여러 특성을 가진 수치로 분석한다. 사람이 과일을 어떤 특성으로 표현한다고 한다면 [단 정도, 둥근 정도, 속이 빨간 정도, 등등] 의 기준을 사용해서 표현할 수 있을 것이다. “수박” = [0.5, 0.7, 0.8, 0.0]. 그런데 이렇게 단어를 벡터화하는 작업을 사람이 하지 않고 뉴럴 네트워크를 사용해 해당 단어의 특성을 벡터로 학습시키는 알고리즘 중 대표적인 것이 word2vec이다.

word2vec을 만드는 근본적 특성이면서 중요한 단점으로 문장에서 비슷한 위치에 있는 단어는 비슷하다고 학습시키는 방식을 뽑을 수 있다. 일반적으로 다양한 문장에서 비슷한 위치에 들어갈 수 있는 단어는 비슷하기 때문에 잘 동작하는 중요한 특징이다. 하지만 “소프트웨어”, "하드웨어"와 같이 비슷한 위치에서 쓰이는 단어의 차이점은 잘 잡아내지 못하게 된다.
word2vec은 보통 문장 데이터를 사용해서 학습하는데 문장에서 특정 단어 C를 빼고 해당 주변단어O를 기준으로 C를 학습하는 방법과 C를 가지고 주변단어들을 학습하는 방법이 있따. 전자를 CBOW와 후자를 skip-gram이라고 한다.

모델 구조

  • skip-gram 방식의 학습방법은 각 중심단어으로 주변 단어을 예측하는 방법으로 학습한다. 만일 자세한 학습방법이 궁금하다면 ratsgo님 블로그 : word2vec를 참고하면 자세히 설명되어 있다.
  • 입력층-히든층 : W, 히든층 - 출력층 : W’라는 매트릭트가 존재하는데 둘은 서로 완전히 다른 매트릭스이다.

Loss함수는 다음과 같다.

기존의 주목할만한 모델 구조는 두 가지 정도가 있다.

  1. W가 모든 단어들에 대해 임베딩 매트릭스가 된다는 점.
  2. W’의 역할은 단어가 임베딩된 벡터를 전체 단어장에 대한 확률 분포로 바꿔준다는 점.

개선된 모델

위의 Loss 함수를 계산하는데 드는 비용은 Vocabulary 사이즈와 각 임베딩 피쳐의 개수의 곱에 비례한다. 모델의 성능은 뛰어나지만 학습시간이 긴 것이 단점이었는데 Negative sampling 이라는 개념을 도입해 훨씬 더 빠르게 계산이 가능하다.

Negative Sampling

  • 위의 모델의 Loss함수가 비용이 큰 원인은 무엇일까. 모델이 모든 단어에 대한 확률로 결과를 내는 멀티 클래스 분류문제이기 때문이다. 여기에 착안하여 True, False만 있는 이진 분류문제로 바꿔서 풀기 위해서 고안해낸 개념이 Negative Sampling 기법이다.
  1. 중심단어와 그 주변단어의 묶음모두 True 클래스이다.
  2. 중심단어와 그 바깥 단어의 묶음False 클래스이다.
  3. 하나의 학습 배치는 하나의 중심단어를 기준으로 [(중심단어, 주변단어 1th, True), (중심단어, 주변단어 2th, True),…, (중심단어, 바깥 단어 1th, False),…(중심단어, 바깥 단어 nth, False)]로 이루어진다.

keras로 구현된 실제 구현은 git code을 참고하시라.

Reference

[1] word2vec 이론 설명 ratsgo 블로그

[2] negative sampling : word2vec keras 구현 git code

댓글

이 블로그의 인기 게시물

[Linux, Unix] export, echo 명령어 알아보기

뼈속 깊이 이해하기 :: 1. 허프만 코딩

IEEE 754 부동 소수점 반올림과 근사