什么是 doc2vec 训练迭代?
What are doc2vec training iterations?
我是 doc2vec 的新手。我最初试图理解 doc2vec,下面提到的是我使用 Gensim 的代码。如我所愿,我得到了两个文档的训练模型和文档向量。
但是,我想知道在几个 epoches 中重新训练模型的好处以及如何在 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]
Word2Vec
和相关算法(如 'Paragraph Vectors' 又名 Doc2Vec
)通常对文本语料库进行多次训练。
Gensim 的 Word2Vec
/Doc2Vec
允许通过 iter
参数指定遍数,如果您还在对象初始化中提供语料库以触发立即训练. (您上面的代码通过向 Doc2Vec(docs, ...)
构造函数调用提供 docs
来做到这一点。)
如果未指定,gensim 使用的默认 iter
值为 5,以匹配 Google 的原始 word2vec.c 版本使用的默认值。所以你上面的代码已经使用了 5 次训练。
已发布的 Doc2Vec
作品通常使用 10-20 遍。如果你想做 20 遍,你可以将 Doc2Vec
初始化更改为:
model = doc2vec.Doc2Vec(docs, iter=20, ...)
因为Doc2Vec
经常为每个文档使用唯一的标识符标签,更多的迭代可能更重要,因此每个文档向量在训练过程中多次出现用于训练,随着模型逐渐改善。另一方面,由于 Word2Vec
语料库中的词可能出现在整个语料库的任何地方,每个词的关联向量将在模型改进的过程中进行早期、中期和后期的多次调整——即使只有一个单程。 (因此,对于一个巨大的、变化多端的 Word2Vec
语料库,使用少于默认遍数的次数是可以想象的。)
您不需要自己做循环,大多数用户也不应该。如果您确实自己管理单独的 build_vocab()
和 train()
步骤,而不是更简单的步骤,即在初始化程序调用中提供 docs
语料库以触发立即训练,那么您必须提供 epochs
到 train()
的参数 – 它将执行该次数的传递,因此您仍然只需要调用一次 train()
。
我是 doc2vec 的新手。我最初试图理解 doc2vec,下面提到的是我使用 Gensim 的代码。如我所愿,我得到了两个文档的训练模型和文档向量。
但是,我想知道在几个 epoches 中重新训练模型的好处以及如何在 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]
Word2Vec
和相关算法(如 'Paragraph Vectors' 又名 Doc2Vec
)通常对文本语料库进行多次训练。
Gensim 的 Word2Vec
/Doc2Vec
允许通过 iter
参数指定遍数,如果您还在对象初始化中提供语料库以触发立即训练. (您上面的代码通过向 Doc2Vec(docs, ...)
构造函数调用提供 docs
来做到这一点。)
如果未指定,gensim 使用的默认 iter
值为 5,以匹配 Google 的原始 word2vec.c 版本使用的默认值。所以你上面的代码已经使用了 5 次训练。
已发布的 Doc2Vec
作品通常使用 10-20 遍。如果你想做 20 遍,你可以将 Doc2Vec
初始化更改为:
model = doc2vec.Doc2Vec(docs, iter=20, ...)
因为Doc2Vec
经常为每个文档使用唯一的标识符标签,更多的迭代可能更重要,因此每个文档向量在训练过程中多次出现用于训练,随着模型逐渐改善。另一方面,由于 Word2Vec
语料库中的词可能出现在整个语料库的任何地方,每个词的关联向量将在模型改进的过程中进行早期、中期和后期的多次调整——即使只有一个单程。 (因此,对于一个巨大的、变化多端的 Word2Vec
语料库,使用少于默认遍数的次数是可以想象的。)
您不需要自己做循环,大多数用户也不应该。如果您确实自己管理单独的 build_vocab()
和 train()
步骤,而不是更简单的步骤,即在初始化程序调用中提供 docs
语料库以触发立即训练,那么您必须提供 epochs
到 train()
的参数 – 它将执行该次数的传递,因此您仍然只需要调用一次 train()
。