我是doc2vec的新手。我最初试图理解doc2vec,下面提到的是我使用Gensim的代码。正如我所希望的,我获得了两个文档的训练模型和文档向量。
但是,我想知道在几个时代重新训练模型的好处以及如何在Gensim中进行训练?我们可以使用iter
或alpha
参数来执行此操作,还是必须在单独的for loop
中进行训练?请告诉我如何更改以下代码以训练20个时间段的模型。
另外,我很想知道word2vec模型需要多次训练迭代。
# Import libraries
from gensim.models import doc2vec
from collections import namedtuple
# Load data
doc1 = ["This is a sentence", "This is another sentence"]
# Transform data
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for i, text in enumerate(doc1):
words = text.lower().split()
tags = [i]
docs.append(analyzedDocument(words, tags))
# Train model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4)
# Get the vectors
model.docvecs[0]
model.docvecs[1]
答案 0 :(得分:6)
Word2Vec
和相关算法(如'段落向量'又名Doc2Vec
)通常会对文本语料库进行多次训练。
如果您还在对象初始化中提供语料库以触发即时培训,则Gensim的Word2Vec
/ Doc2Vec
允许iter
参数指定传递次数。 (上面的代码通过向docs
构造函数调用提供Doc2Vec(docs, ...)
来实现此目的。)
如果未指定,gensim使用的默认iter
值为5,以匹配Google原始word2vec.c版本使用的默认值。所以上面的代码已经使用了5个培训通行证。
已发布的Doc2Vec
作品通常使用10-20次。如果您想要执行20次传递,则可以将Doc2Vec
初始化更改为:
model = doc2vec.Doc2Vec(docs, iter=20, ...)
因为Doc2Vec
经常为每个文档使用唯一标识符标记,所以更多的迭代可能更重要,因此随着模型的逐步改进,每个doc-vector都会在培训过程中多次进行培训。另一方面,因为Word2Vec
语料库中的单词可能出现在整个语料库中的任何位置,所以每个单词'相关的向量将在模型改进时在过程的早期和中期以及后期进行多次调整 - 即使只是单程。 (因此,对于一个巨大的,多变的Word2Vec
语料库,使用少于默认通道数的思维是可以想象的。)
你不需要做自己的循环,大多数用户不应该。如果您自己管理单独的build_vocab()
和train()
步骤,而不是在初始化程序调用中提供docs
语料库以触发即时培训的更简单步骤,那么您必须提供{{{ 1}} epochs
的参数 - 它将执行该次数的传递,因此您仍然只需要调用train()
。