gpt4 book ai didi

python - word2vec tensorflow 中的执行流程

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:25 27 4
gpt4 key购买 nike

这几天我一直在摸索代码 https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec.py#L28 的执行流程.

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

最佳答案

这个sample code被称为“多线程word2vec小批量skip-gram模型”,这就是它使用多个独立线程进行训练的原因。 Word2Vec 也可以使用单线程进行训练,但本教程表明,并行完成时,word2vec 的计算速度更快。

输入、标签和纪元张量由 native 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

首先,它计算当前纪元,然后调用训练,直到纪元增加。这意味着运行此方法的所有线程将进行恰好一个的训练周期。每个线程一次与其他线程并行执行一个步骤。

self._train 是一个优化损失函数的操作(请参阅 optimize 方法),该函数是根据当前 examples 计算得出的>labels(参见build_graph方法)。这些张量的确切值再次在 native 代码中,即在 NextExample 中。本质上,每次调用 word2vec.skipgram_word2vec 都会提取一组示例和标签,这些示例和标签构成优化函数的输入。希望现在更清楚了。

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

关于python - word2vec tensorflow 中的执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47257578/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com