9

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

model = Word2Vec(documents, size=200, window=5, min_count=0, workers=4, iter=5, sg=1)

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)

具有相同的数据和可比的参数。

在此之后,我将这些模型用于我的分类任务。而且我发现,简单地对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

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

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

1 回答 1

21

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

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

如果您的主要兴趣是 doc-vectors——而不是在某些 Doc2Vec 模式中共同训练的词向量——当然也可以尝试 PV-DBOW 模式 ( dm=0)。它会训练得更快,并且通常是表现最好的。

如果您的语料库非常小,或者文档非常短,那么文档向量可能很难变得普遍有意义。(在某些情况下,减少向量size可能会有所帮助。)但特别是如果window它占平均文档大小的很大一部分,则词向量学到的内容和文档向量学到的内容将非常非常相似。由于这些词可能会被训练更多次,在更多样化的上下文中,它们可能具有更普遍的含义——除非你有更多更长的文档集合。

其他有时有助于改进 Doc2Vec 向量以用于分类目的的事情:

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

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

  • 稀有词本质上只是 Word2Vec 或 Doc2Vec 的噪音 - 所以min_count高于 1,也许显着更高,通常会有所帮助。(混入的单例词可能对单个 doc-ID 文档向量尤其具有破坏性,这些文档向量在设计上也是单例的。训练过程与 doc-vector 竞争,试图使这些单例词向量预测他们的单文档邻域...实际上,出于您的目的,您只希望doc-vector最具描述性。因此,这建议尝试 PV-DBOW 并增加min_count.)

希望这可以帮助。

于 2017-07-21T23:58:16.070 回答