【问题标题】:Why Doc2vec gives 2 different vectors for the same texts为什么 Doc2vec 为相同的文本提供 2 个不同的向量
【发布时间】:2018-05-16 04:32:06
【问题描述】:

我正在使用Doc2vec 从单词中获取向量。 请看我下面的代码:

from gensim.models.doc2vec import TaggedDocument
f = open('test.txt','r')

trainings = [TaggedDocument(words = data.strip().split(","),tags = [i]) for i,data in enumerate(f)


model = Doc2Vec(vector_size=5,  epochs=55, seed = 1, dm_concat=1)

model.build_vocab(trainings)
model.train(trainings, total_examples=model.corpus_count, epochs=model.epochs)

model.save("doc2vec.model")

model = Doc2Vec.load('doc2vec.model')
for i in range(len(model.docvecs)):
    print(i,model.docvecs[i])

我有一个test.txt 文件,它的内容有 2 行,这两行的内容相同(它们是“a”) 我用doc2vec训练得到了模型,但是问题是虽然2行的内容是一样的,但是doc2vec给了我2个不同的向量。

0 [ 0.02730868  0.00393569 -0.08150548 -0.04009786 -0.01400406]
1 [ 0.03916578 -0.06423566 -0.05350181 -0.00726833 -0.08292392]

我不知道为什么会这样。我认为这些向量是相同的。 你能解释一下吗?而如果我想为相同的词制作相同的向量,在这种情况下我应该怎么做?

【问题讨论】:

    标签: python nlp word2vec gensim doc2vec


    【解决方案1】:

    Doc2Vec(和 Word2Vec)算法中存在固有的随机性,例如初始向量已经是随机的,即使对于相同的句子也是不同的。您可以评论model.train 电话并亲自查看。

    如果您有兴趣,请详细说明:向量在构建词汇后立即初始化:在您的情况下,它是 model.build_vocab(...) 调用,它又调用 model.reset_doc_weights() 方法(请参阅gensim/models/doc2vec.py 的源代码),无论句子是什么,它都会随机初始化所有向量。如果此时您重置初始化并分配相等的向量,它们不应该再发散了。

    理论上,如果你训练相同的句子真的足够长,即使初始化不同,算法也应该收敛到相同的向量。但实际上,这不会发生,我认为你不应该担心这一点。

    【讨论】:

    • 感谢您的回答,它帮助我更多地了解了 doc2vec。现在经过训练,我使用了 model.infer_vector,我得到了相同数据的相同向量。docs = [data.strip().split(" ") for data in f] for doc in docs: vec = model.infer_vector(doc) print(vec)。但我不知道这是否是我需要的。你怎么看这件事。我是真的吗?谢谢。
    【解决方案2】:

    @Maxim 对算法使用的固有随机性的回答是正确的,但是您对这个示例还有其他问题:

    • Doc2Vec 在玩具大小的小示例上没有给出有意义的结果。只有当向量是大量不同的对比训练上下文的结果时,向量才会获得良好的相对含义。您的 2 行数据集,经过 55 个训练周期,实际上只是为模型提供了 1 个唯一文本,110 次。

    • 尽管您已明智地将向量大小减小到一个很小的数字 (5) 以反映微小的数据,但对于仅 2 个示例而言,它仍然是一个太大的模型,容易完成“过度拟合”。该模型可以随机分配第 1 行向量 [1.0, 0.0, 0.0, 0.0, 0.0] 和第 2 行 [0.0, 1.0, 0.0, 0.0, 0.0]。然后,通过它的所有训练,只更新它的内部权重(而不是文档向量本身),但仍然实现了与真实场景中一样好的或更好的内部单词预测,在真实场景中,一切都在增量更新,因为有足够的免费在模型中声明,从来没有任何必要的竞争/压缩/权衡迫使两个句子在相似的地方收敛。 (有许多解决方案,大多数不涉及任何有用的广义“学习”。只有大型数据集,迫使模型在建模多个示例之间以及尽可能权衡取舍之间进行拉锯战,才能创建学习。)

    • dm_concat=1 是一种非默认实验模式,需要更多数据来训练,并导致模型更大/速度更慢。避免使用它,除非你确定——并且可以用结果证明——它对你的使用有帮助。

    即使这些已修复,Doc2Vec 中的完全确定性也不是自动的——您不应该真的试图消除它。 (运行之间的小抖动是该算法中基本方差的有用信号/提醒 - 如果您的训练/评估在如此小的方差中保持稳定,这是一个额外的指标,表明它是有效的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多