【问题标题】:removing randomization of vector initialization for doc2vec去除 doc2vec 向量初始化的随机化
【发布时间】:2017-06-08 19:02:46
【问题描述】:

我正在使用预训练的 doc2vec BOW 模型(AP-news)。我正在执行以下操作:

import gensim.models as g 
start_alpha=0.01
infer_epoch=1000
model="\\apnews_dbow\\doc2vec.bin"
m = g.Doc2Vec.load(model)
text='this is a sample text'
vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)

但是,如果我再次为相同的文本计算 vec,那么我将得到相同文本的不同矢量表示。为什么会发生这种情况,我该如何避免这种情况。如果我给出完全相同的文本,我希望返回相同的向量。 我尝试关注this post,但似乎没有帮助。

【问题讨论】:

  • 你可以做np.random.seed(42) 这样每次初始化都是一样的?
  • 我应该在哪里使用这个命令?
  • 在您导入 gensim.models 之后。确保你先import numpy as np
  • 我这样做了,但它仍然为相同的文本提供不同的向量值..

标签: python random gensim doc2vec


【解决方案1】:

Gensim project Github issue for deterministic inference 中所述,在您尝试推理之前,每次重新seed() 模型内使用的特定随机数生成器就足够了。 (@Coldspeed 的评论建议是正确的总体思路,但 Doc2Vec 模型使用自己的 random 实例,而不是 numpy 全局实例。)

也就是说,任何地方都有一条像你的...

vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)

...您需要在 infer_vector() 前面加上模型随机生成器的强制重新seed()

m.random.seed(0)

只有这样,以下infer_vector() 才会使用等效的随机数序列。 (如果同一个模型被多个线程使用,所有的赌注都没有了,因为 PRNG 可能会在播种和使用之间被其他线程推进。)

即使这应该可行,但依赖它并不是一个好主意。大多数 Doc2Vec(和 Word2Vec)模式背后的算法都包含固有随机性,每个向量只是渐进式逼近过程的结果,该过程确定一个“足够好”的向量,不仅受制于固有随机性,还受制于所有其他参数。评估应该对结果中的小抖动具有鲁棒性,以尊重模型的内在方差。

请参阅 Gensim 常见问题解答中的相关讨论:“Q12: I've used Doc2Vec infer_vector() on a single text, but the resulting vector is different each time. Is there a bug or have I made a mistake? (doc2vec inference non-determinism)

【讨论】:

    【解决方案2】:

    如果你想为 doc2vec 移除向量初始化的随机化 , 使用时应在 Doc2Vec 中设置workers=1 并通过以下代码修复 PYTHONHASHSEED。

    import os
    import sys
    hashseed = os.getenv('PYTHONHASHSEED')
    if not hashseed:
        os.environ['PYTHONHASHSEED'] = '0'
        os.execv(sys.executable, [sys.executable] + sys.argv)
    

    【讨论】:

      【解决方案3】:

      正如@gojomo 已经指出的那样,每次调用 m.infer_vector() 之前都必须重置种子。

      如果您不想对种子进行硬编码,可以这样做:

      m.random.seed(m.seed)
      vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 2017-09-07
        • 2011-05-18
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多