【问题标题】:Flow of execution in word2vec tensorflowword2vec 张量流中的执行流程
【发布时间】:2017-11-13 05:26:48
【问题描述】:

从这几天开始,我一直在试图弄清楚代码https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec.py#L28中的执行流程。

我了解负采样和损失函数背后的逻辑,但我对 train 函数内部的执行流程感到非常困惑,尤其是在涉及 _train_thread_body 函数时。我对 while 和 if 循环(有什么影响)和并发相关部分感到非常困惑。如果有人可以在否决之前给出一个体面的解释,那就太好了。

【问题讨论】:

    标签: 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 方法),它是根据当前的exampleslabels 计算得出的(参见build_graph 方法)。这些张量的确切值再次在本机代码中,即在NextExample 中。本质上,word2vec.skipgram_word2vec 的每次调用都会提取一组示例和标签,它们构成了优化函数的输入。希望,它现在更清楚了。

    顺便说一下,这个模型在训练中使用NCE loss,而不是负采样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2017-11-05
      • 2018-01-04
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多