tf.random.log_uniform_candidate_sampler 在生成负样本时如何工作?

数据挖掘 张量流 word2vec
2022-02-12 18:36:12

我试图按照此处的教程使用 TensorFlow 为 Word2Vec 模型构建一个简单的负采样器

据我了解,将tf.random.log_uniform_candidate_sampler()要从采样中排除的正确类、要返回的样本数量以及要采样的分布大小作为输入。

在教程中true_classesrange_max是 1、8 和num_ns4。这意味着“从分布 [0, 8) 返回 4 个样本,但跳过 1,因为它是一个正类。”

但是,在本教程中,采样器返回以下张量:tf.Tensor([2 1 4 3], shape=(4,), dtype=int64).

我的问题是,为什么采样器返回类 1,即使在被告知排除它之后,因为它不构成负样本?

此外,在本教程的以下部分:

target_index    : 7
target_word     : sun
context_indices : [1 2 1 4 3]
context_words   : ['the', 'wide', 'the', 'shimmered', 'road']
label           : [1 0 0 0 0]

我们可以清楚地看到类 1 的第一个实例(in 中的索引 0 context_indices)已被标记为正 skip-gram,而 1 的第二个实例(in 中的索引 2 context_indices)已被标记为负 skip-gram。

我希望对我对这个模型或教程的理解进行一些澄清或更正。

谢谢!

2个回答

我试图通过相同的教程,我有同样的问题。我在代码库和文档中做了一些研究,并有以下几点。

  • tf.random.log_uniform_candidate_sampler函数是一个采样器,用于从approximately log-uniform或中采样类Zipfian distribution由于单词在词典中按频率降序排序,因此随机抽样否定词的最佳方法是使用该函数。
  • 此功能不会抑制正类。它采用正类张量,以便它可以返回true_expected_count.

这就是为什么我们在正面和负面对中看到单词重叠的原因。

本教程中不使用此参数,它适用于其他返回值。您可以通过阅读源代码的 122ed 行来理解这一点。

源代码