본 논문에서 subsampling 이야기가 나오는데요. 둘의 차이에 대해서 정리하는 용으로 이슈 남겨둡니다.
논문 등장 내용
NCE(Noise Contrastive Estimation) posits that a good model should be able to differentiate data from noise by means of logistic regression.
We define Negative sampling (NEG) by the objective which is used to replace every log P (wO |wI ) term in the Skip-gram objective. Thus the task is to distinguish the target word wO from draws from the noise distribution Pn(w) using logistic regression, where there are k negative samples for each data sample.
헷갈리는 포인트
negative sampling의 목표가 두가지로 보여진다. 첫번째는 이상한 값을 넣어주더라도 좋은 모델이면 잘 예측할 것이란게 목표고, 두번째는 이미 대부분의 데이터에서 negative sample이 훨씬 많을텐데 그걸 다 쓰는게 아니라 일부 샘플링한다는 것.
논문에서는 efficiency 입장에서 hierarchical softmax -> NCE로, 그리고 NCE를 효과적으로 하기 위해 negative sampling 을 하는 흐름.
hierarchical softamx랑 NCE를 정확히 이해 못해서 그런가. 무슨 이득 때문에 NCE로 넘어간건지 이해가 안됨. NCE로 하면 accuracy가 좋다는건지 속도가 줄어든다는건지..
NCE에서 negative sampling으로 넘어가는거는 단어 w 인풋으로 넣어줄 때 일부만 샘플링해줘서 넣어주고 noise distribution 모르고 임의의 분포(등장 고려)로 모델링해서 샘플링한다는 이득?
sub- sampling of frequent words during training results in a significant speedup
the vector representations of frequent words do not change significantly after training on several million examples.
헷갈리는 포인트
negative sampling은 negative 라벨인 단어를 넣어줌으로써 모델 성능을 높이겠다는 것이고,
sub sampling 은 많이 등장하는 단어일 수록 정보성이 적다. 즉, 쓸데없는 단어로 취급해서 덜 학습에 사용하겠다는 것
행렬 곱에서 전체 행렬 곱하는 것보다 해당 row를 끄집어낸다는 표현이 저번 big O complexity 때 나온 이야기와 통하는 부분이 있는 것 같아서 참고링크 공유드립니다.
임베딩이 된 단어는 30010000의 행렬이고 여기에 넣는 어떤 인풋은 100001의 행렬이죠. 이 인풋행렬은 우리가 원하는 하나의 단에에서만 1값을 가지고 나머지 9999는 0인 one-hot 벡터입니다. 이 둘의 곱으로 나온 행렬은 3001의 행렬입니다. 그런데 결국 이건 임베딩행렬에서 인풋에 해당하는 Column을 선택하는 것과 같습니다. 3001 행렬을 얻으려 300,000개의 값 299개의 0과 모두 곱하는 건 매우 비효율적입니다. 실질적으로 이런 부분은 텐서플로나 케라스 같은 프레임워크에서는 행렬을 곱하기보단 바로 해당 row를 끄집어내는 방식으로 효율적이게 구현되어 있습니다. 임베딩 행렬을 lookup 테이블로 쓰는 것이죠.
Summary