统计推理:tf.keras.preprocessing.sequence skipgrams 如何以及为什么以这种方式使用 sampling_table?

Statistical reasoning: how and why does tf.keras.preprocessing.sequence skipgrams use sampling_table this way?

sampling_table parameter只在tf.keras.preprocessing.sequence.skipgrams方法中使用了一次,测试sampling_table中目标词的概率是否小于某个从0到1抽取的随机数(random.random()).

如果你有一个很大的词汇量并且一个句子使用了很多不常用的词,这不会导致该方法在创建 skipgrams 时跳过很多不常用的词吗?鉴于 sampling_table 的值像 zipf 分布一样是对数线性的,这是否意味着您最终可以完全没有 skip grams?

对此很困惑。我正在尝试复制 Word2Vec tutorial 手不明白或如何使用 sampling_table

source code 中,这是有问题的行:

            if sampling_table[wi] < random.random():
                continue

这看起来像是 word2vec 实现中常见的频繁词下采样功能。 (原Googleword2vec.c代码发布,PythonGensim库,通过sample参数调整。)

在实践中,很可能 sampling_table 已经预先计算过,因此总是使用最稀有的词,跳过一些常见的词,跳过很多最常见的词。

这似乎是 comment for make_sample_table() 反映的意图。

您可以继续使用探测值来调用它,比如 1000 表示 100 个单词的词汇表,然后看看 sampleing_table 它返回了什么。我怀疑它会是早期接近 1.0 的数字(删除大量常用词),并且接近 0.0 后期(保留 most/all 稀有词)。

通过为中频和低频词保留更多的相对注意力,而不是过分 overtraining/overweighting 过多的词,这往往会提高词向量质量。