对 Keras 的 skipgram 和采样表实用程序感到困惑

数据挖掘 机器学习 nlp 喀拉斯 word2vec
2021-09-27 19:46:34

我对 ML 相当陌生,因此作为熟悉 Keras 的学习练习,我正在尝试从数据集中学习一些 word2vec 样式的嵌入。我对skipgram 实用程序的行为感到困惑,特别是应该从make_sampling_table填充的采样表参数。我理解它背后的想法,但我看到了一些奇怪的输出。

作为一个玩具示例,假设我们有以下参数:

vocab_size = 3
sequence = [0,1,0,1,1,0]

所以一个包含 3 个单词的小词汇表,其中只有 2 个出现在序列中。生成skipgrams和标签完全没有采样表可以正常工作:

pairs, labels = skipgrams(sequence, vocab_size)
print("pairs: " + str(pairs) + " labels: " + str(labels))

OUTPUT: pairs: [[1, 1], [1, 2], [1, 1], [1, 2], [1, 1], [1, 1], [1, 1], [1, 2], [1, 1], [1, 1], [1, 1], [1, 1]] labels: [0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1]

但是当我尝试传入一个采样表以免对常用词进行过度采样时,我根本没有得到任何输出:

pairs, labels = skipgrams(sequence, vocab_size, sampling_table=make_sampling_table(vocab_size))
print("pairs: " + str(pairs) + " labels: " + str(labels))

OUTPUT: pairs: [] labels: []

我的问题是:这里发生了什么?为什么将采样表传递给 skipgrams 方法的行为会使其不产生任何输出?

谢谢您的帮助!

1个回答

在查看了 skipgram 方法的代码后,我明白了:它与 sampling_factor 参数有关。它默认为 1e-5,这意味着对于如此小的采样因子,除非您的数据集和词汇量足够大以实际获取一些样本,否则它几乎永远不会实际选择样本。如果您的词汇量很小(如玩具示例中),则应将其设置为更高的值:当我将其设置为 1.0 时(即尽可能多地取样),我得到了很多对,即使对于玩具示例也是如此.