为什么Doc2Vec.scale_vocab(...)['memory'] ['vocab']除以700来获得词汇量?

时间:2017-07-31 14:48:33

标签: gensim doc2vec

来自https://github.com/RaRe-Technologies/gensim/blob/master/docs/notebooks/doc2vec-wikipedia.ipynb

的Doc2Vec维基百科教程
class Test{
    public static void main(String[] args){
        ExecutorService exec = new Executors.newCachedThreadPool();
        exec.execute(new Runnable(){
            System.out.println("I am running!");
        });
        System.out.println("I am Main!"); //This will run...
    }
}

输出是:

for num in range(0, 20):
    print('min_count: {}, size of vocab: '.format(num), 
           pre.scale_vocab(min_count=num, dry_run=True)['memory']['vocab']/700)
  

在原始论文中,他们设定的词汇量为915,715。如果我们设置min_count = 19,它的词汇大小似乎相似。(词汇大小= 898,725)

min_count: 0, size of vocab: 8545782.0 min_count: 1, size of vocab: 8545782.0 min_count: 2, size of vocab: 4227783.0 min_count: 3, size of vocab: 3008772.0 min_count: 4, size of vocab: 2439367.0 min_count: 5, size of vocab: 2090709.0 min_count: 6, size of vocab: 1856609.0 min_count: 7, size of vocab: 1681670.0 min_count: 8, size of vocab: 1546914.0 min_count: 9, size of vocab: 1437367.0 min_count: 10, size of vocab: 1346177.0 min_count: 11, size of vocab: 1267916.0 min_count: 12, size of vocab: 1201186.0 min_count: 13, size of vocab: 1142377.0 min_count: 14, size of vocab: 1090673.0 min_count: 15, size of vocab: 1043973.0 min_count: 16, size of vocab: 1002395.0 min_count: 17, size of vocab: 964684.0 min_count: 18, size of vocab: 930382.0 min_count: 19, size of vocab: 898725.0 似乎相当武断,我在docs中没有看到任何提及此事。

1 个答案:

答案 0 :(得分:1)

这没有意义,但这就是原因:

scale_vocab()(通过使用内部estimate_memory()函数)返回一个dict,其中包含一组粗略估计的模型所需的内存量值(以字节为单位),用于给定{ {1}}。这些估计是基于这样的想法:模型的min_count dict中的每个单词在HS模型中将占用大约700个字节(其中它包括一些额外的霍夫曼编码信息),或者在负采样模型中仅占500个字节。参见:

https://github.com/RaRe-Technologies/gensim/blob/5f630816f8cde46c8408244fb9d3bdf7359ae4c2/gensim/models/word2vec.py#L1343

(这些是基于我运行的一系列临时测试的粗略估计,并且在其他环境中可能会有很大差异 - 但通常vocab不是模型内存使用的最大因素,所以这里的精确度并不重要。)

根据内存估算,考虑到vocab试用数,看来这个笔记本试图反算一下计算出的确切保留词汇大小是多少。

但是,它确实不必这样做。来自dry_run=True的包括内存估算的相同结果词典还包括在顶级scale_vocab()键中精确计算的保留词汇大小。参见:

https://github.com/RaRe-Technologies/gensim/blob/5f630816f8cde46c8408244fb9d3bdf7359ae4c2/gensim/models/word2vec.py#L723

因此,笔记本电脑可以改进。