去除doc2vec的向量初始化的随机化

时间:2017-06-08 19:02:46

标签: python random gensim doc2vec

我使用的是经过预先训练的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但似乎没有帮助。

2 个答案:

答案 0 :(得分: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)的大多数模式背后的算法包括固有随机性,并且每个向量只是逐步逼近过程的结果,该过程稳定在“足够好”的向量上,不仅受固有随机性的影响,还受所有其他参数的影响。对于结果中的小抖动,评估应该是稳健的,以尊重模型的固有方差。

答案 1 :(得分:0)

如果你想去除 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)