1

ここ数日から、私はコードhttps://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec.py#L28で実行の流れを理解しようとしています。word2vecテンソルでの実行の流れ

負サンプリングとロス機能の背後にあるロジックを理解しましたが、特に列車機能内で実行の流れについて混乱しています。特に_train_thread_body関数の場合はそうです。 whileループとifループ(インパクト)と並行処理に関連する部分についてはとても混乱しています。これをダウン投票する前に誰かがまともな説明をすることができれば素晴らしいだろう。

答えて

1

このsample codeは、それが訓練のためにいくつかの独立したスレッドを使用しています理由です、「マルチスレッド word2vecミニバッチ処理スキップ-gramモデル」と呼ばれています。 Word2Vecは1つのスレッドでも訓練することができますが、このチュートリアルでは、word2vecは並列実行時の方が計算が高速です。

入力、ラベル、エポックテンソルはword2vec.skipgram_word2vec関数によって提供され、tutorials/embedding/word2vec_kernels.ccファイルに実装されています。ここで、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が上昇するまで、それはトレーニングを呼び出し、現在のエポックを計算します。つまり、このメソッドを実行するスレッドはすべて、を正確に1つのエポックにします。各スレッドは、一度に1ステップずつ他のスレッドと並行して実行しています。

self._train現在exampleslabelsから計算された損失関数を(optimize方法を参照)、(build_graph方法を参照)最適化オペアンプです。これらのテンソルの正確な値は、ネイティブコードで再びNextExampleです。基本的に、word2vec.skipgram_word2vecの各呼び出しは、最適化機能への入力を形成する一連の例とラベルを抽出します。希望、それは今より明確になります。

ところで、このモデルでは、トレーニングにはNCE lossを使用しています。ネガティブサンプリングではありません。

関連する問題