2017-10-21 13 views
1

현재 doc2vec 코드는 다음과 같습니다.부정 샘플링이 포함 된 Doc2vec 및 word2vec

# Train doc2vec model 
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4, iter = 20) 

다음과 같이 word2vec 코드도 있습니다.

# Train word2vec model 
model = word2vec.Word2Vec(sentences, size=300, sample = 1e-3, sg=1, iter = 20) 

나는 doc2vec 모두 DM 및 DBOW 사용에 관심과 word2vec에서 건너 뛰기 그램과 CBOW 모두. , 내가 이렇게

"계층이 softmax 또는 음의 샘플링을 사용하여," "word2vec의를 통해 깊은 학습과 제작 워드 벡터"건너 뛰기 g 및 CBOW 모델 : Gensim에서

은 내가 아래에 언급 된 문장을 발견 계층 적 softmax 또는 음의 샘플링을 혼란스럽게합니다. 이 두 가지 방법에서 차이점이 무엇인지 알려주세요.

또한, 내가 필요로하는 매개 변수가 계층 softmax를 및/또는 DM, DBOW에 대한 부정적인 샘플링를 사용하는을 변경할 수있는 것을 을 아는에 관심이 있어요, 건너 뛰기 그램과 CBOW를?

p.s. 내 응용 프로그램은 추천 시스템입니다.

답변

3

Skip-gram 또는 CBOW는 신경망에 대해 입력 컨텍스트 을 선택하는 다른 방법입니다. Skip-gram은 근처에있는 하나의 단어를 선택한 다음 입력으로 제공하여 대상 단어를 예측합니다. CBOW는 가까운 단어들을 함께 평균 한 다음 평균을 입력으로 제공하여 목표 단어를 예측합니다.

DBOW는 거리에 관계없이 평균을하지 않고 전체 텍스트에 대한 단일 단락 벡터를 사용하여 개별 대상 단어를 예측한다는 점에서 skip-gram과 가장 유사합니다. 그것은 단일 단락 - 벡터를 사용하는 것 이외에, 개별 인근 단어 - 벡터가 또한 사용되는 동시 스킵 - 그램 훈련과 잘 섞일 수 있습니다. gensim 옵션 dbow_words=1은 스킵 그램 트레이닝을 DBOW dm=0 트레이닝에 추가합니다.

DM은 CBOW와 가장 유사합니다. 단락 벡터는 주변 단어의 수와 함께 평균되어 대상 단어를 예측합니다.

Word2Vec에서는 건너 뛰기 그램 (sg=1)과 CBOW (sg=0) 중에서 하나를 선택해야합니다. 혼합 할 수 없습니다. Doc2Vec에서는 DBOW (dm=0)와 DM (dm=1) 중 하나를 선택해야합니다. 혼합 할 수 없습니다. 그러나 Doc2Vec DBOW를 할 때 skip-gram 단어 학습 (dbow_words=1)을 추가 할 수 있습니다.

hierarchical-softmax와 음수 샘플링 중 하나를 선택하는 것은 위의 선택 사항과는 별개이며 독립적입니다. 목표 단어 예측을 신경망에서 읽는 방법을 결정합니다.

음수 샘플링을 사용하면 가능한 모든 예측에 네트워크의 단일 출력 노드가 할당됩니다. 특정 입력 컨텍스트가 생성하는 예측을 개선하기 위해 출력 노드에서 '정확한'단어 (현재 교육 사례의 코퍼스 발췌문)와 N 개의 다른 '잘못된'단어 (일치하지 않는 단어)를 확인합니다 현재 훈련 예).그런 다음 네트워크의 내부 가중치와 입력 벡터를 조금씩 움직여 '올바른'단어 출력 노드 활성화를 조금 더 강하게 만들고 N '잘못된 단어 출력 노드 활성화를 약간 약하게 만듭니다. (이 에게 큰 어휘에 매우 비싼 모든 출력 노드, 대신 계산 N + 1 개 노드를 계산할 필요하고 나머지는 무시 피할 수 있기 때문는 '드문 드문'접근 방식이라고합니다.)

당신은 설정할 수 있습니다 negative=2 (Word2Vec 또는 Doc2Vec에서 모든 종류의 입력 컨텍스트 모드 사용)을 사용하는 2 개의 음수 예제를 사용한 음수 샘플링. negative이 지정되지 않은 경우 기본 모드는 원래 Google word2vec.c 코드의 기본값 다음에 negative=5입니다.

hierarchical-softmax를 사용하면 각 출력 가능한 노드가 자체 출력 노드를 갖는 대신 모든 출력 노드 활성화 패턴이 특정 단어를 의미하는 것으로 해석됩니다. 단어를 표현하기 위해 어느 노드가 1.0 또는 0.0에 가까워 야 하는가는 단어의 인코딩의 문제입니다. 일반적인 단어의 인코딩은 짧고 (몇 개의 노드 만 포함) 희귀 단어의 인코딩은 더 길어집니다. 노드). 다시 말하면, 이것은 계산 시간을 절약하는 역할을합니다. 즉, 입력 컨텍스트가 정확한 단어 집합을 올바른 값으로 예측하여 현재 단어를 예측하는 경우 (현재 교육 사례의 경우) 확인하고, 전체 세트 대신에 찌르다.

hs=1 인수로 gensim에서 hierarchical-softmax를 활성화합니다. 기본적으로 사용되지 않습니다.

hierarchical-softmax를 활성화하는 경우 일반적으로 negative=0을 제공하여 음수 샘플링을 비활성화해야합니다. 일반적으로 주어진 CPU 시간/RAM 양에 대해 더 나은 성능을 보입니다.

(그러나 원래 Google word2vec.c 코드의 아키텍처에 따라 예를 들어 negative=5, hs=1과 같이 모두 활성화 할 수는 있지만 권장되지는 않습니다. 이렇게하면 더 커지고 느린 모델이 표시 될 수 있습니다. 더 많은 RAM/훈련 시간을 제공하기 때문에 더 나은 성능을 발휘할 수 있지만 그 중 하나 또는 둘 다에 동등한 RAM/시간을 제공하는 것이 좋습니다.)

계층 적 softmax는 더 큰 어휘로 느려지는 경향이 있습니다 (각 training-example에 포함 된 노드의 평균 수가 증가하기 때문에); 음수 샘플링은 (항상 N + 1 노드이기 때문에) 수행하지 않습니다. 큰 코퍼스가있는 프로젝트는 음수 샘플링을 선호하는 경향이 있습니다.

+0

대단히 감사합니다. 아주 잘 설명되어 있습니다. 이것은 내가 찾고 있었던 바로 그 것이다. 다시 한 번 감사드립니다 :) –

+0

답변을 알고 계시면 알려 주시기 바랍니다. https://stackoverflow.com/questions/46970376/issues-in-gensim-wordrank-embeddings –