python - 改进 Gensim Doc2vec 结果

标签 python nlp gensim doc2vec

我尝试在 600000 行句子上应用 doc2vec:代码如下:

from gensim import models
model = models.Doc2Vec(alpha=.025, min_alpha=.025, min_count=1, workers = 5)
model.build_vocab(res)
token_count = sum([len(sentence) for sentence in res])
token_count

%%time
for epoch in range(100):
    #print ('iteration:'+str(epoch+1))
    #model.train(sentences)
    model.train(res, total_examples = token_count,epochs = model.iter)
    model.alpha -= 0.0001  # decrease the learning rate`
    model.min_alpha = model.alpha  # fix the learning rate, no decay

通过上述实现,我得到的结果非常糟糕。
除了教程中的建议之外,我所做的更改是更改以下行:
  model.train(sentences)

作为:
 token_count = sum([len(sentence) for sentence in res])
model.train(res, total_examples = token_count,epochs = model.iter)

最佳答案

不幸的是,您的代码是被误导的实践的荒谬组合。所以不要遵循你正在遵循的任何在线示例!

从上到下依次解决问题:

不做min_alphaalpha .随机梯度下降优化过程需要从大到小逐渐下降alpha在看到许多不同示例的过程中学习率,并且通常应以可忽略的接近零的值结束。 (代码尝试以这种方式显式递减 alpha 还存在其他问题,我们将在下面讨论。)只有已经有工作设置、很好地理解算法并正在执行实验性调整的专家用户才应该更改 alpha/min_alpha默认值。

不设min_count=1 .只出现一次或几次的稀有词通常对 Word2Vec/Doc2Vec 训练没有帮助。它们很少出现意味着它们自己对应的模型权重没有得到太多训练,并且与相应单词的真实含义相比,少数出现更有可能没有代表性(这可能反射(reflect)在测试数据或以后的生产数据中)。因此,模型对这些个别罕见词的表示不太可能变得非常好。但总的来说,所有这些生僻词都与其他有机会变得有意义的词竞争很多——所以“粗”生词主要是对其他词的随机干扰。或者,这些词可能意味着额外的模型词汇参数,有助于模型在训练数据上从表面上变得更好,因为在那里记住了不可概括的特性,但在 future 的测试/生产数据上会更糟。所以,min_count是另一个默认值 (5),只有在您拥有工作基线后才应更改 - 如果您稍后在大型数据集(如您的 600K 文档)上严格元优化此参数,您很可能会发现更高 min_count而不是降低改善最终结果。

为什么要做 token_count ?没有以后需要总 token 计数的地方。 total_examples参数稍后需要文本示例的计数——即单个文档/句子的数量——而不是总字数。通过提供(更大的)字数,train()将无法管理 alpha正确或估计记录输出的进度。

不要打电话train()在循环中多次使用您自己的显式 alpha管理,除非你是肯定的,否则你知道你在做什么。大多数人都弄错了。通过提供默认 model.iter (其值为 5)作为此处的参数,实际上您总共对语料库执行了 500 次传递,这不太可能是您想要的。通过减少初始 0.025 alpha值在 100 次循环中增加 0.0001,您最终会得到一个 alpha 0.015 - 不到起始值的一半。相反,请调用 train()恰好一次,正确 total_examples ,和精心挑选的epochs值(在 Doc2Vec 发表的作品中通常使用 10 到 20)。然后它将执行正确数量的显式迭代,并管理 alpha智能,并在日志中打印准确的进度估计。

最后,接下来的事情不一定是您代码中的问题,因为您没有显示您的语料库 res已构造,但有一个常见错误需要注意:确保您的语料库可以迭代多次(就像它是内存中的列表,或者是来自 IO 的东西上的可重新启动的可迭代对象)。通常人们提供一个一次性迭代器,它在一次通过后(如 build_vocab() )不返回其他任何东西——导致即时训练和无用的仍然随机和未经训练的模型。 (如果您启用了日志记录,并注意记录的输出和每个步骤的时间,这是否是一个问题就很明显了。)

关于python - 改进 Gensim Doc2vec 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890052/

相关文章:

python - 词嵌入提取

python - 如何在 python 中解码 google 的 JWT 响应?

python - 使用 keras 库指定 Dense

python - 当您尝试在遍历列表元素时删除它会发生什么

python - 如何从回调函数中中断Word2vec训练?

swift - 如何在 Swift 中对单个单词进行词形还原

code-generation - 机器学习和字符串代码生成器

Python - NLP - 将 iter(iter(tree)) 转换为 list(tree)

python - 如何找到有意义的词来表示从 word2vec 向量派生的每个 k-means 聚类?

gensim - word2vec中窗口大小与实际句子长度的关系