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함수는 다음과 같다.
기존의 주목할만한 모델 구조는 두 가지 정도가 있다.
- W가 모든 단어들에 대해 임베딩 매트릭스가 된다는 점.
- W’의 역할은 단어가 임베딩된 벡터를 전체 단어장에 대한 확률 분포로 바꿔준다는 점.
개선된 모델
위의 Loss 함수를 계산하는데 드는 비용은 Vocabulary 사이즈와 각 임베딩 피쳐의 개수의 곱에 비례한다. 모델의 성능은 뛰어나지만 학습시간이 긴 것이 단점이었는데 Negative sampling 이라는 개념을 도입해 훨씬 더 빠르게 계산이 가능하다.
Negative Sampling
- 위의 모델의 Loss함수가 비용이 큰 원인은 무엇일까. 모델이 모든 단어에 대한 확률로 결과를 내는 멀티 클래스 분류문제이기 때문이다. 여기에 착안하여 True, False만 있는 이진 분류문제로 바꿔서 풀기 위해서 고안해낸 개념이 Negative Sampling 기법이다.
- 중심단어와 그 주변단어의 묶음은 모두 True 클래스이다.
- 중심단어와 그 바깥 단어의 묶음은 False 클래스이다.
- 하나의 학습 배치는 하나의 중심단어를 기준으로 [(중심단어, 주변단어 1th, True), (중심단어, 주변단어 2th, True),…, (중심단어, 바깥 단어 1th, False),…(중심단어, 바깥 단어 nth, False)]로 이루어진다.
keras로 구현된 실제 구현은 git code을 참고하시라.
Reference
[1] word2vec 이론 설명 ratsgo 블로그
[2] negative sampling : word2vec keras 구현 git code
댓글
댓글 쓰기