我试图将句子映射到向量,以便使句子相互比较。为了测试gensim的Doc2Vec模型,我下载了sklearn的新闻组数据集,并对模型进行了培训。
为了比较两句话,我使用了model.infer_vector(),我想知道为什么使用同一个句子的两个调用传递给我不同的向量:
model = Doc2Vec(vector_size=100, window=8, min_count=5, workers=6)
model.build_vocab(documents)
epochs=10
for epoch in range(epochs):
print("Training epoch %d" % (epoch+1))
model.train(documents, total_examples=len(documents), epochs=epochs)
v1 = model.infer_vector("I feel good")
v2 = model.infer_vector("I feel good")
print(np.linalg.norm(v1-v2)) 输出:
训练时代1 0.41606528 训练时代2 0.43440753 训练时代3 0.3203116 训练时代4 0.3039317 训练时代5 0.68224543 训练时代6 0.5862567 训练时代7 0.5424634 训练时代8 0.7618142 训练时代9 0.8170159 训练时代10 0.6028216
如果我设置了alpha和min_alpha =0,我得到了“我感觉很好”和“我感觉很好”的一致向量,但是模型在每个时代给出了相同的向量,因此它似乎没有学到任何东西:
训练时代1 0.043668125 训练时代2 0.043668125 训练时代3 0.043668125 训练时代4 0.043668125 训练时代5 0.043668125 训练时代6 0.043668125 训练时代7 0.043668125 训练时代8 0.043668125 训练时代9 0.043668125 训练时代10 0.043668125
所以我的问题是:
发布于 2018-05-07 17:56:00
推理使用alpha,因为它与训练是相同的迭代调整过程,仅限于更新一个新文本示例的一个新向量。
所以是的,模型的各种重量都被冻结了。但是,一个新向量的权重(维)从小的随机值开始,就像其他向量也开始一样,然后在多个训练周期中得到增量的推进,从而使向量作为预测文本单词的doc向量工作得更好。然后返回最后一个新向量。
这些提示从更大的起始alpha值开始,最后作为可忽略的min_alpha结束。当alpha为0.0时,就不会发生任何训练/推断,因为对可更新权重的每一个提示修正都会在应用之前乘以0.0,这意味着不会发生任何更改。
与此不同的是,您的代码存在许多问题,可能会阻止期望的结果:
train() epochs times,然后为epochs提供大于1的值,您实际上正在执行epochs * epochs总训练传递。alpha和min_alpha,每个对train()的调用都会将有效α从其高值降到每个调用的低值--这是一种不适合于这种随机梯度下降优化的锯齿形状。(您的日志中应该有关于此错误的警告。)很少需要在一个循环中多次调用train()。只要用正确的epochs值调用它一次,它就会做正确的事情:很多次传递,alpha的学习速率都在平稳衰减。
分别在调用infer_vector()时
documents中的训练示例的documents属性一样--而不是字符串。(通过提供一个字符串,它看起来像一个字符列表,因此它将推断文档['I', ' ', 'f', 'e', 'e', 'l', ' ', 'g', 'o', 'o', 'd']而不是['I', 'feel', 'good']的文档向量。)infer_vector()之前应该将它们降低。passes=5是非常小的,特别是对于简短的文本-许多报告的结果更好,其值为数十或数百。alpha=0.1稍微大一些;使用训练值(特别是使用更多的passes)通常会得到更好的结果。最后,就像训练过程中的算法一样(调整单词预测上下文窗口,或随机抽样负数示例,或随机降样本高频度单词),推理也是如此。因此,即使提供完全相同的标记,也不会自动产生完全相同的推断向量。
然而,如果模型经过了充分的训练,并按照上面的推理进行了调整以获得更好的结果,那么同一文本的向量应该非常非常接近。因为这是一种随机算法,在运行之间存在一些固有的“抖动”,所以最好进行下游评估,并使用容忍如此小的差异的方法。(而且,如果您看到的是较大的差异,请更正其他模型/推断问题,通常需要更多的数据或其他参数调整。)
如果您想强制执行决定论,在gensim项目问题中有一些关于如何做到这一点的讨论。但是,理解和容忍小方差往往更符合这样一个随机影响的算法的选择。
https://stackoverflow.com/questions/50212449
复制相似问题