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