【问题标题】:What are doc2vec training iterations?什么是 doc2vec 训练迭代?
【发布时间】:2017-10-18 09:33:27
【问题描述】:

我是 doc2vec 的新手。我最初试图理解 doc2vec,下面提到的是我使用 Gensim 的代码。如我所愿,我得到了两个文档的训练模型和文档向量。

但是,我想知道在几个时期重新训练模型的好处以及如何在 Gensim 中进行?我们可以使用iteralpha 参数来做到这一点,还是我们必须在单独的for loop 中训练它?请让我知道我应该如何更改以下代码来训练模型 20 个 epoch。

另外,我很想知道 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]

【问题讨论】:

    标签: python deep-learning word2vec gensim doc2vec


    【解决方案1】:

    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 经常为每个文档使用唯一的标识符标签,所以更多的迭代可能更重要,因此随着模型的逐渐改进,每个文档向量在训练过程中都会出现多次训练。另一方面,因为Word2Vec 语料库中的单词可能出现在整个语料库中的任何位置,每个单词的相关向量将随着模型的改进在过程的早期、中期和后期进行多次调整——即使只通过一次. (因此,对于一个巨大的、多样化的Word2Vec 语料库,可以考虑使用少于默认数量的通行证。)

    不需要自己做循环,大多数用户也不应该这样做。如果您自己管理单独的build_vocab()train() 步骤,而不是在初始化程序调用中提供docs 语料库以触发立即训练的更简单步骤,那么您必须向train() 提供epochs 参数– 它会执行该数量的传递,因此您仍然只需要调用train()

    【讨论】:

    • 是的,Word2VecDoc2Vec 在它们的初始化方法中都支持 iter 参数!
    • 非常感谢 :) 直接在doc2vec 中使用文档和使用如下文档有区别吗? model.build_vocab(sentences) for epoch in range(10): model.train(sentences)?它会产生相同的文档向量吗?
    • 像这样调用train() 10 次有很多问题。如果调用没有为您出错,并且您将默认的 iter 保留为 5,则每个调用执行 5 次传递 - 所以您将获得 50 次数据传递,而不是 10 次。此外,每次调用 train()将学习率从起始 alpha 滑到 min_alpha,所以它会从高到低、从高到低等等——对于 SGD 来说根本不正确。而且,因为这个错误很常见,最新的 gensim 甚至不会让你在没有明确的 epochs 参数的情况下调用train(),所以它会在最新的 gensim 中出错。不要这样做。
    • 非常感谢您的完美回答。那么,您建议使用model = doc2vec.Doc2Vec(docs, iter=20, ...)this,而不是model.build_vocab(sentences) for epoch in range(10): model.train(sentences),对吗? :)
    • 是的,因为后者不会按照您的意愿行事,也不会正确管理学习率,甚至运行时不会出错(在最近的 gensim 版本中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多