tensorflow/models 中的 Skip-Gram 实现 - 频繁词的子采样

Skip-Gram implementation in tensorflow/models - Subsampling of Frequent Words

我脑子里有一些与 skipgram 模型相关的实验。所以我开始研究和修改tensorflow/models仓库中的优化实现在tutorials/embedding/word2vec_kernels.cc。突然,我来到了语料库子采样完成的部分之上。 根据 Tomáš Mikolov 论文 (https://arxiv.org/abs/1310.4546, eq.5),这个词应该 kept 概率

其中t表示阈值参数(根据论文选择10^-5),f(w)词频w, 但是 word2vec_kernels.cc 中的代码如下:

float keep_prob = (std::sqrt(word_freq / (subsample_ * corpus_size_)) + 1) *
                  (subsample_ * corpus_size_) / word_freq;

这可以转换为先前呈现的表示法

这种变化背后的动机是什么?难道只是将 'some kind of relation' 的语料库大小建模到这个公式中吗?或者它是对原始公式的一些改造?它是根据经验选择的吗?

编辑:link到github上提到的文件 https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec_kernels.cc

好吧,我想如果没有 corpus_size,该图看起来与原始公式有些相同。语料库大小在公式中添加了与语料库大小 的 关系以及 "it works with the large numbers",因此我们可以计算 discard/keep 概率,而无需将词频归一化为适当的分布。