Doc2Vec比Word2Vec向量的平均值或总和更差

Sci*_*tas 4 python machine-learning gensim word2vec doc2vec

我正在训练一个如下Word2Vec模型:

model = Word2Vec(documents, size=200, window=5, min_count=0, workers=4, iter=5, sg=1)
Run Code Online (Sandbox Code Playgroud)

Doc2Vec模型如:

doc2vec_model = Doc2Vec(size=200, window=5, min_count=0, iter=5, workers=4, dm=1)
doc2vec_model.build_vocab(doc2vec_tagged_documents)
doc2vec_model.train(doc2vec_tagged_documents, total_examples=doc2vec_model.corpus_count, epochs=doc2vec_model.iter)
Run Code Online (Sandbox Code Playgroud)

具有相同的数据和可比较的参数.

在此之后我将这些模型用于我的分类任务.我发现简单地平均或总结word2vec文档的嵌入比使用doc2vec向量要好得多.我也尝试了更多的doc2vec迭代(25,80和150 - 没有区别).

任何提示或想法为什么以及如何改善doc2vec结果?

更新:这是如何doc2vec_tagged_documents创建的:

doc2vec_tagged_documents = list()
counter = 0
for document in documents:
    doc2vec_tagged_documents.append(TaggedDocument(document, [counter]))
    counter += 1
Run Code Online (Sandbox Code Playgroud)

关于我的数据的更多事实:

  • 我的培训数据包含4000个文档
  • 平均900字.
  • 我的词汇量大约是1000字.
  • 我的分类任务数据平均要小得多(平均12个字),但我也尝试将训练数据分成线并训练doc2vec模型,但结果几乎相同.
  • 我的数据与自然语言无关,请记住这一点.

goj*_*omo 13

求和/平均word2vec向量通常非常好!

对Doc2Vec使用10或20次迭代更为典型,而不是从Word2Vec继承的默认值5.(不过我看到你试过了.)

如果您的主要兴趣是doc-vectors - 而不是在一些Doc2Vec模式中共同训练的单词向量 - 那么也一定要尝试PV-DBOW模式(dm=0).它训练得更快,通常是表现最好的.

如果您的语料库非常小,或者文档非常短,那么doc-vectors可能很难变得普遍有意义.(在某些情况下,减少向量size可能有所帮助.)但特别是如果window是平均文档大小的很大一部分,通过单词向量学习的内容以及doc向量学到的内容将非常非常相似.而且由于这些词语可能会被更多次训练,在更多样化的语境中,它们可能具有更广泛的含义 - 除非你有更多的较长文档.

其他有时有助于改进Doc2Vec载体以进行分类的事情:

  • 重新推断所有文档向量,在训练结束时,甚至可能使用与infer_vector()默认值不同的参数,例如infer_vector(tokens, steps=50, alpha=0.025)- 虽然速度很慢,但这意味着所有文档都从相同的最终模型状态获取向量,而不是从批量训练中留下的内容

  • 在已知分类标签的地方,使用作为标签TaggedDocument tags列表的功能将它们添加为训练有素的doc 标签

  • 罕见的词基本上只是对Word2Vec或Doc2Vec的噪音 - 所以min_count高于1,或许显着更高,通常有帮助.(混合使用的单例单词可能对单个doc-ID doc-vector特别有害,这些doc-vector 也是设计单元.训练过程也是在与doc-vector的竞争中,试图使那些单例单词向量预测为他们的单文档社区...当真的,为了你的目的,你只是希望doc-vector是最具描述性的.所以这表明尝试PV-DBOW和增加min_count.)

希望这可以帮助.