0

我对 doc2vec 很陌生,然后我做了一些小研究,发现了一些东西。这是我的故事:我正在尝试学习使用 doc2vec 240 万个文档。起初,我只尝试使用包含 12 个文档的小型模型来这样做。我用第一个文档的推断向量检查了结果,发现它确实与第一个文档相似,余弦相似度为 0.97-0.99。我觉得这很好,即使当我尝试输入一个完全不同单词的新​​文档时,我得到了 0.8 度量相似度的高分。然而,我已经把它放在一边,并试图继续构建包含 240 万个文档的完整模型。在这一点上,我的问题开始了。结果完全是胡说八道,我在 most_similar 函数中收到相似度为 0.4-0.5 的结果,这与检查的新文档完全不同。我试图调整参数,但还没有结果。我还尝试从小型和大型模型中消除随机性,但是,我仍然得到不同的向量。然后我尝试在每个时期使用 get_latest_training_loss 来查看每个时期的损失如何变化。这是我的代码:

model = Doc2Vec(vector_size=300, alpha=0.025, min_alpha=0.025, pretrained_emb=".../glove.840B.300D/glove.840B.300d.txt", seed=1, workers=1, compute_loss=True)

workers=1, compute_loss=True)
model.build_vocab(documents)

for epoch in range(10):
    for i in range(model_glove.epochs):
        model.train(documents, total_examples = token_count, epochs=1)
        training_loss = model.get_latest_training_loss()
        print("Training Loss: " + str(training_loss))

    model.alpha -= 0.002  # decrease the learning rate
    model.min_alpha = model.alpha # fix the learning rate, no decay

我知道这段代码有点笨拙,但在这里使用它只是为了跟踪损失。我收到的错误是:

AttributeError: 'Doc2Vec' object has no attribute 'get_latest_training_loss'

我试着看模型。并自动补全,发现确实没有这个功能,找了个类似名字training_loss的东西,却给了我同样的错误。

这里有人可以给我一个想法吗?

提前致谢

4

1 回答 1

1

尤其是作为初学者,没有迫切需要监控训练损失。很长一段时间,gensim没有以任何方式报告任何模型 - 仍然可以评估和调整模型。

即使是现在,running-loss-reportinggensim还是一种粗略的、不完整的、高级/实验性的功能——在最近的重构之后,它似乎在Doc2Vec. (值得注意的是,虽然损失水平达到稳定水平可能是进一步训练无济于事的有用指标,但绝对不是具有任意低损失的模型比其他模型更好。特别是,模型实现接近零损失的可能会非常过拟合,并且可能对下游应用几乎没有用处。)

关于您描述/显示的过程的总体目标,即获得良好的向量:

  • 微小的测试(与您的 12 个文档一样)实际上不适用于这些算法,除非检查您是否使用合法参数调用这些步骤。你不应该期望这些玩具大小的测试中的相似之处有任何意义,即使它们在某些情况下表面上符合预期。这些算法需要大量的训练数据和大量的词汇来训练合理的模型。(因此,您的全部 240 万份文档应该可以正常工作。)

  • 您通常不应该更改默认alpha/min_alpha值,或者train()在循环中多次调用。您可以将它们保留为默认值,并train()使用您想要的训练 epoch 数量进行调用——它会做正确的事情。您显示的代码中的方法是一种次优且脆弱的反模式——无论您从哪个在线资源中学习它都是被误导且严重过时的。

  • 您尚未显示推理代码,但请注意,除非您提供其他值,否则它将重新使用原始初始化中模型实例中缓存的epochsalpha和。min_alpha而且,如果未指定,则默认epochs值是从共享代码继承的Word2Vec5。仅进行 5 个 epoch 并始终保持有效alpha0.025alpha=0.025, min_alpha=0.025推理一样)不太可能产生良好的结果,尤其是在短文档上。已发表作品的常见epochs值为 10 到 20 - 并且推理至少与训练中使用的一样多是典型的。

  • 您正在展示一个pretrained_emb不属于标准gensim库的初始化参数的使用,因此您可能正在使用其他一些基于 . 的旧版本的 fork gensim。请注意,Doc2Vec使用来自在训练之前的其他地方,所以如果这样做,你已经处于高级/实验领域 - 如果你仍在尝试将一些基本的 doc-vectors 调整为合理的形状,那么这还为时过早。(而且,如果他们有一个小的语料库,通常人们会寻求诸如重用词向量之类的技巧。有 240 万个文档,你可能没有这样的语料库问题——任何词向量都可以从你的语料库中与文档一起学习——向量,以默认方式。)

于 2019-08-14T18:26:04.583 回答