改进Gensim Doc2vec结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了改进Gensim Doc2vec结果相关的知识,希望对你有一定的参考价值。

我尝试在600000行句子上应用doc2vec:代码如下:

from gensim import models
model = models.Doc2Vec(alpha=.025, min_alpha=.025, min_count=1, workers = 5)
model.build_vocab(res)
token_count = sum([len(sentence) for sentence in res])
token_count

%%time
for epoch in range(100):
    #print ('iteration:'+str(epoch+1))
    #model.train(sentences)
    model.train(res, total_examples = token_count,epochs = model.iter)
    model.alpha -= 0.0001  # decrease the learning rate`
    model.min_alpha = model.alpha  # fix the learning rate, no decay

通过上述实现,我的结果非常糟糕。我从教程中建议的更改改变了以下行:

  model.train(sentences)

如:

 token_count = sum([len(sentence) for sentence in res])
model.train(res, total_examples = token_count,epochs = model.iter)
答案

不幸的是,您的代码是误导性做法的荒谬混合。所以不要关注你所关注的在线示例!

从上到下依次处理问题:

不要让min_alphaalpha一样。在看到许多不同的例子的过程中,随机梯度下降优化过程需要从较大到较小的alpha学习率逐渐下降,并且通常应该以可忽略的近零值结束。 (代码尝试以这种方式明确减少alpha还存在其他问题,我们将在下面进行讨论。)只有已经有工作设置,理解算法并正在进行实验性调整的专家用户应该改变alpha / min_alpha默认值。

不要设置min_count=1。只出现一次或几次的稀有单词通常对Word2Vec / Doc2Vec培训没有帮助。它们的少数发生意味着它们自己相应的模型权重没有得到太多的训练,并且与相应的单词“真实含义”(可能反映在测试数据或后来的生产数据中)相比,少数事件更可能不具代表性。因此,模型对这些罕见单词的表示不太可能变得非常好。但总的来说,所有那些罕见的词语与其他有机会变得有意义的词语竞争很多 - 所以“粗略”的罕见词主要是对其他词的随机干扰。或许,这些词语意味着额外的模型词汇参数,这有助于模型在训练数据上表现得更好,因为记忆那里的非泛化特性,但在未来的测试/生产数据上更糟糕。所以,min_count是另一个默认值(5),只有在你有一个工作基线后才能改变 - 如果你以后严格地对这个参数进行元优化,在一个大尺寸的数据集上(比如你的600K文档),你很可能发现更高的min_count而不是更低的改善最终结果。

为什么要制作token_count?以后没有需要总令牌数的地方。 total_examples参数稍后需要计算文本示例 - 即单个文档/句子的数量 - 而不是总单词。通过提供(大得多)字数,train()将无法正确管理alpha或估计记录输出的进度。

不要用你自己明确的train()管理循环多次调用alpha,除非你肯定你知道你在做什么。大多数人都弄错了。通过在此处提供默认的model.iter(其值为5)作为参数,您实际上对语料库执行了500次传递,这不太可能是您想要的。通过在100个循环中将初始0.025 alpha值减少0.0001,您最终得到的最终alpha为0.015 - 小于起始值的一半。相反,使用正确的train()和精心选择的total_examples值(在Doc2Vec出版的作品中通常使用10到20个)调用epochs一次。然后,它将执行完全正确的显式迭代次数,并智能地管理alpha,并在日志记录中打印准确的进度估计。

最后,接下来的事情不一定是你的代码中的一个问题,因为你没有显示你的语料库res是如何构建的,但是有一个常见的错误要注意:确保你的语料库可以多次迭代(就好像它是一个内存列表,或者是来自IO的东西的可重新启动的可迭代对象。通常人们提供一次性使用迭代器,一次通过(如在build_vocab()中)返回其他任何东西 - 导致即时训练和无用的仍然随机和未经训练的模型。 (如果你已经启用了日志记录,并注意每个步骤的记录输出和时间,那么这是一个问题就很明显了。)

以上是关于改进Gensim Doc2vec结果的主要内容,如果未能解决你的问题,请参考以下文章

Doc2vec:gensim doc2vec模型中只有10个docvecs?

doc2vec 利用gensim 生成文档向量

Gensim Doc2Vec most_similar() 方法未按预期工作

如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?

如何将 Gensim doc2vec 与预训练的词向量一起使用?

机器学习使用gensim 的 doc2vec 实现文本相似度检测