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 概率,而无需将词频归一化为适当的分布。
我脑子里有一些与 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 概率,而无需将词频归一化为适当的分布。