Python ';Doc2Vec&x27;对象没有属性';获得最新的培训和损失';

Python ';Doc2Vec&x27;对象没有属性';获得最新的培训和损失';,python,gensim,doc2vec,glove,Python,Gensim,Doc2vec,Glove,我是doc2vec的新手,然后我做了一些小调查,发现了一些东西。以下是我的故事:我正在努力学习使用doc2vec 240万个文档。起初,我只尝试使用一个12个文档的小模型。我用第一个文档的推断向量检查结果,发现它确实与第一个文档通过0.97-0.99余弦相似性度量相似。我发现这很好,尽管当我尝试输入一个完全不同单词的新文档时,我得到了0.8分的高分“度量相似度”。然而,我把它放在一边,试图继续用240万个文档构建完整的模型。在这一点上,我的问题开始了。结果完全是胡说八道,我收到了最相似的函数结果

我是doc2vec的新手,然后我做了一些小调查,发现了一些东西。以下是我的故事:我正在努力学习使用doc2vec 240万个文档。起初,我只尝试使用一个12个文档的小模型。我用第一个文档的推断向量检查结果,发现它确实与第一个文档通过0.97-0.99余弦相似性度量相似。我发现这很好,尽管当我尝试输入一个完全不同单词的新文档时,我得到了0.8分的高分“度量相似度”。然而,我把它放在一边,试图继续用240万个文档构建完整的模型。在这一点上,我的问题开始了。结果完全是胡说八道,我收到了最相似的函数结果,相似性为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'
我试着看着模特。和自动完成,发现确实没有这样的功能,我发现类似的名称训练_损失,但它给我同样的错误

这里有人能给我一个主意吗


提前感谢

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

即使是现在,在
gensim
中运行损耗报告仍然是一种粗糙、不完整、高级/实验性的功能,而且在最近的重构之后,它似乎在
Doc2Vec
中没有得到充分的支持。(值得注意的是,虽然损失水平达到平稳水平可能是一个有用的指标,进一步的培训也无济于事,但最明显的情况是,损失任意较低的模型并不比其他模型好。特别是,达到接近零损失的模型可能会极度过度拟合,并且可能对下游应用程序没有什么用处)

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

  • 微小的测试(与您的12个文档一样)并不真正适用于这些算法,除非检查您是否使用合法参数调用这些步骤。你不应该期望这些玩具大小的测试中的相似之处有什么意义,即使它们在某些情况下表面上符合预期。这些算法需要大量的训练数据和大量的词汇来训练敏感的模型。(因此,您的240万份完整文档应该运行良好。)

  • 您通常不应该更改默认的
    alpha
    /
    minu alpha
    值,或者在循环中多次调用
    train()
    。您只需将它们保留为默认值,然后调用
    train()
    ,并输入所需的培训次数,这样做是正确的。您所展示的代码中的方法是一种次优且脆弱的反模式——无论您从哪一个在线来源了解到它,都是错误的和严重过时的

  • 您尚未显示您的推理代码,但请注意,除非您提供其他值,否则它将重新使用从原始初始化缓存到模型实例中的
    epoch
    alpha
    min_alpha
    。并且,如果未指定,默认的
    epochs
    是从共享代码继承的值,其
    Word2Vec
    值仅为
    5
    。仅仅做5个阶段,将有效的
    alpha
    始终保持在
    0.025
    上(正如
    alpha=0.025,min_alpha=0.025
    对推断所做的那样),不太可能产生好的结果,尤其是在短文档上。常见的
    epoch
    已发表作品的值为10-20,并且进行至少与用于培训相同数量的推理是典型的

  • 您显示的是一个
    pretrained_emb
    初始化参数的使用,该参数不是标准
    gensim
    库的一部分,因此您可能正在使用基于某个较旧版本的
    gensim
    的其他fork。。请注意,在培训之前,通常不会使用其他地方的单词嵌入来初始化
    Doc2Vec
    模型,因此,如果这样做,您已经处于高级/实验领域——如果您仍在尝试将一些基本doc向量设置为合理形状,这还为时过早。(而且,如果有一个很小的语料库,人们通常会寻找一些技巧,比如重复使用的词向量。有240万份文档,你可能不会遇到这样的语料库问题——默认情况下,任何词向量都可以从你的语料库和文档向量中学习。)


我尝试实施您的建议,经过10个或20个训练阶段后,没有任何改善(我还删除了alpha、min_alpha和预训练向量)。关于推断向量,我在没有任何参数的情况下制作了它,但是结果还是非常糟糕。你能告诉我如何应对这种情况吗?什么显示“没有改善”?(您得到的确切结果是什么,以及判断结果是否差的依据,是否与您的预期相符?)如果您的代码与原始问题中显示的内容相比发生了重大变化,您应该更新或扩展您的问题,以显示您现在正在做什么,这样就可以清楚是否还有剩余问题。此外,作为一般提示:确保至少在信息级别登录运行,并仔细检查输出(可能在您的问题中共享),以查看所有正确的进度/临时计数是否有意义。