앞에 3장에서 구현한 word2vec CBOW 모델은 몇 가지 병목 현상이 있다.
즉, 대량의 말뭉치를 제어할 수 있는 방법이 필요하다.
3장에서 구현한 모델로 어휘 수 7개의 벡터들을 처리하는 데는 전혀 문제가 없다.
하지만 어휘 수가 몇 백만개가 넘어가는 현업에서는 3장의 모델로는 무리가 있다.
가장 큰 병목 2개를 본다면 아래와 같다 :
이번 절에서는 첫 번째 병목을 Embedding 층을 추가함으로 완화시켜본다.
그리고 바로 이어지는 절에서는 네거티브 샘플링이라는 손실 함수로 완화시킨다.
원핫 벡터와 가중치 행렬 의 행렬 곱은 결과적으로는 특정 행을 추출하는 것이기에 사실 행렬 곱 계산이 필요하지 않다.
구현도 그저 특정한 행을 지목해서 호출하기만 하면 되는 지극히 간단한 구현이다. (p.153)
위에 이론으로 객체를 초기화해서 순전파와 역전파를 구현하면 Embedding 계층 구현이 끝난다.
다시 말하지만 이번 절에서는 은닉층과 가중치 행렬 의 곱 및 소프트맥스 계층 계산 병목을 완화시킬 것이다.
-> 네거티브 샘플링으로!
핵심 아이디어
위에 문제를 이진 분류 문제로 바꾸어 신경망을 만들게 되면 출력층에서는 단 1개의 뉴런만 있으면 된다. -> 그 뉴런이 맞는지 틀렸는지만 보면 되니까.
다중 분류는 출력층에서 '소프트맥스', 손실 함수는 'CEE'; 이진 분류는 출력층에서 '시그모이드', 손실 함수는 'CEE'를 사용한다.
그럼 시그모이드 함수를 다시 봐 보자.
이 함수의 핵심은 소프트맥스와 마찬가지로 0 부터 1까지의 출력만 갖고 있으니 확률로 봐도 된다는 것이다.
CEE도 다시 한번 보자.
1장에서 봤던 CEE와 다른 이유는 다중 분류에서 이진 분류 문제 바뀌었기 때문이다. 결과적으로는 완전히 같다.
하지만 불행히도 다중 분류에서 이진 분류로 바꾼 것 만으로는 문제가 해소 되지 않는다. -> 위에 구현은 정답일 때에 대해서만 학습했기 때문에 오답도 학습해야 한다. -> 오답 입력 시 어떤 값이 나올지 확실하지 않기 때문이다.
하지만 모든 오답들을 대상을 이진 분류를 학습시키면 다시 제자리로 가기 때문에 새로운 방법이 있어야 한다. -> 이것을 아이디어로 나온 해답이 오답의 몇 가지만 선택해서 학습 시키는 것이다.
네거티브 샘플링(negative sampling) : 적은 수의 부정적 예를 샘플링해서 사용하는 기법. 즉, 부정적인 예를 선별해서 손실을 구하는 것이다.
-> 각각의 데이터 (정답과 오답의 샘플링)의 손실을 더한 값을 최종 손실로 한다.
네거티브 샘플링의 예시를 시각화한 그래프(p.170)
네거티브 샘플링에서 오답을 선별하는 방법은 통계 데이터를 이용하는 것이다. -> 자주는 등장하는 단어를 많이 추출하고, 적게 등장하는 단어를 적게 추출하는 것이다. -> 단어 빈도 기준 샘플링 -> 확률 분포로 나타내어 분포대로 샘플링
확률 분포에 따른 샘플링 구현 (p.172)
여러 빈도의 단어들을 학습시키기 위해 확률분포에 0.75제곱을 하라고 word2vec에서 권고한다. (무조건 높은 빈도의 단어만 학습시키는 것을 방지)
네거티브 샘플링 구현 (p.175)
개선된 word2vec 모델을 PTB 데이터셋으로 학습해보는 절이다. 구현은 깃헙에 올릴것이다.
word2vec을 응용할 수 있는 주제들을 살펴보는 절이다.
Embedding과 네거티브 샘플링, 그리고 과학자들의 통찰력을 볼 수 있던 장이었던 것 같습니다.
구현들은 깃헙에 올릴 예정입니다.