我脑子里有一些与 skipgram 模型相关的实验。所以我开始研究和修改tutorials/embedding/word2vec_kernels.cc
中tensorflow/models库中的优化实现。突然,我来到了语料库子采样完成的部分之上。
根据 Tomáš Mikolov 的论文(https://arxiv.org/abs/1310.4546,eq.5),这个词应该保留概率
其中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;
这种变化背后的动机是什么?只是将与语料库大小的“某种关系”建模到这个公式中吗?或者它是对原始公式的一些改造?它是根据经验选择的吗?
编辑:链接到 github 上提到的文件 https://github.com/tensorflow/models/blob/master/tutorials/embedding/word2vec_kernels.cc
最佳答案
好吧,我想如果没有 corpus_size
,该图看起来与原始公式有些相同。语料库大小在公式中添加了与语料库大小的关系,并且“它适用于大数字”,因此我们可以计算丢弃/保留概率,而无需将词频归一化为适当的分布。
关于c++ - tensorflow/models 中的 Skip-Gram 实现 - 频繁词的子采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49012064/