1

지난 며칠 동안 코드 https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec.py#L28에서 실행 흐름을 파악하려고 노력했습니다.word2vec tensorflow에서의 실행 흐름

부정적인 샘플링과 손실 기능의 논리를 이해했지만 기차 기능 내부에서 실행 흐름에 대해 매우 혼란스러워졌습니다. 특히 _train_thread_body 기능에 관해서는 그렇습니다. while과 if 루프 (영향은 무엇인가)와 동시성 관련 부분에 대해서는 너무 혼란 스럽습니다. 누군가가 예의 바른 설명을 해줄 수 있다면, 이것을 투표하기 전에 좋을 것입니다.

답변

1

sample code은 교육에 대한 몇 가지 독립적 인 스레드를 사용하는 그 이유는, "다중 스레드 word2vec 미니 일괄 스킵 그램 모델"이라고합니다. Word2Vec은 단일 스레드로도 교육 할 수 있지만이 튜토리얼에서는 word2vec가 병렬로 수행 될 때 더 빨리 계산된다는 것을 보여줍니다.

입력, 레이블 및 에포크 텐서는 tutorials/embedding/word2vec_kernels.cc 파일에 구현 된 word2vec.skipgram_word2vec 네이티브 함수에 의해 제공됩니다. 여기서 문장의 전체 모음이 처리되면 current_epoch은 텐서 인 것을 알 수 있습니다.

당신에 대해 요구하는지 방법은 실제로 매우 간단하다

def _train_thread_body(self): 
    initial_epoch, = self._session.run([self._epoch]) 
    while True: 
    _, epoch = self._session.run([self._train, self._epoch]) 
    if epoch != initial_epoch: 
     break 

첫째, epoch이 증가 될 때까지이 훈련을 호출, 현재의 시대를 계산합니다. 즉,이 메서드를 실행하는 모든 스레드는 을 정확히 하나의 획을 띄게됩니다. 각 스레드는 한 번에 한 단계 씩 다른 단계와 병렬로 수행합니다.

self._train

은 ( build_graph 방법 참조)와 전류 examples labels로부터 계산 된 감소 함수 ( optimize 방법 참조), 최적화 연산이다. 이 텐서의 정확한 값은 네이티브 코드 (즉, NextExample)입니다. 기본적으로 word2vec.skipgram_word2vec의 각 호출은 최적화 함수에 대한 입력을 형성하는 예제 및 레이블 세트를 추출합니다. 희망, 그것은 지금 그것을 명확하게한다.

그런데이 모델에서는 음수 샘플링이 아니라 연습 할 때 NCE loss을 사용합니다.