Gensim doc2vec文件流训练性能较差



最近我切换到gensim 3.6,主要原因是优化的训练过程,它直接从文件中流式传输训练数据,从而避免了GIL性能的损失。

这就是我过去如何trin我的doc2vec:

training_iterations = 20
d2v = Doc2Vec(vector_size=200, workers=cpu_count(), alpha=0.025, min_alpha=0.00025, dm=0)
d2v.build_vocab(corpus)
for epoch in range(training_iterations):
d2v.train(corpus, total_examples=d2v.corpus_count, epochs=d2v.iter)
d2v.alpha -= 0.0002
d2v.min_alpha = d2v.alpha

它对文档进行了很好的分类,唯一的不足是,当它经过训练时,CPU的利用率为70%

所以新的方式:

corpus_fname = "spped.data"
save_as_line_sentence(corpus, corpus_fname)
# Choose num of cores that you want to use (let's use all, models scale linearly now!)
num_cores = cpu_count()
# Train models using all cores
d2v_model = Doc2Vec(corpus_file=corpus_fname, workers=num_cores, dm=0, vector_size=200, epochs=50)

现在所有CPU的利用率都达到100%

但该模型的表现非常糟糕。根据文件,我也不应该使用train方法,我应该只使用epoch计数,而不是迭代,而且不应该触摸min_aplpha和aplha值。

两个Doc2Vec的配置在我看来是一样的,所以我的新设置或配置有问题吗,或者新版gensim有问题吗?

p.S我在这两种情况下都使用了相同的语料库,我也尝试了历元计数=100,也使用了5-20这样的较小数字,但我没有运气

EDIT:第一个模型进行20次迭代,每次5个历元,第二个模型进行50个历元。因此,让第二个模式进行100个历元使其性能更好,因为我不再独自管理alpha。

关于弹出的第二个问题:当为文件提供行文档时,文档ID并不总是与行相对应,我没有弄清楚是什么原因导致了这种情况,它似乎对小型语料库很有效,如果我发现我做错了什么,我会更新这个答案。

4GB大小的语料库的最终配置看起来像这个

d2v = Doc2Vec(vector_size=200, workers=cpu_count(), alpha=0.025, min_alpha=0.00025, dm=0)
d2v.build_vocab(corpus)
d2v.train(corpus, total_examples=d2v.corpus_count, epochs=100)

大多数用户不应该在自己的循环中多次调用train(),因为他们试图在循环中管理alpha&迭代本身。做错事太容易了。

具体来说,在循环中调用train()的代码是错误的。无论你以什么在线来源或教程为基础来建模这个代码,你都应该停止咨询,因为它具有误导性或过时了。(与gensim捆绑在一起的笔记本电脑是更好的例子,可以作为任何代码的基础。(

更具体地说:循环代码实际上对数据进行了100次传递,其中20次是外部循环,然后是默认的d2v.iter,每次调用train()5次。您的第一个train()调用使有效alpha从0.025平滑衰减到0.00025,减少了100倍。但是,您的下一个train()调用将使用0.0248的固定alpha进行5次传递。然后是0.0246,等等,直到最后一个循环在alpha=0.0212通过5次——甚至不到起始值的80%。也就是说,在你训练的早期就已经达到了最低的阿尔法值。

调用这两个选项完全相同,只是指定corpus_file的方式不同,而不是可迭代的语料库。

你应该从两种语料库形式中得到相似的结果。(如果你有一个可重复的测试用例,同一个语料库得到的结果质量非常不同,并且没有其他错误,那么值得向gensim报告。(

如果两者的结果都不如你错误地管理train()alpha时好,那很可能是因为你没有进行相当数量的整体训练。

最新更新