【问题标题】:Flow of execution in word2vec tensorflowword2vec 张量流中的执行流程
【发布时间】:2017-11-13 05:26:48
【问题描述】:
【问题讨论】:
标签:
python
multithreading
tensorflow
parallel-processing
word2vec
【解决方案1】:
这个sample code 被称为“多线程 word2vec mini-batched skip-gram 模型”,这就是它使用多个独立线程进行训练的原因。 Word2Vec 也可以使用单线程进行训练,但本教程表明,并行完成 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,然后调用训练直到 epoch 增加。这意味着运行此方法的所有线程都将进行正好一个 epoch 的训练。每个线程与其他线程并行执行一个步骤。
self._train 是一个优化损失函数的运算(参见optimize 方法),它是根据当前的examples 和labels 计算得出的(参见build_graph 方法)。这些张量的确切值再次在本机代码中,即在NextExample 中。本质上,word2vec.skipgram_word2vec 的每次调用都会提取一组示例和标签,它们构成了优化函数的输入。希望,它现在更清楚了。
顺便说一下,这个模型在训练中使用NCE loss,而不是负采样。