我正在训练一个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
模型,但结果几乎相同。 - 我的数据与自然语言无关,请记住这一点。
对 word2vec 向量求和/平均通常非常好!
更典型的做法是使用 Doc2Vec 进行 10 或 20 次迭代,而不是从 Word2Vec 继承的默认 5 次迭代。(不过,我看你已经试过了。
如果您的主要兴趣是文档向量 - 而不是在某些Doc2Vec模式下共同训练的单词向量 - 一定要尝试PV-DBOW模式(dm=0
(。它会训练得更快,并且通常是表现最好的。
如果你的语料库非常小,或者文档很短,文档向量可能很难变得普遍有意义。(在某些情况下,减少矢量size
可能会有所帮助。但是,特别是如果window
是平均文档大小的很大一部分,那么通过词向量学习的内容和通过文档向量学习的内容将非常非常相似。而且由于这些单词可能会在更多样化的上下文中被训练更多次,因此它们可能具有更可概括的含义——除非您拥有更大的较长文档集合。
有时有助于改进 Doc2Vec 载体以进行分类的其他内容:
-
在训练结束时重新推断所有文档向量,甚至可能使用与
infer_vector()
默认值不同的参数,例如infer_vector(tokens, steps=50, alpha=0.025)
- 虽然相当慢,但这意味着所有文档都从相同的最终模型状态获取向量,而不是批量训练中剩余的向量 -
在分类标签已知的情况下,使用
TaggedDocument
tags
作为标签列表的功能将它们添加为经过训练的文档标签 -
生僻词本质上只是 Word2Vec 或 Doc2Vec 的噪音 - 因此高于 1 的
min_count
,也许明显更高,通常会有所帮助。(混合在一起的单例单词可能对单个 doc-ID 文档向量特别有害,这些文档向量在设计上也是单例。训练过程也是,在与文档向量的竞争中,试图使那些单例词向量预测他们的单文档邻域......实际上,为了您的目的,您只希望文档向量最具描述性。因此,这表明既要尝试PV-DBOW,又要增加min_count
。
希望这有帮助。