ayu*_*hal 2 python random gensim doc2vec
我正在使用预先训练的 doc2vec BOW 模型(美联社新闻)。我正在做以下事情:
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)
Run Code Online (Sandbox Code Playgroud)
但是,如果我再次计算相同文本的 vec,那么我会得到相同文本的不同向量表示。为什么会发生这种情况以及我该如何避免这种情况。如果我给出完全相同的文本,我希望返回相同的向量。我尝试关注这篇文章,但似乎没有帮助。
正如确定性推理的 Gensim 项目 Github 问题中所述,每次尝试推理之前,重新seed()指定模型内使用的特定随机数生成器就足够了。(@Coldspeed 的评论建议是正确的总体思路,但 Doc2Vec 模型使用自己的实例,而不是全局实例。)randomnumpy
也就是说,到处都有一条像你的线一样的线......
vec=m.infer_vector(text,alpha=start_alpha, steps=infer_epoch)
Run Code Online (Sandbox Code Playgroud)
...您需要在此之前infer_vector()强制重新seed()模型的随机生成器:
m.random.seed(0)
Run Code Online (Sandbox Code Playgroud)
只有这样,下面才会infer_vector()使用等效的随机数序列。(如果多个线程使用同一个模型,那么所有的赌注都会被取消,因为 PRNG 可能会在播种和使用之间被其他线程推进。)
尽管这应该可行,但依赖它并不是一个好主意。Doc2Vec(和 Word2Vec)大多数模式背后的算法都包含固有的随机性,每个向量只是渐进逼近过程的结果,该过程确定为“足够好”向量,不仅受固有的随机性影响,还受所有其他参数的影响。评估应该对结果中的小抖动具有鲁棒性,以尊重模型的内在方差。
请参阅 Gensim FAQ 中的相关讨论:“ Q12:我在单个文本上使用了 Doc2Vec infer_vector(),但每次得到的向量都不一样。是否有 bug 或者我犯了一个错误?(doc2vec 推理非确定性) ) ”