Python ';Doc2Vec&x27;对象没有属性';获得最新的培训和损失';
我是doc2vec的新手,然后我做了一些小调查,发现了一些东西。以下是我的故事:我正在努力学习使用doc2vec 240万个文档。起初,我只尝试使用一个12个文档的小模型。我用第一个文档的推断向量检查结果,发现它确实与第一个文档通过0.97-0.99余弦相似性度量相似。我发现这很好,尽管当我尝试输入一个完全不同单词的新文档时,我得到了0.8分的高分“度量相似度”。然而,我把它放在一边,试图继续用240万个文档构建完整的模型。在这一点上,我的问题开始了。结果完全是胡说八道,我收到了最相似的函数结果,相似性为0.4-0.5,与检查的新文档完全不同。我试图调整参数,但还没有结果。我还尝试从小模型和大模型中去除随机性,但是,我仍然得到了不同的向量。然后我尝试在每个历元上使用get_latest_training_loss,以查看损失在每个历元中的变化。这是我的代码:Python ';Doc2Vec&x27;对象没有属性';获得最新的培训和损失';,python,gensim,doc2vec,glove,Python,Gensim,Doc2vec,Glove,我是doc2vec的新手,然后我做了一些小调查,发现了一些东西。以下是我的故事:我正在努力学习使用doc2vec 240万个文档。起初,我只尝试使用一个12个文档的小模型。我用第一个文档的推断向量检查结果,发现它确实与第一个文档通过0.97-0.99余弦相似性度量相似。我发现这很好,尽管当我尝试输入一个完全不同单词的新文档时,我得到了0.8分的高分“度量相似度”。然而,我把它放在一边,试图继续用240万个文档构建完整的模型。在这一点上,我的问题开始了。结果完全是胡说八道,我收到了最相似的函数结果
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
已发表作品的值为10-20,并且进行至少与用于培训相同数量的推理是典型的epoch
- 您显示的是一个
初始化参数的使用,该参数不是标准pretrained_emb
库的一部分,因此您可能正在使用基于某个较旧版本的gensim
的其他fork。。请注意,在培训之前,通常不会使用其他地方的单词嵌入来初始化gensim
模型,因此,如果这样做,您已经处于高级/实验领域——如果您仍在尝试将一些基本doc向量设置为合理形状,这还为时过早。(而且,如果有一个很小的语料库,人们通常会寻找一些技巧,比如重复使用的词向量。有240万份文档,你可能不会遇到这样的语料库问题——默认情况下,任何词向量都可以从你的语料库和文档向量中学习。)Doc2Vec